EADP Game Services DirtySDK 15.1.6.0.4 - June 3, 2020

        Framework   8.04.00

        Android     AndroidSDK 100.00.00-pr1
                    AndroidNDK 15.2.4203891
        Capilano    CapilanoSDK 180712-1-proxy
        GDK         GDK 200200-proxy
        Kettle      kettlesdk 7.508.001-proxy
                    PlayStation4AppContentEx 7.008.001
                    PlayStation4AudioInEx 7.008.001
        PS5         ps5sdk 0.95.00.36-proxy
        NX          nx_config 1.00.05
                    nxsdk 9.0.0
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Stadia      StadiaSDK dev-proxy
        Win32       WindowsSDK 10.0.18362

New in this release:

    DirtySDK (All)
        Base64
            Added the ability to remove padding from url encoded via a new API Base64EncodeUrl2. Padding isn't required
            by the spec in all cases and with JWT we do not wanted padding added.

    DirtySDK (Sony)
        VoipHeadsetPS4
            Added support for querying the blocklist to auto-mute players on Sony platforms as required by TRC R5304.

    DirtySDK (Stadia)
        NetConnStadia
            Added support for the 'chat' selector to check if the local user can use voice chat. This selector will be
            used by the voip system like on other platforms to restrict voice chat.

        PrivilegeApiStadia
            Added support for checking the voice chat and multiplayer features on stadia allowing for showing the
            overlay if necessary.

        VoipHeadsetStadia
            Added support for processing the blocklist to auto-mute players. Added tracking for the remote player ids
            which is needed for processing the blocklist.

            Added the checking of the voice chat restrictions for the transmission and playback of voice chat.

            Added support for transcription and text chat accessibility features. This implementation is based on PS4
            where we disable 'vdis' for transcription when narration is active. Like on other platforms we provide the
            text chat narration features as a way to allow teams to use our voip features for text chat when voice chat
            is inactive.

            Added support for text-to-speech using the cloud based providers via voipnarrate. The narration module
            supports a sample rate that differs of that in module. This is handled transparently in the codec (via
            resampling) but we need to handle the data coming in with the differing sample rate.

        VoipStadia
            Added proper support for local input muting. We had preliminary for the local input muting in the voip
            module but it was not implemented in the headset module.

Changes in this release:

    DirtySDK (All)
        DirtyNet
            Removed the suppressions around the include of winsock2.h in dirtynet.h to fix issues with all warnings
            being suppressed for complation units that include this header file. In previous versions of the WindowsSDK
            these suppressions were needed due to warnings being generated by the header file. We no longer see this
            behavior on current versions of the WindowSDK.

        NetConn
            Increased the number of idle handlers to 64 due to game team use cases where more than 32 need to be
            registered. The number of idle handlers should not be the limiting factor to the amount of modules we can
            have running at once.

        QosClient
            Changed the NetCritEnter to NetCritTry to prevent stalling the main thread waiting for the lock. If we can't
            the lock then we can wait for the next frame to do the update.

        VoipHeadset
            Changed the headset modules to unify on how they detect a change in the first party mute list uisng the
            'fpmu' selector. Previously on xbox we were using the 'fpmc' selector that returns the number of entries in
            the first party mute list. Given that certain implementations could make multiple updates in an interval
            that could mean no change in the count, we needed to use a different method. The new method will signal if
            an update was made to the list which we signal in the places when we know a change has been made.

        VoipNarrate
            Updated the module to expose the sample rate that it uses internally. On system's with differing sample
            rates it allows us to resample where necessary at the codec level.

        VoipOpus
            Refactored the resampler logic to prevent reallocation when switching sampling rate and update the
            calculation the sample rate based on input samples. On Stadia when communicating without accessibility we
            will be using a sample rate of 48kHz, our accessibility modules depend on 16kHz which we need to resample in
            order to support. Given that we might switch the sampling rate we don't want to reallocate the same state
            thus we will just remember what sampling rate the resampler is configured to.

        UserList
            Increased the size of the gamertag field to support the increases in the gdk and stadia gamertags.

    DirtySDK (GDK)
        NetConnGDK
            Changed the implementation of the environment determination to default to production on cases where the
            sandbox lookup failed or a valid mapping was not found. In these cases we want to ensure that the default
            case of running in production still functions. If we would fall into these cases before these changes we
            would be stuck in the environment determination state until the user tried to reconnect to the platform
            network again.
        
        UserListApiGDK
            Fixed a build error UserListApiGDK. We now also include userlistapixboxone.h in userlistapi.h. 
            This matches what was done for userapi.h and fixes compliation issues.

    DirtySDK (NX)
        NetConnNX
            Added 'eusr' selector support on NX. This selector returns the IEAUser interface given a user index.

    DirtySDK (PS4)
        DirtySessionManagerPS4
            Removed Play together feature because it is not officially deprecated. All the assciated functionality will 
            only be avaliable if you are using SDK version lower than 7.5 SDK 
        
        NetConnPS4
            Changed NetConnStartup to update the title id if it is called while the module is already started and 
            title id is NETCONNPS4_SAMPLE_TITLE_ID. This will allow the title id to be updated to the game title id 
            for cases where NetConnStartup is called early for BugSentry and NETCONNPS4_SAMPLE_TITLE_ID is used as 
            a default.

    DirtySDK (PS5)
        DirtyWebApi2PS5
            Changed the way how DirtyWebApi callback is called when we encounter sce errors. The http status code is now also
            supplied along with the sce error to help differentiate potential buffer size errors.
            
            Fixed the unintended knock on of sharing dirtywebapi2. When modules sharing dirtywebapi2 they should only be allowed to 
            abort the requests made by themselves. 

        NetConnPS5
            Changed NetConnStartup to update title id if it is called while the module is already started and 
            title id is NETCONNPS4_SAMPLE_TITLE_ID. This will allow the title id to be updated to the game title id 
            for cases where NetConnStartup is called early for BugSentry and NETCONNPS4_SAMPLE_TITLE_ID is used as 
            a default.
            
        UserListApiPS5
            Fixed Total item friends count not being set for a list end event.
            
            Fixed callbacks not firing when using type mask with a user without friends. It will now also fire the callback if 
            the get account ids request returns zero items.
            
            Removed an unecessary NetCritLeave in _UserListApiProcessRequest (). This extra NetCritLeave was causing strange 
            deadlocks because unlocking an unlocked mutex is undefined behavior.

            Changed the restriction on the max blocked list size limit to 2000 per request (this is the max number supported by PSN). 
            Querying Blocked List with filters or mask parameter are also not supported.

            Fixed the  _UserListApiAddQueryParamsToRequest() function to ignore adding query parameters for blocked list reqauest 
            instead of the friends request.            

    DirtySDK (Sony)
        VoipHeadsetPS4
            Removed the uChatPrivileges field as it is no longer read out of due to changes in CL1329299.

    DirtySDK (Stadia)
        NetConnStadia
            Changed the 'tick' selector to support retrieveing the raw JWT. Retrieving the JWT was missed during the
            initial implementation of JWT support on stadia. This aligns with how the other platforms support retrieving
            the JWT.

        Voip
            Enabled the speaker callback on stadia. We are following the PC implementation and this was already
            supported at the headset level.

        VoipHeadsetStadia
            Fixed VoipHeadsetControl to return -1 when unhandled.

        VoipStadia
            Fixed a bug in that the correct user indices were not being passed to apply the mute on.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Fixed for uncaught exception during environment determination when the TMS class is not enabled in the
            appxmanifest. If the application was not setup to include the ability to access title storage an exception
            will be thrown when we try to create that class. In this case we will catch the exception and default to the
            production environment.


EADP Game Services DirtySDK 15.1.6.0.3 - April 21, 2020

        Framework   8.03.02

        Android     AndroidSDK 100.00.00-pr1
                    AndroidNDK 15.2.4203891
                    android_config 5.00.00-pr1
        Capilano    CapilanoSDK 180712-1-proxy
        GDK         GDK 200200-proxy
        Kettle      kettlesdk 7.008.001-proxy
                    PlayStation4AppContentEx 6.508.010
                    PlayStation4AudioInEx 6.508.001
        PS5         ps5sdk 0.95.00.36-proxy
        NX          nx_config 1.00.05
                    nxsdk 9.0.0
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Stadia      StadiaSDK dev-proxy
        Win32       WindowsSDK 10.0.18362

    *** Important - First release supporting Stadia ***
    This is the first DirtySDK release that supports Stadia.  Most but not all functionality is supported.
    For more detailed information please please contact Gameplay Services.

New in this release:

    DirtySDK (All)
        DirtyGIF, DirtyGraph
            Added support for multiframe GIF decoding.  Frames may be decoded all at once or one at a time.

        DirtyUser
            Added a generic dirtyuser based on uint64_t identifiers and switched all our platforms to using it. Given
            that all our platforms use uint64_t ids there is no reason to require the creation of a platform specific
            version that is exactly the same.

        ProtoHttp
            Added a new error PROTOHTTP_EAGAIN  to be used when we cannot make the request because a resource is not
            available or not ready to be used.

        ProtoSSL
            Added a public API function to expose the pkcs1 verify features internal to protossl. This functionality
            will allow us to verify the RSA signatures when used for cryptographic operations outside the context of a
            TLS connection.

             Added a public function to generate a PKCSv1.5 signature.

    DirtySDK (PS5)
        UserApiPS5, UserListApiPS5
            Added PS5 support for UserApi and UserListApi

    DirtySDK (Stadia)
        NetConnStadia
            Added initial support for the stadia platform. Other modules use the unix versions which work out of the
            box.

            Added a selector 'gpid' to get the player id for the user registered at a given index.

        UserApiStadia, UserListApiStadia
            Adding support for userapi and userlistapi on the stadia platform. For the profile data, stadia only
            supports getting the gamertag and id. For the presence data, stadia only supports getting the availability
            of the user.

        VoipStadia
            Added an implementation of the voip module for stadia. This implementation is generic and inspired from the
            other platforms. It will be expected to change when we start implementing the headset functionality.

        VoipHeadsetStadia
            Added support for the headset module on stadia. Stadia only supports pulling PCM data from the microphone at
            48kHz. For other platforms we normally only support 16kHz but we don't have the option to modify this on
            stadia. Given that 20ms of audio data at 48kHz exceeds our MTU we must compress the audio. To do this we
            have added support for the opus codec which is supported on other supported platforms. Opus is configured to
            use 16kHz by default but for stadia we have modified the build scripts and source to allow bumping that up
            to 48kHz.

Changes in this release:

    DirtySDK (All)
        Base64
             Fixed decoding of non-padded base64. when no padding is present treat the data up to the quad as padded.

        NetConn
            Fixed the issue of NetConnDisconnect being called while the ref count is not zero.

        NetGameDistServ
            Moved some metrics sampling interval validation logic to where it belongs, from gameserveroimetrics.c to
            netgamedistserv.c

            Enhanced debug logging around calculation of idpps, odmpps and inputdrops metrics.

            Replaced NetGamDistServT::bPrevFlowEnabled, NetGameDistServT::bPrevNoInputMode and
            NetGameDistServT::uPrevStatClientCount with respective local variables in functions where their usage was
            limited to. Fixed implementation of NetGameDistControl('rsta') such that it is now limited to reset the
            following boolean variables used to flag if events happened during the sampling interval:
            NetGameDistServT::bClientCountChanged, NetGameDistServT::bFlowEnabledChanged,
            NetGameDistServT::bNoInputModeChanged.

            Fixed implementation of 'ocnt' selector to now return 1 if sampling interval is invalid.

            Fixed implementation of 'drop' and 'icnt' selector to now return 1 if sampling interval is invalid.

        ProtoHttp
            Deprecated the PROTOHTTP_NOTHREADS error (used on PS4/PS5) as the PROTOHTTP_EAGAIN can be used instead as a
            general purpose error across the platforms.

        ProtoSSL
            Fixed an issue where a PSS signature scheme could be chosen when sending a CertificateVerify message for a
            PKCS1 certificate.  This would cause OpenSSL to abort the connection with an illegal parameter alert.

            Fixed a possible null-pointer exception by aborting the handshake if we can't find a valid matching
            signature scheme in RecvCertificateRequest; this situation could only happen with a non-compliant server.

            Fixed SendCertificateRequest() to build the TLS1.2 SignatureAndHashAlgorithms from the available signature
            schemes rather than hard-coding a subset of available signature schemes in the function itself.

            Removing support for ECDSA-SHA512 as we are not looking to support SECP521R1 curves at this time.

        VoipConnection
            Changed the initial value (from 127 to 0) of the variable used to track the last received seq number for
            reliable data messages on a specific voip connection. The previous value was used to make it clear that
            the validity range is limited to [1,127] and that the next expected inbound sequence number at connection
            start is 127 + 1 = 1. This had a knock on in a scenario where we need to send a ACK before inbound traffic
            would have even been received. That scenario seems only possible in server-based connectivity using
            the 1x upload Nx download optimiztion on MIC packets. Upon exercising that race condition, one end of
            the connection would ACK seq nb 127 when in reality it has not yet received packet resulting in reliable
            data traffic flow being broken. The bug fix consists in initializing the variable with 0 instead resulting
            in the next expected inbound sequence number at connection start to be 0 + 1 = 1, and the usage of 0 when
            ACKING before traffic comes in, where 0 means 'ignore this field, no sequence number acked'.

    DirtySDK (GDK)
        ProtoHttpGDK
            Fixed the uri truncation by parsing the information directly from the request headers. If you had a uri
            longer than 256 characters we would truncate the information causing the formatted request headers to fail
            when making the call to WinHttpOpenRequest.

            Changed the behavior on gdk to not automatically redirect before providing the caller with the redirection
            header information. When redirects are enabled with WinHttp, you never get a chance to inspect the
            intermediate header information. Their are certain customers (webkit) that depend on being able to pull out
            the location headers before the redirect is complete.

            Fixed the corruption of the download payload by only resetting the read and recv positions before doing a
            new read. If the caller has read the entire available buffer using ProtoHttpRecv while we have a pending
            WinHttpReadData call (due to having some available space in the buffer), our payload may get corrupted. The
            iInpOff and iInpLen fields get reset to zero when everything is read in ProtoHttpRecv. This causes the
            writes to happen to the wrong location.

            Fixed the processing of the redirect from a POST to a GET by making sure the post size is set to zero. In
            the GDK version of ProtoHttp to handle the state change to ST_HEAD we wait for all the data to be sent based
            on the amount sent and post size.

            Fixed redirect issue when we try to receive the body but a redirect happens by not trying to receive body
            when redirecting. If we are redirecting we will be create a new request and by trying to receive the body
            we put our request tracking in a bad state. We try to receive the response and then put our query async-op
            into the pending state. This puts our async-op in a bad state for the next request that happens.

        ProtoHttpManager
            Fixed requests failing on the GDK platform if pipelining is enabled by disabling this pipelining feature at
            the httpmanager level.

    DirtySDK (Linux)
        DirtyErrUnix
             Fixed the parsing of the errorlist not to exit on an error of zero but use the list term as done on other
             platforms.

    DirtySDK (PC)
        DirtyNetWin
            Fixed local address resolution when using a full tunnel VPN by using an address in the public space to do
            the routing query. With the work from home directive some teams have started trying to use their work PCs
            at home using the full tunneled VPN. On the windows version of dirtynet, the local address resolution tries
            to use 192.168.1.1 for routing query. On home networks you are likely to pick a 192.168.1.x address which
            is the non-VPN adapter's address which will fail to be used for prototunnel connectivity purposes, even
            when the connection does not leave the host.

    DirtySDK (PS5)
        DirtyContextManager
            Added the cleanup of Http2 contexts during shutdown

        DirtyWebApiPS5
            Fixed a merge error. sceNpWebApi2AddHttpRequestHeader should be using the web request id instead.

        NetConnPS5
            Changed the default behavior of the shared dirtywebapi2ps5 to queue up the callbacks ('qcal' selector)

    DirtySDK (XboxOne)
        VoipHeadsetXboxOne
            Changed _VoipHeadsetAddLocalTalker()/_VoipHeadsetRemoveLocalTalker() to no longer invoke
            _VoipHeadsetDumpChatUsers() directly but to now flag a boolean that will result in the users being
            dumped from VoipHeadsetProcess() instead. This is to avoid possible concurrent execution of
            _VoipHeadsetDumpChatUsers() from the socket recv thread (not locking ThreadCrit) and other threads locking
            ThreadCrit, i.e. voip thread and main thread.


EADP Game Services DirtySDK 15.1.6.0.2 - February 14, 2019

        Framework   8.02.01

        Android     AndroidSDK 100.00.00-pr1
                    AndroidNDK 15.2.4203891
                    android_config 5.00.00-pr1
        Capilano    CapilanoSDK 180709-proxy
        GDK         GSDK 191100-proxy
        Kettle      kettlesdk 7.008.001-proxy
                    PlayStation4AppContentEx 6.508.010
                    PlayStation4AudioInEx 6.508.001
        PS5         ps5sdk 0.90.00.24-proxy
        NX          nx_config 1.00.05
                    nxsdk 9.0.0
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Win32       WindowsSDK 10.0.18362

    *** Important - First Gen5 release supporting PS5 and GDK targets ***
    This is the first DirtySDK release that supports Gen5 consoles.  Most but not all functionality is supported.
    For more detailed information please please contact Gameplay Services.

    *** Important - Required framework version updated to 8.x line in support of Gen5 consoles  ***

New in this release:
    DirtySDK (All)
        ConnApi
            Added a debugging print to explain that we are connecting in passive mode and a comment explaining what that
            is.

        NetGameDist
            Added support for client side metrics (rpacklost, lpacklost, odpps, idpps, dist wait time, dis proc time)

    DirtySDK (GDK)
        DirtyErrGDK
            Added the WinHttp specific error mappings to the module.

            Added the errors from xsapi to the file but given that c++ hardcoded the values.

            Added errors that come from winerror that are also used in the xsapi's httpclient.

        NetConnGDK
            Added support for checking the trial information. In the GDK, the request is always asynchronous and thus
            we needed to introduce a control call to kick off the request.

            Added protoupnp support, strictly for informational purposes (no adding/removing port mapping as we rely on
            Microsoft for that).

            Added support for communications check for the 'chat' selector

        PrivilegeApiGDK
            Added support for privilege checks on the GDK

        ProtoHttpGDK
            Added support for the WinHttp library backed implementation of ProtoHttp.

            Added support for send and recv rate throttles as supported on the socket and other protocols. These
            throttles can be queried and controlled via the normal methods ProtoHttpStatus/ProtoHttpControl
            respectively.

        ProtoUpnp
            Added new macro 'dscp' for Gemini use - discovers/describes and finds port mapping but does not attempt to
            add/delete one.

            Added new status flag PROTOUPNP_STATUS_FNDPORTMAP, used to indicate if a port mapping was found on the
            device.

        UserApiGDK
            Added support for pulling profile(s), presence and rich presence information via the userapi module.

            Added support for posting rich presence data.

            Added support for specifying the size of the avatar urls based on what we do on xboxone.

        UserListApiGDK
            Added support for grabbing the social relationships on GDK without pulling any additional information.

            Added support for the avoid and mute list APIs. For this support we are treating avoid list as blocking as
            the closest thing available on that platform.

            Added support for profile, presence and rich presence data lookup as part of the userlist.

            Added handling for the rate limiting errors for retry time.

        VoipHeadsetXboxOne
            Added support for finding the audio endpoint on GDK builds for narration.

        VoipNarrateGDK
            Added support for using XSpeechSynthesizer for doing local narration on GDK builds.

    DirtySDK (PS5)
        DirtyWebApiPS5
            Added support for NpWebApi2 calls.

    DirtySDK (NX)
        NetConnNX
            Added support for setting the dirtysock thread's affinity using the startup param that is used on other
            platforms. The 'affn' selector was also added like on other platforms to query our affinity.

            Implemented NetConnQuery based on implementation of other console platforms. Using the information we have
            already in the module we can query the index based on nickname, uid or first logged in user.

Changes in this release:
    DirtySDK (All)
        ConnApi
            Fixed crash when the secure address on xboxone within our dirtyaddr is not properly set by checking the
            validity of the getaddr call.

        CryptRand
            Changed the module to use a single cryptrand.c source where possible for our various platforms as the
            complexity of the solution was unnecessary.

            Changed the definitions of the CryptRandInit and CryptRandShutdown functions to be private

        DirtyThread
            Fixed race condition crash / assert when the dirtysock core threads shut down by moving the logging before
            the shutdown indicator.

        ProtoHttp2
            Fixed the truncation of the formatted header by ensuring space for the null terminator in our temporary
            buffer we use for HPACK compression

        ProtoHttpManager
            Fixed a crash in a print, because pHttpManager can be null after a disconnect in rare cases.

        ProtoHttpServ
            Fixed boundary issues with chunk headers and trailers not being fully available when receiving a chunked
            transfer.

        ProtoSSL
            Fixed the behavior of the alerting when no certificate is received and one is required based on what is
            specified by the spec.

        VoipDef
            Added VoipHeadsetPreferredDefaultDeviceTypeE enum for use with VoipHeadsetStatus() control selector 'odft'.

            Changed comments to be platform agnostic for VOIP_LOCAL_USER_HEADSETOK, VOIP_LOCAL_USER_INPUTDEVICEOK and
            VOIP_LOCAL_USER_OUTPUTDEVICEOK.

        VoipCommon
            Fixed wrong exit condition for FOR loop that could result in out-of-bound access of
            VoipConnectionListT::bTranscribedTextRequested[] array.

        VoipTranscribe
            Fixed buffer resetting to be more consistently applied.

            Fixed an issue where SendFinish could fail to send when using IBM Watson and websockets, which could result
            in a session timeout from that transaction as the server waits for the close or trailing silence, neither
            of which were being sent, to complete the request.

            Fixed some cases that weren't going through ST_FAIL state properly.

            Fixed to reset record buffer on fail; this resolves some issues with a request following a failure.

            Fixed a rare case where the state machine could be stuck in ST_IDLE permanently.

            Fixed STREAM_END for HTTP2 when finishing a submission (Amazon/Google).

    DirtySDK (GDK)
        DirtyCert
            Fixed the port offset to use the correct one on all xbox platforms (xdk/gdk)

        ProtoHttpGDK
            Fixed incorrect copying of data from ProtoHttpRecvAll after back to back requests by making sure we reset
            our state to default.

        UserListGDK
            Fixed a leak of the xbl context in the case we failed to kick off the async requests.

        VoipHeadsetXboxOne
            Fixed the setting of the bitrate for gdk based on the documentation.
            game_chat_audio_encoding_type_and_bitrate was changed to game_chat_audio_encoding_bitrate on the GDK.

            Fixed a bug where the users "text to speech conversion preference" was not being honored.

    DirtySDK (GDK, XboxOne)
        VoipHeadsetXboxOne
            Changed User^ calls to use 'xuid' and 'gtag' for compatibility with both GDK and XDK

            Removed the platform check for xboxone for bApplyRelFromMuting check on the voip thread.

        VoipXboxOne
            Changed User^ calls to use 'xuid' and 'gtag' for compatibility with both GDK and XDK

    DirtySDK (NX)
        DirtyNetNX
            Fixed issues with NetConnStartup failures due no network connection on the switch

        NetConnNX
            Removed the to do in _NetConnGetPlatformEnvironment(). Note: On NX there is no way for the client to
            determine the environment.

    DirtySDK (PC)
        VoipHeadsetPC
            Changed VOIP_HEADSET_MAXDEVICES to 16 and updated some comments to no longer refer to only output
            devices.

            Changed VoipHeadsetStatus() with control selector 'odft' to take an iValue of enum
            VoipHeadsetPreferredDefaultDeviceTypeE for specifying whether to retrieve the default audio device or
            the default voice communications device, and whether to set the DRVM_MAPPER_PREFERRED_FLAGS_PREFERREDONLY
            flag.

        VoipPC
            Changed print statements in voip status callback for consistency with changes in other platforms.

    DirtySDK (PS4)
        DirtyErrPS4
            Added more webapi 2 errors specific to PS5.

        DirtyWebApiPS4
            Added DirtyWebApiRequestEx to allow the addition of request headers

        NetConnPS4
            Added mapping for CZECH, HUNGARIAN, GREEK, ROMANIAN, THAI, VIETNAMESE and INDONESIAN from sony
            SCE_SYSTEM_PARAM_LANG_* to our LOBBYAPI_LANGUAGE_*.

        VoipHeadsetPS4
            Changed _VoipHeadsetUpdateStatus() to send VOIP_HEADSET_STATUS_INPUT to pStatusCb and changed
            headset references to mic in places where only input device was being checked.

        VoipPS4
            Fixed voip status calback to no longer toggle output device status when an input device is inserted
            or removed. Output device status is now set when local talker is registered and is not updated.

    DirtySDK (PS5)
        NetConnPS5
            Added the 'pscx' and 'pscd' status selector to create/return a user's push context id and to delete a users
            push context id.

            Fixed the gating of the chat restriction, the 'chat' selector returns FALSE when there is no restriction
            instead of TRUE.

            Added mapping for CZECH, HUNGARIAN, GREEK, ROMANIAN, THAI, VIETNAMESE and INDONESIAN from sony
            SCE_SYSTEM_PARAM_LANG_* to our LOBBYAPI_LANGUAGE_*.

        VoipOpus
            Removed the hacks for building on PS5 for the speex package after we upgraded to the latest version.

    DirtySDK (XboxOne)
        DirtyAddrXboxOne
            Modified the DirtyAddrGetInfoXboxOne to validate that the address has been properly set before trying to
            retrieve data.

        NetConnXboxOne
            Added exception handling when adding a new NetworkStatusChanged event handler

        VoipHeadsetXboxOne
            Changed _VoipHeadsetUpdateStatus() to send VOIP_HEADSET_STATUS_INPUT to pStatusCb and changed
            headset references to mic in places where only input device was being checked.

            Changed _VoipHeadsetGetChatUserForVoipUser() to use to_wstring instead of snwprintf

            Fixed gamechat 2 audio buffers not being returned when switching between crossplay modes.

            Fixed first party mute to ignore adjuster none. Muting due to adjuster none is technically not a result of
            first party settings.

            Fixed the way how user chat status is being handled for crossplay.

        VoipXboxOne
            Fixed voip status calback to no longer toggle output device status when an input device is inserted
            or removed. Output device status is now set when local talker is registered and is not updated.

EADP Game Services DirtySDK 15.1.6.0.1 - October 9, 2019

        EA Config   5.14.04
        Framework   7.19.00

        Android     AndroidSDK 28
                    AndroidNDK r15c-1
                    android_config 4.06.01
        Capilano    CapilanoSDK 180709-proxy
                    capilano_config 2.07.02
        Kettle      kettlesdk 6.508.001-proxy
                    kettle_config 2.11.00
                    PlayStation4AppContentEx 6.508.010
                    PlayStation4AudioInEx 6.508.001
        NX          nx_config 1.00.05
                    nxsdk 9.0.0
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Win32       DotNet 4.0-2
                    DotNetSDK 2.0-4
                    VisualStudio 15.4.27004.2002-2-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        DirtyPNG
            Added paletted png decode support.

        NetGameDist
            Added new status selector 'drop' to return the total dropped packets

        NetGameDistServ
            Added a new NetGameDistServStatus2() function that takes more parameters.

            Added 4 new status selector for reporting stats
                'clnu': number of clients
                'drop': total dropped input packet count
                'idps': total input dist packet count
                'odmp': total output dist multi packet count

            Added new control selector 'rsta' to reset stat variables

        ProtoSSL
            Added new ECDSA Gameplay Services Root CA for future use.

        VoipNarrate
            Added VoipNarrateControl('ctsm') to clear text to speech metrics in VoipTextToSpeechMetricsT
            This is used in a fix where incorrect tts metrics may be reported, to make use of this fix update BlazeSDK
            to trama.1.

        VoipTranscribe
            Added VoipTranscribeControl('cstm') to clear speech to text metrics in VoipSpeechToTextMetricsT
            This is used in a fix where incorrect stt metrics may be reported, to make use of this fix update BlazeSDK
            to trama.1.

    DirtySDK (XboxOne)
        VoipConnection
            Added VoipConnectionlistT::bApplyRelFromMuting.

Changes in this release:
    DirtySDK (All)
        DirtyJPG
            Fixed a crash when attempting to decode an unsupported JPEG variant; an error is returned instead.

        NetConnCommon
            Fixed the external list processing potentially being processed by separate threads which can cause double
            destroys by using a crit.

        ProtoSSL
            Fixed to add limited unicode support (truncation of 16bit ASCII characters to 8bit ASCII) to ASN.1
            certificate string parsing.

            Fixed bug that prevented an ECDSA root ca from working.

        Voip
            Fixed a bunch of status/control selector not retuning proper error codes causing log spam.

            Fixed how local voip users set their crossplay flag, which prevents the receiving side from printing this
            incorrect log:
            voipconnection: [0] error, platform 2, persona 1000000517837 attempted to join, but cross play is not
            enabled remotely.

        VoipBlockList
            Improved VoipBlockListIsBlocked, when passed a VOIP_SHARED_USER_INDEX it will check all the local users to
            determine if iBlockedAccountId should be blocked.

            Fixed destruction, by caching the memgroup information and use it on destruction instead of re-querying it.

        VoipCodec
            Added 'plvl' status selector to support querying of current audio power level as calculated for VAD.

        VoipCommon
            Removed superfluous conditions in VoipCommonUpdateRemoteStatus as the same conditions are being checked
            in VoipConnectionSetSendMask() and VoipConnectionSetRecvMask()

            Fixed default channel selection for the shared user.  The default behavior is to have the shared user
            have the most restrictive set of channels between all the local users and blocking communication on the
            shared user if there are no channels shared by all of the local users.

        VoipConnection
            Changed remote user registration path to now flag that reapplying channel config is necessary
            (for join-in-progress only).

            Fixed invalid behavior in the voipconnection due to buffer overrun when making shared user updates by using
            the correct shared user index.

    DirtySDK (iOS)
        NetConnIos
            Fix crash in netconnios when attempting to call into netconn common, but it has no ref to do that.

    DirtySDK (NX)
        DirtyErrNX
            Changed all the error codes to use Nintendo specific ones.

        DirtyNetNX
            Fixed the destruction of the hostname cache to happen after the last _SocketIdle call to ensure we don't
            crash on shutdown.

    DirtySDK (PC)
        VoipHeadsetPC
            Fixed _VoipHeadsetSendEncodedAudio() to use a memcleared voipUser for remoteUser instead of an empty string
            when loopback is enabled.

            Fixed 'aloc' selector incorrectly returning error code upon user going from 'participating' to
            'not participating'.

        VoipNarratePC
            Fixed crash if CoInitialize failed by setting the failure state and not destroying the ref.

        VoipPC
            Removed dead code from _VoipActivateLocalTalker(): inappropriate error handling for 'aloc' selector
            because it can't return a negative value.

    DirtySDK (PS4)
        DirtyErrPS4
            Removed the errors that no longer exist in SDK7.000 conditionally to maintain backwards compat with
            SDK6.500

        DirtySessionManagerPS4
            Fixed an issue where the meta data on the available invites would not be updated if the invite was received
            while we were in the console's REST state, this prevent the user from successfully joining the invite.
            Now upon attempting to join an invite from the system software we will no longer assume the list is up to
            date.

        ProtoHttpPS4
            Fixed redirects failing due to not being able to parse the location header.

    DirtySDK (XboxOne)
        ProtoMangelXboxOne
            Fixed crash in the IncomingAssociationEventHandler by validating that the module ref is still valid and
            unregistering the event handler like we do in other areas of DirtySock.

            Fixed exception that gets thrown when trying to access a security association that was cleaned up by the
            remote peer by not accessing the state.

            Fixed crash when mutating the security association vector between the event handler and main thread by
            protecting the writing with a crit.

            Moved the manipulation of the list before we start the destruction and protect with the new global state
            crit to ensure the operation has succeeded to prevent invalid access to a killed crit.

        UserApiXboxOne
            Added handling of http errors code in _UserApiProcessProfileResponse

        VoipCommon
            Fixed setting bApplyRelFromMuting whenever send masks have been altered, this makes it so the communication
            relationship is reflected by the change of channels.  Prior to this bApplyRelFromMuting was only being set
            when a user was activated, which could result in updates for mute/unmute, not working.

            Fixed the 'umic' and 'uspkr' control selector to set bApplyRelFromMuting to reflect changes in title code
            mute.

        VoipConnection
            Changed remote user registration path to now flag that reapplying communication relationships is
            necessary (for both initial connect and join-in-progress).

        VoipConnection/VoipXboxOne
            Code reapplying communication relationships was moved from VoipConnectionSetSendMask() and
            VoipConnectionSetRecvMask() to the _VoipThread().

        VoipHeadsetXboxOne
            Fixed to capture sttEventCount and sttCharCountRecv metrics.

            Removed the comment block around code dealing with first party mute. First party mute will now work as long
            as you are on XDK July QFE 9.

            Fixed to allow enabling/disabling STT functionality with the 'tran' control for crossplay mode, when you
            are not yet in crossplay mode.

        VoipXboxOne
            Modified local user registration and activation paths to now flag that reapplying communication
            relationships is necessary.

EADP Game Services DirtySDK 15.1.6.0.0 - July 24, 2019

        EA Config   5.14.04
        Framework   7.19.00

        Android     AndroidSDK 28
                    AndroidNDK r15c-1
                    android_config 4.06.01
        Capilano    CapilanoSDK 180702-proxy
                    capilano_config 2.07.02
        Kettle      kettlesdk 6.508.001-proxy
                    kettle_config 2.11.00
                    PlayStation4AppContentEx 6.508.010
                    PlayStation4AudioInEx 6.508.001
        NX          nx_config 1.00.04
                    nxsdk 7.2.1
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Win32       DotNet 4.0-2
                    DotNetSDK 2.0-4
                    VisualStudio 15.4.27004.2002-2-proxy
                    WindowsSDK 10.0.10586-proxy

    *** Important - First crossplay compatible release ***
    This is the first DirtySDK release that supports crossplay. For more information please refer to our
    crossplay integration guide : https://developer.ea.com/display/TEAMS/Cross+Play+Integration+Guide
                                  https://developer.ea.com/display/dirtysock/VoIP+Tech#VoIPTech-CrossplayConstraints
    Crossplay is NOT SHIPPABLE for this release.

New in this release:
    Contrib (ALL)
        VoipOpus
            Changed VoipOpus to be available on pc, ps4 and xone platforms; for use in cross play mode.

            Added speex resampler, to convert to a standard sample rate when needed (for xone).

            Added the _VoipOpusControl selectors:
            'infl'  - Set if the input samples are float via iValue, (default int16)
            'inin'  - Set if the input samples are int32_t via iValue, (default int16)
            'insr'  - Set the input sample rate (default 16000)

    DirtySDK (All)
        NetGameDistServ
            Added the ability to configure a logging callback which allows logging using a different mechanism.
            This is used in cases where we want to log to a different logger on release builds that don't have debug
            logging.

        ProtoHttp
            Added an explicit failure code to report a failure due to the maximum number of redirections being
            exceeded.

        ProtoSSL
            Added the support for enabling and disabling of individual curves.

            Added debug print of from/till times if a certifiicate is determined to be expired.

        Voip
            Added the ability to set the thread affinity for the VoIP thread when it differs from DirtySDK.

        VoipBlockList
            Added VoipBlockList, when integrated with Social's "Muting Web API" produces a cross platform persistent
            muting feature.  An example of its usage is found in BlazeSDK\samples\Ignition\Friends.cpp.  The
            VoipBlockList is created when VoipStartup is called, game code is responsible for calling VoipBlockListAdd,
            VoipBlockListRemove, and VoipBlockListClear as needed to keep the DirtySDK representation of the mute list
            up to date.  It is possible to call VoipBlockListIsBlocked to validate if communication is blocked between
            the two users.  All of these functions operate on a local user index and an account id of the muted user.

    DirtySDK (PC)
        VoipHeadsetPC
            Added '-pbk' and '+pbk' selectors which were available on PC and XOne, making muting functionality
            consistent.

    DirtySDK (PS4)
        VoipHeadsetPS4
            Added cross-play support.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Added 'tsbx' selector, allowing override of test sandbox name.  This obviates the need for hosting a file
            to specify the sandbox  name, although that capability remains.

        VoipXboxOne, VoipHeadsetXboxOne
            Added cross-play support.

Changes in this release:
    DirtySDK (All)
        CryptChaCha
            Changed the implementation of Encrypt and Decrypt to skip Poly1305 if NULL is passed to pTag. In some cases
            we just want to use ChaCha20 to encrypt and decrypt, while not needing to use Poly1305 for MAC.

            Optimized the block operation by using memcpy to eliminate an unnecessary loop.

        CryptNist
            Changed the ECDSA signing operations to generate the signatures deterministically by generating k based on
            the message hash, private key and curve parameters.

            Decreased the size of the private key state, the largest we will need is 48 bytes.

        CryptRand
            Improved our PRNG implementation using CryptChaCha. Since each platform we target has a method to get random
            bytes from their entropy pool and our fallback is not secure, we have opted to move to a new system of
            generating random data. In this new system we use a small amount of random bytes fro the ChaCha cipher key
            and IV (nonce) to generate pseudo random bytes.

        DirtyThread
            Suppressed the 4702 warning around our main thread which caused issues when LTCG is enabled.

            Removed the call to ThreadEnd as the EAThread Mutex assert issue came back on newer versions. The call is
            not needed for the trouble it has caused us.

        NetConn
            Added NetConnAccountInfo struct that stores user's nucleus account id and persona id. 'acid' and 'peid' control
            selectors will be used to populate it.

        ProtoHttpUtil
            Fixed ProtoHttpUrlDecodeStrParm() to reserve space for terminating null character (preventing possible
            overflow of the null).  Also fixed to not read past the end of the input buffer if a percent character
            was the second-to-last or last character.

        ProtoHttp2
            Enhanced the header formatting to use the available space in the output buffer for formatting. This allows
            for formatting much larger headers without extra allocations.

        ProtoSSL
            Changed the module to use platform ds_strsplit and removed the _ProtoSSLSplitDelimitedString.

            Removed CA certificates with < SHA-256 hash, with the exception of VeriSign Class 3 Public Primary
            Certification Authority - G5 which is still required by C&I.  Additionally removed VeriSign Universal Root
            CA that never saw use.

            Fixed server to not automatically enable all TLS1.3 ciphers if TLS1.3 is enabled and no TLS1.3 ciphers
            are enabled.

        Voip
            Removed VoipRemove and VoipConnectionRemove, these functions are no longer called.

            Moved internal functions in voip.h to voipcommon.h which is where our internal/private APIs are located.

            Moved VoipActivateLocalUser to VoipCommon to make sure that customers are calling VoipGroupActivateUser.

        VoipCommon
            Removed the controls in voipcommon that are used internally to prevent customers from calling them. Instead
            of calling the controls, functions were added that are accessible to the source layer of the voip subsystem.

            Moved the VoIP memory function to be part of VoipCommon and removed the implementations for VoipPriv.

            Removed the NULL check for voipcommon state in _VoipCommonTextDataCb as the state will always be valid.
            Headset who calls this callback is owned by VoipCommon, thus it cannot be NULL when getting a callback. This
            code trips coverity defects because it assumes if you check here you have to check in the later parts of the
            function.

            Removed VoipCommonStatus('ruid') and added 'rcvu', since this no longer returns the remote user id. 'rcvu'
            returns the "remote connection voip user"

        VoipConduit
            Added support for multiple VoIP mixers.

            Added support for controlling playback (used for muting) through a playback callback.

        VoipConnection
            Fixed crash when invalid user index is passed into VoipConnectionSend by early returning in this case.

            Changed the shared user index sent to remote players to VOIP_SHARED_REMOTE_INDEX which -1.

        VoipHeadset
            Removed VoipHeadsetStatus('ruid') and added 'ruvu', since it does not operate on id's. 'ruvu' returns (TRUE)
            if the "remote user voip user" is registered in voip headset.

        VoipPriv
            Removed VoipTimerT as it is no longer used.

            Changed VoipUserT to contain only the NetConnAccountInfo, voip user flags and the platform type of
            the voip user. It will no longer contain first party IDs.

            Changed VOIP_NullUser and VOIP_SameUser macros to compare persona IDs.

    DirtySDK (PC)
        CryptRand
            Switched PC to use BCrypt to align with XboxOne.

        VoipHeadsetPC
            Removed the default setting of the volume to 90 on the audio output device. This was interfering with game
            settings.

    DirtySDK (PS4)
        DirtyWebApiPS4
            Fixed DirtyWebApiAddPushEventListener* so it returns a valid id to be passed back to
            DirtyWebApiRemovePushEventListener.

    DirtySDK (NX)
        ZFileNX
            Removed zfilenx as it is identical to unix outside of one function which we ifdef out on that platform.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Enhanced implementation of _ProtoHttpXmlHttpWritingToOutstream() for more robustness. Previous
            implementation assumed that iBlockingOpsThreadResult would always contain a number of bytes accumulated
            equal to the number of bytes originally submitted. After reviewing the implementation of
            SequentialStream::Write(), this assumption proved to be luckily correct (thus this CL being on ml only
            and not being associated with a critical ticket). But it was decided to change the implementation of
            _ProtoHttpXmlHttpWritingToOutstream() to avoid coding pattern based on an "implicit" assumption.
            With the new implementation, things will still work in the future if SequentialStream::Write() is
            modified and no longer behave the same (i.e. it could result in partial accumulation).

        ProtoMangleXboxOne
            Removed entering/leaving MangleCrit in the lambda executed upon completion of the creation of a security
            association. It was left over from a previous implementation and it was no longer protecting any specific
            thread safety access.

        VoipCommon
            Fixed an issue in _VoipCommonReceiveTextDataNativeCb preventing local user from seeing their own Speech To
            Text, requires QFE5 of the July 2018 XDK

        VoipDef, VoipGroup
            Removed VoipCbTypeE::VOIP_CBTYPE_AMBREVENT (xboxone-only bad rep auto mute event). It had been unused
            since rebasing voip xboxone to game chat 2 (i.e. since Shrike.0).

            Removed xboxone-specific fields from VoipSynthesizedSpeechCfgT because the 'voic' control selector is
            no longer usable on xboxone since the introduction of MS Game Chat 2 in Shrike.0.

        VoipHeadsetXboxOne
            Changed implementation to comply with game chat 2 reference doc (Xbox Live API Compiled HTML Help) and
            MS sample code: only call synthesize_text_to_speech() if text_to_speech_conversion_preference_enabled()
            is true for the originator.

            Fixed XMA/audio issues experienced by customers by setting the DO_NOT_USE_SHAPE flag when initializing
            XAudio2 for use with text narration. Based on the conversation with NHL and the Frostbite Audio team. By not
            using DO_NOT_USE_SHAPE we cause the current xma allocations to have bad data.

EADP Game Services DirtySDK 15.1.5.0.2 - June 20, 2019

        EA Config   5.14.04
        Framework   7.19.00

        Android     AndroidSDK 28
                    AndroidNDK r15c-1
                    android_config 4.06.01
        Capilano    CapilanoSDK 180702-proxy
                    capilano_config 2.07.02
        Kettle      kettlesdk 6.508.001-proxy
                    kettle_config 2.11.00
                    PlayStation4AppContentEx 6.508.010
                    PlayStation4AudioInEx 6.508.001
        NX          nx_config 1.00.04
                    nxsdk 7.2.1
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Win32       DotNet 4.0-2
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        DirtyNet
            Added the 'poln' control to do a blocking poll specified in nanoseconds.

            Added a SocktetHostnameCacheProcess function to allow us to expire entries from idle to fix entries never
            expiring.

    DirtySDK (PS4)
        NetConnPS4
            Added play-first trial check using NetConnStatus('pftr') selector.  This capability is disabled by default,
            use -D:dirtysdk-playfirsttrial=true when generating the solution to enable.  Requires the
            PlayStation4AppContentEx package.

            Changed 'tria' selector to additionally return TRUE if play-first trial is enabled.

        VoipHeadsetPS4
            Added two new public api to be invoked from voipcommon: VoipHeadsetTranscribedTextPermissionCheck()
            and VoipHeadsetSetTranscribedTextReceivedCallback().

            Added a new callback synopsis: VoipHeadsetTranscribedTextReceivedCbT.

    DirtySDK (XBoxOne)
        ProtoHttpXboxOne
            Added a period of time before we delete the XmlHttp state to prevent accessing invalid memory from the
            HttpCallbacks. There is a small window after the COM memory has been released where callbacks can still
            be fired. During this period we want to make sure that both the XmlHttp and HttpRef state is still valid
            to prevent crashing. This change will increase the time it takes for the kill list to be cleared.

Changes in this release:
    DirtySDK (All)
        Build
            Removed the vccorlib includes to the sample program module as this is no longer needed vs2015+.

        ConnApi
            Fixed the setup of demangling (and unsetting of addresses) when the game is server hosted but voip is not.
            When Xbox Clients setup their dedicated server client in the client list, the address fields in the client
            info are set to 0. This causes the connections to the dedicated server to failed because of the invalid IP
            addresses.

        ProtoHttpServ
            Fixed incorrect linked list manipulations in _ProtoHttServUpdateListen(). Problem description: Upon
            inserting a new httpthread entry in the httpthread list, if that list already has more than one entry,
            the new entry would incorrectly be inserted after the first entry as the tail of the list... resulting
            in the rest of the list being lost. As a knock-on of this bug, CCS-DirtyCast ssl connections would no
            longer be cleaned up properly... resulting in stunnel spamming with:
                         LOG3[1301]: transfer: s_poll_wait: TIMEOUTclose exceeded: closing

        ProtoSSL
            Fixed TLS 1.3 client to return illegal_parameter alert instead of handshake_failure when no cipher is
            selected.

            Fixed TLS 1.3 client to validate server session id value is empty when the session id sent was empty.

            Fixed TLS 1.3 client to support middlebox compatibility mode for session_id field.

            Fixed TLS 1.3 client to validate Protocol Version or Supported Versions extension.

            Fixed a client bug when a client cert was sent on a previous connection attempt; a subsequent connection
            attempt where a client cert was not sent would result in the client trying to send a CertificateVerify
            handshake message and crashing with a null-pointer exception.

            Fixed TLS 1.3 client/server to abort on non-null compression value.

            Fixed TLS 1.3 server to return unexpected_message alert instead of no_negotiation when receiving a Hello
            Request message.

            Fixed TLS 1.3 server to validate ClientHello version is at most TLS1.2 before parsing supported versions
            extension, which previously could overwrite an invalid version before the version was validated.

            Fixed to move bCertSent/bCertRecv from the state ref to the secure state ref, renamed to bSentCert/bRecvCert.
            These state booleans make more sense being in the secure state, since they track the status of a specific
            session, and also benefit from being automatically reset when a new connection is attempted, which is not
            the case with the overall state.

            Fixed to add handshake state transition validation to prevent invalid messages from causing exceptions,
            e.g. if a KeyExchange message is sent before ClientHello.

            Fixed to add protection for a server giving us an unsupported elliptic curve (a spec violation).

            Fixed to add protection for a hello extension with an extension size extending past the end of the hello.

            Fixed to remove SSL3_MSG_HELLO_RETRY_REQUEST define, as it is not an explicitly defined handshake message,
            and add SSL3_MSG_END_OF_EARLY_DATA handshake define for future reference/use.

        VoipCodec
            Fixed VAD to consider all samples in a frame, instead of just the first.  Found by inspection.

        VoipGroup
            Fixed incorrect low-level conn id to high-level conn id translation logic in
            _VoipGroupManagerDisplayTranscribedTextCallback()

        VoipTranscribe
            Fixes for some possible sources of metrics issue observed in production.

    DirtySDK (NX)
        NetConnNX
            Fixed the shutdown by properly clearing the global ref.

    DirtySDK (PC)
        VoipNarratePC
            Suppressed the warnings from the windows headers which can cause issues on higher warning levels.

    DirtySDK (PC, PS4)
        VoipHeadsetPC,VoipHeadsetPS4
            Fixed crash when TTS is enabled but STT is disabled when doing narration by checking for NULL before calling
            the 'vdis' control.

    DirtySDK (PS4)
        NetConnPS4
            Fixed _NetConnRequestAuthCode() and _NetConnNpAsyncRequest() not returning a negative when an error is
            encountered.

        ProtoHttpPS4
            Removed the call to sceHttpAbortRequest which breaks following redirects in certain scenarios.

        VoipCommon (PS4)
            Fixed chat restriction not being properly enforced for inbound transcribed text (fix is inspired from
            original MS game chat dll implementation). When inbound transcribed text is received from the network,
            voipcommon now passes it to VoipHeadset with a call to VoipHeadsetTranscribedTextPermissionCheck().
            If the permission check passes, then VoipHeadset passes the text back to VoipCommon by invoking the
            new VoipHeadsetTranscribedTextReceivedCbT callback previously registered with
            VoipHeadsetSetTranscribedTextReceivedCallback(). If the permission check fails, VoipHeadset
            instead just drops the text and never invokes the VoipHeadsetTranscribedTextReceivedCbT callback.

    DirtySDK (Unix)
        DirtyNetUnix
            Fixed _SocketPoll(), when processing ppoll result, incorrectly including sockets that were not originally
            included in the poll. Potential knock-on: process showing 100% CPU usage caused by ppoll continuously
            unblocking immediately.

        VoipUnix
            Changed implementation of VoipSetLocalUser() to initialize the local user with user id "dummy_voip_user"
            instead of the string returned by NetConnMAC().  This change was done to work around NetConnMAC() not
            always returning a valid string when used on a VM because the name of the NIC does not match what
            NetConnMAC() is looking for (eth0, eth1 or wlan0). See implementation of _SocketGetMacAddress() in
            dirtynetunix. NetConnMAC misbehaving results in VoipSetLocalUser() creating 'empty' voip user id, and
            the stress client no longer sending voip traffic over established voip connection because the send mask
            is incorrect as a result of the user id being NULL.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Fixed use after free crash in _ProtoHttpProcessKillList by moving the _ProtoHttpUpdateXmlHttp to be the last
            function that is called within the loop.

        UserApiXboxOne
            Fixed read access violation when growing the response buffer after the second PROTOHTTP_RECVBUFF by only
            copying the exact amount of data in the source buffer.

        VoipHeadsetXboxOne
             Enhanced implementation of _VoipHeadsetSetRemotUserOutboundMute() and
             _VoipHeadsetSetRemotUserInboundMute() to guard against the possibility of
             pRemoteChatUser->custom_user_context() being NULL.

        VoipNarrateXboxOne
            Changed the AsyncStatus to be fully scoped which fixes build errors in certain conditions.

EADP Game Services DirtySDK 15.1.5.0.1 - April 9, 2019

        EA Config   5.14.04
        Framework   7.19.00

        Android     AndroidSDK 28
                    AndroidNDK r15c-1
                    android_config 4.06.01
        Capilano    CapilanoSDK 180702-proxy
                    capilano_config 2.07.02
        Kettle      kettlesdk 6.008.001-proxy
                    kettle_config 2.11.00
                    PlayStation4AudioInEx 6.008.001
        NX          nx_config 1.00.04
                    nxsdk 7.2.1
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Win32       DotNet 4.0-2
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

    *** Important - First DirtySDK release with NX Support ***
    This is the first DirtySDK release with official NX support. Currently VoIP, UserApi and UserListApi are not
    supported on this platform.

    *** Important - API Breaking Change ***
    The VoipDisplayTranscribeTextCallback function prototype has been changed to return an int32_t instead of
    returning void.  This enables the user callback to signal that text has been rendered, and prevent the text
    from possibly being rendered again from a different VoipGroup.

New in this release:
    DirtySDK (All)
        Aws
            Added keyPath to signing info.

            Added reading and writing of signed binary events, used in transcription.

        Voip
            Added new VOIP_CBTYPE_TTOSEVENT event type to VoipCallback; this event signals the start and end of TTS.
            It can be used to temporarily override a push-to-talk system to allow the audio to be sent to the other
            player(s) without requiring push-to-talk to be manually activated by the user.

        VoipPC,VoipPS4
            Added auto-muting of audio input when send mask is zero.  This prevents STT from taking place when the user
            is muted, e.g. in a push-to-talk system when PTT is not engaged.

            Added polling of TTOS status and updating the VoipCommon status variable that tracks it.

        VoipCommon
            Added tracking of ttos status, and triggering of VOIP_CBTYPE_TTOSEVENT when ttos status changes.

        VoipHeadsetPC,VoipHeadsetPS4
            Added 'ttos' status selector to indicate when text-to-speech is active.

            Added 'mute' control and status selector to mute input audio, used to prevent transcription when
            a player is not sending any audio.

            Added 'spam' pass-through to VoipTranscribe, to allow setting debug level of that module.

        VoipTranscribe
            Added Amazon Transcribe support.

            Added 'vdsc' control selector to enable/disable the short audio discard behavior that is enabled by
            default.  This is used by the VoipHeadset layer to disable short audio discard during TTS, which
            would otherwise prevent STT of short TTS phrases from working.

    DirtySDK (NX)
        Build
            Added NX support

    DirtySDK (PC)
        VoipHeadsetPC
            Added support for 'txta' control which is used to control how text chat accessibility functions in the context of loopback.

    DirtySDK (PS4)
        VoipHeadsetPS4
            Added support for the 'txta' control to change the behavior when using text chat accessibility features.

    DirtySDK (XboxOne)
        VoipNarrateXboxOne
            Added the narrate module on xboxone to perform non-voip based narration that can be used for text chat.

Changes/fixes in this release:
    DirtySDK (All)
        Aws
            Fixed xcode build warnings due to truncation.

        ProtoHttp2
            Changed to increase header cache size from 1k to 2k; this allows sending and receiving larger headers.

            Changed the implemention to ignore frames from untracked (closed) streams.
            Per the spec: WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the END_STREAM flag.

            Fixed append header rejects new headers if the previous header values were appended to by switching to
            strcmp from strncmp.

        VoipDef
            [API BREAKING] Changed VoipDisplayTranscribedTextCallback to return an int32_t instead of void.  This
            allows the application to indicate when it has displayed transcribed text, and prevent further callbacks
            against other voipgroups with the same text.

        VoipGroup
            Changed the implementation such that the voipgroup layer registers its 'display transcribed text'
            callback with the underlying voip sub-system as soon as the voipgroup manager gets created, and such
            that the voipgroup layer only unregisters that callback upon destruction of the voipgroup manager.
            This change is inspired from the way the 'event' callback is registered/unregistered and it is necessary
            to avoid a possible situation where the 'display transcribed text' callback gets called from the
            voip thread after the voipgroup manager got destroyed, which can happen if the voipgroup manager is
            destroyed after text is submitted for transcription but before the transcription result is received.

            Removed incorrect usage of critical section from VoipGroupSetDisplayTranscribedTextCallback(). Potential
            deadlock before this fix:
                    --> voip thread locking pVoip->Common.ThreadCrit first from _VoipThread() and then blocking on
                        NetCritEnter(&pManager->crit) from _VoipGroupManagerEventCallback()
                    --> main thread locking pManager->crit first from VoipGroupSetDisplayTranscribedTextCallback()
                        and then blocking on NetCritEnter(&pVoipCommon->ThreadCrit) from
                        VoipSetDisplayTranscribedTextCallback()

            Changed _VoipGroupManagerDisplayTranscribedTextCallback() to respond to the new
            VoipDisplayTranscribedTextCallback return parameter and stop iterating through voipgroups if the callback
            returns TRUE.

        VoipNarrate
            Fixed an issue formatting the Microsoft request body where the format string and parameter count didn't
            match.

            Fixed to release any queued requests on destroy.

            Changed VOIPTRANSCRIBE_INPUT_MAX to VOIPNARRATE_INPUT_MAX based on coding standards.

        VoipTranscribe
            Fixed a bug where the STT uDurationMsSent metric was not set to the correct value, often being 0.

            Fixed a bug with google+http encoding where the Base64 request could be terminated too early, resulting in
            a 400 server error.

            Fixed an issue parsing google error response.

            Changed to increase the size of the JSON parse buffer to be able to handle large Amazon responses.

            Changed to increase the ref response buffer substantially to be able to handle large Amazon responses.

            Changed Watson parsing to use the ref parse buffer instead of allocating dynamically.

            Fixed to allow specification of a non-encoded Watson apikey, as VoipNarrate does.  Pre-encoded Watson
            apikeys are still supported, but will be deprecated in the future.

            Fixed Watson/Websockets transcription request failing if the server has timed us out since the last
            request.

            Added smart_formatting enable for Watson (e.g. "one two three" becomes "1 2 3").

            Fixed to eat %HESITATION markers from Watson transcription result, if present.

            Fixed a metrics issue where a buffer could be submitted every VoipTranscribeUpdate() execution while
            receiving a response, if a very large untranscribable buffer was previously submitted.  The impact of this
            issue was that metrics would be ticked every frame and very quickly result in bogus metrics with hundreds
            of imaginary transactions spanning thousands of minutes.  The fix is to wait to submit until the ongoing
            receive operation is complete.  In practice, this situation is very hard to trigger and involves many
            consecutive empty transaction results and a maximum backoff timer of 60s.

        VoipTunnel
            Fixed the voice "squelching" logic to not only release the appropriate rebroadcasting slot(s) when the
            voice originator stops talking, but also when the voice originator mutes a subset of the players
            (voice consumers) to which he is talking.

    DirtySDK (PC)
        VoipDef
            Changed PC VOIP_MAXLOCALUSERS from 1 to 4, to match NETCONN_MAXLOCALUSERS

        VoipHeadsetPC
            Fixed the 'voic' selector and improved voipnarratepc to support other languages with the voic selector.

            Changed PC voip to allow multiple local users, there is still only one device, so there may only be one
            active user at a time. Recording, playback, transcription, STT/TTS metrics only function for the active
            user index.

            Changed VoipHeadsetControl 'aloc' which now takes and store the active user index.

            Fixed transcription buffer size to use define instead of being hardcoded at 256.

            Fixed assignment of iDebugLevel to be done only under DIRTYCODE_LOGGING=1

        VoipPC
            Changed so that all users on a PC will have the same headset status.

            Changed VoipSetLocalUser to take user index into account (like other platforms).

            Changed VoipActivateLocalUser to take user index into account (like other platforms) however with the added
            limitation that only one user can be active at a time, if the active user becomes deactivated a new user
            will be selected if possible.

    DirtySDK (PS4)
        VoipHeadsetPS4
            Fixed severe stuttering audio issue with PS4 camera voip, broken in audio input pipeline refactor in
            Raven.5.

    DirtySDK (Unix)
        DirtyNetUnix
            Moved the SocketHost logging behind a verbosity check to reduce spam that is not helpful in most cases.

    DirtySDK (XboxOne)
        ConnApi
            Fixed the voip server dedicated flow to not perform unnecessary demangling on Xbox One.

        DirtyAuthXboxOne
            Fixed potential deadlocks by adding the missing NetCritLeave calls when returning early due to errors.

        ProtoHttpXboxOne
            Fixed ProtoHttpSend() with an implicit call to ProtoHttpUpdate() to allow internal state machine to be
            pumped when ProtoHttpSend() is called repeatedly without intermediate calls to ProtoHttpUpdate().

            Changed implementation such that ProtoHttpPost(), ProtoHttpPut() and ProtoHttpPatch() can be used without
            a mandatory subsequent call to ProtoHttpSend() as it used to be supported prior to Shrike.0. Fix consists
            in buffering request data passed to ProtoHttpRequestCb2() into a new "pre-send" buffer. A new PRESEND state
            is also introduced to accumulate the content of the pre-send buffer into the xmlhttp object's outbound
            sequential stream before accepting any new data from the user subsequently calling ProtoHttpSend().

            Fixed a bug introduced in Shrike.0 which included a ProtoHttpXboxone refactor to improve the way
            potentially long blocking MS calls are being offloaded to worker threads. The new solution broke an edge
            case involving request redirection. Upon some race conditions, a request redirection may be incorrectly failed.

            Fixed the possibility of an xmlhttp req being stalled in state
            ProtoHttpXmlReqStateE::REQ_ST_WAITING_RESPONSE when a race condition is exercised: xmlhttp req's event
            handler modifying eNextState before the main thread initializes it to REQ_ST_INIT.

            Fixed a crashed in OnError by adding a check for bWaitingForAsyncCompletion in _ProtoHttpProcessKillList().
            bWaitingForAsyncCompletion must be false before xmlHttp can transition states

EADP Game Services DirtySDK 15.1.5.0.0 - January 23, 2019

    This SDK release was built using the following compiler packages:

        EA Config   5.14.04
        Framework   7.19.00

        Android     AndroidSDK 26.0.2-3
                    AndroidNDK r13b-1
                    android_config 4.03.00
        Capilano    CapilanoSDK 180702-proxy
                    capilano_config 2.07.02
        Kettle      kettlesdk 6.008.001-proxy
                    kettle_config 2.11.00
                    PlayStation4AudioInEx 6.008.001
        iPhone      ios_config 1.14.00
        OSX         osx_config 1.20.01
        Linux/Unix  UnixClang 4.0.1
        Win32       DotNet 4.0-2
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

    *** Important - PUBLIC API IMPACTING - ***

    Reference: https://developer.ea.com/display/dirtysock/DirtySock+Shrike+Upgrade+Guide

    CryptMD2 has been removed as MD2 support is obsolete.

    Removed VOIP_LOCAL_USER_MICON which has been unused since PS2 era.

    DirtySDK voip for xboxone now use MS Game Chat 2
        * Game chat 2 now needs to be added as a sdkreference in nant build scripts. This step is needed for the
          game chat 2 dll to be copied to the deployment directory as a post build step.
            <sdkreferences if="${config-system} == 'capilano'">
                Xbox.Game.Chat.2.Cpp.API, Version=8.0
            </sdkreferences>

        * Because MS game chat 2 is internally dealing with retrieval of XBL accessibility settings for the user,
          DirtySDK XboxOne voip no longer needs to be fed with that info by the game code.

        * DirtySDK XboxOne voip is no longer displaying inbound transcribed text in system UI if
          game code does not register a display transcribed text callback. (New behavior resulting from
          VoipHeadsetXBoxOne being rebased from from windows::xbox::chat to MS game chat 2)

        * DirtySDK XboxOne voip no longer supports the feature originally requested by the EA accessibility team: a
          hearing-impaired person requesting transcribed text from other players also wants to see transcribed text
          for his/her own speech. (New behavior resulting from VoipHeadsetXBoxOne being rebased from from
          windows::xbox::chat to MS game chat 2)

New in this release:
    DirtySDK (All)
        AWS
            Added new module to supply various utility functions in support of connecting to AWS services, starting
            with AWS Signature Version 4.

        ConnApi
            Added the game / voip topology configuration to the module, which allows complexity that existed in the
            network adapter to be moved down.

            Added status selectors for the configured timeout values.

        CryptBn
            Added the CryptBnBitAnd and CryptBnBitXor which performs bitwise and; bitwise xor operations

        CryptCurve
            Introduced cryptcurve, an interface over the multiple curve modules we support.

        CryptEcc
            Added a new parameter to CryptEccPointFinal to let us know if we are encoding the shared secret into a
            buffer.

        CryptHash
            Added the ability to lookup the hash based on the size.

        CryptMont
            Added support for X25519 and X448 curves based on RFC7748.

        DirtyLib
            Added the ability to set an option for crits via NetCritInit2 and added an option to enable a crit in
            single-threaded mode for specific multi-threaded scenarios (SocketLookup).

            Added NetLibCrc32 to calculate CRC32, with optional table parameter.

        DirtyMem
            Added new VOIP_PLATFORM_MEMID memory identifier.

        Plat-Str
            Added new string functions ds_fmtoctstring_lc, ds_strtolower, ds_strtoupper, ds_strtrim, and
            ds_strlistinsert in support of AWSV4 signing.

        Plat-Time
            Added TIMETOSTRING_CONVERSION_ISO_8601_BASIC to supported ds_timetostr conversion options.

        ProtoHttp2
            Added the ability to decode the debug data in GOAWAY frames.

        ProtoHttpUtil
            Added ProtoHttpUtilParseRequest() for parsing the first line of an HTTP request, functionality refactored
            from _ProtoHttpServParseHeader()

        ProtoHttpServ
            Added new ProtoHttpServControl2 API to allow setting SSL settings specific to a ProtoHttpServ thread.

        Protomangle
            Added the service name to the demangler query for better tracking

        ProtoTunnel
            Added control to allow setting the behavior for trying a random port on bind failure.

            Added control selectors for maximum number of receive calls per update and idle callback rate.

        VoipConnection
            Added support for "reliable opaque" data type needed for sending/receiving MS game chat 2's reliable data
            frames. (MS Game chat 2's unreliable data frames are sent as 'MIC' packets.)

            Added a iConnId parameter to VoipConnectRecvVoiceCbT and VoipConnectRegUserCbT.

            Added VoipConnectRecvOpaqueCbT.

            Added a uSendMask parameter to VoipConnectionSend().

        VoipHeadset
            Added VoipHeadsetReceiveOpaqueDataCb().

        VoipNarrate
            Added Amazon Polly support.

    DirtySDK (Apple)
        Build
            Added a warning for partial available so the build will fail when the deployment version is too low for the
            APIs we reference.

            Created an objectivec build type that imports all our C warnings that we enable.

        ProtoSSLApple
            Added support for the ALPN extension on versions of the OS that support it.

    DirtySDK (PC)
        VoipNarratePC
            Added a new VoipNarrate PC module
                *Separated TTS SAPI on PC into it own VoipNarratePC module
                *Removed the need of copying the output of SAPI into wav buffers
                *Aligned behavior with the generic VoipNarrate module

    DirtySDK (XboxOne)
        Build scripts
            Added game chat 2 header file directory to include path. Added game chat 2 lib to set of external libs to
            be linked with.

            Added game chat 2 lib to set of external libs to be linked with.

        PrivilegeApiXboxOne
             Added exception handling around usage of xboxone user object methods.

        UserApiXboxOne
             Added exception handling around usage of xboxone user object methods.

        UserListApiXboxOne
             Added exception handling around usage of xboxone user object methods.

        VoipHeadset
            Added VoipHeadsetTranscribedTextReceivedCbT and VoipHeadsetSetTranscribedTextReceivedCallback().

        VoipXboxOne
            Added _VoipUpdateLocalStatus() in charge of polling VoipHeadsetStatus('talk') to detect if local players
            are talking or not.

Changes/fixes in this release:
    DirtySDK (All)
        CommUdp
            Minor fix to use SockaddrInit instead of ds_memclr to make sure the address family is properly specified,
            preventing possible warning in later sockaddr call.

        ConnApi
            Reduced the complexity of the implementation of connapi now that we have knowledge of the topologies and
            hosts.

            Fixed the initialization of the game / voip host, this needs to be happen before any other initialization
            to make sure everything lands in the correct state.

            Replaced usage of ConnApiClientInfoT.uId with uLocalClientId / uRemoteClientId where appropriate. uId is
            used for identification purposes, in cases where we are establishing a connection the uLocalClientId and
            uRemoteClientId are to be used.

        CryptEcc/CryptNist
            Changed the module to split up the DH and DSA states, which allows them to be used independently.

            Changed the implementation to allocate the table on the fly instead of keep it in the state. This work
            reduces the sitting memory consumption.

            Changed the initialization of the curve state to use the curve identifier.

            Renamed CryptEcc to CryptNist, CryptNist is more specific to the curves we support in the module.

        CryptHmac
            Fixed to work with keys longer than the block size.

        CryptMont
            Changed the implementation to return an error if passed an unsupported curve identifier.

        DirtyLib
            Changed the NetCritInit functions to return an error if the internal allocation fails.

        DirtyNet
            Changed SocketBind to fail if the virtual socket is already bound.

            Improved the thread safety in SocketDestroy by protecting the calls to SocketClose. SocketClose may be
            invoked at the same time that the DirtyNet subsystem is being destroyed which we must protect against.

            Replaced the use of uCalllast = 0xFFFFFFFF to the boolean bInCallback to prevent the potential of colliding
            with a valid tick value

        DirtyThread
            Changed the thread initialization to set the processor to any.

        Hpack
            Increased the temporary buffer for header parsing to prevent header value truncation.

            Fixed the encoding of large header values (over 127 bytes) to properly encode the size by offsetting after
            the value has been written.

        JsonParse
            Fixed an issue in JsonFind where parsing an incomplete object caused by invalid JSON could cause a crash.

        NetGameDist
            Fixed compilation errors inside the TIMING_DEBUG defines.

        Platform
            Removed unused undefs and defines in this module.

        ProtoHttp
            Changed the calling of the custom header callback to pass NULL and 0 to pData and iDataLen in preparation
            for these parameters being deprecated.

        ProtoHttp2
            Changed the implementation to validate the frame header and the individual frame types payloads per the
            spec.

            Fixed documentation for some internal enumerations and fixed SETTINGS_NUM to use the correct value.

            Enabled huffman coding for HTTP/2 header by default.

            Fixed the content-length header to be all lower case.

            Changed "not enough room" debug print in ProtoHttp2Send use verbosity level 1 so that it is not enabled at
            the default logging level.

        ProtoHttpUtil
            Removed the call to ProtoHttpGetLocationheader via ProtoHttpGetHeaderValue as the functionality was
            deprecated.

        ProtoSSL
            Fixed to send of empty renegotiation_info extension in ClientHello; there are a small number of
            servers that require this or will fail the connection.

            Fixed to send of empty renegotiation_info extension in ServerHello if the client sent one.

            Changed to add no_renegotiation warning alert response by client if a server attempts to renegotiate.

            Fixed a TLS1.3 issue where receiving a ChangeCipherSpec immediately following a HelloRetryRequest would not
            be correctly ignored, because the supported_versions extension in the HRR was not being parsed.

            Changed _RecvCertificate to simplify and clarify the certificate parsing, as well as do a better job
            skipping certificates that aren't a part of the chain and might violate some of the other checks which
            previously would have resulted in verification failure.

            Removed TLS1.3 draft revision support, and updated all draft RFC links to reference the published final RFC
            instead.

            Removed SSLv3 version support (previously disabled by default).

            Removed RC4 cipher suites (previously disabled by default).

            Cleaned up some remaining unused MD2 signature algorithm definitions.

            Reorganized/renamed most functions to provide better and more consistent readability.  No functional
            change.

            Fixed some out-of-date curve defines that limited the 'crvd' selector to only choosing the first two
            curves.

            Added full support for RFC8446 style downgrade detection; added server support for setting random values,
            added client support for detecting and aborting a TLS1.2 request being illegally downgraded).

            Added server support for remembering HRR cipher we sent, and making sure it is selected when we send the
            following ServerHello.  Added client support for remembering HRR cipher we received, and making sure we get
            it from the ServerHello, alerting if not.

            Fixed to send an illegal_parameter alert when client parses a supported_versions extension with no versions
            we support.

            Changed debug output of connecting hostname to include "using TLSx".

        ProtoStream
            Fixed copy of error text to copy only the error text (was also copying leftover data from previous request).

        ProtoWebSocket
            Removed the Listen/Accept functions as we do not have plans on adding server functionality at this time.

            Removed ProtoWebSocketConnect2 function as it is not used for anything. Please use ProtoWebSocketConnect
            function instead.

        VoipCommon
            Enhanced implementation of VoipCommonContro('vcid') to support usage of client id 0.

        VoipConnection
            Changed resetting the VOIP_LOCAL_USER_SENDVOICE and VOIP_REMOTE_USER_RECVVOICE to be triggered if we have
            not sent or recv a mic packet within the VOIP_PING RATE.

            Enhanced implementation to support scenarios where blaze ends up exercising the solution in such a way
            that VoipControl('vcid') gets called with a 0 value. A client id of 0 is now valid and a boolean is now
            used to indicate whether the 'vcid' selector was used to set the local user id.

        VoipDef
            Removed VOIP_LOCAL_USER_MICON which has been unused since PS2 era.

            Changed VOIP_MAXCONNECT from 30 to 32.

        VoipNarrate
            Changed VoipNarrateConfig() to no longer take a VoipNarrateRefT, the supplied configuration is stored
            globally and used in all calls to VoipNarrateCreate().  VoipNarrateCreate() will fail if not configured
            properly.

            Changed VoipNarrateStatus() to have an additional argument 'iValue' to match the same function signature of
            other status functions.

        VoipSpeex
            Changed speex codec to use the built-in VoipCodec VAD instead of re-implementing internally.

        VoipTranscribe
            Changed VoipTranscribeConfig() to no longer take a VoipTranscribeRefT, the supplied configuration is stored
            globally and used by all calls to VoipTranscribeCreate(). VoipTranscribeCreate() will fail if not configured
            properly.

            Changed VoipTranscribeSubmit() to no longer take an iUserIndex argument, MLU was implemented above this api.

            Changed VoipTranscribeGet() to no longer take an iUserIndex argument, MLU was implemented above this api.

            Changed VoipTranscribeStatus() to have an additional argument 'iValue' to match the same function signature
            of other status functions.

        VoipTunnel
            Changed the module to use the VoipPacketHeadT definition from voippacket.h

    DirtySDK (Apple)
        ProtoSSLApple
            Moved the validation of the peer certificate to its own function and state. The validation of the peer
            certificates plus the handshaking causes a performance spike. Moving this into a different state and
            function makes it so it gets processed on the next update.

            Removed RC4 cipher suites.

            Fixed a crash when calling ProtoSSLClrCACerts before ProtoSSLShutdown by correctly offsetting the array in
            the former function.

            Changed the implementation to redirect our allocation to DirtyMem using a custom allocator.

    DirtySDK (iOS)
        NetConnIos
            Fixed a strict prototypes build warning by removing prototypes that were not needed.

    DirtySDK (PC)
        VoipHeadsetPC
            Moved the creation of the voice transcription module until it is needed, this saves memory when not in use.

            Removed 'qual' selector from VoipControl; none of the codecs we support reference it.

    DirtySDK (PS4)
        DirtyContextManagerPS4
            Fixed DirtyContextManagerShareNetPool() to properly select the lowest slot ref counted NetContext that has a
            context size that is greater or equal to the request iNetPoolSize

        DirtyNetPS4
            Removed the attempted optimization when receiving from the packet queue does not return any data. Given that
            the clients and servers don't have a packet rate such that this would be necessary we felt that it is best
            to remove it. In observed cases this extra call would result in EAGAIN.

        DirtySessionManagerPS4
            Changed the server driven session to be enabled by default.

            Removed unused parameters from DirtySessionManagerCreate.

            Added multi-threaded protection for global variable _ProtoHttp_State.

        DirtyWebApiPS4
            Changed to deleting the request after sceNpWebApiAbortRequest. This is following Sony guidance in ticket
            https://ps4.siedev.net/forums/thread/115651.

        ProtoHttpManager
            Compiled out the 'pipe' control call on PS4 because the underlying implementation does not support it.

        ProtoHttpPS4
            Fixed the implementation so that the recv throttling doesn't incorrectly cause the request to finish
            prematurely.

            Fixed the header formatting to use the input buffer instead of our header cache to prevent truncation.

            Fixed the parsing of large parsing values by increasing the buffer we used to parse.

            Fixed the request functions to actually send the amount of payload data we sent.

            Refactored the call to sceHttpSendRequest() to optionally be called on its own thread.

            Fixed a truncation error with _ProtoHttpIsPEMFormat() function by changing the return type from a uint8_t to a int32_t.

        VoipHeadsetPS4
            Moved the creation of the voice transcription module until it is needed, this saves memory when not in use.

            Moved the creation of the voice narration module until it is needed, this saves memory when not in use.

            Changed VoipHeadsetStatus('sttm'), MLU is now supported; get VoipSpeechToTextMetricsT via pBuf, user index
            is iValue.

            Changed VoipHeadsetStatus('ttsm'), MLU is now supported; get VoipTextToSpeechMetricsT via pBuf, user index
            is iValue.

            Fixed the +-pbk to include the shared user

    DirtySDK (Unix)
        DirtyNetUnix
            Removed the attempted optimization when receiving from the packet queue does not return any data. Given that
            the clients and servers don't have a packet rate such that this would be necessary we felt that it is best
            to remove it. In observed cases this extra call would result in EAGAIN.

            Changed the implementation to allow 'poll' to be called when not in single-threaded mode.

            Changed implementation of _SocketGetMacAddress() such that additional interfaces can easily be added to the
            hardcoded default list of interfaces used for mac addr query attempts.

        NetConnUnix
            Fixed the order of operations in shutdown to make sure ProtoSSL is shutdown after its dependents.

        VoipUnix
            Fixed VoipActivateLocalUser() not properly forcing re-application of channel config.

    DirtySDK (XboxOne)
        ConnApi
            Fixed XboxOne attempting to demangle the connection to the dedicated server when the voip topology is set to peer
            web.

            Changed the logic for setting up the connection state on XboxOne to always set our gameinfo / voipinfo to be
            INIT / Demangled as we never connect to ourselves.

        ProtoMangleXboxOne
            Enhanced processing of entries in killlist that are in "listening" state.  Because there is no system async
            op in progress while in that state, we can immediately proceed with a final clean up as soon as the
            association is on the killlist.

        ProtoHttpXboxoOne
            Changed the implementation to address the module potentially negatively impacting the performance of the
            game thread using it. Refactored the way potentially long blocking MS calls are being offloaded to worker
            threads. The new solution is involving a single dedicated thread (same lifetime as request object) to which
            we offload as little as possible to minimize potential threading issues. As a result of this refactor,
            usage of critical section has significantly been reduced.

        ProtoWebSocketXboxOne
            Switched back to the base implementation of ProtoWebSocket on XboxOne. The implementation that is provided on
            XboxOne leaves out features that are required for our public API. There are no strict requirements on using
            their implementation for WebSockets.

        UserListApiXboxOne
            Fixed typo in typdef for struct UserListApiPlatformUserContextT as it was colliding with types in
            UserApiXboxOne.

            Changed to be not case sensitive when checking for "retry-after:

        VoipCommon
            Changed implementation such that XboxOne is no longer displaying inbound transcribed text in system UI if
            game code does not register a display transcribed text callback.

            Changed the implementation such that transcribed text to be displayed is now received with a callback
            registered with VoipHeadsetSetTranscribedTextReceivedCallback() instead of a callback registered with
            VoipConnectionSetCallbacks().

        VoipHeadsetXboxOne
            Changed the implementation to now use MS game chat 2 instead of windows::xbox::chat.

            Changed VoipHeadsetStatus('sttm') will no longer be able to provide metrics for speech to text, as this
            info is hidden within game chat 2.

            Changed VoipHeadsetStatus('ttsm'), MLU is now supported; get VoipTextToSpeechMetricsT via pBuf, user index
            is iValue.

        VoipPriv
            Removed the specialized VoipUserExT. No longer needd after rebasing VoipHeadsetXboxOne from
            windows::xbox::chat to MS game chat 2. DirtySDK XBoxOne voip now uses VoipUserT like all
            other platforms.

        VoipSerialization
            Removed. No longer needed after rebasing VoipHeadsetXboxOne from windows::xbox::chat to MS game chat 2.

        VoipXboxOne
            Fixed the calculation of the length of time the voip thread took to be milliseconds and not microseconds.

            Changed VOIP_THREAD_SLEEP_DURATION from 20 ms to 40 ms to meet MS game chat 2 requirements.

            Removed code for auto muting of bad rep user. This is all handled internally by MS game chat 2 now.


EADP Game Services DirtySDK 15.1.4.0.5 - December 20, 2018

    This SDK release was built using the following compiler packages:

        EA Config   5.07.00
        Framework   7.10.00

        Android     AndroidSDK 26.0.2-2
                    AndroidNDK r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.07.00
        Kettle      kettlesdk 5.508.071-proxy
                    kettle_config 2.09.00
                    PlayStation4AudioInEx 5.508.001
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang 4.0.1
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

    *** Important - This release includes full support for VoIP Accessibility on all platforms ***
    VoIP Accessibility includes Transcription (Speech to Text or STT) and Narration (Text to Speech or TTS), in order to
    fulfill the requirements of the Computer and Video Accessibility Act (CVAA) that will be enforced in the US starting
    January 1st, 2019.  Previous releases included support of both STT and TTS for the Xbox One and TTS for the PC; this
    release adds support for STT on PC and TTS and STT on PS4.

    Also includes feature request from EA accessibility team: a hearing-impaired person requesting transcribed text from
    other players also wants to see transcribed text for her/his own speech. VoipDisplayTranscribedTextCallbackT
    callback is invoked with iConnId parameter set to -1 when transcribed text is from a local user.

    Integration requires the application to support rendering of STT text to the screen and acquisition of text from the
    user for input into TTS.  Please see https://developer.ea.com/pages/viewpage.action?pageId=183248884 or email
    GS-DirtySock Support for more information.

    *** Important - PUBLIC API IMPACTING - ***
    With the addition of full support of PC and PS4 platforms for Accessibility, some API changes have been made to
    present a more unified and consistent interface:

       - Changed public STT interface to use a utf8-encoded char string instead of wchar_t string
       - Changed synopsis of 'stot' control selector: iValue parameter used to be enable/disable, it is now local
         user index; pValue parameter used to be local user index, it is now enable/disable.
       - Renamed VoipSetTranscribedTextReceivedCallback() to VoipSetDisplayTranscribedTextCallback()
       - Renamed VoipGroupSetTranscribedTextReceivedCallback() to VoipGroupSetDisplayTranscribedTextCallback()
       - Renamed VoipTranscribedTextReceivedCallbackT to VoipDisplayTranscribedTextCallbackT
       - VoipDisplayTranscribedTextCallbackT callback can now be invoked with iConnId parameter set to -1 when
         transcribed text is from a local user
       - XoneSynthesizedSpeechCfgT and PCSynthesizedSpeechCfgT have been unified into a single structure with
         platform-specific elements and renamed to VoipSynthesizedSpeechCfgT

New in this release:
    DirtySDK (All)
        ConnApi
            Added usage of the new VoipGroupControl('self') to inform the underlying voipgroup of the local slot
            index in the game.

        ProtoStream
            Added ProtoStreamOpen2() to allow use of POST requests.

            Added minimum buffer concept for callback; if specified, a callback will never provide less than this
            minimum amount of data, unless it is the end of the stream.

            Added cache of HTTP error response body and added 'serr' selector to return it.

        Voip
            Added STT/TTS metrics structures, VoipSpeechToTextMetricsT and VoipTextToSpeechMetricsT, which contain
            fields used to track usage of the voip accessibility features.

        VoipGroup
            Added new VoipGroupControl('self') selector to be used by ConnApi to inform the underlying voipgroup of
            the local slot index in the game.

    DirtySDK (PC,PS4)
        VoipTranscribe
            Added new module to encapsulate cloud-based transcription (Speech to Text) services for the purpose of
            transcribing VoIP audio.  This module is fully integrated in DirtySDK VoIP and does not need to be accessed
            directly.  Configuration of this module happens via a Blaze server configuration.  This version supports
            local user indices but does not currently support multiple local users.

    DirtySDK (PC)
        VoipHeadsetPC
            Added support for VoipTranscribe module.

            Added VoipHeadsetStatus 'sttm', to get the VoipSpeechToTextMetricsT via the passed in buffer.

            Added VoipHeadsetStatus 'ttsm', to get the VoipTextToSpeechMetricsT via the passed in buffer.

    DirtySDK (PS4)
        VoipHeadsetPS4
            Added support for VoipNarrate and VoipTranscribe modules.

            Added call to sceAudioInIsSharedDevice(), used to replace
            sceVoiceGetPortAttr(SCE_VOICE_ATTR_AUDIOINPUT_DEVICE_CAMERA), supplied by the new AudioIn_03 library.

            Added silence detection for discontinuous transmission (previously supplied by sceVoice) and transcription.

            Added VoipHeadsetStatus 'sttm', to get the VoipSpeechToTextMetricsT via the passed in buffer.

            Added VoipHeadsetStatus 'ttsm', to get the VoipTextToSpeechMetricsT via the passed in buffer.

        VoipNarrate
            Added new module to encapsulate cloud-based narration (Text to Speech) services for the purpose of producing
            VoIP audio from text.  This module is fully integrated in DirtySDK VoIP and does not need to be accessed
            directly.  Configuration of this module happens via a Blaze server configuration.  This version supports
            local user indices but does not currently support multiple local users.

    DirtySDK (XboxOne)
        VoipHeadsetXboxOne
            Added VoipHeadsetStatus 'sttm', to get the VoipSpeechToTextMetricsT via the passed in buffer.

            Added VoipHeadsetStatus 'ttsm', to get the VoipTextToSpeechMetricsT via the passed in buffer.

Changes/fixes in this release:
    Contrib (PC)
        VoipOpus
            Changed sampling rate from 8khz to 16khz for improved audio quality, and to match transcription audio input
            rate.

            Fixed decoder not accumulating into the output buffer, which broke >2p VoIP.

    DirtySDK (All)
        Base64
            Fixed _Base64Encode, which was erroring out if the encoded size plus null terminator would exactly fit the
            output buffer size.

        CryptEcc
            Changed the definition of the number of iterations to allow teams to override it if they choose.

        NetConn
            Fixed the module startup to assign the global ref after the full startup is complete, this makes it so that
            'open' reports correctly.

        NetGameDist
            Changed the _ProcessPacketType to prevent setting bRecvMulti on the server. bRecvMulti is only meant for
            clients to tell if they are in 2-player peer-to-peer games or server based games.

        ProtoHttp
            Fixed to not abort streaming post on header response if the response is successful (in the 200 range).

        ProtoHttp2
            Changed the timer to be updated only when creating a new connection, instead of every time we create a new
            request. We don't want to artificially update the timer when we have yet to send data. This could cause us to
            get stuck in ST_CONN if we try to create new requests quicker than we can timeout.

            Changed the send behavior to return zero bytes sent if we don't have space but are not sending a zero sized
            payload (stream end). This aligns with how other modules handle similar cases.

        ProtoSSL
            Fixed an issue processing fragmented handshake packets found when testing TLS1.3 connections to servers
            using Facebook's new TLS library ("fizz").

            Fixed an issue where a private key file passed in without a signature was misidentified as ECDSA due to an
            uninitialized variable in _FindPEMCertificateData.  This would cause the key file to fail to load and the
            subsequent connection request to fail.

        ProtoStream
            Changed some debug verbosity levels.

        ProtoUpnp
            Fixed the handling in cases that we might send zero bytes in a post. In this situation we need to make calls
            to ProtoHttpSend to send the remaining data.

        ProtoWebsocket
            Changed to disable "append header is the same" debug spam at default verbosity, matching the behavior of
            other protocols.

        Voip
            Renamed VoipTranscribedTextReceivedCallbackT to VoipDisplayTranscribedTextCallbackT.

            Renamed VoipSetTranscribedTextReceivedCallback() to VoipSetDisplayTranscribedTextCallback().

            Changed XoneSynthesizedSpeechCfgT and PCSynthesizedSpeechCfgT to be unified into a single structure with
            platform-specific elements and renamed to VoipSynthesizedSpeechCfgT.

        VoipCommon
            Changed synopsis of 'stot' control selector: iValue parameter used to be enable/disable, it is now local
            user index; pValue parameter used to be local user index, it is now enable/disable.

            Renamed VoipTranscribedTextReceivedCallbackT to VoipDisplayTranscribedTextCallbackT.

            Changed _VoipCommonTextDataCb (callback to handle locally generated transcribed text) to not only send
            transcribed text to remote users, but to additionally display it locally if the local user has STT enabled.

            Changed implementation to now enable text transcription locally if any local user is requesting text
            transcription from remote users.

        VoipGroup
            Changed implementation of _VoipGroupManagerDisplayTranscribedTextCallback() such that it can now surface
            up not only transcribed text from remote users, but also locally transcribed text from local users.

            Renamed _VoipGroupManagerTranscribedTextReceivedCallback() to
            _VoipGroupManagerDisplayTranscribedTextCallback().

            Renamed VoipGroupSetTranscribedTextReceivedCallback() to VoipGroupSetDisplayTranscribedTextCallback().

        VoipHeadset
            Changed VoipHeadsetDisplayTranscribedText() to be an xboxone only api because all other platforms
            had stubbed implementation for it. Also renamed it from VoipHeadsetDisplayTranscribedText() to
            VoipHeadsetDisplayTranscribedTextInSystemUI() to avoid confusion with the new
            VoipDisplayTranscribedTextCallbackT callback.

    DirtySDK (PC)
        VoipHeadsetPC
            Changed sampling rate from 11.025khz to 16khz for improved audio quality, and to match transcription audio
            input rate.

            Fixed a crackle and pop issue with PC TTS.

            Renamed VoipHeadsetControl('stot') to VoipHeadsetControl('tran') for enabling local transcription.

    DirtySDK (PS4)
        DirtyErrPS4
            Changed to include audio in/out errors.

            Changed audio input path from sceVoice to use sceAudioIn, to gain access to the uncompressed voice audio for
            the purpose of transcription.

        VoipHeadsetPs4
            Renamed VoipHeadsetControl('stot') to VoipHeadsetControl('tran') for enabling local transcription.

            Removed deprecated SCE_VOICE_EVENT_AUDIOINPUT_MUTE_STATUS enum. It was never used by Sony.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Fixed 'xusr' to early return when an error occurs

        ProtoHttpXboxOne
            Fixed a memory stomp when terminating our header buffer when the size of the header is larger than that of
            the header cache by terminating the source instead of the destination.

        UserApiXboxOne/UserListXboxOne
            Fixed the module to correctly handle timeout errors. In CL1332066, we added a new recv error code to inform
            users that a timeout had occurred. While doing this there were several modules that were not catching this
            case.

        UserApiXboxOne
            Fixed the handling in cases that we might send zero bytes in a post. In this situation we need to make calls
            to  ProtoHttpSend to send the remaining data.

        VoipHeadsetXboxone
            Enhanced robustness with new exception handling around the retrieval of the encoder object to be used to
            encode locally acquired voice samples. This is added to mitigate the impact of very low-rate prod crashes
            reported by NBA.

            Changed the handling of "bystanders". Adding bystanders to the chat session is no longer working with recent
            XDK/recoveries. As soon as a "bystander" is added to the chat session all subsequent chat session updates
            fail. After reporting the issue to Microsoft, we were told that Windows::Xbox::Chat is completely deprecated,
            and that we could stop adding bystanders without any risk of certification failures.

            Changed VoipHeadsetDisplayTranscribedTextInSystemUI() to support both local and remote originators for
            transcribed text.

            Renamed VoipHeadsetControl('stot') to VoipHeadsetControl('tran') for enabling local transcription.

EADP Game Services DirtySDK 15.1.4.0.4 - October 29, 2018

    This SDK release was built using the following compiler packages:

        EA Config   5.07.00
        Framework   7.10.00

        Android     AndroidSDK 26.0.2-2
                    AndroidNDK r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.07.00
        Kettle      kettlesdk 5.508.071-proxy
                    kettle_config 2.09.00
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        ProtoHttp2
            Added support for checking if an idle connection is still active to prevent any unwanted issues if the
            server silently goes away.

Changes/fixes in this release:
    DirtySDK (All)
        ConnApi
            Fixed a bug introduced in the context of GOSREQ-1975 (Refactored the DirtyCast/nonDirtyCast dedicated
            server divergent code paths). To align with the DirtyCast implementation, the conn index passed to
            VoipGroupConnect() is being decremented by 1 to save the spot unnecessarily used by the voipserver
            in the voip sub-system (because there is no voipconnections to the voipserver itself). But the
            call to VoipGroupControl('vcid') was not tailored in the same manner. It now is.

        DirtyCert
            Fixed deadlock when disconnecting from the redirector and updating at the same time by not waiting on the
            module crit when updating. Given that the window that this can occur is rare, we can just try the lock in
            the update case to prevent deadlocking in the future.

        DirtyNet
            Fixed logic used to decrement pPacketQueue->iPacketTail in SocketPacketQueueAllocUndo(). Upon an underflow
            resulting from decrementing the tail when it is 0, the logic proved to only work when
            pPacketQueue->iMaxPackets was a power of two. After the fix, the logic works for any value of
            pPacketQueue->iMaxPackets.

        ProtoHttpManager
            Fixed the update so that we can process idle protohttp refs. ProtoHttp requires that we allow it to do idle
            processing to handle connection wide events.

        VoipGroup
            Removed an early return in VoipGroupConnStatus and VoipGroupRemoteUserStatus which hid the correct status
            information when a suspended connid is queried.

    DirtySDK (PC)
        VoipOpus
            Fixed the accumulation of the output buffer as required by the voip mixer. Before if we received multiple
            voice bundles we would only write one.

    DirtySDK (PS4)
        DirtyWebApiPS4
            Fixed a crash if initialization fails by checking for NULL and configuring the thread life correctly.

EADP Game Services DirtySDK 15.1.4.0.3 - August 24, 2018

    This SDK release was built using the following compiler packages:

        EA Config   5.06.00
        Framework   7.10.00

        Android     AndroidSDK 26.0.2-2
                    AndroidNDK r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.03.00
        Kettle      kettlesdk 5.008.071-proxy
                    kettle_config 2.06.03
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        VoipGroup
            Added a selector to get the mute all status from the voipgroup.

        QosClient
            Added a new error code QOS_CLIENT_REQUEST_STATUS_ERROR_TIMEOUT_PARTIAL so we can distinguish a qos test
            that wasn't successful getting any probes round trip, vs one that was at least partially successful.

Changes/fixes in this release:
    DirtySDK (All)
        ConnApi
            Fixed a crash if we try to abort demangling on xbox one when we are not currently demangling.

        DirtyNet
            Fixed size of internal structure (HostentT::name[]) used during DNS name lookup: increased size from 64
            bytes to 256 bytes to support recent scenarios involving names longer than 64 chars. The maximum DNS name
            length is 253 characters

        ProtoHttp2
            Fixed the 31-bit value parsing/decoding that caused incorrect behavior in the module. When decoding the
            stream id and window update increments we were masking out the high bit after shifting instead of before,
            which caused to get incorrect values.

        QosClient
            Fixed a potential issue where resources would not be freed on SocketLookup failure.

            Enhanced error checking, so that received data is at least the size of a probe before processing it.

        VoipCommon
            Enhanced error handling around VoipHeadsetCreate()

        VoipGroup
            Changed the code to ignore mute all if it has already been done.

    DirtySDK (iPhone/OSX)
        ProtoSSLApple
            Fixed being stuck in a bad state when an error occurs in setup by cleaning up the secure state in those
            instances.

    DirtySDK (PC)
        VoipOpus
            Changed the default for opus to use the built in voipcodec vad support to help with stuttering.

    DirtySDK (PS4)
        NetConnPS4
            Removed the code terminate the UserService as this uninitentially left in. When we still supported
            disabling IEAUser, we needed to use the user service to work how our legacy code worked.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Fixed a crash in the suspend handler by refactoring the code to more careful in how we signal the invalidity
            of the xmlhttp requests.

        VoipHeadsetXboxone
            Fixed possible crash conditions upon VoipHeadsetDestroy() being called from within VoipHeadsetCreate().

EADP Game Services DirtySDK 15.1.4.0.2 - July 12, 2018

    This SDK release was built using the following compiler packages:

        EA Config   5.06.00
        Framework   7.10.00

        Android     AndroidSDK 26.0.2-2
                    AndroidNDK r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.03.00
        Kettle      kettlesdk 5.008.071-proxy
                    kettle_config 2.06.03
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        UserApi
            Added a new selector 'rrsp' to disable UserApi from returning First Party raw response.

    DirtySDK (PC)
        VoipHeadsetPC
            Added Text-to-Speech functionality. You can now use the 'ttos' selector to send text as voice.

Changes/fixes in this release:
    DirtySDK (All)
        CommUdp
            Fixed the calculation of the packets we can fit in the buffer to account for the encoded subpacket size to
            prevent prototunnel rejecting our packets.

        ConnApi
            Fixed crashes when creation of the protomangle ref fails on XboxOne by guarding calls to that module.

        NetGameDist
            Fixed _SetDataPtrTry to correctly identify uIndexB when we are looking at the server outbound queue.

        ProtoHttp
            Fixed failure to invoke the write callbacks with data when we received but have not processed the whole
            chunked response.

        ProtoTunnel
            Fixed to not rematch on an OUTOFORDER decrypt result, which causes a stream desync and the connection to
            fail.

        QosClient
            Fixed bug where in some error conditions a protohttp2 stream would be leaked.

            Increased the logging level on protohttp2 used by QoS2.0 to potentially give insight into if the coordinator
            is not responding to the client sending results.

    DirtySDK (PS4)
        ProtoHttpPs4
            Fixed failure to invoke the write callbacks with data when we received but have not processed the whole
            chunked response.

            Fixed no content length downloads to properly calculate the body size when the download is complete.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Fixed the write callback from not processing due to not correcting assessing if we have read the entire body
            by tracking the amount read.

            Fixed the processing of the kill list to allow for killing requests not yet in the in-progress state.

        ProtoMangleXboxOne
            Fixed a crash if there is a template load failure by moving the creation of the incoming security
            association vector earlier.

        UserApiXboxOne
            Fixed the ability to fetch 100 profiles at a time by increasing the json buffer to 2048.

        VoipHeadsetXboxOne
            Fixed incorrect usage of the chat session in a scenario where the chat session creation previously failed.

            Fixed incorrect inbound queue management in _VoipHeadsetProcessInboundQueues().

            Fixed incorrect expection handling in _VoipHeadsetReputationQuery() that might cause a crash.

EADP Game Services DirtySDK 15.1.4.0.1 - June 1, 2018

    This SDK release was built using the following compiler packages:

        EA Config   5.06.00
        Framework   7.10.00

        Android     AndroidSDK 26.0.2-2
                    AndroidNDK r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.03.00
        Kettle      kettlesdk 5.008.071-proxy
                    kettle_config 2.06.03
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        DirtyNet
            Added SocketPacketQueueAllocUndo() to be used to "undo" a recent call to SocketPacketQueueAlloc().

            Added calls to SocketPacketQueueAllocUndo() in scenarios where the previous call to
            SocketPacketQueueAlloc() needs to be undone because the allocated resources ended up not being used,
            i.e. when WSARecvFrom() fails and when WSAGetOverlappedResult() fails.

    DirtySDK (PS4)
        ProtoHttpPS4
            Added the 'ratr' and 'rats' selectors to the implementations for parity with the stock version of protohttp

            Added ProtoHttpControl('mwrk') selector to control the maximum number of worker threads ProtoHttp will spawn.
            Defaults to 0 to that the current behavior will not change unless the user changes this value.
            Refactored the call to sceHttpSendRequest() to optionally be called in its own thread.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Added the 'ratr' and 'rats' selectors to the implementations for parity with the stock version of protohttp

Changes/fixes in this release:
    DirtySDK (All)
        ConnApi
            Restored the NetGameDistStatus('mplr') selector which will not account for the server index.

            Refactored the ConnApiStatus('gsrv') selector to merge two different implementations. This
            will now always return TRUE if the game is server hosted and FALSE otherwise, and if a buffer is
            provided it will copy the server's ConnApiClientT there.

        NetConn
            Fixed the return code from NetConnCommonStartup when NetConn has already been started.

        NetGameDist
            Fixed incorrect "wraparound" logic for the OutBufData queue. This CL is fixing two things with the function
            _SetDataPtrTry() which is used to identify where to write data into the respective ring buffers associated
            with inbound and outbound queues.
                #1 When used with OutBufData, the function was incorrectly initializing uIindexB with "OutBufData.iBeg"
                instead of  "InpBufData.iBeg+iIOOffset"... thus opening the door for overwriting the "pending entries"
                when the queue is close to filling up.
                #2 The iPosB variable was being initialized without considering whether uIndexB was pointing to a
                "valid" entry or not... potentially resulting in the code executing with a busted iPosB
                (specific to empty queue scenarios)

            Refactored NetGameDistMultiSetup to not automatically remove 1 from the index on the clients. This offset
            shall be performed by the user.

        ProtoSSL
            Fixed a bug introduced in Raven.0 skipping a certificate that is not a part of chain.

            Fixed a bug introduced in Raven.0 where the client did not correctly handle a server downgrade when
            formulating the ClientKeyExchange PreMasterSecret, triggering a downgrade detection on the server and
            causing the server to fail the connection with a bad record mac alert.

        QosClient
            Fixed a bug, when compiling without logging, a timer variable would not be reset resulting in a spam of
            callbacks reporting the Qos procedure has timed out.

            Added a way to get module hResults from the callback structure QosCommonProcessedResultsT or via
            QosClientStatus('hres').

        QosCommon
            Fixed building qoscommon so that we don't need to keep adding #ifdefs for new platforms to use strtok.

        VoipConnection
            Fixed an issue where the local client id was not being treated consistently in _VoipReliableDataUnpackDATA.
            This led to Speech-To-Text data not being displayed in some cases.

        VoipTunnel
            Fixed the suspend logic so that if we are removing a suspended game at the end of the list we would clear
            it out correctly. If we were to remove suspended data at the end and suspend logic hits later at the same
            slot, the voiptunnel would incorrectly error because it believes there is already a game suspended there.

    DirtySDK (iPhone/OSX)
        ProtoSSLApple
            Fixed an issue where we incorrectly don't process the received data when receiving a FIN in the same packet.
            How the processing works we can make many read calls off the socket before the data gets returned back to
            the caller. In the case that we get data and FIN, we just see this as the peer closing the connection.
            Instead of doing it in this way we should always first process any data we received.

    DirtySDK (PC)
        DirtyNetWin
            Enhanced tracking of pSocket->bRecvInp such that it gets flagged before WSARecvFrom is attempted. The goal
            is to eliminate a theoritical race condition identified during code review:  bRecvInp is checked in
            SocketRecvFrom() which can be invoked from the main thread... and thus that opens the door for a race
            condition with the socket recv thread updating that variable too late (after the call to WSARecvFrom().

        NetConnWin
            Fixed the cleanup when socket creation fails during NetConnStartup().

    DirtySDK (PS4)
        ProtoHttpPS4
            Fixed the header parsing for large headers by using the input pointer to the `sceHttpGetAllResponseHeaders`.
            In the parse header code we check if we have the entire header to allow us to continue parsing. If the
            header is too large, we truncate the headers and the parse header function will always early return,
            attempting to wait for more data.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Fixed overallocating memory when receiving large responses from the server by resetting the offsets when the
            entire buffer is read.

            Fixed the logic so that we could kill any requests that we know will no longer receive callbacks. In
            conditions such as suspend and disconnects we have observed that no callbacks will be fired which leaves
            requests in XMLHTTP_STATE_INPROGRESS. This has the effect of leaving netconn in the ST_CLEANUP state while
            waiting for the kill list to be cleared of all requests, which blocks NetConnConnect from connecting to the
            first party network.

        ProtoMangleXboxOne
            Fixed the crash when template fails to load by failing the creation of the module, it will try to continue
            without demangling at the higher levels.

            Removed the concept of secure bypass which is not being used.

        UserApiXboxOne
            Fixed a crash when trying to parse the profiles response by ensuring that we received any data. If we didn't
            receive any data it could mean that we had something misconfigured or that server just returned an error to
            us. We should not have assumed that we would always have data waiting.

EADP Game Services DirtySDK 15.1.4.0.0 - March 28, 2018

    This SDK release was built using the following compiler packages:

        EA Config   5.06.00
        Framework   7.10.00

        Android     AndroidSDK 26.0.2-2
                    AndroidNDK r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.03.00
        Kettle      kettlesdk 5.008.071-proxy
                    kettle_config 2.06.03
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

    *** Important - This release has not been tested with Xbox February XDK and Sony PS4 5.5 SDK  ***
    Official support for the newer February XDK and PS4 5.5 SDK will come in the next release.

    *** Important - This is the first release of Qos2.0 ***
    QosApi has been replaced with QosClient for Qos2.0.  E-mail GS-Operations@ea.com to have a custom Qos profile
    setup for your title, it specifies which ping sites to use, and what tests it should conducted.

New in this release:
    DirtySDK (All)
        CryptBn
            Added a debug function to log the big number.

            Added Added CryptBnByteLen to return number of bytes currently used by the big number.

        CryptChaCha
            Added ChaCha20-Poly1305 AEAD cipher implementation.

        DirtyCert
            Changed redirector endpoint name to gosca18.ea.com

            Changed to add support for using port 44326 for DirtyCert on Xbox One.

        DirtyErr
            Added DirtyErrDecodeHResult which can split an hResult value into its component pieces, to better
            understand what it represents.

        ProtoSSL
            Added TLS1.3 support.  Default requested version remains TLS1.2, so TLS1.3 connections are not attempted
            without being explicitly enabled.

            Added DigiCert Global Root CA for EA-signed secure public endpoints (used in place of Symantec/VeriSign).

            Added ECDSA support, including private key parsing, cipher suites, server and client certificates, and
            signature algorithms for TLS1.2 and 1.3.

            Added support for TLS_CHACHA20_POLY1305_SHA256 (TLS1.3), and TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
            and TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (TLS1.2) cipher suites.

            Added support for RSA-PSS client and server certificates.

            Added ability for ProtoSSLControl 'scrt' control selector to pass in full .pem files with signatures not
            already stripped.  If no signature is present PKCS#1 is assumed, retaining previous functionality.

            Added ProtoSSLStat('ladd'), selector. Is used to return a cached local client address, that was used
            for the last connection.  The address is copied into pBuffer, which must be at least sizeof(struct sockaddr)

        QosClient
            Added the new module QosClient, a part of the Qos2.0 system, it replaces all functionality of previous QosApi.
            Qos2.0 manages the whole Qos process from start to finish, this management had been done by BlazeSDK in the
            past.  The basic usage of the QosClient module would be; call QosClientCreate() to initialize, regularly
            call QosClientUpdate(), call QosClientStart() and wait for its callback with results.  Look at the in code
            documentation for additional details.

    DirtySDK (XboxOne)
        UserListApiXboxOne
            Added support for 409 (Rate Limited) response code.

Changes/fixes in this release:
    DirtySDK (All)
        ConnApi
            Fixed size of dynamically allocated module ref. An unused client entry was always unnecessarily allocated
            at the very end of the struture.

            Removed the concept of the GameServer in ConnApi. This was only used for DirtyCast servers, which will now
            be located at index 0 of the client list the same way it is for nonDirtyCast servers.

            Removed 'mplr' control selector, which was deemed unneeded.

            Removed the XBox One 'phxc' control selector, and replaced it with a generic 'gsrv' selector. This indicates
            whether the host is a dedicated server or a console.

            Refactored ConnApiControl('gsrv') usage for the new functionality.

            Removed ConnApiControl('gsv2') .

            Removed the gameflags and associated parameter in ConnApiConnect, this is leftover from Xenon.

        CryptBn
            Changed the CryptBnInverseMod function to be implemented using binary extended gcd. This new algorithm is
            much faster than extended euclidean. The new algorithm is explained in the Handbook of Applied Cryptography
            Chapter 14.4.3 (14.61).

            Changed the CryptBnMod algorithm to skip trying to reduce or left shift until we have at least incremented
            the number once. In our profiles we noticed that there was a lot of wasted time in the reduction checking
            when the result was still zero.

        CryptEcc
            Optimized the point calculations in _CryptEccPointCalculate by multiplying over the modulus. Doing this
            makes it so the final redunction happens on a smaller number.

            Fixed the ECDSA sign and validation when the hash's bitsize is larger than the bitsize of the curve. Based
            on the algorithm, when the bitsize of the hash is larger than the order of the curve the hash shall be
            truncated.

            Changed the ECDSA signing to be done given the new private key parameter. The private key used previously
            was the wrong one and caused the validation to fail on the peer's end.

        DirtyCert
            Addressed a TODO to close the connection instead of abort when the work is complete.

        DirtyErr
            Changed the parameters to DirtyErrGetHResult(), so the sizes of the fields provided more accurately
            represent the size of what is internally stored in the hResult.

        DirtyNetUnix
            Added the missing thread termination signal

        JsonFormat
            Addressed a TODO to use ds_timetostr instead of implementing it inline.

        NetGameDist
            Improved readability of code by renaming some variables.

        NetGameDistServ
            Fixed some coding standard issues in the module's InputQueryMulti and InputLocalMulti functions.

        ProtoHttp2
            Changed the frame size clamp macro to call DS_CLAMP.

            Removed half-implemented proxy support until a time when we find a h2 proxy that supports CONNECT.

        ProtoTunnel
            Fixed a bug where a packet that could not be decrypted and had a negative stream offset could cause the
            tunnel connection to be reset, breaking the stream.  This fix includes changes to clarify behavior that
            was previously difficult to ascertain without a very close inspection of the code:

        ProtoSSL
            Changed to disable RC4-MD5 cipher suite and SSLv3 by default.

            Changed to enable ECDHE cipher suites by default.

            Changed the certificate loading to use Base64Decode2. The implementation was assuming that Base64Decode
            returned the amount of data needed in the output but in fact it just returns TRUE or FALSE. The
            Base64Decode2 function returns the result that it intended to get.

            Changed cipher preference order to be more in-line with current practices.

            Changed signature schemes/algorithms preference order to be more like boringssl.

            Changed execution of TLS1.3 handshake key generation in RecvServerHello, and signature verification in
            RecvServerKeyExchange and RecvCertificateVerify to be async (blocking in smaller increments).

            Changes to simplify certificate parsing and make it easier to read and follow, with a fix and two minor
            functional improvements;
                - fixed issue observed from inspection of skipping a cert that is not part of the chain not working
                  for tls1.3, due to the extensions field not being skipped
                - moved validation bypass to be immediately after certificate parsing, before date validation
                - moved leaf cert caching and cached cert bypass into block specific to parsing the leaf certificate,
                  simplifying main loop

            Changed signature scheme and cipher selection to account for certificate signing algorithm, if a
            certificate is available.

            Changed to allocate certificate and private key buffers internally when using 'scrt' and 'skey' control
            selectors, meaning these buffers no longer need to be persisted by the caller.

            Changed signature verify buffer from 2048 bytes to SSL_SIG_MAX.

            Changed signature verify failure alert from bad_record_mac to decrypt_error, as OpenSSL does.

            Fixed ECDHE/SHA1 ciphers for TLS1.0/TLS1.1, and enabled them for those versions.

            Fixed an issue with AES decrypt when a padding failure was detected, returning an immediate error instead
            of resulting in a bad_record_mac alert as intended.

            Fixed an issue in _ProtoSSLGenerateSecret() where the size of the PreMasterKey buffer (48) was being used
            to build the master secret instead of the key length, which is not always 48.

            Fixed a bug in RecvCertificateVerify in TLS1.3, which was dependent on the ECC context being left
            initialized with the proper curve by RecvCertificate.

            Fixed to not send signature_algorithms extension for connection attempts with a TLS version less than 1.2.

            Fixed 'rsao' operator to cover new async crypto states, renamed 'crpt', and marked 'rsao' for deprecation.

            Fixed a server issue processing the ChangeCipherSpec message.

            Fixed a server bug from Raven-pr2 where the signature_algorithms extension would be sent in the ServerHello
            by a TLS1.2 or earlier server, which is not legal.

            Fixed a server bug that broke resume flow in tls1.2 and prior when tls1.3 server hello session echo was
            implemented.

            Fixed the server to select cipher based on session resume cipher if available, and to not attempt resume if
            the ssl version or cipher of the previous session don't match those of the current session.

            Fixed a server bug in ProtoSSLUpdateSendServerKeyExchange(), which was leaving bRSAContextInitialized TRUE.
            This would cause a subsequent client certificate verify operation to fail.

            Fixed a server bug when receiving a tls1.3 ClientHello but negotiating a tls1.2 or prior connection with an
            ECDHE cipher; the key from the key_share extension would be used when sending the server key exchange,
            causing the connection to fail.

            Fixed server bug when verifying an ecdsa client certificate; the state was left initialized, which broke
            subsequent encryption of Finished message.

            Fixed SendCertificateRequest to transition to sending Certificate message when TLS1.3 is used.

            Fixed RecvCertificateRequest to choose signature scheme in concert with certificate signing algorithm, if a
            certificate is available.

            Fixed SendFinished to transition to RECV_HELLO state if TLS1.3+server+client cert flow.

            Fixed SendServerKeyExchange and RecvCertificateVerify for TLS1.1+server+rsa|ecdsa.

            Fixed RecvCertificate to transition to RecvFinished if a TLS1.3 server receives an empty Certificate
            message, and the client cert level is not two (client cert required).

            Fixed SendCertificate to transition to SendFinished if a TLS1.3 client sends an empty Certificate message,
            skipping CertificateVerify.

        ProtoPing
            Moved this module to the LegacyDirtySDK.

        ProtoPingManager
            Moved this module to the LegacyDirtySDK.

        ProtoUdp
            Moved this module to the LegacyDirtySDK.

        ProtoUpnp
            Changed the implementation to switch from using ProtoUdp to DirtyNet for UDP communication.

        QosApi
            Moved this module to the LegacyDirtySDK.

        VoipGroup
            Changed the VoipGroupManager to contain a variable length array of voipgroups. In multihub mode we require
            more voipgroups due to the number of concurrent blazehubs running.

        VoipTunnel
            Refactored indexes for voip clients lists were offset by -1 so that the first console user in the list
            would appear at index 0 of the voip client list. This helps to not waist one of the maximum 32 voip slots.

        XmlFormat
            Removed XmlValidate debug function that was never implemented. This fixes an outstanding TODO we had to
            implement this functionality.

    DirtySDK (Android)
        CryptRand
            Changed the Android implementation to read from /dev/urandom. This addresses an outstanding TODO we had to
            add a native implementation for this platform.

    DirtySDK (Linux)
        DirtyNetUnix
            Fixed the idle procs not being called when running in singlethreaded mode.

    DirtySDK (macOS/iOS)
        NetConnIos
            Switched the implementation to use the non-deprecated Base64Decode2.

        ProtoSSLApple
            Enabled support for ECDSA and CHACHA20-POLY1305 ciphers.

    DirtySDK (PC)
        DirtyNetWin
            Changed the implementation of 'poll' to fire the socket callback when we have data waiting. The previous
            implementation would just notify that is a socket is waiting but would need to wait for the socket idle
            thread for the socket callback to be invoked.

    DirtySDK (PS4)
        DirtyLibPS4
            Removed support for singlethreaded mode on PS4, this isn't a supported configuration. The implementation was
            taken from unix when it was created.

        ProtoHttpPS4
            Fixed a write callback bug when all data is available immediately, in which case the write callback
            completes the transition before the data can be read.

        VoipHeadsetPS4
            Fixed size of dynamically allocated module ref. An unused client entry was always unnecessarily allocated
            at the very end of the struture.

    DirtySDK (Unix)
        NetConnUnix
            Fixed bug (opt build only) inadvertently introduced in Raven-pr2. Body of _NetConnUpdateConnStatus() was
            incorrectly made "logging only" by conditionnally compiling it in with DIRTYCODE_LOGGING but that broke
            the functionality because the line "pRef->uConnStatus = uNewConnStatus" is not only for logging purposes
            but is core functionality for internal state transitions.

        VoipUnix
             Changed voipunix to assume single-threaded usage: eliminates run-time threading issues (malformed
             prototunnel packets) resulting from voipunix being used from the dirtycast stress client which implies
             disabled critical sections.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Fixed the ProtoHttpAbort behavior on XBox One to be similar to other platforms.

            Fixed a write callback bug when all data is available immediately, in which case the write callback
            completes the transition before the data can be read.

        ProtoMangleXboxOne
            Fixed size of dynamically allocated module ref. An unused client entry was always unnecessarily allocated
            at the very end of the struture.

        VoipXboxOne
            Fixed copy and paste error, the code was set to set the priority and not the affinity.

EADP Game Services DirtySDK 15.1.4.0.0-pr2 - February 5, 2018

    This SDK release was built using the following compiler packages:

        EA Config   5.06.00
        Framework   7.10.00

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.03.00
        Kettle      kettlesdk 5.008.051-proxy
                    kettle_config 2.06.02
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        ProtoHttpServ
            Added ability to specify ALPN string for ProtoSSL.

        ProtoSSL
            Added support for rsassa-pss signed certificates.

            Added support for draft22 and draft23 versions of TLS1.3.

            Added client support for TLS1.3 session resumption.

            Added safe reading for handshake receive functions and extension parsing.

            Added client certificate support for TLS1.3.

        QosApi
            Added QosApiControl('stwi') - set the amount of ms before a stall is counted, if a stall is detected test
            timeout will be extended (default 500ms).

        UserListApiPS4
            Added order directions for list queries

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Fixed the build scripts to correctly set the optionset for C++ files when building as a DLL.

        ConnApi
            Removed the empty ConnApiMigratePlatformHost function.

        DirtyNet
            Changed the implementation of the map address functions to return only -1 in error as negative numbers are
            expect for real (non-virtual) IPv4 addresses. We do not want to return error when remapping an IPv4 address.

            Changed the implementation of the remap address function to handle the case an IPv4 address was tried to be
            remapped.

            Fixed SockaddrInSetPort to not generate constant value truncation warning on Windows builds.

        Hpack
            Fixed crash in _HpackDecodeLiteralField if the indexed entry decode failed by stopping further processing.

            Fixed crash in _HpackHuffmanTreeDecode if the huffman code lookup in the tree failed.

        NetGameDist
            Fixed parsing of the stat packet to prevent reading past the end of the buffer. The module reads and writes
            to the stat packet based on the number of players. On the client this is a fixed value, while on the server
            this is adjusted based on when players join and leave the game. Due to a mismatch between the both sides,
            the server will write less than the client expects causing it to potentially read past the end of the
            buffer.

        Protobuf
            Fixed reading and writing of non-packed repeated fields. When this was originally implemented, how I
            understood the encoding documentation is that with proto3 all repeated fields were packed, which was
            incorrect. How it actually works is that the primitive types (varint, 32-bit and 64-bit) are packed while
            length delimited types are not. Due to this I needed to make a change in the APIs so it can account for the
            behavior change in the implementation.

            Refactored the functions dealing with reading packed repeated fields to be a bit more elegant to use.

            Removed the output sizes for the fixed type functions (non-repeated) as this is implicit based on the
            function.

            Removed the unnecessary fixed writing functions at align with the reading size.

            Refactored the error checking based on the expectations for each fixed function.

        ProtoHttpUtil
            Changed ProtoHttpUrlEncode functions to return the append point rather than always returning zero.  Also
            changed to mirror C99 vsnprintf() overflow semantics.

        ProtoSSL
            Fixed crash when parsing ASN.1 binary objects by preventing a negative size when zero sized data is parsed
            from the header.

            Fixed a memory leak when CryptRSAInit fails when verifying the signature and the context is heap allocated.

            Removed support for md2-signed certificates.

            Fixed a bug in sending of TLS1.3 HelloRetryRequest by server.

            Fixed a bug receiving 0/n record split records introduced in Raven-pr1.

            Fixed SendCertificateVerify to work with PSS encoded signatures when using TLS1.2.  PSS signature support
            was added along with TLS1.3 in Raven-pr1, which exposed the lack of support.

            Fixed to increase ClientHello body format buffer to 2k to accomodate large session tickets in TLS1.3
            resume flow.

            Fixed to prevent ProtoSSL running as a server using DirtyCert.

            Fixed two bugs introduced in DirtySDK 13.3.1.6.0 when code to check AES padding was added.  First, in SSLv3
            the block cipher padding value is not specified and therefore should not be checked.  This would likely
            break any SSLv3 connection negotiated with AES.  Second, the padding check itself was biased one character
            forward, meaning it missed checking the very first padding byte, instead comparing the last byte (the
            length) to itself.

            Fixed to support the full 64 bits of sequence number (previously, only 32 bits were supported).

        QosApi
            Changed http and probing timeouts, so they are treated separately and have their own error codes.

            Fixed issue when the client stalls, it was possible to timeout without having had a chance to do the
            probing.  QosApi will detect client side stalls and will increase the timeout to compensate.

            Changed QosApi to reject latency packets that are well beyond expected ranges, 20 seconds.

    DirtySDK (Apple)
        ProtoSSLApple
            Changed the code to cleanup the secure state when we detect that the connection was closed.

    DirtySDK (XboxOne)
        UserApiXboxOne
            Fixed a crash due to the UserApi ref being created before users are added to NetConn by creating
            ProtoHttp refs for all possible users.

        VoipHeadsetXboxOne
            Changed the LoadLibraryEx input to be wrapped with a TEXT macro to ensure it works on non-UNICODE
            environments.

EADP Game Services DirtySDK 15.1.4.0.0-pr1 - December 7, 2017

    This SDK release was built using the following compiler packages:

        EA Config   5.06.00
        Framework   7.08.02

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170608-proxy
                    capilano_config 2.03.00
        Kettle      kettlesdk 5.008.051-proxy
                    kettle_config 2.06.02
        iPhone      ios_config 1.09.00
                    iphonesdk 10.0-proxy-1
        OSX         UnixGCC 0.10.00
                    osx_config 1.15.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

    *** Important - First DirtySDK release with Speech-To-Text (STT) and Text-To-Speech (TTS) support ***
    Support available for XboxOne only. PS4 and PC not yet supported

    *** Important - PS4 Random module required ***
    With this version loading of the PS4 Random module is required

    *** Important - Public API changes for NetConnXboxOne ***
    Removed support for -nologin parameter with NetConnStartup() and NetConnConnect().

    *** Important - Public API changes for NetGameDistServ ***
    Removed the notion of a "started" game as it proved to be completely broken. NetGameDistServStartGame() and
    NetGameDistServStopGame() were removed. When a game is started or stopped (like during a blaze match replay), the
    game code running on the client is in charge of exercising the netgamedist flow control.

    *** Important - Public API changes for Voip ***
    Removed for good 'umic' and 'uspk' control selectors that had been deprecated for a long time already.

New in this release:
    DirtySDK (All)
        Base64
            Added support for base64 url string encoding and decoding per RFC 4648 Section 5. Added new
            internal functions to do the encoding / decoding to be shared between the various functions.

        Build
            Added a target for building full html docs.

        CommUdpUtil
            Added as a new file where code shared between commupd and dirtycast is located. Contains new util
            functions with explicit names that improve readability and hide bit/byte level inspection in
            commudp packets.

        CryptBn
            Added functions to left and right shift by more than 1 bit at a time. Defined a macro for right shift by 1
            to mimic how left shift works.

        CryptEcc
            Added a function to the module to validate if a point is on the curve.

            Added support for ECDSA signing and verification which can be used instead of RSA for those purposes.

        CryptRSA
            Added support for Chinese Remainder Theorem (CRT) algorithm to speed up RSA operations that use the private
            key. Since the data and sate used for the different RSA computations are different, I introduced a union
            that can represent the data we are working with.

        DirtyNet
            Added a minimum rate limit of 1460 bytes/sec to the SocketRate API. This also fixes the issue that
            setting a rate lower than this will result in no data going through.

            Added support for IPv6 address parsing from text.

        DirtyThread
            Added support for condition variables via the new dirtythread module which is powered by EAThread.
            Added support for threads via the new dirtythread module which is powered by EAThread.

        NetGameDistServ
            Added a call to _NetGameDistServFlowControl() in NetGameDistServAddClient() such that a player
            joining results in DirtyCast announcing "I no longer receive" until the joiner explicitly confirms
            "I can receive" with a call to NetGameDistControl('lrcv').

        NetGameLink
            Added the number of naks sent to peer from us to the NetGameLinkStatT structure.

            Moved 'slen' and 'sque' to be a status selector. We are keeping the control selector version of
            these but they are now consider deprecated.

        Platform
            Added include to <wchar.t> to provide access to wchar_t

        Protobuf
            Added a reader and writer for the protobuf (version 3) wire format.

        ProtoHttp
            Added secure proxy support using HTTP CONNECT.

            Added global proxy setting via new 'gpxy' ProtoHttpControl selector.

            Added an additional request API to specify custom and receive header callbacks, which take priority over the
            global callbacks.

        ProtoHttpServ
            Added a listen function to allow users to specify their own TCP backlog settings.

        ProtoSSL
            Added TLS1.3 protocol support, implementing draft-18 through draft-21 versions at compile-time (defaulting
            to draft-18).  TLS1.2 remains the default client-requested version.

            Added support for sha512 handshake hash.

            Added debug output of Master Secret in a form suitable for Wireshark decryption via (Pre)-Master Secret log
            file.

        ProtoWebSocket
            Added message sending (ProtoWebSocketSendMessage) and receiving (ProtoWebSocketRecvMessage).  Already
            existing Send/Recv functions use a stream-like metaphor.

        QosApi
            Added QosApiControl('ncrt') - passed to ProtoHttpControl, if TRUE will proceed even if SSL cert errors
            are detected (defaults FALSE), for debug purposes.

            Added QosApiStatus('ncrt') - get the 'ncrt' setting, if TRUE we will ignore SSL errors for setup
            communication.

            Added QosApiControl('soli') - passed down to the socket as a SO_LINGER option if its >= 0, a 0 value
            will abort the socket on disconnection with no TIME_WAIT state (ideal for stress testing).

            Added QosApiStatus('soli') - get the value passed to ProtoHttp 'soli'.

        Voip
            Added VoipSetTranscribedTextReceivedCallback() for voipgroup layer to register a callback used by
            lower-level voip to notify about inbound transcribed text over voip connections.

        VoipConnection
            Added a per-connection outbound sequence number instead of the global one, needed to support a
            scenario where transcribed text is not sent on ALL connections.

            Added a NULL check when setting bPeerIsAcking as based on code before it pConnection might be NULL.

        VoipDef
            Added XoneSynthesizedSpeechCfgT to be used with VoipControl('voic').

            Added VoipTranscribedTextReceivedCallbackT which is the prototype of the callback registered with
            VoipSetTranscribedTextReceivedCallback() and VoipGroupSetTranscribedTextReceivedCallback().

        VoipGroup
            Added VoipGroupSetTranscribedTextReceivedCallback() for game code to register a callback used by
            DS to notify about inbound transcribed text over voip connections.

        VoipPacket
            Added new VOIP_PACKET_STATUS_FLAG_STT, flagging that at least one user on the originating side as requested
            transcribed text to be sent.

            Added aRemoteClientId field to ReliableDataInfoT.  Required to uniquely identify who the reliable data is
            for.

        VoipTunnel
            Added new events for adding and deleting games from the VoipTunnel.

        VoipHeadset
            Added VoipHeadsetDisplayTranscribedText() to display transcribed text in system overlay.

    DirtySDK (Apple)
        DirtyErrUnix
            Added the errors from Apple's Security.framework headers SecBase.h and SecureTransport.h

        ProtoSSLApple
            Added an implementation of ProtoSSL that is driven by Apple's SecureTransport library.

    DirtySDK (PC)
        DirtyNetWin
            Added SocketControl('soli') - set SO_LINGER On the specified socket, iData1 is timeout in seconds.

            Added support for IPv4 sockets, required for Windows XP compatibility.  Use SocketControl('afam') control
            selector to set global address family to use for sockets.

        VoipAux
           Added support for the Opus VoIP codec. This codec uses the default settings and 8kHz sampling rate.

        VoipHeadsetPc
            Added support for variable length frames for PC codec's which is needed to add Opus support. To allow the
            codec to choose if it can support variable length frames, have the headset status fallthrough down to the
            codec. Due to the current codecs not supporting variable length frames, I put the unhandled logging message
            at a higher verbosity to prevent spamming. Changed the voice data callback to only validate the size of the
            frames when not using variable length frames. Changed the calculation of sub-packet size to work for both
            variable and fixed frames.

    DirtySDK (PS4)
        DirtyNetPS4
            Added support for SO_LINGER socket option via the 'soli' control like on PC/Unix

        NetConnPS4
            Added NetConnStatus('locl') and NetConnStatus('locn') API to fetch locale.

            Added support for -delaySEMD in NetConnStartup to ignore the state of SystemEventMessageDispatcher.

        ProtoHttpPS4
            Added rate limiting.

    DirtySDK (Unix)
        DirtyNetUnix
            Added SocketControl('soli') - set SO_LINGER On the specified socket, iData1 is timeout in seconds.

        VoipUnix
            Added as a new file. Not real voice. Artificial voip data injection on voip connections. Injected
            sub-packet rate and sub-packet size are controllable via voip control selectors ('psiz', 'prat').

    DirtySDK (XboxOne)
        UserApiXboxOne
            Added support for retrieval of the TTS/STT settings that are a part of the profile data.

            Added Accessibility field to UserApiProfileT.

        VoipHeadsetXboxOne
            Added support for leveraging new Text-to-speech (TTS) and Speech-to-text (STT) features in XboxOne XDK.
                * Added 'ttos' control selector to be used by the game code to feed in text to be synthesized (from
                  a speech-impaired user).
                * Added 'stot' control selector to be used by the game code to enable local generation of transcribed
                  text to be sent reliably to all remote peers that requested it (i.e. hearing-impaired user).
                * Added 'voic' control selector with platform-specific params used for identifying "voice" used when
                  producing synthesized speech.

        VoipSerializationXboxOne
            Added "game display name" property to the remote user object because we need to feed that into.
            Windows::Xbox::UI::Accessibility::SendSpeechToTextString(). So that information is now part of the
            user serialization.

API Breaking Changes in this release:
   DirtySDK (All)
        Build
            Removed support for non-namespaced include imports, you must use the full path.
            For example: <DirtySDK/dirtysock/dirtynet.h> versus <dirtynet.h>

        CommTcp
            Removed CommTCP for good.

        ConnApi
            Renamed 'phcc' selector (PC Host Capilano Client) to 'phxc' (Pc Host Xboxone Client). ('phxc' used to
            stand for "PC Host Xenon Client" but it was free now that xbox360 is no longer supported.)

            Removed the option of using ConnApi as the owner of voip. Calling VoipStartup/VoipShutdown is now ALWAYS
            required before using ConnApi with voip-enabled topologies.

        DirtyLang
            Removed LOBBYAPI_LANGUAGE_TEGULU, which was replaced with LOBBYAPI_LANGUAGE_TELUGU long time ago.

            Removed LOBBYAPI_LANGUAGE_UIGUR, which was replaced with LOBBYAPI_LANGUAGE_UIGHUR long time ago.

            Removed LOBBYAPI_LANGUAGE_WELCH, which was replaced with LOBBYAPI_LANGUAGE_WELSH long time ago.

            Removed LOBBYAPI_COUNTRY_SLOVAKIA_, which was replaced with LOBBYAPI_COUNTRY_SLOVAKIA long time ago.

            Removed LOBBYAPI_COUNTRY_ST_HELENA, which was replaced with
            LOBBYAPI_COUNTRY_ST_HELENA_ASCENSION_AND_TRISTAN_DA_CUNHA long time ago.

        NetGameDistServ
            Removed the notion of a "started" game as it proved to be completely broken.
            NetGameDistServStartGame()/NetGameDistServStopGame() were removed. When a game is started or stopped
            (like during a blaze match replay), the game code running on the client is in charge of exercising the
            netgamedist flow control.

            Updated the stats structure to include more useful information and trimming the sizes down. There was no
            need to include ping due to the fact that it can be derived from latency if needed. Added the send queue
            length to allow detection when the queue is filling up at the lowest level. To allow us to get this I added
            a fallthrough from NetGameDistStatus to NetGameLinkStatus. Added the packet loss and nak information as more
            indicators to problems on the client->server connection.

        NetGameLink
            Renamed NETGAME_QOS_DURATION_MIN to NETGAMELINK_QOS_DURATION_MIN and moved it from public domain to private
            domain.

            Renamed NETGAME_QOS_DURATION_MAX to NETGAMELINK_QOS_DURATION_MAX and moved it from public domain to private
            domain.

            Renamed NETGAME_QOS_INTERVAL_MIN to NETGAMELINK_QOS_INTERVAL_MIN and moved it from public domain to private
            domain.

            Renamed NETGAME_QOS_PACKETSIZE_MIN to NETGAMELINK_QOS_PACKETSIZE_MIN and moved it from public domain to
            private domain.

            Changed the 'mwid' to a status from a control based on a v8 TODO we still had outstanding.

        Voip
            Removed for good 'umic' and 'uspk' control selectors that had been deprecated for a long time already.

            Removed VoipDisconnect() and renamed VoipDisconnect2() to VoipDisconnect().

            Removed the uAddress parameter from the VoipDisconnect() synopsis.

            Removed VoipSpeaker and VoipMicrophone from the public interface. This API can be misused by customers and
            given that it used to be the way to deal with muting we want to remove it to prevent incorrect use.

        VoipGroup
            Removed VoipGroupConnect() and renamed VoipGroupConnect2() to VoipGroupConnect().

            Removed VoipGroupResume() and renamed VoipGroupResume2() to VoipGroupResume().

    DirtySDK (XboxOne)
        NetConnXboxOne
            Removed support for -nologin parameter with NetConnStartup() and NetConnConnect(). -nologin used to be
            exercised by FIFA tools. Instead of using -nologin, tools can just call NetConnStartup() and not
            call NetConnConnect(). Implicitly that means tools do not need to wait for netconn to reach +onl state
            before doing generic networking activity.

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Changed the documentation generation to use the headerfiles fileset which is updated to include the correct
            files across platform. This allows us to reduce the complexity of our doxygen configuration generation as
            it now works similarly to the sourcefiles fileset.

            Fixed hack that gets a property that just equates to ${config-system} with just ${config-system}.

            Changed the build scripts to explicitly build against the newest C standard (c11). We currently are not
            supporting the older standards and don't want to assume a default. This fixes some issues with how some
            1st Party APIs are defined.

        Common
            Removed the platform specific zlib functionality, instead we call into DirtySDK which implements it already
            for all platforms.

        ConnApi
            Removed parameter validation from ConnApiControl('sqos') and ConnApiControl('lqos') to eliminate
            code duplication with equivalent validation made in NetGameLinkControl('sqos') and
            NetGameLinkControl('lqos').

            Removed the ProtoUpnp code from ConnApi, which is already handled in NetConn. The ConnApi module would be
            doing the UPnP operations too late for it to be of value as we want this to be available early so it can be
            updated in the user's information.

            Refactored the virtualisation of the VoIP ports to the module that owns the VoIP connection. In a dedicated
            server scenario, ConnApi does not establish any VoIP connection as this is handled by the VoipTunnel owned
            by the ConnApiVoipManager.

            Refactored ConnApiRemoveClient to validate the index passed in to ensure that it is the valid range.

            Removing code relating to increasing our connection timeout required to create a secure association used for
            legacy failover mode (which was removed).

        CommUdp
            Enhanced internal implementation with major cosmetic fixes to re-align with coding standard. No functional
            impact.

            Removed code duplication between commudp and voipservercomm by moving shared code to a new file called
            CommUDPUtil.

        CryptBn
            Changed the right shift operation to clear the memory when shrinking the width to match what we do in other
            places.

        CryptEcc
            Changed the output of the functions CryptEccPublic, CryptEccSecret and CryptEccSign to be optional.

        CryptRSA
            Changed the internal exponentiation function so it can take in different data for different needs.

            Refactored the RSA exponentiation code to use a sliding window algorithm as an optimization.

        DirtyAddr
            Changed DIRTYADDR_MACHINEADDR_MAXLEN from 127 to 372 for xboxone specifically to fix a rare issue demonstrated
            in production where the SecureDeviceAddr blob would be clamped when stored in a DirtyAddrT because too large.
            After discussing with MS, 372 was identified as the right size to avoid this kind of issue.
            (See comment in the code for more details)

        DirtyCert
            Changed the 'prld' to use the correct variable when changing a value based on a control. It was using iControl
            which tells us which control we are working on instead of iValue.

        DirtyJpg
            Fixed an unusual case where the huffman decoder was reading past the end of the input file.

        DirtyLib
            Removed some erroneous extra argument provided to NetPrintf.

            Changed the array printing code to add the opening brace on its own log line. This allows the array to be
            copied more easily from the log files.

            Changed NetPrintfVerboseCode to only call ds_vsnprintf when the verbosity is over the check level.

            Removed unused defines from the Gen3 era.

            Refactored the NetCrit system to be driven by EAThread instead of being implemented in place.

        DirtyNames
            Removed unneeded extern for function declarations.

        DirtyNet
            Changed to refactor address conversion to text and address printing, moving some code from plat-str to
            dirtynet, and consolidated and rearranged.  Also updated for coding standards, and reordered address
            functions to make more sense and align with header.

            Cleaned up the ambiguity about what an INVALID_SOCKET descriptor means. Protect operations that
            require a valid socket descriptor or that valid only when the socket has not been added to the kill
            list. When shutting down a socket we want to make sure that we protect the socket for the short time
            before it is actually released.

            Changed the map translate print to level 3 verbosity based on how often we print this.

            Fixed the code so we have the tick when we finish the receive into allocated packet queue entries. When
            looking at the time between adding an entry to the packet queue and removing we were noticing that packets
            off the physical socket were reporting misleading times.

        MurmurHash3
            Changed the code to use the EABase little endian define. The current code was not correctly applying the
            little endian logic for all the support systems.

        NetConnCommon
            Moved implementation of netconn external cleanup mechanism to netconncommon to eliminate code duplication
            in netconnxboxone and netconnps4.
                _NetConnAddToExternalCleanupList() becomes NetConnCommonAddToExternalCleanupList().
                _NetConnProcessExternalCleanupList() becomes NetConnCommonProcessExternalCleanupList().

            Moved iRefCount from platform specific implementations to NetConnCommonStartup. Moved the associated printf
            on PC and Unix for consistency in the logging.

            Fixed an issue with NetConnStartup, NetConnShutdown and DirtyCert from the recent merging on NetConnCommon
            into all platforms.

        NetGameDist
            Enhanced internal implementation with major cosmetic fixes to re-align with coding standard. No functional
            impact.

            Changed implementation of NetGameDistInputLocalMulti() to improve readability without impacting
            functionality: rewrote a very complex if statement in a more explicit manner.

            Removed the unused variable iStrmMaxPktSize, leftover from when dist owned the streams.

            Moved the status selectors to the NetGameDistStatus function from NetGameDistControl to align with the rest
            of DirtySDK

        NetGameDistServ
            Fixed flow control handling when Join-in-Progress is exercised.

            Fixed usage of _NetGameDistServSanityCheckIn(). It is meant to be used after a call to
            NetGameDistInputPeek(), but it was not used like that before this fix.

            Removed unused NetGameDistServT::aInKeepAlive and NetGameDistServT::aOutKeepAlive.

            Adjusted the send and peek timing logging to be a multiple of the configured fixed rate to prevent spamming
            the logs when on higher fixed rate configurations.

        NetGameLink
            Enhanced internal implementation with major cosmetic fixes to re-align with coding standard. No functional
            impact.

            Renamed KEEP_ALIVE_TIME to NETGAMELINK_KEEPALIVE_TIME.

            Enhanced the send packet code to prevent sync packets from appending to unreliable packets. The sync
            packets are used to drive the stats we provide at the NetGameLink level, dropping one of these packets would
            skew this information.

            Changed NetGameLink to adjust the stream max packet size based on the CommUDP max width.

        Plat-str
            Added ds_fmtoctstring(), which formats hexadecimal text from an input binary blob of data.

        ProtoHttp
            Fixed a bug where the base url was not correctly processed when using a proxy server.

            Changed ProtoHttpStatus() function to pass down unhandled selectors to ProtoSSLStat(), rather than directly
            returning a -1 unhandled result.

            Fixed crash in the instance we call ProtoHttpRecvAll with a NULL buffer but the response has no body.
            Normally when a response has a body the use of a NULL buffer and size of zero will prompt ProtoHttp to tell
            us that we need to allocate more space to be able to receive. If there is no body and we get a success right
            away if will try to null-terminate that buffer which would lead to a crash.

        ProtoHttp2
            Changed ProtoHttp2Status() function to pass down unhandled selectors to ProtoSSLStat(), rather than
            directly returning a -1 unhandled result.

            Fixed a missing NetPrintf argument for [%p] print (pState).

            Enhanced the logging for when we get an invalid stream id in a frame that requires one.

            Changed the trigger for incrementing the flow control window to when it will be under the size of the window
            to prevent pausing the download.

            Fixed out of bound access when trying to print invalid frame types.

        ProtoHttpManager
            Changed the code to prevent a dereference of NULL when logging an error as the pHttpCmd variable might be
            NULL.

        ProtoHttpServ
            Fixed crash in protohttpserv when a http2 client is used.

            Increased the size of the URL data in the request structure to 128 bytes.

            Fixed a bug with not setting the correct maximum buffer size for the write callback. The maximum needed to
            account for the amount of data that was already written.

        ProtoMangle
            Removed unnecessary platform-specific code used while generating random port. From now on, a port range of
            6000 is used on all platforms.

        ProtoSSL
            Changed TLS_ECDHE_RSA_WITH_AES_(128|256)_CBC_SHA to be TLS1.2+ only after testing revealed issues with
            TLS1.1 and prior.

            Fixed issue where _ProtoSSLRecvHandshakeFinish() was processing multiple handshake packets at once, which
            could cause the handshake hash to be computed for more handshake packets than was correct.  This did not
            cause an issue prior to TLS1.3, but resulted in bad handshake hash calculations in the CertificateVerify
            and Finished messages received from mozilla servers (which send the Certificate and CertificateVerify in
            one SSL frame) when using TLS1.3.

            Fixed _ProtoSSLRecvServerKeyExchange() to validate the RSA-PKCS1.5 signature padding (in addition to adding
            RSASSA-PSS validation for TLS1.3).

            Changed signature validation to use generated object comparison rather than parsing the included object.
            This is generally understood to be better practice than ASN.1 parsing, which is error-prone.

            Changed to consolidate some other code (debug printing of premaster and master secrets, clearing premaster
            secret from memory) in _ProtoSSLBuildKey().

            Fixed a possible issue in _ProtoSSLHandshakeHashGet() where an unknown hash result from CryptHashGetSize()
            could fall through without error.  Changed handling of a hash too large for the provided buffer by
            truncating the size and continuing rather than returning an error.

            Fixed an issue where a certificate date validation failure would not fail the connection IFF the signing
            certificate was not available locally but was successfully installed on-demand by DirtyCert.

            Changed to refactored secure data receive flow, and increased internal receive buffer.  This allows
            handshake messages that are larger than a single SSL record to be received successfully, as well as in
            general simplifying and cleaning up the receive code.  While fragmented SSL handshake messages are very
            rare they can happen when a very large Certificate is sent by the server, for example.

            Fixed _ProtoSSLUpdateRecvCertificate() to validate outer certificate envelope size.

            Fixed to add validation of ChangeCipherSpec message size and content.

            Changed the signature verification to heap allocate the CryptRSA state. The size of the CryptRSA state can
            be rather large due to the number of CryptBnT structures that we use in certain conditions. This is the
            only instance of us using a stack allocated CryptRSA state and we rather prevent stack overflow issues.

            Fixed a crash by ensuring we successfully get the Hash ASN object before trying to generate a hash.

            Changed the certification validity expiration prints to only be done when DEBUG_VAL_CERT is enabled.

            Changed ProtoSSLShutdown to clear the stored CAs.

        ProtoTunnel
            Changed the send callback to early out when sending on the server socket used for xbox one. This socket
            should be treated the same as the normal prototunnel socket, we will not try to match a tunnel.

            Refactored the tunnel flush timeouts to check the last send time on individual tunnels instead of mass
            flushing all tunnels regularly  regardless of when the last send occurred. This should help improve packet
            bundling behavior.

        ProtoWebSocket
           Fixed an issue where receiving an empty control frame (e.g. a ping) would cause the receiving to get stuck.

           Added logging when we enforce the minimum keep-alive internal of 30s to let users know what is happening.

        QosApi
            Removed an unused function prototype.

        Tools
            Removed the mapparse and mpsummary tools as they are no longer used. The source code for these can be found
            at //gos/tools/dirtyutils.

        UserListApi
            Added a comment to specify that a certain structure is only valid within the UserListApiCallbackT.

        Voip
            Changed VoipSetEventCallback() to now enter the ThreadCrit before proceeding. This is to avoid any
            potential theoretical race condition where the voipthread would kick in and use the callback while the
            main thread is in the middle of altering it.

        VoipAux
            Updated the build script's include to make sure that it adds the package.dir to the fromfile attribute.
            The basedir only applies to the files in source.txt and not the fromfile call itself.

        VoipCommon
            Changed VoipCommonStartup() to now take a new input parameter called pTextDataCb() invoked internally
            when the system notifies readiness of newly locally generated transcribed text (ready for transmission
            over the network).

            Fixed potential buffer overrun caused by trying to set channel settings on the shared audio input device
            on a platform that doesn't support it.

            Changed the logic to make sure that we have a valid index into LocalUsers/RemoteUsers for the 'luid'/'ruid'
            status selectors.

            Changed the check for support of the shared user index, checking negative does not work against 0xff when
            checking against an int32_t type. Instead of checking for negative we want to check that the shared user
            index is not set to the invalid value. When selecting the channel it did not seem as if the original check
            was doing what was desired.

            Changed the shared user index checks to compile time instead of runtime to prevent certain compilers
            generating unreachable code warnings.

        VoipConnection
            Changed implementation to properly initialize the per-connection voice send timers used for sending at
            a fixed 10hz rate. Prior to this change, there was a possibility for the first voip MIC packet being sent
            to contain more than 100 ms of voice (i.e. the packet would keep filling up to the max sub-packet limit).

            Fixed setting/testing of the VOIP_PACKET_STATUS_FLAG_STT flag.

            Enhanced logics protecting against reliable data packing overflow.

            Changed implementation to now pack and unpack target client id with reliable data. Allows for ignoring
            inbound reliable data for which we are not the target when receiving voip MIC packet from the voipserver.

            Fixed the name of the _VoipEncodeFlags and _VoipDecodeFlags function to _VoipEncodeLocalHeadsetStatus and
            _VoipDecodeRemoteHeadsetStatus respectively to better reflect their purpose.

            Changed how much channel configuration data we send in the ping packets. Added a channel user indices bitset
            to flag which indices the channel configuration corresponds to. This allows us to send less channel
            configuration data in the ping packets.
            Removed the fixed channel configuration from the ping packet and use the variable data where the reliable
            data used to live to write the needed channel configuration. This bumps the VoIP packet version to 'h'.

        VoipGroup
            Fixed a cleanup ordering issue in _VoipGroupManagerShutdown() that could result in a crash when
            _VoipGroupManagerEVentCallback() is invoked from the voip thread.

            Added support for VOIP_CONNID_ALL in the VoipGroupMuteByXXX methods to affects all users in the VoipGroup
            at once.

            Refactored the module ref logging to use %p instead of 0x%08x.

            Added VoipGroupMuteByClientId3.

            Added VoipGroupMuteAll, which stacks with the other VoipGroupMuteByXXX methods.

        VoipHeadset
            Changed VoipHeadsetCreate() to now take a new input parameter called pTextDataCb() invoked internally
            when the system notifies readiness of newly generated transcribed text.

        VoipMixer
            Removed unused parameter iMixBufferUnused from VoipMixerAccumulate() synopsis.

        VoipPacket
            Removed VOIP_MAXSUBPKTS_PER_PKT. Had not been needed since _VoipConnectionIsSendPktReady() had
            been added.

            Removed the VOIP_PACKET_RELIABLE_FLAG_FIRST flag, no longer needed.

            Changed the value of VOIP_PACKET_RELIABLE_FLAG_ACK_ACKCNF and VOIP_PACKET_RELIABLE_FLAG_DATA.

        VoipTunnel
            Fixed the client flags to properly reset the VOIPTUNNEL_CLIENTFLAG_RECVVOICE when a user leaves the game.

            Enhanced the send logic to no longer call the user callback when send fails. We want to correctly represent
            how much data we are sending, this could potentially misrepresent our metrics. This aligns with what we do
            for game traffic.

            Fixed missing NetPrintf argument.

        XmlParse
            Removed assignment of a variable that gets reassigned on the next line.

    DirtySDK (PC)
        CommUdp
            Fixed an incorrect sizeof() in PC-specific portion of _CommUDPListen0().

        DirtyNetWin
            Fixed incorrect debug printfs for the 'keep' selector.

            Switched to using a uintptr_t variable to store the temp handle when creating our threads so we don't need
            to have a 32-bit / 64-bit check.

        VoipPc
            Changed implementation to align with new synopsis of VoipCommonStartup().

            Fixed the duplicate check by checking the right most condition to use the correct define.

    DirtySDK (PS4)
        CryptRand
            Refactored the PS4 implementation to use the random library provided by the SDK. Due to only being able to
            generate 64 bytes at a time, we use it to seed our random. With this change you are now required to load the
            Random module.

        DirtyLibPS4
            Refactored _NetTickCount to use sceKernelGetProcessTimeCounter function which stops while the system is
            suspended.

        DirtySessionManagerPs4
            Refactored the control code to align more closely with other DirtySDK modules. We want to get rid of the
            large switch statement in the beginning of the function as it is hard to maintain. Instead we will return an
            error when we reach the end of the invitation controls if we are doing the sessions via the server.

        NetConnPS4
            Refactored internal implementation. Changed NetConnUserT to be a collection of fields belonging to a single
            user instead of a collection of arrays indexed with the user index.
                NetConnUserT::aNpid[]               renamed to NetConnUserT::NpId.
                NetConnUserT::aNpState[]            renamed to NetConnUserT::NpState .
                NetConnUserT::aUserServiceUserId[]  renamed to NetConnUserT::UserServiceUserId.
                NetConnUserT::aAuthCode[]           renamed to NetConnUserT::AuthCode.
                NetConnUserT::aParentalCtrls[]      renamed to NetConnUserT::ParentalCtrls.
                NetConnUserT::aPsPluss[]            renamed to NetConnUserT::PsPlus.
                NetConnUserT::aNpAvailability[]     renamed to NetConnUserT::NpAvailability.
                NetConnRefT::NpUsers                renamed to NetConnRefT::aUsers[].
                Created NetConnNpRequestTypeE. Needed for new synopsis of _NetConnUpdateNpRequests().

            Enhanced internal implementation.
            * For consistency with how things are done in other DirtySDK files, local variables declaration made in for
              loops were moved to the beginning of the function.
            * Renamed some local variables with more explicit names.
            * Made debug logging more consistent across the files.
            * Uniformized usage of i, iIndex, iUserIndex and iLocalUserIndex -->  it is now iLocalUserIndex everywhere.

            Refactored internal implementation: moved implementation of netconn external cleanup mechanism to
            netconncommon to eliminate code duplication, and also slightly modified implementation details
            such that the new common api is used in a more uniformed manner.

            Changed from using IEAUser to KettleUser to align with the code used in netconnxboxone.

        ProtoHttpPS4
            Fixed a potential crash when running out of system resources.

            Fixed the handling of an error when rate limiting reduced the number of bytes to send to 0.

            Fixed an issue with rate throttling that prevented request with no payload from completing.

            Refactored the timeout behavior to use the our own timeouts rather than the native PS4 timeout system to
            better match what we do on other consoles.

            Fixed the return value of the 'data' status selector to return the size of the header plus the currently
            received size of the Http body.

        VoipHeadsetPS4
            Modified implementation to now unconditionally apply most restrictive voip settings to comply with Sony TRC
            R4061 when there are multiple local users interacting with a game (note: that's different from EA MLU which
            implies multiple users authenticated with Blaze). Under such conditions, we used to apply most restrictive
            voip settings only if users were sharing output audio via TV and input audio via PS4 cam mic.  If both
            users were identified to be using dedicated headsets, we used to apply respective privileges on a
            per-headset basis. Sony confirmed this being an incorrect strategy
            (https://ps4.scedev.net/support/issue/131717/_Need_help_with_interpretation_of_TR_4061) as there is no way
            to make sure that the restricted user is not hearing the voice even if headsets are detected because what
            is detected as a headset connected to a controller can rather be a speaker.

        VoipPS4
            Changed implementation to align with new synopsis of VoipCommonStartup().

    DirtySDK (Unix)
        DirtyLibUnix
            Removed the NetTickSet function which was previously used to workaround an issue with an older version of
            the linux kernel.

            Removed the _NetLib_bCritEnabled variable which has been replaced with a NetConn startup parameter.

        DirtyNetUnix (All)
            Moved global socket control 'spam' to _SocketControlGlobal while leaving per socket 'spam' control in
            SocketControl(). This does not change any behavior but aligns the grouping of global controls and socket
            specific controls.

            Aligned with dirtynetwin regarding the logging in SocketConnect, we should be logging the remote address
            after translation.

            Changed SocketDestroy to wait for any current socket lookups to finish processing. If there is a current
            socket lookup processing and we destroy the hostname cache, after the processing is finish it will segfault.

        DirtyNetUnix (iOS/OSX)
            Fixed a bug that broke iOS IPv6 compatibility, introduced in the 15.1.3.0.0 SDK release.

    DirtySDK (XBoxOne)
        NetConnXboxOne
            Refactored internal implementation: moved implementation of netconn external cleanup mechanism to
            netconncommon to eliminate code duplication, and also slightly modified implementation details
            such that the new common api is used in a more uniformed manner.

            Fixed an incorrect debug trace in _NetworkStatusThread().

            Refactored to cache the value of NetConnStatus('tria') so avoid the performance hit from accessing the
            1st party object.

        ProtoHttpXboxOne
            Refactored calls to 1st party API which take a long time to resolve so that they are run in a seperate
            thread.

            Refactored to move the Open() and initialization of the IXMLHttpRequest2 object into a task to prevent its
            long execution time from causing visual glitches when an HTTP request is performed.

            Refactored so that the request header callback would fire on the same thread as the http requestor thread.
            This is a requirement for WebKit.

            Fixed a potential crash when cleaning up the XMLHTTP object.

            Fixed an issue for request requiring DirtyCert, the DirtyCert request was not complete at the time we were
            trying to query the token which caused these operations to fail.

            Refactored threads so that the custom header callback is triggered on the same thread as the caller of
            ProtoHttpUpdate().

            Refactored the process kill list to accomodate part of the clean up process occuring in a new thread.

            Fixed an error that set the XmlHttp object to NULL incorrectly.

            Fixed a race condition by forcing all XmlHttp objects to be destroyed via the kill list.

            Moved a call to _ProtoHttpRequest on a thread inside the critical section.

            Fixed an occasional Nucleus login issue by working around an error the MS api returns after reaching the
            maximum number of redirections.

            Fixed an issue where the protohttp reference can be destroyed while an asynchronous task is in progress.

            Fixed an issue where a critical section was not left before an early return.

        ProtoMangleXboxOne
            Removed usage of the PROTOMANGLE_STATE_UNLOCK state for security associations. This state was an
            unnecessary state because the "unlocking" step has never really been enforced by Microsoft.
            It was a pre-gen4 launch concept that did not become real at gen4 launch.

        ProtoTunnel
            Fixed to track up to sixteen different remote server ports for the server socket.

            Changes to status/control selectors:
                -changed 'bnds' control selector to not recreate the server socket if it already exists.
                -changed 'bnds' status selector to return if the specified port is in the list of server ports.
                -changed 'bnds' status and control selectors to use iValue instead of iValue2 for the server port.
                -added 'bndr' control selector to remove a mapped server port.

        VoipHeadsetXboxOne
            Removed while loop in _VoipHeadsetPollForVoiceData() because there is no good reason to read more
            that one sample bundle per voip thread iteration. Moreover, the while loop proved to be problematic
            with TTS specifically because the capture source suddenly has a lot of samples ready (... much more
            that what typically is delivered in a 20 ms sampling window) and that resulted in the originator
            filling up the inbound receive queues of consumers.

            Changed implementation to use NetTickUsec() instead of NetTick() to get usec precision when logging
            voice submission activity.

            Fixed a vector by changing it to an immutable vector to prevent a possible crash.

        VoipXboxOne
            Changed implementation to align with new synopsis of VoipCommonStartup().

            Changed implementation to properly support new Text-to-speech (TTS) and Speech-to-text (STT) features
            in XboxOne. These changes became unavoidable with STT/TTS because without them it was nearly impossible
            to play back successfully a very long input text. The inbound queue on the consumer side would just
            continuously overflow.
                * Changed VOIP_THREAD_SLEEP_DURATION from 18 ms to 20 ms.  It used to be 18 ms because we had
                  problems pumping the voip thread at a sharp 20 ms rate. This problem was resolved by replacing
                  calls to NetTick() with calls to NetTickUsec() in _VoipThread(). NetTick() does use the high
                  res timer internally but it rounds up the result when it returns a ms value. The previous
                  implementation ended up not being able to create a sharp 20 ms pump rate because it was
                  subtracting two rounded up value. The new implementation is performing a single usec to
                  msec conversion at the last minute when it is about to call NetConnSleep().
                * Also, the priority of the _VoipThread() was changed from THREAD_PRIORITY_HIGHEST to
                  THREAD_PRIORITY_TIME_CRITICAL. The new implementation is much closer to what MS does in the
                  GameChat DLL.


EADP Game Services DirtySDK 15.1.3.0.5 - October 10, 2017

    This SDK release was built using the following compiler packages:

        EA Config   5.01.00
        Framework   7.01.00

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 170302-proxy
                    capilano_config 1.05.07
        Kettle      kettlesdk 4.508.111-proxy
                    kettle_config 2.01.00
        iPhone      ios_config 1.07.00
                    iphonesdk 8.0-proxy-3
        OSX         UnixGCC 0.10.00
                    osx_config 1.11.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        ProtoWebSocket
            Added APIs to allow sending of text data to the server. Our other APIs only allowed sending binary data
            but the protocol also supports text, for more information see: https://tools.ietf.org/html/rfc6455#section-5.6

Changes/fixes in this release:
    DirtySDK (All)
        ConnApi
            Fixed negative indexing when updating connection timers for the DirtyCast client.

        MurmurHash3
            Changed the function name of the internal implementation of rotl64 to prevent colliding on other systems
            that might provide it.

        ProtoHttp
            Fixed a write callback bug when all data is available immediately, in which case the write callback was
            completing the transaction before the data could be read.

        ProtoTunnel
            Fixed an Xbox One specific issue when a player is in multiple meshes with more than one server, e.g. in a
            situation where a user is in a CC-assisted game group while being in a dedicated server game.  In such an
            instance, the packets for the first server connected to would cease to flow when the second server
            connection was established.

    DirtySDK (PS4)
        ProtoHttpPS4
            Refactored the timeout behaviour to use our own timeouts rather than the native PS4 timeout system to better
            match what we do on other systems.

    DirtySDK (XboxOne)
        ConnApi
            Changed the size of a local variable used to store a SecureDeviceAddress as it could potentially be not
            large enough for some theoretical networking conditions.

        DirtyAddr
            Changed DIRTYADDR_MACHINEADDR_MAXLEN from 127 to 372 for xboxone specifically to fix a rare issue
            demonstrated in production where the SecureDeviceAddr blob would be clamped when stored in a DirtyAddrT
            because too large. After discussing with MS, 372 was identified as the right size to avoid this kind
            of issue. (See comment in the code for more details)

        NetConnXboxOne
            Fixed an issue with resume where if we didn't set the the status thread connectivity level to none will
            cause netconn to skip the xbl_wait state causing connection failures

        ProtoHttpXboxOne
            Fixed an issue where a redirect request would never be killed when redirection is disabled due to it never
            going into the completed state.

        VoipHeadsetXboxOne
            Fixed a potential crash in a race condition to create a chat participant for a bystander.

EADP Game Services DirtySDK 15.1.3.0.4 - August 30, 2017

    This SDK release was built using the following compiler packages:

        EA Config   5.01.00
        Framework   7.01.00

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 10.0.14393.2156-proxy
                    capilano_config 1.05.07
        Kettle      kettlesdk 4.508.031-proxy
                    kettle_config 2.01.00
        iPhone      ios_config 1.07.00
                    iphonesdk 8.0-proxy-3
        OSX         UnixGCC 0.10.00
                    osx_config 1.11.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

New in this release:
    DirtySDK (All)
        ProtoHttp/ProtoHttp2
            Added a timeout error (-7) when our module level timeout hits to allow the caller to differentiate between
            errors at the lower protocols currently driven by HRESULT.

        ProtoHttp2
            Added support for HTTP/2 frame padding, see: https://tools.ietf.org/html/rfc7540#section-10.7

        VoipTunnel
            Added VoipTunnelStatus('talk') which returns the current count of "talking" clients, which is a client for
            which the VoipTunnel detects inbound voip traffic.

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Changed the optimized buildtype to correctly derive from what buildtype we are current building (static /
            dynamic) using ${dirtysdk-buildtype}.

        CommUDP
            Fixed an issue in CommUDPSend() where a full reliable buffer would prevent unreliable packets from being
            sent.

        Hpack
            Fixed the string decode function to initialize the output to NULL to prevent from freeing stack memory
            when there is temporary data still being pointed to from previous functions.

        ProtoWebSocket
            Updated the initial handshake receive to be copied into a temporary buffer and changed how it detects we
            have the complete handshake header. Previously, if we get the HTTP/1.1 header data and some of the websocket
            data combined in a single receive call, we have trouble getting into the open state as expected.

    DirtySDK (XboxOne)
        ProtoHttpXboxOne
            Fixed the header parsing to replace the final \r\n with NULL characters to align with our other protohttp
            implementations. This is required for the headers to be compatible with the ProtoHttpUtil header parsing
            functions.

            Removed the memmove in recv that was causing performance issues. On Xbxone the memmove is not really necessary
            since we always allocate a buffer big enough for the full response.

        UserListApiXboxOne
             Fixed a crash that happens when reading the XboxUserProfile results by adding null checks and exception handling.

EADP Game Services DirtySDK 15.1.3.0.3 - July 12, 2017

    This SDK release was built using the following compiler packages:

        EA Config   5.01.00
        Framework   7.01.00

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 10.0.14393.2156-proxy
                    capilano_config 1.05.07
        Kettle      kettlesdk 4.508.001-pr-proxy
                    kettle_config 2.01.00
        iPhone      ios_config 1.07.00
                    iphonesdk 8.0-proxy-3
        OSX         UnixGCC 0.10.00
                    osx_config 1.11.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Updated the voipaux sourcefiles includes to make that it adds the package.dir to the fromfile attribute.
            The basedir only applies to the files in source.txt and not the fromfile call itself.

        ConnApi
            Updated ConnApiRemoveClient to validate the passed in index to ensure it is in the valid range we
            support.

            Removed the virtualization of the voip port when voip is disabled.
            This allows for virtualization to only be done by modules that own the voip connection.

        DirtyNet
            Updated the async receive code to cleanup the packet queue entry when receiving data into it results
            in an error, allowing it to be used again.

        NetGameDistServ
            Removed the notion of a "started" game as it proved to be completely broken.
            When a game is started or stopped, the game code running on the client is in charge of exercising the
            netgamedist flow control.

        ProtoHttp2
            Updated the processing of the url when using a proxy server, we needed to update the url after doing our
            parsing.

        ProtoHttpServ
            Updated the URL length in the request data to 128 bytes.

    DirtySDK (Unix)
        DirtyNet
            Updated SocketConnect logging to align with dirtynetwin which logs the remote address after translation.

EADP Game Services DirtySDK 15.1.3.0.2 - June 1, 2017

    This SDK release was built using the following compiler packages:

        EA Config   5.01.00
        Framework   7.01.00

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 10.0.14393.2156-proxy
                    capilano_config 1.05.07
        Kettle      kettlesdk 4.508.001-pr-proxy
                    kettle_config 2.01.00
        iPhone      ios_config 1.07.00
                    iphonesdk 8.0-proxy-3
        OSX         UnixGCC 0.10.00
                    osx_config 1.11.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

Changes/fixes in this release:
    DirtySDK (All)
        CommUDP
            Added a reliable resend timer separate from our normal send timer to control when we resend reliable
            packets. When customers mix reliable and unreliable packets, it didn't play well with the timer that
            we had setup within commudp.

        CryptBn
            Updated the calculation of the big number bit length to use the correct builtin based on the
            representation of uint64_t on our platform. On 32-bit platforms we were trying to calculate using
            the unsigned long version when uint64_t is a unsigned long long on that platform.

        CryptEcc
            Updated the double and add operations for elliptic curve key generation to use a sliding window.
            This algorithm is adapted from the one used for RSA Exponentiation which is discussed in the Handbook of
            Applied Cryptography Chapter 14.6.

        ProtoSSL
            Updated the server handshake to make sure that we send the server key exchange for ECDHE ciphers
            when client certs are enabled.

            Fixed to add PKCS#1 1.5 padding validation to signature verification, added OBJ_sha384 and OBJ_sha512 to
            ASN.1 parser table, now required for proper PKCS#1 signature validation.

            Fixed to add overflow checking on ASN.1 length parsing.

            Removed obsolete and unsafe OTG3 and GOS2011 CAs from trusted store.

    DirtySDK (PS4)
        ProtoHttpPS4
            Fixed an issue when a POST must be changed to a GET.

            Refactored the creation and destruction of 1st party http contexts objects so that they only exist during requests.

            Refactored the maximum number of times the net context could be shared from a hardcoded constant to a variable
            that can be set through ProtoHttpControl('mncs') or DirtyContextManagerControl('mncs').

            Fixed an issue where a socket is potential left open after a sceEpoll is destroyed without being unset.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Removed the use of the cached User^ and instead rely upon EAUser to provide the information we
            previously relied upon the cached ref for.

EADP Game Services DirtySDK 15.1.3.0.1 - April 11, 2017

    This SDK release was built using the following compiler packages:

        EA Config   5.01.00
        Framework   7.01.00

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 10.0.14393.2156-proxy
                    capilano_config 1.05.07
        Kettle      kettlesdk 4.508.001-pr-proxy
                    kettle_config 2.01.00
        iPhone      ios_config 1.07.00
                    iphonesdk 8.0-proxy-3
        OSX         UnixGCC 0.10.00
                    osx_config 1.11.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

Changes/fixes in this release:
    DirtySDK (All)
        CommUDP
            Changed the #define for ESC_CAUSE_LOSS to not use the define statement as part of the PS4 4.5 SDK changes.

    DirtySDK (PS4)
        DirtySessionManagerPS4
            Changed the constant SCE_NP_PLAY_TOGETHER_MAX_ONLINE_ID_LIST_NUM to SCE_NP_PLAY_TOGETHER_MAX_INVITEE_LIST_NUM as part of the PS4 4.5 SDK changes.

EADP Game Services DirtySDK 15.1.3.0.0 - March 31, 2017

    This SDK release was built using the following compiler packages:

        EA Config   5.01.00
        Framework   7.01.00

        Android     androidsdk 24.4.1-1-2
                    androidndk r13b
                    android_config 4.00.00
        Capilano    CapilanoSDK 10.0.14393.2156-proxy
                    capilano_config 1.05.07
        Kettle      kettlesdk 4.008.131-proxy
                    kettle_config 1.14.00
        iPhone      ios_config 1.07.00
                    iphonesdk 8.0-proxy-3
        OSX         UnixGCC 0.10.00
                    osx_config 1.11.00
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32       DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 14.0.23107-1-proxy
                    WindowsSDK 10.0.10586-proxy

    *** Important - DirtyCast Failover Mode has been removed ***
    Support of DirtyCast Failover mode has been removed in this release.
    This feature has now been replaced by Connection Concierge.

    *** Important - Public API changes UserListApi PS4 ***
    The profile mask is now not supported when querying for the block list.
    Please specify a type mask of 0 instead.

    *** Important - Public API changes for ConnApi ***
    Removed ConnApiStart().
    Removed ConnApiStop().
    Removed ConnApiRematch().
    Removed ConnApiSetPresence().

    *** Important - PS4 User Identifier Changed ***
    As part of Sony's SDK/API 4.0 Sony has deprecated APIs that use OnlineIds, in
    favor of replacement versions using the PS4 account ids. All DirtySDK calls to
    PSN have been switched to use PS4 account ids instead of OnlineIds.

    *** Important - Public API changes for DirtyNet ***
    Renamed SocketInfo('size') to SocketInfo('psiz')
    Renamed SocketPacketQueueStatus('size') to SocketPacketQueueStatus('psiz')
    Renamed SocketPacketQueueStatus('full') to SocketPacketQueueStatus('pful')

    *** Important - WinRT/WinPRT ***
    Removed WinRT and WinPRT support completely.

    *** Important - Modules removed from DirtySDK ***
    The following modules have been migrated to the new LegacyDirtySDK package
        LobbyLan
        Sort
        Tagfield
        NetResource
        WebOffer


New in this release:
    DirtySDK (ALL)
        Build
            Added exporting of the buildtype in our module's publicdata, which allowed dependent packages to easily find
            our exported libs/dlls.

            Enhanced build scripts to define headerfiles so the headers show correctly in Visual Studio.

        CryptBn
            Added a dedicated big number module based on the CryptRSA's implementation, this is used a basis for all
            the crypto based math for RSA/ECC operations.

        CryptEcc
            Added this module to implement math for short Weierstrass curves using CryptBn. This is the basis for the
            support of the P-256/P-384 curves we use within ProtoSSL.

        ConnApi
            Added more detail connection metrics which could be retrieved in the ConnApiInfoT struct as a ConnApiConnTimer with the following fields:
                * uCreateSATime -  time it takes to resolve secure association (xbox one)
                * uConnectTime  -  time it takes for intial connection attempt
                * uDemangleTime -  time it takes to attempt demangling on the connection
                * uDemangleConnectTime - time it takes to attempt a connection after demangling

        Hpack
            Added a module to implement HTTP/2 Header compression support based on
            https://tools.ietf.org/html/rfc7541. This module is used primarily by the new ProtoHttp2 module.

        JsonParse
            Added new JsonParse2() API, which handles allocation of required memory internally.

            Added new getters supporting an error flag (JsonGetString2, JsonGetInteger2, JsonGetDat2, JsonGetBoolean2,
            JsonGetEnum2), which can be leveraged to simplify parsing code that wants to validate whether fields were
            present or not.  JsonGetInteger2 also supports min/max valudation.

        Plat-str
            Added new ds_memclr API that encapsulates memsetting memory to zero. In an attempt to prevent incorrect
            uses of memsetting, we have introduced an API that encapsulates the more common case for memset. For cases
            where memset to zero is not desired a ds_memset function was created so we can easily track conforming code.

        ProtoHttp
            Added support for http PATCH requests.

        ProtoHttp2
            Added a module to implement HTTP/2 based on https://tools.ietf.org/html/rfc7540.

        ProtoHttpUtil
            Added support for parsing the HTTP/2 style header which name begin with a leading ':' character.

        ProtoSSL
            Added support for setting TCP_NODELAY socket option on the ProtoSSL socket.

            Added support for the elliptic curve client hello extension. This extension allows us to negotiate which
            elliptic curves we support.

            Added support for ECDHE Key Exchange and the following cipher suites:
                PROTOSSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA256
                PROTOSSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA256
                PROTOSSL_CIPHER_ECDHE_RSA_WITH_AES_128_GCM_SHA256
                PROTOSSL_CIPHER_ECDHE_RSA_WITH_AES_256_GCM_SHA384
                PROTOSSL_CIPHER_ECDHE_RSA_WITH_AES_128_CBC_SHA
                PROTOSSL_CIPHER_ECDHE_RSA_WITH_AES_256_CBC_SHA
            Due to the performance of our configured elliptic curves, these cipher suites are currently disabled by
            default.

        ProtoTunnel
            Added new status selector 'vers' that can be used to query the prototunnel version negotiated on a specific
            tunnel.

        VoipCommon
            Enhanced debug logging for voip muting using 'umic' and 'uspk' control selectors. And fixed incorrect
            prefix in some other already existing debug traces.

        VoipGroup
            Enhanced logging for the low level connectivity id when resuming a connection.

    DirtySDK (iOS)
        Build
            Added an objective-c fileset / source text for adding multiple files to build as objective-c filetype.

            Added the -Wno-deprecated-declarations flag to disable warnings cause by CHttp functions used in dirtynet.

    DirtySDK (PS4)
        DirtyContextManagerPS4
            Added a system to share sceNetPools to make it possible to create more concurrent ProtoHttpRefTs.

        DirtyErrPS4
            Added errors from the Sony SSL/HTTP libraries.

            Added missing errors from the Sony WebApi library.

        DirtyWebApiPS4
            Added server error message reporting when dealing with errors. We previously only reported the SDK side
            errors but not the errors reported by the server. The server errors are not defined in a manner that we
            can get the data from DirtyErr so we need to rely upon the data returned by the response information
            struct.

        NetConnPS4
            Enhanced NetConnShutdown() with implicit IEAUser entries cleanup in case the game team is not calling
            NetConnRemoveLocalUser() before calling NetConnShutdown(), or in case recent remove requests are still
            pending in the internal request list when calling NetConnShutdown().

        ProtoHttpPS4
            Added support for http POSTs with no payload.

            Added additional printf messages for debugging http headers.

            Added error logging so we know what the exact Sony errors were when any error occurs.

        VoipPS4
            Added VoipControl('+pri') to be used to by game code to signal that the specified local user shall be
            included when internally calculating most restrictive voip privileges

            Added VoipControl('-pri') to be used to by game code to signal that the specified local user shall not be
            included when internally calculating most restrictive voip privileges.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Enhanced NetConnShutdown() with implicit IEAUser entries cleanup in case the game team is not calling
            NetConnRemoveLocalUser() before calling NetConnShutdown(), or in case recent remove requests are still
            pending in the internal request list when calling NetConnShutdown().

Changes/fixes in this release:
    DirtySDK (ALL)
        Build
            Switched over to using Visual Studio 2015 by default.

            Refactored contribs to unflatten the include structure. To prevent collisions with other libraries we
            are adding extra directories to our include structure.
            common/include  -> common/include/libsample
            voipaux/include -> voipaux/include/voipaux

        General
            Refactored locations that use memcpy/memcpy_s to use ds_memcpy/ds_memcpy_s.

        ConnApi
            Removed ConnApiStart(), ConnApiStop(), ConnApiRematch(), ConnApiSetPresence(). Those functions are
            leftovers from the xbox360 times... they have been no-op for a long period. They no longer need to exist.

            Fixed the setting of the GameServer's VoIP connection id by setting to VOIP_CONNID_NONE to prevent
            incorrect teardowns of any active VoIP Connections. When in a Game Group and a DirtyCast hosted game,
            if we leave the game the VoIP connection would have been incorrectly torn down. This causes our VoIP port
            to be devirtualized, which caused our subsequent VoIP connections a higher chance of getting into a bad
            state. So instead we needed to indicate that the DirtyCast GameServer does not own any VoIP connections and
            that we will only devirtualize the VoIP port when tearing down the connection.

            Changed the virtualization of ports to be at the ConnApi level instead of the connection level. When doing
            virtualization of ports at a connection level we can quickly run out of available ports. Since we know that
            the virtualized ports do not change we can easily move this. With this change I updated our documentation
            of how the client level ports are assigned to be more clear of what is happening.

            Removed gameserver mode concept used for fallback. Fallback mode has been replaced with connection concierge.

        DirtyLib
            Changed to move platform-specific time code from plat-time to dirtylib.

            Changed NetPrintfCode() to initilize string buffer separately from instantiation.  This is an optimization
            to prevent the entire array from having to be memset at instantiation on every invocation.

        DirtyMem
            Removed these two external MEMIDs:  PLAYERSYNCSERVICE_MEMID ('plss')   &   TELEMETRYAPI_MEMID ('telm')
            Any external module using the dirtymem api is now assumed to be internally defining its own mem id.

            Removed unused internal MEMIDS: PROTONAME_MEMID ('pnam')   &   PROTOARIES_MEMID ('pari')   &
                                            FRIENDAPI_MEMID ('frnd')   &   DIRTYLSP_MEMID   ('dlsp')   &
                                            COMMSER_MEMID   ('cser')

        DirtyNet
            Fixed error conversion logic in SockRecvfrom(). Socket type (stream vs dgram vs raw) is now taken
            into account to determine what conversion to use.  The incorrrect logic proved to be problematic with
            TCP sockets using async recv thread and being explicitly polled for recv by the client code instead
            of just relying on recv callback invocation by the DS layer.

            Changed (renamed) SocketInfo('size') to SocketInfo('psiz')

            Changed (renamed) SocketPacketQueueStatus('size') to SocketPacketQueueStatus('psiz')

            Changed (renamed) SocketPacketQueueStatus('full') to SocketPacketQueueStatus('pful')

            Fixed SocketPacketQueueStatus 'pdrp' and pmax' when using the SocketPacketQueueAlloc code path.

            Changed SocketAddrMapTranslate to accept addresses of the same type without reporting an error.

        DirtySock
            Removed the LobbyLan, Sort, Tagfield, NetResource and WebOffer modules.
            These can now be found in the LegacyDirtySDK package.

            Fixed potential threading issues with modules with updates calling through NetConnIdle.

        JsonParse
            Fixed JsonFind() to prevent reading outside the parse buffer.

            Fixed JsonParse() to return zero if the parse buffer is too small.

        NetConn
            Changed NetConn to track NetConnStartups and Shutdowns with a reference count. Copied the handling on some
            NetConnStartup params over to NetConnConnect options.

        NetGameUtil
            Fixed NetGameUtilConnect() and NetGameUtilAdvert() to correctly handle failing calls to
            _NetGameUtilAdvtConstruct().

            Fixed local error codes possibly conflictig with COMM_* error codes in NetGameUtilConnect().

            Changed implementation to eliminate code duplication: advt ref validation code
            is now centralized in _NetGameUtilAdvtConstruct().

        Plat-str
            Changed to replace use of strncpy() with inline implementation in ds_strnzcpy(), for improved performance
            when copying a string into a large buffer.  The standard version will fill any unwritten parts of the
            destination buffer with zeros.

        ProtoHttpServ
            Changed strLocation (redirection location) to ProtoHttpServeResponseT.

        ProtoMangle
            Updated logging to know what ports are bound and what currently module ref that logs belong to

        QosApi
            Removed unused tagfield include.

            Changed the default packet queue length to 12 (up from 10), in testing this covers the most extreme case
            of _QosApiRecvCB NetCritTry never succeeding.

            Added logging describing packet queue health, a warning will be printed if the queue is close to being
            full.

            Fixed a print which indicated both FW probes were sent to the same address, when they in fact have not.

        VoipCommon
            Fixed a potential race condition between the main thread and the voip thread when altering the voip channel
            config. The bApplyChannelConfig variable was being set to TRUE before propagating the change down to the
            voip layer with VoipControl('chan'). Under some timing conditions, that could result in the voip thread
            applying the voip channel config with the old values instead of the new values because the data structures
            involved were not yet updated.

        VoipGroup
            Fixed some coding standard violations, arrays are required to be prefixed with "a"

        VoipTunnel
            Changed to using qsort for sorting our internal lookup table.

            Changed suspended data not found logging to be at a higher verbosity as we assume this something that doesn't happen often and can be quite spammy

    DirtySDK (PS4)
        DirtyContextManagerPS4
            Fixed a bug which prevented the manager from properly cleaning itself up on shutdown.

            Changed to Sony API using PSN account ids.

        DirtyLibPS4
            Changed mutex creation to attempt to fallback to an unnamed mutex when create returns
            SCE_KERNEL_ERROR_EAGAIN.

        DirtyUserPS4
            Removed unused tagfield include.

            Changed to Sony API using PSN account ids.

        DirtyWebApiPS4
            Fixed DIRTYSESSMGR_MEMID being incorrectly used instead of DIRTYWEBAPI_MEMID.

            Changed mutex creation to attempt to fallback to an unnamed mutex when create returns
            SCE_KERNEL_ERROR_EAGAIN.

            Removed the SDK 2.5 checks as we are long past the days of titles allowed to ship on those old SDKs.

            Removed deferred delete list.

            Changed to Sony API using PSN account ids.

        NetConnPS4
            Fixed multiple cosmetic issues to improve code readability and alignment with coding convention.

            Fixed an inconsistent error code in NetConnShutdown.

            Changed to Sony API using PSN account ids.

        PrivilegeApiPS4
            Changed to Sony API using PSN account ids.

        ProtoHttpPS4
            Fixed the dumping of the POST data payload, we needed to use the size instead of the result of send.

            Changed the HTTP connection template creation to disable gzip decompression. ProtoHttp does not offer this
            type of functionality which causes some isues when trying to read gzipped compressed bodies from the
            server.

            Fixed an issue where large headers were not processed properly.

            Fixed a possible truncation of a url when formatting a request.

            Fixed an issue with long urls getting truncated.

            Refactored to deactivate the Sony library's automated handling of redirections and cookies in order to
            provide the exact same behavior as other platforms.

            Fixed the handling of binary certs.

            Fixed the http headers to be associated with the sceRequest rather than the sceTemplate to make sure the
            headers are cleared at the appropriate times. This prevents the http library from running out of memory
            after a few uses of a protohttp reference.

        UserApiPS4
            Changed to Sony API using PSN account ids.

        UserListApiPS4
            Changed to Sony API using PSN account ids.

        VoipPS4
            Changed to Sony API using PSN account ids.

        VoipHeadsetPS4
            Fixed dirtysdk incorrectly requiring a voip user to be a member of a blaze mesh for his privacy settings
            to contribute to the calculation of the most restrictive voip setting on the console in scenarios where
            multiple users are locally signed-in. DirtySDK now only requires the user to be authenticated with blaz
            for his privacy settings to contribute to the calculation of the most restrictive voip setting. The
            rational being that a blaze authenticated user is implicitly a user interacting with the game UI and
            therefore a "particiapting user" as defined by Sony.

            Changed initialization of Sony voice lib to leverage the new sceVoiceSetThreadsParams() api
            (introduced is SDK 3.50) to specify the priority and the affinity of the internal voice and audio port
            threads. This replaces the usage of ephemeral high-priority threads for calling sceVoiceStart() and
            sceVoiceCreatePort() such that internal threads inherit of the right attributes.

            Changed _VoipHeadsetUpdateChatPrivileges() to now take the new +pri / -pri config into account when
            calculating pHeadset->bSharedPrivilege.

    DirtySDK (Unix)
        DirtyNetUnix
            Fixed to revert address selection to prefer IPv4 addresses on non-Apple platforms.  Apple platforms
            continue to prefer IPv6 addresses, a fix that was required for iOS10 compatibility.

        NetConnUnix
            Fixed an inconsistent error code in NetConnShutdown.

    DirtySDK (XboxOne)
        DirtyAddrXboxOne
            Removed TagField usage as TagField will be moving to the LegacyDirtySDK.

            Fixed an off-by-1 error for decoding binary7 Xbox One addresses.

        DirtyUserXboxOne
            Removed TagField usage as TagField will be moving to the LegacyDirtySDK.

        ProtoHttpXboxone
            Refactored implementation to use a request killlist where terminated requests are queued until they
            complete for good. That is replacing the former explicit abort operations.

            Changed the implementation with the introduction of a state machine to track asynchronous evolution
            of a specific xmlhttp object.


EADP Game Services DirtySDK 2015 Winter 2.3.0 - October 19, 2016

    This SDK release was built using the following compiler packages:

        EA Config   4.03.01
        Framework   6.04.01

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 10.0.14393.1058-proxy
                    capilano_config 1.05.03
        Kettle      kettlesdk 3.508.041-proxy
                    kettle_config 1.06.00
        iPhone      ios_config 1.03.00
                    iphonesdk 8.0-proxy-2
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.02-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-4-proxy
                    WindowsPhoneSDK 8.0.9900-proxy

    *** Important: The CommTAPI and CommSer modules have been removed ***

    *** Important: The CryptSSC2 module has been removed, for string encrypt/decrypt please use CryptArc4 ***

    *** Important: The SOCKET_ASYNCRECVTHREAD = 0 support has been removed ***

New in this release:
    DirtySDK (All)
        ConnApi
            Added a new control selector 'dtif' that can be used to override the default timeout value for XB1
            security association creation or the demangling timeout on other platforms (in a cc-assisted or failover
            context).

       DirtyNet
            Added support for TCP keep-alive settings using the 'keep' control.  In some environments we need to be able
            to tweak the keep-alive settings to ensure that firewalls and other external parties do not close our
            connections without notifying us.

            Added SocketHostnameCacheDel, which deletes an entry from the hostname cache (internal use only).

            Added debug print when a lookup is refcounted.

        NetConn
            Added ability to allow users to override the cpu affinity of our internal threads with a netconn startup
            param "-affinity".

        Platform
            Added ds_strtoull function to convert strings to uint64_t.

            Added support for using EABase to drive the platform.h defines.

        ProtoSSL
            Added support for the ALPN extension (Application Level Protocol Negotiation) on both the client & server
            side.  This extension helps negotiate a protocol between the client & server; see the spec at
            https://tools.ietf.org/html/rfc7301.

            Added ProtoSSLControl() 'resu' selector, to enable/disable SSL session resume (enabled by default,
            preserving previous behavior).

            Added support for setting the keep alive settings for the TCP socket. To support this I've added
            an 'skep' option and followed the same pattern as the other socket options that we set for this module.

        QosApi
            Added ability to configure much of qosapi with QosApiControl, via the BlazeSDK util component this provides
            us with many options to tweak QOS behaviors post ship.  New selectors are:
            'bpco' - if used overrides config from server, this will be the number of bandwidth probes used for tests
            'bpso' - if used overrides config from server, this will be the size of bandwidth probes used for tests
            'isyt' - sets the maximum number of ms to wait to initially synchronize all latency requests
            'lpco' - if used overrides config from server, this will be the number of latency probes used for tests
            'pque' - passed to SocketControl 'pque' if not 0, otherwise the numpackets will be passed to SocketControl
                     'pque'
            'rbuf' - passed to SocketControl 'rbuf'
            'repc' - sets the number of extra probes sent (in addition to those which received no response) on a re-issue
            'sado' - set the override address to send the http requests to when issuing a service request, overrides
                     parameter passed to QosApiServiceRequest
            'salp' - if TRUE use old logic of sending all latency probes at once (default FALSE)
            'sbuf' - passed to SocketControl 'sbuf'
            'sprt' - set the override port to send the http requests to when issuing a service request, overrides
                     parameter passed to QosApiServiceRequest
            'tgbp' - sets the minimum number of ms between sending latency probes to the same site.
            'ussl' - if TRUE use https else http for setup communication (defaults TRUE)

    DirtySDK (PS4)
        DirtySessionManagerPS4
            Added new status selectors for PlayTogther support. New selectors are:
            'pthe' - poll this selector to check if the client has received the PlayTogether event
            'ptil' - if a PlayTogether event has been received use this selector to retrieve the invite list

        NetConnPS4
            Added a new startup parameter "-checktick" on PS4 to control how we initialize DirtyEventManager.  The new
            startup parameter will control if we fail our initialization of DirtyEventManager in the case that we have
            potentially missed events because the EASystemEventMessageDispatcher has been ticked. By default we will
            not check if the dispatcher has been ticked so teams don't need to worry about aligning the startup of the
            two systems.

        ProtoHttpPS4
            Added protohttpps4 for native support of HTTP and SSL.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Added extra mapping from sandbox to environment to prevent having the title download storage figure out the
            environment:
            * EARW.3 -> CERT
            * XDP1.0 -> PROD (EA Access Testing)

Changes/fixes in this release:
    DirtySDK (ALL)
        Build
            Changed to set the optionset to the C++ build type when building those types of files.  With newer packages
            we see that our C++ files were trying to be built as C and causing us to generate some compiler errors due
            to that.

        ConnApi
            Changed to move the virtualization of ports to be handled at the connapi layer instead of having the
            network adapter deal with it.

        DirtyCert
            Changed to move DirtyCert updating to the internal NetLib idle thread.  To make integration easier for our
            customers, this makes it possible to use ProtoHttp without the need to poll NetConnIdle.  The major
            requirement that ProtoHttp depended on was DirtyCert, which needs to be updated in case we needed to pull
            down any CA certs.

        DirtyNet
            Fixed to no longer refcount HostentT refs that are in the list but are in a done state.

        JsonParse
            Fixed crash issue parsing json with leading whitespace.

        ProtoHttp
            Fixed a bug in both ProtoHttpGetNextHeader() and ProtoHttpFindHeaderValue(), when dealing with an empty
            header.

        ProtoHttpServ
            Fixed an issue which could lead an http client to hang indefinately or until timeout when the client
            requested a keep-alive.

            Fixed a cert cache issue where it was possible to reconnect to a server with a cached cert using IP address
            instead of name.

        ProtoTunnel
            Fixed to initialize the sockaddr used in _ProtoTunnelRecvCallback to prevent address translation spam.

        QosApi
            Changed to improve latency tests accuracy in poor network conditions; latency is now done in parallel
            across all ping sites, preventing random lag spikes from effecting one result.

            Changed to improve logging by making it more configurable with QosApiControl('spam') - set the verbosity of
            the module, default 1 (0 errors, 1 debug info, 2 extended debug info, 3 per probe info).

            Changed public APIs QosApiCreate and QosApiServiceRequest to simplify API and better reflect data types
            being passed.

            Removed unused defines QOSAPI_STATUS_XB_*, QOSAPI_LISTENFL_*, and QOSAPI_RESPONSE_MAXSIZE.

            Removed and replaced QOSAPI_REQUESTFL_* with QosApiRequestTypeE.

        VoipConnection
             Fixed coverity warning about potential out of bound access of pConnection->VoipMicrPacket[] array when
             user index is VOIP_SHARED_USER_INDEX (0xFF on PC).

             Fixed a bug in use of memset, which resulted in target buffer not being cleared.

        VoipTunnel
            Removed deprecated flags and fields that were set for deprecation since v9
            * VOIPTUNNEL_CLIENTFLAG_BROADCASTING_VOICE
            * VOIPTUNNEL_GAMEFLAG_MAX_VOICES_REACHED
            * VoipTunnelGameT.iNumClientsBroadcasting

        XmlFormat
            Fixed access to unitialized variable coverity warning.

    DirtySDK (PS4)
        DirtySessionManagerPS4
            Fixed to try to catch configuration errors with dirtysessionmanager as we want to send failures back to
            bring it to the attention of integrators.

            Fixed an issue where the return value was not properly being set because of a bad enclosure of assignment.

    DirtySDK (Unix)
        Build
            Removed voiptunnel.c from unix specific sources as this is already part of main source list.

        DirtyNetUnix
            Fixed _SocketLookupThread to prefer IPv6 addresses, when available.  This fixes compatibility with iOS10.

            Fixed SocketConnect to scrub a hostname cache entry when connect() returns an EHOSTUNREACH error.  This
            type of error happens when switching from an IPv4 to an IPv6 connection or vice versa.

    DirtySDK (XboxOne)
        Build
            Changed to use sdkreferences task when depending on any of the extension assemblies on XboxOne.

        ProtoMangleXboxOne
            Fixed a potential issue where an IPv6 user mapping might get updated instead of added.

        NetConnXboxOne
            Fixed to handle the AsyncStatus::Started case when calling DownloadBlobAsync.  FIFA was seeing instances
            where we would crash when getting a AsyncStatus::Started due to the fact that we don't handle and just kill
            the async operation.  After discussing this with Microsoft their suggestion was just to ignore this status
            as you should expect to get another callback when the operation actually finishes.

            Fixed an issue were a failed environment check would not properly trigger a retry, leaving netconn stuck in
            ~env state indefinitely.


EADP Game Services DirtySDK 2015 Winter 2.2.3 - September 19, 2016

    This SDK release was built using the following compiler packages:

        EA Config   3.04.00
        Framework   5.05.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 10.0.10586.1203-proxy
                    capilano_config 1.03.03
        Kettle      kettlesdk 3.508.041-proxy
                    kettle_config 1.06.00
        iPhone      ios_config 1.03.00
                    iphonesdk 8.0-proxy-2
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.01-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-1-proxy
                    WindowsPhoneSDK 8.0.9900-proxy

New in this release
    DirtySDK (All)
        DirtyNet
            Added support for TCP keep-alive settings using the 'keep' control


EADP Game Services DirtySDK 2015 Winter 2.2.2 - September 06, 2016

    This SDK release was built using the following compiler packages:

        EA Config   3.04.00
        Framework   5.05.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 10.0.10586.1203-proxy
                    capilano_config 1.03.03
        Kettle      kettlesdk 3.508.041-proxy
                    kettle_config 1.06.00
        iPhone      ios_config 1.03.00
                    iphonesdk 8.0-proxy-2
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.01-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-1-proxy
                    WindowsPhoneSDK 8.0.9900-proxy

New in this release:
    DirtySDK (All)
        ProtoSSL
            Added ProtoSSLStat() 'rsao' selector to signal that there is currently an RSA operation ongoing.

Changes/fixes in this release:
    DirtySDK (All)
        ProtoTunnel
            Fixed a knock-on  in cl 1174902 when faced with discarding an out-of-order packet that could not be
            recovered.  This would cause a stream reset that broke the connection.  This fix reverts part of that
            change to make the out-of-order packet discard safe and not break the connection. In doing so it undoes
            the original fix, meaning some other resolution for that issue will be required moving forward.

    DirtySDK (PC)
        VoipPC
            Fixed intermittently broken voip on PC caused by bad initialization of the VoIP user identifier.

    DirtySDK (Unix)
        NetConnUnix
            Fixed to check for NULL terminator when parsing /proc/cpuinfo in the case we have a truncated string
            (does not include \n).  This caused issues on newer hardware where the flags field grew larger than 512,
            which caused a crash from the loop never exiting.


EADP Game Services DirtySDK 2015 Winter 2.2.1 - July 13, 2016

    This SDK release was built using the following compiler packages:

        EA Config   3.04.00
        Framework   5.05.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 10.0.10586.1203-proxy
                    capilano_config 1.03.03
        Kettle      kettlesdk 3.508.041-proxy
                    kettle_config 1.06.00
        iPhone      ios_config 1.03.00
                    iphonesdk 8.0-proxy-2
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.01-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-1-proxy
                    WindowsPhoneSDK 8.0.9900-proxy

Changes/fixes in this release:
    DirtySDK (PS4)
        DirtySessionManagerPS4
            Changed DirtySessionManager to better catch configuration errors and service it back to integrators.

        VoipHeadsetPS4
            Fixed _VoipHeadsetUpdateChatPrivileges() to ignore non-participating user.  This fix is necessary to comply
            with TRC R4061G in PS4-TestCase_for_TRC1.5_e stating: A non-voip-restricted user in a game should not see
            his voip blocked because of a voip-restricted user signed-in on the console but not participating in the
            game.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Fixed potential crash in the lambda expression performed when the DownloadBlobAsync()  operation completes
            with completion status AsyncStatus::Canceled.  The code incorrectly uses a reference that was invalidated
            when the operation cancellation was initiated.

        ProtoHttpXboxOne
            Fixed a potential external cleanup issue by adding a timeout to stop waiting for the E_ABORT that might
            never come.  Instead after 5 second time we will fake the E_ABORT Event ourselves.

    DirtySDK (Unix)
        DirtyNetUnix
            Removed the use of  AI_V4MAPPED flag when ai_family is AF_UNSPEC.


EADP Game Services DirtySDK 2015 Winter 2.2.0 - June 09, 2016

    This SDK release was built using the following compiler packages:

        EA Config   3.04.00
        Framework   5.05.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 10.0.10586.1203-proxy
                    capilano_config 1.03.03
        Kettle      kettlesdk 3.508.041-proxy
                    kettle_config 1.06.00
        iPhone      ios_config 1.03.00
                    iphonesdk 8.0-proxy-2
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.01-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-1-proxy
                    WindowsPhoneSDK 8.0.9900-proxy
New in this release:
    DirtySDK (All)
        Build
            Enabled shadow variable warnings on targets that doesn't set this by default.

        DirtyLib
            Added NetPrintRateLimit, implementing automated rate limiting of redundant lines of NetPrintf output.
            Identical sequences of lines are suppressed for up to 100ms, or when a new line of text is printed.
            The number of suppressions is appended to the line of text.  Lines of text over 256 characters are
            not rate-limited.

        DirtyNet
            Added SocketPacketQueueStatus('full') to query if socket inbound packet queue is full or not.

            Added SocketPacketQueueStatus('size') to query current size (in packets) of socket inbound packet queue.

            Added IPv6 support definitions and includes.

            Added SocketAddressMap functionality, moved here from dirtynetxboxone, for general IPv6 support.  IPv6
            addresses are mapped to pseudo-IPv4 addresses for public consumption.

        NetConn
            Added standard error code for NetConnStartup.

        ProtoHttpServ
            Added function to log via the logging callback at varying verbosity levels.

        ProtoSSL
            Added debug output of certificate signature type when validating a certificate.

        QosApi
            Added code to leverage the new support for SocketControl('pque') on physical sockets (non-virtual). QosApi
            is now using a socket with a 10-deep recv paquet queue to eliminate the possibility of inducing artificial
            latency resulting from inbound latency probes remaining in the system socket receive buffer because the
            1-deep queue was full. (Happens when the critical section cannot be entered in the recv callback registered
            by qosapi - _QosApiRecvCB())

    DirtySDK (Android/iOS/PC/Unix/XboxOne)
        DirtyNetWin
            Added IPv6 support, switched to using IPv6 sockets internally, leveraging dual-protocol stack functionality
            to continue to support IPv4.  Added IPv6 name resolution support to SocketLookup().  IPv4 names continue
            to be preferred when available.

    DirtySDK(WinRT)
        DirtyNet
            Added new define INADDR_LOOPBACK for WinRT configurations

    DirtySDK(XboxOne)
        NetConnXboxOne
            Added a new XBLWait state so make sure we wait for the connectivity level to become xbox live.

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Moved the contents of dirtysock-initialize.xml to Initialize.xml file and tell the package to
            initializeself. This makes it so the package will include Initialize.xml automatically without us needing
            to do it explicitly.

            Changed implementation to now export the DIRTYCODE_LOGGING defines based on the
            dirtysdk_debug_enable / dirtysdk_debug_disable build properties.

            Removed hhc.exe from the SDK and depend on the userdoc package to provide this when building documentation.

            Removed unused macro / defines

            Removed unused release build scripts

        ConnApi
            Fixed the GameServer's bAllocated flag to be correctly set TRUE during client initialization.

        CryptGCM
            Fixed crash in _CryptGcmDecrypt() when passed a negative length.  This condition is rare and has been seen
            when an SSL server incorrectly sends an unencrypted alert message when aborting a connection.

        DirtyLib
            Changed to move/consolidate NetPrintfCode and NetPrintfHook to dirtylib from platform-specific files.

            Moved DIRTY_TOKEN_PASTE and DIRTY_CONCATENATE_HELPER here from dirtynet.h as a better fit.

        DirtyNet
            Fixed implementation to skip empty hostname cache entries before checking for expiration, to eliminate
            confusing debug output.

            Refactored recv path for physical sockets (non-virtual):
              * Replaced hard-coded 1-deep queue with configurable n-deep queue.
              * Performed appropriate changes for all flavors (win, x1, ps4, unix) to be as close as possible
                (eliminated unjustified platform specificities)
              * Simplified recv path logic in terms of what is done in the context of SocketrecvFrom() vs in the
                context of socketrecvthread

            Standardized verbosity tracking and usage (spam levels).

        JsonParse
            Added handling for JSON strings inside of JsonSeekObjectEnd.

        Plat-str
            Cleanup and better support of IPv6 address printing.

        ProtoAdvt
            Fixed a couple of places that didn't initialize a sockaddr struct before use.

        ProtoHttpServ
            Changed all the logging to use the logging callback so we get in the applications that run this module.

        ProtoSSL
            Fixed a bug when requesting an SSLv3 connection where the requested cipher list would be empty, causing
            the connection to fail.  This is only relevant to test setups as DirtySDK clients do not request SSLv3
            by default.

        ProtoTunnel
            Removed tunnel mode concept from prototunnel.

    DirtySDK (PC)
        DirtyNetWin
            Removed DirtyNetXboxOne. Consolidated win and xboxone implementations in a single file called DirtyNetWin
            to achieve reduction of code duplication.

        VoipConnection
            Fixed the voip data to not be processed if there is no listening device attached to prevent TTY spam on PC.

    DirtySDK (PS4)
        Build
            Removed unsupported defines as part of the PS4 3.500 SDK upgrade. The ORBIS_SDK_VERSION was replaced by
            SCE_ORBIS_SDK_VERSION.

            Removed very old version checks that are no longer needed.

            Removed the privilege checks for asynchronous multiplayer as this is not supported on the newer SDK.

            Changed implementation to now set the config-vs-version on PS4 to support the use case of Frostbite titles.
            Make sure to only set the VS2015 compiler flags for vc compilers.

            Fixed PS4 compiler warnings introduced in the PS4 3.500 upgrade, reported by a customer (Unreachable code
            and checking NULL on arrays).

        DirtyNetPS4
            Added handling of sceNpWebApiDeleteRequest failures.

        DirtySessionManagerPS4
            Fixed potential mem leaks caused by the changeable data never being released when it exists.

            Fixed implementation of DirtySessionManagerControl('gchg') to invoke
            _DirtySessionManagerSetChangeableSessionData() instead of _DirtySessionManagerSetSessionData().

        DirtyWebApiPS4
            Changed where iThreadLife is set to DirtyWebApiCreate (main thread).

        NetConn
            Fixed implementation to check the result code of sceAppContentAppParamGetInt() when querying for trial
            status.

        UserApiPS4
            Fixed a double counting problem when a first party query fails.

    DirtySDK (XboxOne)
        Build
            Fixed compiler warnings introduced by upgrading to the March XDK.
              * Fixed shadow variable usage in 'poll' selector (dirtynetxboxone)
              * Fixed an incorrect implementation of SocketRecvfrom the pBuf parameter is non-const (dirtynetxboxone)
              * Remove unused variables on platforms they are not used on (connapi, user, privilege)
              * Use a conditional instead of assigning an integer to a boolean in C++ (voipxboxone)
              * Remove printing of serialization size as that was the only use of the variable and not very helpful to
                logging.
              * Suppress warning in T2Host relating to changing of sizes between compilers and alignment attributes
              * Assign the enumeration to the correct value instead of treating it as an integer (privilege)
              * Switch from while(1) to for (;;) to prevent a constant expression warning (SampleCore)
              * Remove unused variable (connapi, SampleCore)

        DirtyLibWin
            Changed to statically initialize nettick frequency to a safe value, so any calls to NetTick() on Xbox One
            before NetConnStartup() will not crash.

        DirtyNetXboxOne
            Switched to using DirtyNet functions for Address Map functionality that were previously internal.

            Removed DirtyNetXboxOne. Consolidated win and xboxone implementations in a single file called DirtyNetWin
            to achieve reduction of code duplication.

        VoipHeadsetXboxOne
            Refactored bad rep check query to use normal lambda expressions.


EADP Game Services DirtySDK 2015 Winter 2.1.0 - March 31, 2016

    This SDK release was built using the following compiler packages:

        EA Config   3.04.00
        Framework   5.05.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 10.0.10586.1100.0-proxy
                    capilano_config 1.03.03
        Kettle      kettlesdk 3.008.211-proxy
                    kettle_config 1.05.00
        iPhone      ios_config 1.03.00
                    iphonesdk 8.0-proxy-2
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.01-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-1-proxy
                    WindowsPhoneSDK 8.0.9900-proxy

    *** Important - Xbox One XSAPI 2.0 Support ***
    This version of DirtySDK supports XSAPI 2.0 which is not backwards compatible with XSAPI 1.0.
    Integrators will need to build against XSAPI 2.0.

    *** Important - ConnApi client uId of 0 is now considered invalid ***
    ConnApi client with a uId of 0 will now be consider invalid and will be ignore by ConnApi.

    *** Important - First DirtySDK version compatible with the Connection Concierge feature ***
    This version of DirtySDK includes a large amount of changes that were introduced specifically for interoperability
    with the Connection Concierge tech (https://docs.developer.ea.com/display/TEAMS/Connection+Concierge+Project).
    Regardless of your game leveraging Connection Concierge or not, those changes should be transparent to you.

New in this release:
    DirtySDK (All)
        CommUdp
            Added backwards-compatible update to protocol to allow versioning, defined previous version as 1.0 and new
            version as 1.1.

            Added larger subpacket support (increased from a maximum of 250 bytes to 1530 bytes) for connections
            negotiated to commudp protocol version 1.1 or higher.  Subpackets requiring 250 bytes or fewer continue to
            use one byte of encoding, while larger subpackets require two bytes.  This allows packet redundancy, when
            combined with raising the default redundancy limit, for larger packets.

        ConnApi
            Added the ability to specify a user index when activating the P2P connection forced failure debug
            option ('!res'). Setting the index to -1 will affect all users like the old behavior.

            Added support for hosted connections (obtained from Connection Concierge). New code paths were added
            to use connection IDs received from Connection Concierge when setting up game connections, voip
            connections and tunnels. Related public api changes:
             * Added multiple new fields to ConnApiClientInfoT.
             * Added CONNAPI_CCMODE_* defines.
             * Added a new 'ccmd' control selector to specify the Connection Concierge mode associated with
               the connapi instance.

        DirtyNet
            Added prints to track virtual port addition and deletion.

            Added packet drop and packet high water to packet queue.

            Added SocketInfo() 'pdrp' and 'pmax' selectors.

        JsonParse
            Added support for JSON payloads greater than 64k.

            Added support for JsonParse taking a length of -1, in which case strlen is used to calculate the size of
            the input JSON buffer.

            Added support for JsonParse to take a null parse buffer, in which case the size in bytes required for the
            parse buffer are calculated and returned.

        ProtoHttpServ
            Added support for a 'spam' control to control the amount of logging with do within the module.

            Added a request timeout to cover situations where the remote side stops sending or receiving, defaulting
            to 30 seconds.

            Added a ProtoHttpServControl('idle') selector to set the idle/keep-alive timeout.

            Added PROTOHTTPSERV_FLAG_LOOPBACK.

            Added ProtoHttpServCreate2() which has an additional uFlags parameter.

        ProtoTunnel
            Added a new 'actv' status selector to get the number of active tunnels on based on a specific prototunnel
            version.

            Added a new 'vset' status selector to get a comma delimited list of versions we support to report to the
            CCS.

            Added PROTOTUNNEL_VERSION, PROTOTUNNEL_VERSION_MIN, PROTOTUNNEL_VERSION_MAX to the public header file.

        Voip
            Added support for one way muting.

        VoipCommon
            Added a new 'vcid' control selector to assign a local 32-bit identifier to a specific voip connection.

        VoipConnection
            Added support for hosted connections (obtained from Connection Concierge). New code paths were added
            to use connection IDs received from Connection Concierge when setting up voip connections.
            Related public api changes:
                * New uRemoteClientId field added to VoipConnectionT.
                * Renamed uClientId field to uLocalClientId in VoipConnectionT.

        VoipGroup
            Added support for hosted connections (obtained from Connection Concierge). New code paths were added
            to use connection IDs received from Connection Concierge when setting up voip connections.
            Related public api changes:
                * Added VOIPGROUP_CCMODE_* defines.
                * Added a new 'ccmd' control selector to specify the Connection Concierge mode associated with
                  the voipgroup.
                * Added VoipGroupConnect2() which takes an additional bIsConnectivityHosted input parameter and an
                  additional uLowLevelConnectivityId input parameter.
                * Added VoipGroupResume2() which takes an additional uLowLevelConnectivityId input parameter. For
                  Connection Conncierge support specifically.

        VoipTunnel
            Added support for allowing voiptunnel clients to exist in multiple games. This functionality to used to
            mimic how Blaze handles clients in Games and Game Groups. Related public api changes:
                * Added VOIPTUNNEL_MAXSUSPENDED.
                * Added VoipTunnelSuspendInfoT.
                * Added iNumSuspended field to VoipTunnelClientT.

            Added support for a unique game identifier that can be specified when creating the game in the
            voiptunnel. New API functions were added to allow users to work with this identifier. Related public
            api changes:
                * Added VoipTunnelGameListAdd2().
                * Added iGameIdx input param to VoipTunnelClientListDel().
                * Added VoipTunnelGameListMatchIndex().
                * Added VoipTunnelGameListMatchId().

    DirtySDK (PS4)
        DirtyNet
            Added missing definition for INADDR_LOOPBACK for PS4, needed in protohttpserv.

        VoipHeadsetPS4
            Added the ability to configure voice lib thread attributes. You can override the settings with your
            Blazeserver util.cfg.

    DirtySDK (PS4/XboxOne)
        NetConn
            Added a new 'eusr' selector that returns the IEAUser object at a given index.

    DirtySDK (XboxOne)
        DirtyNetXboxOne
            Added functionality to remap IPv6 addresses to existing IPv4 virtual addresses. It was demonstrated that
            this update is possible in a cable pull scenario.

        ProtoMangleXboxOne
            Added processing for updates of secure associations which the are already in a completed state to update
            the IPv6 address mappings.

        Voip
            Added bad reputation auto muting support in order to better satisfy XR-086. This feature will be on by default.

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Fixed doc build errors.

            Fixed warnings generated by VS2015 Update 1

            Changed the build scripts to use the config-vs-version property to better handle changing between versions
            of Visual Studio.

        ConnApi
            Fixed how we increment the client count.

            Fixed the 'cadr' selector to return the prototunnel address used.

            Removed CONNAPI_STATUS_CLSE as it is no longer used.

            Fixed an issue that caused the previous mute settings not to be properly retained when resuming a voip
            connection.

            Fixed an issue where a game group would use the wrong voip port when joining a game session, then a
            game group, then leaving the game session.

            Fixed ConnApiControl 'adve' selector, when disabling advertising, to also destroy the NetGameUtil ref
            if it has already been created.

        DirtyCert
            Fixed to not issue a redundant preload request if a preload request is already in the queue.

            Fixed a bug where a successful preload triggered by a validation failure would result in a failed
            transaction, because the subsequent on-demand request would be considered to fail due to adding a
            redundant CA.

        DirtyNet
            Fixed to include missing return in 'pque' selector that caused misleading debug warning.

            Changed packet queue max size from 127 to 1024.

        JsonFormat
            Fixed _JsonUpdateHeader() to prevent buffer offset from exceeding the buffer size during an overflow
            condition.  This fixes a possible memory stomp on a subsequent call to a JsonFormat method.

        JsonParse
            Fixed a bug when executing a JsonFind against an element in an unclosed array; the find would skip past the
            end of the parse buffer data and access uninitialized memory.

            Fixed a bug where executing a JsonFind against an unclosed element, containing a name but no value, would
            result in returning a pointer to the beginning of the Json buffer.

            Fixed some other cases where the parse buffer could be accessed after the terminator.

            Fixed one issue each in the decode and escape lookup tables.

            Fixed to ensure after calling JsonParse that the parse buffer is always zero terminated.  If this is not
            possible, zero is returned.

            Changed name of JsonGetListItemEnd to JsonGetObjectEnd to better match JSON naming conventions.  A #define
            wrapper supporting the old name is included to maintain compatibility with previous code.

        NetConn
            Fixed documentation error in header for NetConnIdle.

        Plat-time
            Fixed a bug in weekday calculation in ds_secstotime.

        ProtoHttpManager
            Fixed to use consistent modulename as prefix to debug output.

        ProtoHttpServ
            Removed code in _ProtoHttpServUpdateRecvBody() that set the received body flag true when receiving a
            chunked transfer without any initial data.

            Changed the ProtoHttpServControl('time') selector to set the request timeout.

            Fixed a typo in the default idle timeout value, which was supposed to be five minutes but was in fact much
            longer.

            Changed size of ProtoHttpServRequestT.strContentType[] from 32 to 64 to match what we use for
            ProtoHttpServResponseT

            Changed the code in the _ProtoHttpServParseHeader to skip all the URI / TYPE information that is in the header
            This fixes an issue with skipping the first valid header value when parsing

        ProtoTunnel
            Fixed two issues when attempting to switch keys.  The first issue was on the side receiving a packet
            encrypted by the new key, in ProtoTunnelValidatePacket(), which was not using the new crypto state to try
            decrypting the packet.  The second issue was on the sending side, where a new HMAC was not being calculated
            when the new key was chosen.  These issues caused failures in scenarios with players in a game and a
            gamegroup, when players left either the game or the gamegroup, and could not maintain their p2p
            connections.

            Fixed an issue where a large stream offset could cause a rematch to fail due to out-of-order discard.  The
            send stream offset is now reset to zero when a new key is selected, matching the behavior of the rematch
            code on the receive side, which already assumes a stream offset of zero.

            Fixed possible issues with crypto setup by making sure send/recv states are both initialized all of the
            time when switching keys.

            Fixed a bug which broke a reconnection scenario where one side of a connection was already active, while
            the other was not.  The bug was due to an incorrect change of hard-coded return values in
            _ProtoTunnelDecryptAndValidatePacket2(), introduced along with the addition of ProtoTunnel 1.1 protocol
            support.

            Removed usage of hard-coded values. Replaced with explicit defines for packet decrypt flow.

            Changed _ProtoTunnelDecryptAndValidatePacket() to return a VALIDATE error if an attempt to recover an out
            of order packet fails.

            Changed to implementation to simplify error returns from _ProtoTunnelRecvData() and error handling of
            values returned by that function in _ProtoTunnelRecv().

            Fixed a bug in _ProtoTunnelFindTunnel(), where a failed match of an inactive tunnel would print an error
            message, but continue on with the tunnel index as if the match had succeeded.  This would cause some
            parameters (port, addr) to be updated incorrectly before the packet was subsequently rejected, which was
            mostly harmless but could cause some confusing temporary side effects particularly in the debug printing.

            Fixed various documentation and debug printing items.

        ProtoWebSocket
            Fixed some documentation errors regarding several TODOs in the code.

        VoipCommon
            Fixed a potential memory stomp when setting voip channel information for a user index which is out of range.

            Fixed the channel selection functions to properly include attempts to modify the VOIP_SHARED_USER_INDEX.

        VoipGroup
            Fixed a bug during the transition from a gamegroup to a game so that the proper mute status from the game
            group would transfer over into the game.

        VoipTunnel
            Remove support for the 'dcst' control which was used to set a DirtyCast hack. We now support this
            functionality by default as there exists no configuration we were disable the hack.

            Fixed a possible memory leak detected by Coverity, in a situation when trying to create a VoipTunnel object
            and running out of memory.

    DirtySDK (iOS)
        Plat-time
            Fixed broken NetPrintf time stamps.

    DirtySDK (PC)
        DirtyNetWin
            Fixed the usage of the socket select() function to be compatible with Berkley sockets.

    DirtySDK (XboxOne)
        Build
            Removed support for the XboxOne ADK

        DirtyNetXboxOne
            Fixed the usage of the socket select() function to be compatible with Berkley sockets.

        NetConnXboxOne
            Fixed an issue where token acquisition did not reset properly after a cable pull and a reconnect, leading
            to a report that the token acquisition failed when it had not been attempted.

EADP Game Services DirtySDK 2015 Winter 2.0.0 - October 22, 2015

    This SDK release was built using the following compiler packages:

        EA Config   2.25.03
        Framework   3.32.02

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 6.2.13332.0-proxy
                    capilano_config 1.02.00
        Kettle      kettlesdk 3.008.041-proxy
                    kettle_config 1.03.01
        iPhone      ios_config 1.01.05
                    iphonesdk 7.0-proxy-5
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.01-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-1-proxy
                    WindowsPhoneSDK 8.0.9900-proxy

    *** Important - DIRTYSDK_IEAUSER_ENABLED compile switch no longer supported ***
    Deprecated DIRTYSDK_IEAUSER_ENABLED compile switch such that IEAUser integration can no longer be turned off at
    compile time when using DirtySDK NetConn for PS4 or XboxOne.

    *** Important - Gen 3 platform specific code has been removed ***
    Gen3 support was deprecated in 15.1.1.1.0. The remaining Gen 3 specific code have now been removed.

New in this release:
    DirtySDK (All)
        Build
            Added support for structured xml libs-external when Framework is version 3.33.00 or higher.

            Added support for Visual Studio 2015. To enable support the vsversion property needs to be
            set to "2015" when building as the new warning suppressions are not backwards compatible.

            Added new build property dirtysdk-contrib that allows enabling the contribs to build Without
            samples. If dirtysdk-contrib does not need to be specified when dirtysdk-samples is true.

        CryptSTP1
            Removed CryptSTP1 support.

        Displist
            Removed Displist support.

        Hasher
            Removed Hasher support.

        NetGameLink
            Added verbosity setting to reduce QoS data spam in the logs unless desired.

            Added the reception time in ticks of the packet to NetGamePacketHeadT metadata.

        ProtoHttpServ
            Added a new callback for processing the incoming header. This callback allows us to opt out of further
            processing if we know that request data is malformed based on header information.

            Added support for handling the 'Expect: 100-continue' header if sent by clients. ProtoHttpServ will always
            just send back the 100 status code and will not reject requests based on the expect header. If a payload is
            too large it can be rejected using the new header processing callback.

        ProtoAries
            Removed ProtoAries support.

        ProtoHttpUtil
            Added support for decoding url-encoded strings.

            Added support for parsing query parameters similar to what we use for parsing header information.

    DirtySDK (Android)
        Plat-time
            Added Android implementation to ds_plattimetotime().

    DirtySDK (PS4)
        DirtySessionManagerPS4
            Added support for ps4 session changeable data.

            Added new server-driven mode (all operations that are executed from a server are now disabled, i.e.
            everything except what is necessary for invitation). DirtySessionManagerBinaryHeaderT and
            DirtySessionManagerChangeableBinaryHeaderT are now public (PS4 only). This is to enable a compile time
            check to ensure the Blaze Server's structs are equivalent to those. C++ static assert are used in the
            Blaze client code (game manager) and they rely on those structures being public.

            Added new status selectors:
                'gcda' - to get the active session's changeable binary data size
                'gpcd' - to get the pending session's changeable binary data size
                'gagm' - to get the active changeable data game mode
                'gpgm' - to get the pending changeable data game mode
                'gagt' - to get the active binary data game type
                'gpgt' - to get the pending binary data game type
                'lsts' - to get the last status code returned from the calls to the Sony APIs

            Added new control selectors:
                'gchg' - to queue getting the changeable binary data into the pending session
                'serv' - to turn on server-driven session - in that mode, this client tech no longer honors any
                         client request for operations that are now owned by the server
                'sess' - to set session identifier (server-driven mode only)
                'spgm' - to set the pending session game mode
                'spgt' - to set the pending session game type

    DirtySDK (PS4/XboxOne)
        NetConn
            Added a new status selector 'eusr' which will return the IEAUser given a dirtysock user index.

        VoipHeadset
            Added new status selector 'sact' to determine if the shared device is active (Kinect/PS Camera).

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Removed the AddDirtySDKLibsToModule task, external libraries are now added to the
            package.DirtySDK.dirtysock.libs.external fileset instead.

            Fixed 'NULL is defined to be 0' warning in platform.h by using #if defined instead of #ifdef.

            Removed the DIRTYCODE_API from typedefs, definitions do not need to be exported for dynamic libraries.

            Fixed an issue with how our C++ filesets are organized which caused files to be built both static and
            dynamic instead of based on the build configuration.

        NetGameDist
            Fixed NetGameDistInputQueryMulti() and NetGameDistInputCheck() to always poll NetGameDistUpdate() for
            new packet data if no remote inputs are available.  Previously, NetGameDistUpdate() would not be polled
            if there were no local input packets queued for sending, but this behavior had a negative impact in
            multi mode, requiring the caller poll NetGameDistUpdate() themselves if they had no inputs to send.  To
            fix that issue and simplify the code, the (minor) optimization of not calling NetGameDistUpdate() if no
            local input packets are queued, when in non-multi mode, was removed.

            Fixed NetGameDistInputQueryMulti() to be safer in the event the caller calling the function following a
            queue overrun.  In the event of a queue overrun it is possible to lose multi inputs that have a delta
            value that is not one (the default) assigned.  A delta greater than one that is lost will point the
            paired input queue pointer into unallocated buffer space, resulting in an invalid input with a length
            of zero.  This would result in a memcpy of -1 bytes which would result in a memory stomp and subsequent
            crash.  This scenario is now detected and handled safely; although the caller should still detect the
            overflow error and shut the game down, this condition will no longer cause a crash.

            Fixed NetGameDistInputCheck() to return "ready to receive" in multi mode if remote inputs are
            available, regardless of whether there are local inputs queued for sending or not.  This issue would
            cause titles calling NetGameDistInputCheck() to incorrectly not receive data that was available if they
            were not sending a steady stream of inputs themselves.

        ProtoHttpServ
            Changed to update the data that is based through the various callbacks for handling the request and
            responses.  Instead of using the same type, specific request and response types have been created.

            Changed the read/write callbacks to be receive/send to be clearer for integrators.

            Changed the request callback to allow to be called continuously if more processing time is needed based on
            the result.

            Changed the logging callback to no longer return a result.

        ProtoMangle
            Fixed a Valgrind warning by initializing a variable and preventing the possibility of copying garbage data
            to a buffer.

        ProtoTunnel
            Removed 1.0 protocol support and remaining Xbox 360 code.

            Removed ability to conditionally compile out HMAC.

            Fixed issue with _ProtoTunnelFindTunnel() not detecting a port change during handshake.

        Voip
            Removed Gen3 only parameter for VoipStartup().

            Changed the way we update voip channel settings. We now update it right when we get a ping and mic packet
            with the new channel information instead of in voip idle.  This also addresses potential multi-threading
            issue with applying channel configs.

        VoipCommon
            Fixed shared channel configs not being recalculated after a channel reset.

            Fixed a situation where channel configs are applied before we have any registered user.

        VoipConnection
            Fixed a wrong usage of ds_memcpy.

        VoipGroup
            Fixed an issue with mute flags being inconsistent or reset when player join both a game group and a game
            session.

            Fixed an issues with mute flag consistency across multiple voip groups when a user is a part of more than
            one at the same time.

            Fixed an issue where joining a second voip group or leaving an additional voip group would mute or unmute
            all players respectively.

            Changed 'umic' and 'uspk' control selectors to deprecated.

        WebOffer
            Changed the signature of WebOfferGetBusy2 to take the strDefaultMessage as a const char * instead of char *
            to prevent a writable strings warning on PS4.

    DirtySDK (PC)
        ProtoPingPC
            Fixed an issue on Windows XP where the ProtoPingIcmpResponseT structure was too small (the size required
            turns out to not be documented explicitly).  Adding a 32 byte buffer to the structure resolved the issue.

    DirtySDK (PS4)
        DirtyNetPS4
            Changed implementation such that socket receive thread now runs at high priority.

        DirtySessionManagerPS4
            Changed the dirtysessionmanger callback not to block when we have dirtywebapi queuing enabled.

        DirtyWebApiPS4
            Fixed a race condition where the webapi thread sometimes would miss the signal to wake up.

        NetConnPS4
            Removed internal automatic detection of system users by NetConn.  Usage of NetConnAddLocalUser() and
            NetConnRemoveLocalUser() is now mandatory. Implicit: Also removed 'cuis' and 'csiu' status selectors
            for converting system index into dirtysdk index (or opposite).

            Changed the method to determine what error state NetConn enters to more accurately reflect the reason we
            could not go online in a multiple user scenario.

        VoipPS4
            Changed implementation such that voip thread now runs at high priority.

        VoipHeadsetPS4
            Fixed initialization of voice lib thread priorities. sceVoiceStart() and sceVoiceCreatePort() are now
            being called from dedicated ephemeral high-priority threads to force internal Sony threads to also
            execute as high priority threads. This bug fix is required to eliminate crackling voice during heavy
            processing scenarios (game play).

            Changed voice lib initialization to comply with voice lib doc and to mimic what is done in Sony samples.

            Fixed _VoipHeadsetUpdateDecoderConnections() not being called when pHeadset->bSharedPrivilege changes.

            Changed implementation to flush the internal buffer of the decoder port when it is no longer connected to
            any speaker port. This is required to avoid "old voice" being played back when the decoder port is being
            reconnected to a speaker port.

    DirtySDK (Unix)
        DirtyNetUnix
            Fixed to prevent the logging of ENOTCONN errors when shutting down the socket to prevent unnecessary spam.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Removed internal automatic detection of system users by NetConn.  Usage of NetConnAddLocalUser() and
            NetConnRemoveLocalUser() is now mandatory.  Implicit: Also removed 'cuis' and 'csiu' status selectors
            for converting system index into dirtysdk index (or opposite).

            Refactored NetConnXboxOne to reduced complexity.

        ProtoHttpXboxOne
            Refactored the status function to be consistent with other platforms. Certain selectors are only handled
            when the state of the module is ST_BODY or ST_DONE.

        ProtoMangleXboxOne
            Fixed _ProtoMangleRemoteHostAddRef() and _ProtoMangleRemoteHostDelRef() such that multi-threaded usage of
            refRemoteHostRefCountMap is now guarded by the critical section.

            Fixed implementation to now try-catch around usage of method used to compare two secure device addresses to
            gracefully handle rare cases where a COMException is thrown.

            Fixed implementation to now try-catch around SecureDeviceAddress::FromBytes().

        UserApiXboxOne
            Changed to using the AsyncOp refs to track the progress of requests. This prevents an issue where the
            previous bitfield might get stomped on in certain conditions and makes the code clearer to understand.

        VoipXboxOne
            Changed to move VoIP state destruction to NetConnIdle shutdown callback.  This move is because the VoIP
            thread can become blocked in Microsoft Chat code for over ten seconds in certain loss-of-network scenarios.
            This was causing long stalls when trying to VoipShutdown() upon loss of network.  Also added guard on
            VoipStartup() to ensure it is not called in a state where the module has not been shut down (VoipShutdown()
            already had the corresponding guard on the module having been started).


EADP Game Services DirtySDK 2015 Winter 1.1.0 - July 09, 2015

    This SDK release was built using the following compiler packages:

        EA Config   2.25.01
        Framework   3.32.02

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 6.2.12999.0-1-proxy
                    capilano_config 1.01.02
        Kettle      kettlesdk 2.508.081-proxy
                    kettle_config 1.03.00
        iPhone      ios_config 1.01.05
                    iphonesdk 7.0-proxy-5
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.12.01-proxy
        Win32/WinRT/WinPRT
                    DotNet 4.0
                    DotNetSDK 2.0-4
                    VisualStudio 11.0.50727-1-proxy
                    WindowsSDK 8.0.50727-1-proxy
                    WindowsPhoneSDK 8.0.9900-proxy

    *** Important - Gen3 platforms (PlayStation 3 and Xbox 360) no longer supported ***
    The Winter 1.0.x stability branch should be used for any further development on these platforms.

New in this release:
    DirtySDK (All)
        Build
            Removed Gen3 Support.

        ConnAPI
            Added support to gate the voip connection based on QoS validation. The 'estv' selector can be used to
            ungate the voip connection.

        ProtoHttp
            Added returning of http status code as part of the 'hres' status selector.

        ProtoSSL
            Added signature_algorithms hello extension support, enabled by default.  Some servers require this
            extension to be present before accepting a connection request.

            Added validation of supported signature algorithms upon receiving a CertificateRequest handshake message.

        XmlParse
            Added support for 64-bit integers via XmlContentGetInteger64 and XmlAttribGetInteger64.

    DirtySDK (PC)
        NetConnWin
             Added support querying for MAC address with valid IP using the 'ethr'/'macx' when non-zero is passed into
             iData.

    DirtySDK (PS4)
        DirtyNetPS4
            Added 'spam' selector support to change debug verbosity.

        NetConnPS4
            Added an error message for when PRX is not loaded for the sceNpAuthCreateAsyncRequest call.

        VoipHeadsetPS4
            Added support for the following bitrates: 14400, 16000 and 22533.  The default bitrate has been increased
            from 7300 to 16000.

Changes/fixes in this release:
    DirtySDK (All)
        Build
            Changed DirtySDK build scripts to use Framework Structured XML.

        DirtyCert
            Changed requesting certificates use format state field with "ST=" instead of "S=", which is the default
            OpenSSL nomenclature.

        NetConn
            Changed NetConnDisconnect() to also abort UPnP operations.

        ProtoHttp
            Changed default PUT/POST behavior to not reuse a previous connection (keep-alive).  When making a PUT or
            POST request and utilizing a keep-alive connection, it is possible for the server to close the connection
            and for that connection close to be "in flight" when issuing the request.  This results in the request
            being failed when the connection close is received.  Because a PUT or POST request can result in modifying
            server state, it may not be automatically re-issued.  Not using keep-alive avoids this complication.  A new
            ProtoHttpControl('rput') selector has been added to disable this behavior if the caller is willing to deal
            with this complication in trade for getting connection reuse on a PUT/POST.

        ProtoSSL
            Fixed incorrect CertificateVerify formatting when using TLS1.2.  This fixes client certificate support that
            was previously broken when connecting to a server supporting TLS1.2.

            Fixed an error with 'hres' selector not returning the right hresult in some cases.

        ProtoTunnel
            Fixed diagnostic output in _ProtoTunnelFindTunnel(), when re-matching addr/port, to include correct tunnel
            index instead of the max tunnel index.

    DirtySDK (PC/XboxOne)
        DirtyLibWin
            Fixed debug print on QueryPerformanceCounter() failure that was comparing against the wrong result code.

    DirtySDK (PS4)
        PrivilegeApiPS4
            Fixed a logical error that prevented a dialog from being appropriately terminated when aborted and the
            reference is not destroyed.

        DirtyWebApiPS4
            Fixed an issue where we were using the wrong critical section for handling errors which ended up in a
            deadlock if another request was made before the response was handled.

        DirtySessionManagerPS4
            Changed 'gses' control selector to now guard against passing in "INVALID".

        VoipHeadsetPS4
            Fixed the wrong user index being set when polling for voice.

    DirtySDK (PS4/XboxOne)
        NetConn
            Added ability to pass -1 into NetConnRemoveLocalUser(), in which case an internal lookup will be performed.

            Added a new selector 'iusr' than can be used to retrieve the index given the IEAUser UserId.

        VoipHeadset
            Fixed voipheadsetDeleteLocalUser() to also clear the last headset status.

            Fixed a situation where channel configs are applied before we have any registered user with voipheadset.

    DirtySDK (PS4/Unix)
        DirtyNet
            Fixed SocketConnect() to copy the remote address when performing an non-blocking connect
            (SCE_NET_EINPROGRESS/SYS_NET_EINPROGRESS/EINPROGRESS) for ps4/ps3/unix.

    DirtySDK (Unix)
        DirtyLibUnix
            Fixed NetTickUsec() to use proper scale for seconds.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Changed the environment to be mapped to the sandbox ID. If it can't be mapped it will default back to TMS
            RETAIL -> PROD
            CERT -> CERT
            EARW.1 -> TEST

EADP Game Services DirtySDK 2015 Winter 1.0.1 - June 05, 2015

    This SDK release was built using the following compiler packages:

        EA Config   2.19.00
        Framework   3.25.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 6.2.12710.0-1-proxy
                    capilano_config 1.01.00
        Kettle      kettlesdk 2.508.051-proxy
                    kettle_config 1.02.00
        iPhone      ios_config 1.01.05
                    iphonesdk 7.0-proxy-5
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.07.00
        PS3         ps3sdk 470.001-lite
                    PlayStation3NpEx 470.001
        Win32/WinRT/WinPRT
                    DotNetSDK 4.0
                    VisualStudio 11.0.50727-proxy
                    WindowsSDK 8.0.50727-proxy
                    WindowsPhoneSDK 8.0.9900-proxy
        Xenon       XenonSDK 2.0.21256.3-proxy

    *** Important - ProtoTunnel format modified - backward compatibility broken ***
    Th Winter 1.0 release of DirtySDK introduced a new ProtoTunnel protocol version - 1.1.  By default, this
    is the version used for all platforms except for Xbox 360.  ProtoTunnel v1.1 is not compatible with v1.0,
    and Xbox 360 is not compatible with v1.1.  Please make sure to rebuild any game servers in addition to
    game clients when upgrading to this release from a version older than Winter 1.0.

New in this release:
    DirtySDK (PS4)
        NetConnPS4
            Added NetConnRegisterNpStateCallback() to receive callbacks directly from NP State events.

Changes/fixes in this release:
    DirtySDK (All)
        NetGameLink
            Fixed a rare latency estimation issue at start of connection when local and remote clocks are close to but
            not quite synchronized.

    DirtySDK (PC)
        VoipPC
            Fixed VoipCommonUpdateRemoteStatus() not being invoked from the VoipThread.

            Fixed bPrivileged not defaulting to TRUE.

        VoipCommon
            Removed unnecessary PC specificities.

    DirtySDK (PS3)
        VoipHeadsetPS3
            Fixed implementation to no longer wait for the user to be in a participating state for acquiring and
            playing voice.  Without this change, there is some potential for garbled voice at connection establishment.

    DirtySDK (PS4)
        VoipHeadsetPS4
            Changed VoIP muting based on privileges back to be the most restrictive between local users. It will
            be reverted back to be muted on a per player basis once Sony provides us a way to check whether VoIP
            is being played back on the TV or headsets.

    DirtySDK (XboxOne)
        ConnApi
            Fixed _ConnApiInitClientConnectionState() to not reset ip address if it was already resolved (required for
            host migration to succeed with peer hosted topology when p2p voip is active before host migration).

        NetConnXboxOne
            Fixed the value of the internet connectivity state to reset after a resume to prevent the user from getting
            stuck in an offline state after a NetConnDisconnect()/NetConnConnect().

        UserListApiXboxOne
            Fixed the queueing of UserListApiIsFriendAsync() requests which return success codes but then behaved
            strangely when more than one request was active.

            Fixed a possible memory leak on shutdown.

    DirtySDK (PC/PS3/Unix/XboxOne)
        DirtyLib
            Fixed a rare thread safety issue in SocketLookup around
            refcounting


EADP Game Services DirtySDK 2015 Winter 1.0.0 - April 9, 2015

    This SDK release was built using the following compiler packages:

        EA Config   2.19.00
        Framework   3.25.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 6.2.12128.0-proxy
                    capilano_config 1.01.00
        Kettle      kettlesdk 2.000.121-proxy
                    kettle_config 1.02.00
        iPhone      ios_config 1.01.05
                    iphonesdk 7.0-proxy-5
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.07.00
        PS3         ps3sdk 450.001-lite
                    PlayStation3NpEx 450.001
        Win32/WinRT/WinPRT
                    DotNetSDK 4.0
                    VisualStudio 11.0.50727-proxy
                    WindowsSDK 8.0.50727-proxy
                    WindowsPhoneSDK 8.0.9900-proxy
        Xenon       XenonSDK 2.0.21256.3-proxy

    *** Important - Please update your QOS servers from your Blaze server configurations ***
    The changes to the qosapi requires the new version of the QOS servers in order to function properly.
    Contact GOSOPS for information about the most up to date QOS servers.

    *** Important - ProtoTunnel format modified - backward compatibility broken ***
    This release of DirtySDK introduces a new ProtoTunnel protocol version - 1.1.  By default, this is the
    version used for all platforms except for Xbox 360.  ProtoTunnel v1.1 is not compatible with v1.0, and
    Xbox 360 is not compatible with v1.1.  Please make sure to rebuild any game servers in addition to game
    clients when upgrading to this release.

New in this release:

    DirtySDK (All)
        ProtoTunnel
            Added support for the new 1.1 version of the ProtoTunnel protocol, with the following features:
                - Introduces backwards compatibility for future protocol versions.
                - Control packet data data used in handshaking is still authenticated, but is now unencrypted.
                - Adds fast matching (and re-matching, when the source addr and/or port changes) of packet data to the
                  correct endpoint.
                - Version 1.0 can still be selected and is the default for Xbox 360 operation.  Xbox 360 is not
                  compatible with 1.1 or later versions of the protocol.
                - Version 1.0 is compatible with the previous ProtoTunnel protocol.

        CommUDP
            Added a packet received flag which can be accessed through NetGameUtilStatus('pkrc'). The flag is stored in
            ConnApiClientT GameInfo.uConnFlags. This part of the more specific join error task GOSREQ-184.

    DirtySDK (PS3)
        NetConnPS3
            Added 'nper' selector to NetConnStatus() to allow the user to differentiate a user logging out from PSN
            from PSN disconnect.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Added a critical section to protect against NetConnStatus('xusr') being called from the voip thread.

        VoipHeadsetXboxOne
            Added support for MS voip bystanders (cert requirement).

    DirtySDK (Xenon)
        ConnApiXenon
            Added ConnApiControl('xonl') which can be used to tell ConnApiXenon to no longer attempt game connectivity
            but to only perform Xsession management.

            Added _ConnApiMoveToNextState() for improved logging of ConnApiXenon state transitions.

Changes/fixes in this release:

    DirtySDK (All)
        CryptRSA
            Refactored to make modular exponentiation an iterative process.  This allows it to be spread out over
            multiple updates, which is useful as the operation can take significant amounts of clock time and is
            blocking.  As part of this change, roughly 12k of temporary state that used to be on the stack is now
            moved to the RSA state.

            Switched to use 64-bit math on Linux and PS4, improving execution time on those platforms.

        DirtyCert
            Switched to new gosca.ea.com endpoint using certificate issued against GOS2015 CA.

        DirtySessionManager
            Renamed DirtySessionManagerComplete() to DirtySessionManagerGetSecureIp(), and made that new function
            xenon-only.

        NetConn
            Changed UPnP initialization: if peerport netconn param is not specified, netconn now configures
            protoupnp with default port 3659 instead of default port 0.

        NetGameDist
            Fixed _strNetGameDistDataType to also cover GMDIST_DATA_NODATA.

        ProtoHttp
            Changes to harden protohttp against multi-threaded calls into update, send, and recv functions from
            interfering with one another.

        ProtoSSL
            Enabled ServerName Hello Extension by default.

            Refactored to take advantage of iteratve modular exponentation for SendClientKeyExchange and
            SendCertificateVerify operations.

            Switched CA provider flag from GOS2013 CA to GOS2015 CA.  This allows the new DirtyCert endpoint to
            provision CA certificates.

        QosApi
            Refactored qosapi to improve maintainability, this is extensive changes throughout the
            implementation.

            Changed qosapi so that the different phases of the qos process (latency, bandwidth, firewall)
            do not have dependencies on one another.  In the past firewall could only be done after
            bandwidth, and qos phases would have an impact on the error status of other qos phases.

            Changed qosapi to use the new ip reported by the server rather than the IP address discovered
            by the DNS lookup. The old behavior prevented XboxOne from successfully querying the NAT type,
            due to DNS round robin issues.

            Removed the client to client methods QosApiListen() and QosApiRequest() from the qosapi.

        VoipConnection
            Fixed incorrect array size for LocalUsers

    DirtySDK (PS3)
        DirtyNetPS3
            Fixed a race condition that causes memory corruption when calling NetConnShutdown() while a
            hostname lookup is in progress.  NetConnShutdown() now waits until all hostname threads are
            finished.

    DirtySDK (PS4)
        DirtySessionManagerPS4
            Removed DirtySessionManagerComplete().

    DirtySDK (XboxOne)
        NetConnXboxOne
            Fixed a case where the connectivity level can be stuck because of a missing notification from
            Microsoft. When logging out after a resume event it seems that we sometimes do not receive an
            XboxLiveAccess notification when logging back in after the resume. This fix forces a check of
            the network state after 5 seconds.

    DirtySDK (Xenon)
        ConnApiXenon
            Changed implementation to guarantee that _ConnApiUpdateDemangle() will never be performed before
            XSessionCreate() or XSesssionMigrateHost() completes (on both session host and session members).
            Failure to enforce such a serialization can lead to 2 potential problems:  secure address being
            resolved with an invalid session id (if primary session creation is not complete) or connapi
            exiting ST_MIGRATE state prematurely before firing SESSEVENT (if secondary session migration is
            not complete).

            Changed ConnApiUpdate() such that _ConnApiUpdateDemangle() cannot be called when a session
            creation or a session migration is pending.

            Removed usage of ConnApiSessionManagerStatus('idle') at the beginning of _ConnApiUpdateDemangle():
            no longer required now that calls to _ConnApiUpdateDemangle() from ConnApiUpdate() are limited to
            states where it is allowed.

            Fixed _ConnApiInitClientList() to properly initialize pConnApi->GameServer.ClientInfo.strTunnelKey
            (inspired from connapi.c) This fix is minor because the tunnel key is not used on xenon anyway.

        ConnApiXenonSessionManager
            Enhanced implementation of ConnApiXenonSessionManagerComplete() to make it clear that
            ConnApiXenonSessionManagerGetSecureIp() CANNOT return "in-progress".

            Fixed implementation of ConnApiXenonSessionManagerComplete() to return the right secure ip address for the
            console specified as input. It used to return pRef->iAddrPrimary which is not guaranteed to match the
            specified console.

            Renamed ConnApiXenonSessionManagerComplete() to ConnApiXenonSessionManagerGetSecureIp()

            Removed ConnApiXenonSessionManagerControl('conn') which was dead code because the 'conn' selector is no
            longer supported in DirtySessionManager.

        DirtySessionManagerXenon
            Renamed DirtySessionManagerComplete() to DirtySessionManagerGetSecureIp().

        VoipXenon
            Fixed implementation of VoipSetLocalUser() to properly setup the VoipUserT to be passed to
            _VoipRegisterLocalTalker(). Without this fix, wrong xuids are registered with XHV resulting
             in calls to  pXHVEngine->SubmitIncomingChatData() intermittently failing with ERROR_INVALID_FUNCTION.


EADP Game Services DirtySDK 2015 Winter 0.3.0 - March 16, 2015

    This SDK release was built using the following compiler packages:

        EA Config   2.19.00
        Framework   3.25.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.07
        Capilano    CapilanoSDK 6.2.12128.0-proxy
                    capilano_config 1.01.00
        Kettle      kettlesdk 2.000.121-proxy
                    kettle_config 1.02.00
        iPhone      ios_config 1.01.05
                    iphonesdk 7.0-proxy-5
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.07.00
        PS3         ps3sdk 450.001-lite
                    PlayStation3NpEx 450.001
        Win32/WinRT/WinPRT
                    DotNetSDK 4.0
                    VisualStudio 11.0.50727-proxy
                    WindowsSDK 8.0.50727-proxy
                    WindowsPhoneSDK 8.0.9900-proxy
        Xenon       XenonSDK 2.0.21256.3-proxy

New in this release:

    DirtySDK (All)
        CommUDP
            Added a metric to track packet loss prevented by a redundancy mechanic.

        DirtyLib
            Added new NetTickUsec() to return microsecond-precision tick counter for profiling purposes.

        ProtoSSL
            Added GOS2015 SHA2 CA.

            Added VeriSign 2008 Universal SHA2 CA.

        VoipConnection
            Added support for piggy-backing reliable data over voip traffic (data packets and ping packets)
                * Added VoipConnectionReliableBroadcastUser() and VoipConnectionReliableBroadcastOpaque().
                * Added LinkedReliableDataT.
                * Extended VoipConnectionT and VoipConnectionlistT for reliable data support.
                * Changed synopsis of VoipConnectRecvVoiceCbT.

        VoipHeadset
            Added support for piggy-backing reliable data over voip traffic (data packets and ping packets)
                * Changed to adapt to change in synopsis of VoipConnectRecvVoiceCbT.

        VoipPacket
            Added support for piggy-backing reliable data over voip traffic (data packets and ping packets)
                * Added new constants, and ReliableDataInfoT, ReliableDataT, ReliableAckT.

        VoipPriv
            Added support for piggy-backing reliable data over voip traffic (data packets and ping packets)
                * Changed implementation of VOIP_CopyUser() to use ds_memcpy_s() instead of ds_strnzcpy().
                * Changed VoipUserExT to be conditionally compiled in for XBOXONE only.

    DirtySDK (PS4)
        DirtyWebApiPS4
            Added DirtyWebApiUpdate to issue callbacks from same thread as NetConnIdle. This feature can be enabled
            or disabled with 'qcal' control selector. By default the feature is disabled.

    DirtySDK (XboxOne)
        VoipXboxOne
            Added support for piggy-backing reliable data over voip traffic (data packets and ping packets)
                * Added call to VoipConnectionReliableBroadcastUser() from VoipActivateLocalUser().

    DirtySDK (Xenon)
       ConnApiXenon
        Removed the dependency of the CONNAPI_MAXCLIENT from the function ConnApiUpdateDemangle().

Changes/fixes in this release:

    DirtySDK (iOS)
        DirtyLib
            Fixed incorrect critical section length for iOS64

    DirtySDK (PC)
        Build
            Fixed compilation warnings for deprecated winsock2 calls with WindowsSDK 8.1

    DirtySDK (PS3)
        NetConnPS3
            Fixed the processing of the SCE_NP_MANAGER_STATUS_OFFLINE event when we are early on in the connection
            process to prevent us from becoming stuck in +con when PSN is down.

            Fixed the handling of cellNetCtlNetStartDialogUnloadAsync() which was being treated as a synchronous
            function.

    DirtySDK (PS4)
        VoipPS4
            Changed the chat permission to applied on a player to player basis when not using the Playstation Camera

    DirtySDK (WinRT)
        DirtyLibWinRT
            Fixed incorrect thread priority initialization in NetLibCreate().

    DirtySDK (XboxOne)
        NetConnXboxOne
            Fixed a build error that occurs when IEAUSER is not used.

        PrivilegeApiXboxOne
            Fixed a memory stomp.

    DirtySDK (Xenon)
        Build
            Fixed a build break in the post build step of ATGFramework, which is used for the Xenon samples.

        ConnApiXenon
            Fixed secure address resolution not being done for new connections to be established after host migration.

        FriendApiXenon
            Fixed a potential issue where friend data could be populated in the incorrect slot.


EADP Game Services DirtySDK 2015 Winter 0.2.0 - January 28, 2015

    This SDK release was built using the following compiler packages:

        EA Config   2.19.00
        Framework   3.25.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.05-1
        Capilano    CapilanoSDK 6.2.11785.0-proxy
                    capilano_config 1.00.14
        Kettle      kettlesdk 2.000.091-proxy
                    kettle_config 1.01.08
        iPhone      ios_config 1.01.05
                    iphonesdk 7.0-proxy-5
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.07.00
        PS3         ps3sdk 450.001-lite
                    PlayStation3NpEx 450.001
        Win32/WinRT/WinPRT
                    DotNetSDK 4.0
                    VisualStudio 11.0.50727-proxy
                    WindowsSDK 8.0.50727-proxy
                    WindowsPhoneSDK 8.0.9900-proxy
        Xenon       XenonSDK 2.0.21256.3-proxy

New in this release:

    DirtySDK (All)
        PrivilegeApi
            Added PRIVILEGEAPI_PRIV_INVALID privilege for ease of use.

    DirtySDK (PC)
        VoipSpeex
            Added the dll export tag to extern const VoipCodecDefT VoipSpeex_CodecDef.

    DirtySDK (PS3)
        NetConnPS3
            Added logging for connection status changes.

    DirtySDK (PS4)
        DirtySessionMangerPS4
            Added session lock support (prevent user from joining). A PS4 session can not be locked/unlocked
            using the 'lock' selector.

        NetConnPS4
           Added logging for connection status changes.

    DirtySDK (XboxOne)
        NetConnXboxOne
            Removed automatic reset user list support when IEAUSER is used.

            Added logging for connection status changes

        UserApiXboxOne
            Added Support for ProfileChanged Event. Please use the new UserApiNotifyDataT::ProfileUpdateData type
            and UserApiNotifyTypeE::USERAPI_NOTIFY_PROFILE_UPDATE to listen for the event.

    DirtySDK (Xenon)
        NetConnXenon
            Added logging for connection status changes

Changes/fixes in this release:

    DirtySDK (All)
        ConnApi
            Fixed a bug where ConnApi will tried to initialize clients with NULL machine address.

        DirtyMem
            Fixed to export DirtyMemAlloc and DirtyMemFree when building as a DLL.

            Added include of <stdlib.h> to prevent malloc() and free() calls for default memory allocators compiling
            out when building as a DLL.

        DirtyPng
            Fixed a wrong usage of ds_strnzcpy that leads to a memory stomp.

        NetConn
            Fixed NetConnStatus() not propagating the iData parameter to SocketInfo() for selectors that are passed
            through.

        ProtoHttp
            Fixed a memory pointer issue when sending chunked http transaction faster than the network can keep up
            that could lead to potentially sending parts of uninitialized memory over the network.

            Changed to check status of open keep-alive connection in the DONE state, to detect server-closed
            connections when they are closed, rather than waiting until the ProtoHttp ref is used in a new transaction
            or destroyed.

        VoipConnection
            Fixed an integration error. VoipConnectionStartup() will now have a max player check. If for any reason
            voip system is not started properly voip setup will be skipped by Blaze.

    DirtySDK (iOS)
        DirtyLib
            Fixed wrong critical section length for iOS64.

    DirtySDK (PS4)
        DirtyWebApiPS4
            Changed priority and scheduling setting of internal threads in favor of less aggressive threading
            patterns to avoid negatively impacting game with unnecessary thread switches during game play.

        NetConnPS4
            Fixed an error which prevents users from going online if PSN does not respond quickly to the parental
            settings query.

        PrivilegeApiPS4
            Fixed an integration error, which caused _PrivilegeApiUpdateDialogStatus callback not to be removed properly.

    DirtySDK (XboxOne)
        ProtoMangleXboxOne
            Fixed a potential crash if a client is removed and re-added while corresponding security association
            creation is in progress.


EADP Game Services DirtySDK 2015 Winter 0.1.0 - December 4, 2014

    This SDK release was built using the following compiler packages:

        EA Config   2.19.00
        Framework   3.25.00

        Android     androidsdk 18-2
                    androidndk r9c
                    android_config 1.06.05-1
        Capilano    CapilanoSDK 6.2.11785.0-proxy
                    capilano_config 1.00.14
        Kettle      kettlesdk 2.000.071-proxy
                    kettle_config 1.01.07
        iPhone      ios_config 1.01.05
                    iphonesdk 7.0-proxy-5
        OSX         UnixGCC 0.05.00
                    osx_config 1.00.01
        Linux/Unix  UnixClang  0.07.00
        PS3         ps3sdk 450.001-lite
                    PlayStation3NpEx 450.001
        Win32/WinRT/WinPRT
                    DotNetSDK 4.0
                    VisualStudio 11.0.50727-proxy
                    WindowsSDK 8.0.50727-proxy
                    WindowsPhoneSDK 8.0.9900-proxy
        Xenon       XenonSDK 2.0.21256.3-proxy

    *** Important - Complementary integration guidelines available on Confluence ***
        DirtySDK 2015 Winter Upgrade available here:
        https://docs.developer.ea.com/display/dirtysock/DirtySDK+2015+Winter+Upgrade+Guide

New in this release:

    DirtySDK (All)
        ProtoSSL
            Added support for AES-128-GCM-SHA256 and AES-256-GCM-SHA384 cipher suites.

            Added two obsolete alternate definitions for sha1withRSAEncryption for compatibility with some software
            that generates certificates using these object IDs, for example makecert.exe in WindowsSDK.

        ProtoTunnel
            Enhanced debug logging for the 'bnds' selector.

        Voip
            Enhanced API for user registration to better support MLU (Multiple Local Users) scenarios. Every local user
            should now be registered with the voip sub-system using VoipSetLocalUser() in order for its headset status
            info to be available for queries. To additionally get fully functional voip, local users must be further
            activated with VoipActivateLocalUser(), which promotes the user to a "participating" state. Basically any
            user being pulled into the game should be a participating user. Associated public api impact:
                * New synopsis for VoipSetLocalUser()
                * New function to promote local users to "participating" state: VoipActivateLocalUser()

        VoipGroup
            Enhanced VoipGroup api. It was re-aligned with changes to the voip api called out above.
                * New function to promote local users to "participating" state: VoipGroupActivateLocalUser()

    DirtySDK (PC)
        DirtyErrPC
            Added DirtyErrPC implementation with pc-specific errors.

        ProtoPingPC
            Added a new version of protoping for PC, using ICMPSendEcho2() API.  This API allows use of ICMP when an
            application is run without administrator privilege, which is required for use of RAW sockets employed with
            protoping.c.

    DirtySDK (PS4)
        VoipHeadsetPS4
            Enhanced _VoipHeadsetIsLocalVoiceFrameReady() to detect voice readiness quicker.

            Added '-pbk' and '+pbk' selectors to better support our voip channel feature under MLU scenarios.

    DirtySDK (WinRT/WintPRT)
        DirtyLibWinRT
            Enhanced NetPrintfCode() to use OutputDebugStringA() instead of OutputDebugStringW().

    DirtySDK (XboxOne)
        UserApiXboxOne
            Added support for the 'avsz' selector. Now different profile pictures sizes can be fetched.

        VoipXboxOne
            Added selectors:
            VoipStatus 'pcac' - returns true if party chat is active
            VoipStatus 'pcsu' - returns true if party chat is currently suspended
            VoipControl 'pcsu' - takes iValue as a bool, TRUE suspend party chat, FALSE resume it
            In order for VoipControl 'pcsu' to work you must add to the appxmanifest.xml:
            <mx:Extension Category="xbox.multiplayer">
                <mx:XboxMultiplayer CanSuppressPartyChat="true" />
            </mx:Extension>

Changes/fixes in this release:

    DirtySDK (All)
        General
            Replaced APIs deprecated by Microsoft with generic equivalents.

        ConnApi
            Changed synopsis of ConnApiOnline(): it no longer has a pSelfAddr parameter.

            Changed ConnApiUserInfoT.uClientFlags to ConnApiUserInfoT.uFlags.

            Changed ConnApiClientInfoT.uMachineId to ConnApiCLientInfoT.uId.

            Removed multiple virtual machine mode: connapi 'mvtm' status and control selectors no longer exist.
            The implementation is now multiple-virtual-machine capable by default.

            Removed ConnApiUserInfoT, ConnApiAddUser() and ConnApiRemoveUser() for all platforms except xbox360.

            Removed ConnApiFindClient(), then renamed ConnApiFindClientById() to ConnApiFindClient().

            Removed ConnApiClientInfoT.strUniqueId

            Removed _ConnApiDefaultCallback() and made the debug logging client-centric instead of user-centric.

        DirtyNet
            Changed all dirtynet files to log unsupported status selectors the same way.

        NetGameLink
            Changed implementation to avoid code duplication: moved packet loss calculation logics into a static
            function.

            Changed the names of several member variables in the NetGameLinkStatT structure. The changes are listed below:
            bps  to outbps
            rps  to outrps
            nps  to outnps
            pps  to outpps
            rpps to outrpps

        ProtoSSL
            Changed to request TLS1.2 instead of TLS1.1.  Servers are still allowed to select any version from TLS1.2
            down to SSLv3.

            Changed to use 64-bit time for certificate expiration checking, so certificates created with expiration
            times far in the future won't fail validation.

            Changed to harden protossl against multi-threaded use causing obscure secure failures.

        VoipConnection
            Removed platform specificities in _VoipConnectionInit().

        VoipPacket
            Changed value of VOIP_PACKET_STATUS_FLAG_METADATA from 2 to 1.

    DirtySDK (PS4)
        DirtyWebApiPS4
            Removed DirtyWebApiCreate()/DirtyWebApiCreateEx() and renamed DirtyWebApiCreateEx2() to
            DirtyWebApiCreate().

            Changed WebApi threads to only wakeup when there are jobs queued.

        VoipHeadsetPS4
            Fixed establishment of connections between a decoder port and all local speaker ports when a user is added
            after a decoder was created.

    DirtySDK (XboxOne)
        DirtyNetXboxOne
            Fixed _SocketAddrMapGet() to no longer include the port value when trying to match an input ipv6 address
            with an existing mapping. This change is required for multi-hub test bench to be functional on xboxone:
            because hubs all bind to different game port, the inbound traffic source port may not be same as the ipv6
            address mapped when resolving secure device address for the local console.

        VoipHeadsetXboxOne
            Deprecated support for pre-March2014 XDKs (_XDK_VER < 10698).

            Replaced VOIPHEADSET_VOICELIB_DEBUG with VOIPHEADSET_DEBUG.

    DirtySDK (Xenon)
        ConnnApiXenon
            Changed internal usage of some control selectors: moved call to ConnApiXenonManagerControl('self')
            and VoipGroupControl('lusr') from ConnApiOnline() to _ConnApiInitClientList()

            Fixed connapixenon to properly update the remote tunnel port with the peer's internally bound port
            when the internal address (i.e. internal to NAT scope) is used to reach that peer.

            Fixed a logical error forcing the voip connection attempt to fail early.
