From 9770ef188f3bf3105ff49ffff2813d58a10b1e2d Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Thu, 26 Jun 2025 13:33:52 +0200 Subject: [PATCH 01/10] import raw C# samples --- PubNubUnity/Assets/PubNub/Snippets.meta | 3 + .../AccessManager/AccessManagerSample.cs | 396 ++++++++ .../AccessManager/AccessManagerV2Sample.cs | 238 +++++ .../ChannelGroup/ChannelGroupsSample.cs | 83 ++ .../Configuration/ConfigurationSample.cs | 172 ++++ .../Snippets/Entities/EntitiesSample.cs | 358 +++++++ .../PubNub/Snippets/Files/FilesSample.cs | 160 +++ .../PubNub/Snippets/Logging/LoggingSample.cs | 50 + .../MessageActions/MessageActionsSample.cs | 81 ++ .../Assets/PubNub/Snippets/Misc/MiscSample.cs | 133 +++ .../Snippets/Presence/PresenceSample.cs | 304 ++++++ .../Publish/PublishSubscribeSample.cs | 930 ++++++++++++++++++ .../Assets/PubNub/Snippets/Push/PushSample.cs | 170 ++++ .../Storage/StorageAndPlaybackSample.cs | 340 +++++++ 14 files changed, 3418 insertions(+) create mode 100644 PubNubUnity/Assets/PubNub/Snippets.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets.meta b/PubNubUnity/Assets/PubNub/Snippets.meta new file mode 100644 index 00000000..9d57da3c --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f827c90ef6be4e6789a58a9d9a6d8e64 +timeCreated: 1750936995 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs new file mode 100644 index 00000000..56bcf4ab --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs @@ -0,0 +1,396 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +class AccessManagerSample +{ + private static Pubnub pubnub; + + static void PubnubInit() + { + // snippet.pubnub_init + //Create configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo" + }; + //Create a new PubNub instance + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + static async Task BasicUsage() + { + // snippet.basic_usage + try + { + //Perform token granting operation + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUuid("my-authorized-uuid") + .Resources(new PNTokenResources + { + Channels = new Dictionary + { + { "my-channel", new PNTokenAuthValues { Read = true, Write = true } } + } + }) + .ExecuteAsync(); + + //Parse operation response + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + static async Task GrantTokenComplex() + { + // snippet.grant_token_complex + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUuid("my-authorized-uuid") + .Resources(new PNTokenResources() + { + Channels = new Dictionary() { + { "channel-a", new PNTokenAuthValues() { Read = true } }, + { "channel-b", new PNTokenAuthValues() { Read = true, Write = true } }, + { "channel-c", new PNTokenAuthValues() { Read = true, Write = true } }, + { "channel-d", new PNTokenAuthValues() { Read = true, Write = true } }}, + ChannelGroups = new Dictionary() { + { "channel-group-b", new PNTokenAuthValues() { Read = true } } }, + Uuids = new Dictionary() { + { "uuid-c", new PNTokenAuthValues() { Get = true } }, + { "uuid-d", new PNTokenAuthValues() { Get = true, Update = true } }} + }) + .ExecuteAsync(); + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + // snippet.end + } + + static async Task GrantTokenWithRegex() + { + // snippet.grant_token_regex + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUuid("my-authorized-uuid") + .Patterns(new PNTokenPatterns() + { + Channels = new Dictionary() { + { "channel-[A-Za-z0-9]", new PNTokenAuthValues() { Read = true } }} + }) + .ExecuteAsync(); + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + // snippet.end + } + + static async Task GrantTokenComplexWithRegex() + { + // snippet.grant_token_complex_with_regex + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUuid("my-authorized-uuid") + .Resources(new PNTokenResources() + { + Channels = new Dictionary() { + { "channel-a", new PNTokenAuthValues() { Read = true } }, + { "channel-b", new PNTokenAuthValues() { Read = true, Write = true } }, + { "channel-c", new PNTokenAuthValues() { Read = true, Write = true } }, + { "channel-d", new PNTokenAuthValues() { Read = true, Write = true } }}, + ChannelGroups = new Dictionary() { + { "channel-group-b", new PNTokenAuthValues() { Read = true } } }, + Uuids = new Dictionary() { + { "uuid-c", new PNTokenAuthValues() { Get = true } }, + { "uuid-d", new PNTokenAuthValues() { Get = true, Update = true } }} + }) + .Patterns(new PNTokenPatterns() + { + Channels = new Dictionary() { + { "channel-[A-Za-z0-9]", new PNTokenAuthValues() { Read = true } }} + }) + .ExecuteAsync(); + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + // snippet.end + } + + static async Task GrantTokenOldBasicUsage() + { + // snippet.basic_usage_old + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUserId("my-authorized-userId") + .Resources(new PNTokenResources() + { + Spaces = new Dictionary() { + { "my-space", new PNTokenAuthValues() { Read = true } } } // False to disallow + }) + .ExecuteAsync(); + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + //PNAccessManagerTokenResult is a parsed and abstracted response from the server + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + // snippet.end + } + + static async Task GrantTokenOldComplex() + { + // snippet.grant_token_complex_old + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUserId("my-authorized-userId") + .Resources(new PNTokenResources() + { + Spaces = new Dictionary() { + { "space-a", new PNTokenAuthValues() { Read = true } }, + { "space-b", new PNTokenAuthValues() { Read = true, Write = true } }, + { "space-c", new PNTokenAuthValues() { Read = true, Write = true } }, + { "space-d", new PNTokenAuthValues() { Read = true, Write = true } }}, + Users = new Dictionary() { + { "user-c", new PNTokenAuthValues() { Get = true } }, + { "user-d", new PNTokenAuthValues() { Get = true, Update = true } }} + }) + .ExecuteAsync(); + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + // snippet.end + } + + static async Task GrantTokenOldWithRegex() + { + // snippet.grant_token_old_regex + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUserId("my-authorized-userId") + .Patterns(new PNTokenPatterns() + { + Spaces = new Dictionary() { + { "space-[A-Za-z0-9]", new PNTokenAuthValues() { Read = true } }} + }) + .ExecuteAsync(); + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + // snippet.end + } + + static async Task GrantTokenOldComplexWithRegex() + { + // snippet.grant_token_complex_old_with_regex + PNResult grantTokenResponse = await pubnub.GrantToken() + .TTL(15) + .AuthorizedUserId("my-authorized-userId") + .Resources(new PNTokenResources() + { + Spaces = new Dictionary() { + { "space-a", new PNTokenAuthValues() { Read = true } }, + { "space-b", new PNTokenAuthValues() { Read = true, Write = true } }, + { "space-c", new PNTokenAuthValues() { Read = true, Write = true } }, + { "space-d", new PNTokenAuthValues() { Read = true, Write = true } }}, + Users = new Dictionary() { + { "user-c", new PNTokenAuthValues() { Get = true } }, + { "user-d", new PNTokenAuthValues() { Get = true, Update = true } }} + }) + .Patterns(new PNTokenPatterns() + { + Spaces = new Dictionary() { + { "space-[A-Za-z0-9]", new PNTokenAuthValues() { Read = true } }} + }) + .ExecuteAsync(); + PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; + PNStatus grantTokenStatus = grantTokenResponse.Status; + if (!grantTokenStatus.Error && grantTokenResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + } + // snippet.end + } + + static async Task RevokeTokenBasicUsage() + { + // snippet.revoke_token + PNResult revokeTokenResponse = await pubnub + .RevokeToken() + .Token("p0thisAkFl043rhDdHRsCkNDcGF0pERjaGFuoENnctokenVzcqBDc3BjoERtZXRhoENzaWdYIGOAeTyWGJI") + .ExecuteAsync(); + PNAccessManagerRevokeTokenResult revokeTokenResult = revokeTokenResponse.Result; + PNStatus revokeTokenStatus = revokeTokenResponse.Status; + if (!revokeTokenStatus.Error && revokeTokenResult != null) + { + Console.WriteLine("Revoke token success"); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(revokeTokenStatus)); + } + // snippet.end + } + + static async Task SetAuthTokenSnippet() + { + // snippet.set_token + pubnub.SetAuthToken( + "p0thisAkFl043rhDdHRsCkNyZXisRGNoYW6hanNlY3JldAFDZ3Jwsample3KgQ3NwY6BDcGF0pERjaGFuoENnctokenVzcqBDc3BjoERtZXRhoENzaWdYIGOAeTyWGJI"); + + // snippet.end + } + + static async Task ParseTokenBasicUsage() + { + // snippet.parse_token_usage + var parsedTokenContent = + pubnub.ParseToken( + "p0thisAkFl043rhDdHRsCkNyZXisRGNoYW6hanNlY3JldAFDZ3Jwsample3KgQ3NwY6BDcGF0pERjaGFuoENnctokenVzcqBDc3BjoERtZXRhoENzaWdYIGOAeTyWGJI"); + var parsedTokenJson = pubnub.JsonPluggableLibrary.SerializeToJsonString(parsedTokenContent); + // snippet.end + + /* + // snippet.parse_token_result + { + "Version":2, + "Timestamp":1619718521, + "TTL":15, + "AuthorizedUuid":"my_uuid", + "Resources":{ + "Uuids":{ + "uuid-id":{ + "Read":true, + "Write":true, + "Manage":true, + "Delete":true, + "Get":true, + "Update":true, + "Join":true + } + }, + "Channels":{ + "channel-id":{ + "Read":true, + "Write":true, + "Manage":true, + "Delete":true, + "Get":true, + "Update":true, + "Join":true + } + }, + "ChannelGroups":{ + "group-id":{ + "Read":true, + "Write":true, + "Manage":true, + "Delete":true, + "Get":true, + "Update":true, + "Join":true + } + } + }, + "Patterns":{ + "Uuids":{ + "uuid-pattern":{ + "Read":true, + "Write":true, + "Manage":true, + "Delete":true, + "Get":true, + "Update":true, + "Join":true + } + }, + "Channels":{ + "channel-pattern":{ + "Read":true, + "Write":true, + "Manage":true, + "Delete":true, + "Get":true, + "Update":true, + "Join":true + } + }, + "ChannelGroups":{ + "group-pattern":{ + "Read":true, + "Write":true, + "Manage":true, + "Delete":true, + "Get":true, + "Update":true, + "Join":true + } + } + } + } + // snippet.end + */ + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs new file mode 100644 index 00000000..31857986 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs @@ -0,0 +1,238 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class AccessManagerV2Sample +{ + private static Pubnub pubnub; + + static void PubnubInit() + { + // snippet.pubnub_init + //Create configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo" + }; + //Create a new PubNub instance + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + static async Task Grant() + { + // snippet.grant + PNResult grantResponse = await pubnub.Grant() + .Channels(new string[]{ + //channels to allow grant on + "ch1", + "ch2", + "ch3" + }) + .ChannelGroups(new string[] { + // groups to allow grant on + "cg1", + "cg2", + "cg3" + }) + .AuthKeys(new string[] { + // the keys we are provisioning + "key1", + "key2", + "key3" + }) + .Write(true) // allow those keys to write (false by default) + .Manage(true) // allow those keys to manage channel groups (false by default) + .Read(true) // allow keys to read the subscribe feed (false by default) + .Delete(true) // allow those keys to delete the subscribe feed (false by default) + .TTL(12337) // how long those keys will remain valid (0 for eternity) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } + + static void GrantCallback() + { + // snippet.grant_callback + pubnub.Grant() + .Channels(new string[]{ + //channels to allow grant on + "ch1", + "ch2", + "ch3" + }) + .ChannelGroups(new string[] { + // groups to allow grant on + "cg1", + "cg2", + "cg3" + }) + .AuthKeys(new string[] { + // the keys we are provisioning + "key1", + "key2", + "key3" + }) + .Write(true) // allow those keys to write (false by default) + .Manage(true) // allow those keys to manage channel groups (false by default) + .Read(true) // allow keys to read the subscribe feed (false by default) + .Delete(true) // allow those keys to delete the subscribe feed (false by default) + .TTL(12337) // how long those keys will remain valid (0 for eternity) + .Execute(new PNAccessManagerGrantResultExt( + (result, status) => { + //PNAccessManagerGrantResult is a parsed and abstracted response from server + } + )); + // snippet.end + } + + static async Task GrantTTL() + { + // snippet.grant_ttl + PNResult grantResponse = await pubnub.Grant() + .Channels(new string[] { + "my_channel" + }) + .Write(false) + .Read(true) + .Delete(false) + .AuthKeys(new string[] { + "my_ro_authkey" + }) + .TTL(5) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } + + static async Task GrantPresence() + { + // snippet.grant_presence + PNResult grantResponse = await pubnub.Grant() + .Channels(new string[] { + "my_channel-pnpres" + }) + .Write(true) + .Read(true) + .Delete(true) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } + + static async Task GrantChannelGroup() + { + // snippet.grant_group + PNResult grantResponse = await pubnub.Grant() + .ChannelGroups(new string[] { + "cg1", + "cg2", + "cg3" + }) + .AuthKeys(new string[] { + "key1", + "key2", + "key3" + }) + .Write(true) + .Manage(true) + .Read(true) + .Delete(true) + .TTL(12337) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } + + static async Task GrantWithAuthKey() + { + // snippet.grant_auth_key + PNResult grantResponse = await pubnub.Grant() + .Uuids(new string[] { + "my_uuid" + }) + .Get(true) + .Update(true) + .Delete(true) + .AuthKeys(new string[] { + "my_ro_authkey" + }) + .TTL(1440) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } + + static async Task GrantAppLevel() + { + // snippet.grant_app_level + PNResult grantResponse = await pubnub.Grant() + .Write(true) + .Read(true) + .Delete(true) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } + + static async Task GrantChannelLevel() + { + // snippet.grant_channel_level + PNResult grantResponse = await pubnub.Grant() + .Channels(new string[] { + "my_channel" + }) + .Write(true) + .Read(true) + .Delete(true) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } + + static async Task GrantUserLevel() + { + // snippet.grant_user_level + PNResult grantResponse = await pubnub.Grant() + .Channels(new string[] { + "my_channel" + }) + .Write(true) + .Read(true) + .Delete(true) + .AuthKeys(new string[]{ + "my_authkey" + }) + .TTL(5) + .ExecuteAsync(); + + PNAccessManagerGrantResult grantResult = grantResponse.Result; + PNStatus status = grantResponse.Status; + //PNAccessManagerGrantResult is a parsed and abstracted response from server + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs new file mode 100644 index 00000000..e5126967 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs @@ -0,0 +1,83 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class ChannelGroupsSample +{ + private static Pubnub pubnub; + + static void PubnubInit() + { + // snippet.pubnub_init + //Create configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo" + }; + //Create a new PubNub instance + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + static async Task AddToGroup() + { + // snippet.add_to_group + try + { + PNResult cgAddChResponse = await pubnub.AddChannelsToChannelGroup() + .ChannelGroup("myChannelGroup") + .Channels(new string[] { "channel1", "channel2", "channel3" }) + .ExecuteAsync(); + + PNChannelGroupsAddChannelResult cgAddChResult = cgAddChResponse.Result; + PNStatus cgAddChStatus = cgAddChResponse.Status; + + if (!cgAddChStatus.Error && cgAddChResult != null) + { + Console.WriteLine("Channels successfully added to the channel group."); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(cgAddChStatus)); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + static async Task ListFromGroup() + { + // snippet.list + PNResult cgListChResponse = await pubnub.ListChannelsForChannelGroup() + .ChannelGroup("cg1") + .ExecuteAsync(); + // snippet.end + } + + static async Task RemoveFromGroup() + { + // snippet.remove + PNResult rmChFromCgResponse = await pubnub.RemoveChannelsFromChannelGroup() + .ChannelGroup("family") + .Channels(new string[] { + "son" + }) + .ExecuteAsync(); + // snippet.end + } + + static async Task DeleteGroup() + { + // snippet.delete + PNResult delCgResponse = await pubnub.DeleteChannelGroup() + .ChannelGroup("family") + .ExecuteAsync(); + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs new file mode 100644 index 00000000..0143131c --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs @@ -0,0 +1,172 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +// snippet.using_crypto +using PubnubApi.Security.Crypto; +using PubnubApi.Security.Crypto.Cryptors; +// snippet.end + +public class ConfigurationSample +{ + private static Pubnub pubnub; + + static void PubnubInit() + { + // snippet.init_config + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + // snippet.end + + // snippet.crypto + // encrypts using 256-bit AES-CBC cipher (recommended) + // decrypts data encrypted with the legacy and the 256-bit AES-CBC ciphers + pnConfiguration.CryptoModule = new CryptoModule(new AesCbcCryptor("enigma"), + new List { new LegacyCryptor("enigma") }); + + // encrypts with 128-bit cipher key entropy (legacy) + // decrypts data encrypted with the legacy and the 256-bit AES-CBC ciphers + pnConfiguration.CryptoModule = new CryptoModule(new LegacyCryptor("enigma"), + new List { new AesCbcCryptor("enigma") }); + // snippet.end + + // snippet.new_pubnub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + static void BasicUsage() + { + // snippet.basic_usage + // Create a configuration instance for PubNub + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", // Required + PublishKey = "demo", // Only required if publishing + SecretKey = "SecretKey", // Only required for access operations + Secure = true, // Enable SSL + AuthKey = "authKey", // If Access Manager is utilized + LogLevel = PubnubLogLevel.Debug, // Enable debugging + SubscribeTimeout = 310, // Subscribe loop timeout in seconds + NonSubscribeRequestTimeout = 300, // Non-subscribe request timeout + FilterExpression = "such=wow", // PSV2 filter expression + HeartbeatNotificationOption = PNHeartbeatNotificationOption.All, // Heartbeat notifications + PresenceTimeout = 120, // Presence timeout + }; + + // Configure presence timeout with custom interval + pnConfiguration.SetPresenceTimeoutWithCustomInterval(120, 59); + + // Encryption configuration (Optional) + pnConfiguration.CryptoModule = new CryptoModule( + new AesCbcCryptor("enigma"), + new List { new LegacyCryptor("enigma") }); + + // Initialize a new PubNub instance with the created confiiguration + Pubnub pubnub = new Pubnub(pnConfiguration); + // snippet.end + + // snippet.user_id + pnConfiguration.UserId = new UserId("myUserId"); + // snippet.end + + // snippet.get_user_id + UserId currentUserId = pubnub.GetCurrentUserId(); + // snippet.end + } + + static void ChangeUserId() + { + // snippet.change_user_id + //Setting the initial UserId + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + //Changing to a new UserId + pnConfiguration.UserId = new UserId("myUserId"); + // snippet.end + } + + static void SetAndGetAuthKey() + { + // snippet.set_auth_key + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + pnConfiguration.AuthKey = "authKey"; + // snippet.end + + // snippet.get_auth_key + string sampleAuthKey = pnConfiguration.AuthKey; + // snippet.end + } + + static void FilterExpression() + { + // snippet.filter_expression + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + pnConfiguration.FilterExpression = "such=wow"; + // snippet.end + + // snippet.get_filter_expression + string filterExpression = pnConfiguration.FilterExpression; + // snippet.end + } + + static void InitWithUUID() + { + // snippet.init_with_uuid + // Initialize PubNub using the configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Create the PubNub instance with the configuration + Pubnub pubnub = new Pubnub(pnConfiguration); + // snippet.end + } + + static void InitNonSecure() + { + // snippet.init_non_secure + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + pnConfiguration.PublishKey = "my_pubkey"; + pnConfiguration.SubscribeKey = "my_subkey"; + pnConfiguration.Secure = false; + Pubnub pubnub = new Pubnub(pnConfiguration); + // snippet.end + } + + static void InitSecure() + { + // snippet.init_secure + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + pnConfiguration.PublishKey = "my_pubkey"; + pnConfiguration.SubscribeKey = "my_subkey"; + pnConfiguration.Secure = true; + Pubnub pubnub = new Pubnub(pnConfiguration); + // snippet.end + } + + static void InitSecretKey() + { + // snippet.init_secret_key + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + pnConfiguration.PublishKey = "my_pubkey"; + pnConfiguration.SubscribeKey = "my_subkey"; + pnConfiguration.SecretKey = "my_secretkey"; + pnConfiguration.Secure = true; + + Pubnub pubnub = new Pubnub(pnConfiguration); + // snippet.end + } + + static void InitReadOnly() + { + // snippet.init_read_only + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + pnConfiguration.SubscribeKey = "my_subkey"; + Pubnub pubnub = new Pubnub(pnConfiguration); + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs new file mode 100644 index 00000000..b09b5e2a --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs @@ -0,0 +1,358 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class EntitiesSample +{ + private static Pubnub pubnub; + private static PNConfiguration config; + + static void Init() + { + // snippet.pubnub_init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + public static async Task GetAllUuidMetadataBasicUsage() + { + // snippet.get_all_uuid_metadata_basic_usage + try + { + PNResult getAllUuidMetadataResponse = await pubnub.GetAllUuidMetadata() + .IncludeCustom(true) + .IncludeCount(true) + .ExecuteAsync(); + + PNGetAllUuidMetadataResult getAllUuidMetadataResult = getAllUuidMetadataResponse.Result; + PNStatus status = getAllUuidMetadataResponse.Status; + + if (!status.Error && getAllUuidMetadataResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(getAllUuidMetadataResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + public static async Task GetUuidMetadataBasicUsage() + { + // snippet.get_uuid_metadata_basic_usage + // Get Metadata for UUID set in the pubnub instance + PNResult getUuidSetMetadataResponse = await pubnub.GetUuidMetadata() + .ExecuteAsync(); + PNGetUuidMetadataResult getUuidSetMetadataResult = getUuidSetMetadataResponse.Result; + PNStatus uuidSetStatus = getUuidSetMetadataResponse.Status; + + // Get Metadata for a specific UUID + PNResult getSpecificUuidMetadataResponse = await pubnub.GetUuidMetadata() + .Uuid("my-uuid") + .ExecuteAsync(); + PNGetUuidMetadataResult getSpecificUuidMetadataResult = getSpecificUuidMetadataResponse.Result; + PNStatus specificUuidStatus = getSpecificUuidMetadataResponse.Status; + // snippet.end + } + + public static async Task SetUuidMetadataBasicUsage() + { + // snippet.set_uuid_metadata_basic_usage + // Set Metadata for UUID set in the pubnub instance + PNResult setUuidMetadataResponse = await pubnub.SetUuidMetadata() + .Uuid(config.Uuid) + .Name("John Doe") + .Email("john.doe@user.com") + .ExecuteAsync(); + PNSetUuidMetadataResult setUuidMetadataResult = setUuidMetadataResponse.Result; + PNStatus status = setUuidMetadataResponse.Status; + // snippet.end + } + + public static async Task RemoveUuidMetadataBasicUsage() + { + // snippet.remove_uuid_metadata_basic_usage + // Remove Metadata for UUID set in the pubnub instance + PNResult removeUuidMetadataResponse = await pubnub.RemoveUuidMetadata() + .ExecuteAsync(); + PNRemoveUuidMetadataResult removeUuidMetadataResult = removeUuidMetadataResponse.Result; + PNStatus status = removeUuidMetadataResponse.Status; + // snippet.end + } + + public static async Task GetAllChannelMetadataBasicUsage() + { + // snippet.get_all_channel_metadata_basic_usage + PNResult getAllChannelMetadataResponse = await pubnub.GetAllChannelMetadata() + .IncludeCount(true) + .IncludeCustom(true) + .ExecuteAsync(); + + PNGetAllChannelMetadataResult getAllChannelMetadataResult = getAllChannelMetadataResponse.Result; + PNStatus status2 = getAllChannelMetadataResponse.Status; + // snippet.end + } + + public static async Task GetChannelMetadataBasicUsage() + { + // snippet.get_channel_metadata_basic_usage + // Get Metadata for a specific channel + PNResult getChannelMetadataResponse = await pubnub.GetChannelMetadata() + .Channel("my-channel") + .IncludeCustom(true) + .ExecuteAsync(); + + PNGetChannelMetadataResult getChannelMetadataResult = getChannelMetadataResponse.Result; + PNStatus status = getChannelMetadataResponse.Status; + // snippet.end + } + + public static async Task SetChannelMetadataBasicUsage() + { + // snippet.set_channel_metadata_basic_usage + // Set Metadata for a specific channel + PNResult setChannelMetadataResponse = await pubnub.SetChannelMetadata() + .Channel("my-channel") + .Name("John Doe") + .Description("sample description") + .Custom(new Dictionary() { { "color", "blue" } }) + .IncludeCustom(true) + .ExecuteAsync(); + + PNSetChannelMetadataResult setChannelMetadataResult = setChannelMetadataResponse.Result; + PNStatus status = setChannelMetadataResponse.Status; + // snippet.end + } + + public static async Task SetChannelMetadataIterativeUpdate() + { + // snippet.set_channel_metadata_iterative_update + PNConfiguration config = new PNConfiguration(new UserId("example")) + { + PublishKey = "demo", + SubscribeKey = "demo", + }; + Pubnub pubnub = new Pubnub(config); + string channel = "team.red"; + string name = "Red Team"; + string description = "The channel for Red team."; + var customField = new Dictionary() + { + { "visible", "team" }, + }; + PNResult setChannelMetadataResponse = await pubnub.SetChannelMetadata() + .Channel(channel) + .Name(name) + .Description(description) + .Custom(customField) + .ExecuteAsync(); + Console.WriteLine("The channel has been created with name and description.\n"); + + // Fetch current object with custom fields + PNResult currentObjectResponse = await pubnub.GetChannelMetadata() + .Channel(channel) + .IncludeCustom(true) + .ExecuteAsync(); + var currentObject = currentObjectResponse.Result; + + // Initialize the custom field dictionary + Dictionary custom = currentObject?.Custom ?? new Dictionary(); + + + // Add or update the field + custom["edit"] = "admin"; + + // Writing the updated object back to the server + try + { + setChannelMetadataResponse = await pubnub.SetChannelMetadata() + .Channel(channel) + .Custom(custom) + .Name(currentObject?.Name) + .Description(currentObject?.Description) + .ExecuteAsync(); + Console.WriteLine($"Object has been updated.\n {setChannelMetadataResponse.Result}"); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + // snippet.end + } + + public static async Task RemoveChannelMetadataBasicUsage() + { + // snippet.remove_channel_metadata_basic_usage + // Delete Metadata for a specific channel + PNResult removeChannelMetadataResponse = await pubnub.RemoveChannelMetadata() + .Channel("mychannel") + .ExecuteAsync(); + + PNRemoveChannelMetadataResult removeChannelMetadataResult = removeChannelMetadataResponse.Result; + PNStatus status = removeChannelMetadataResponse.Status; + // snippet.end + } + + public static async Task GetMembershipsBasicUsage() + { + // snippet.get_memberships_basic_usage + PNResult getMembershipsResponse = await pubnub.GetMemberships() + .Uuid("my-uuid") + .Include(new PNMembershipField[] { PNMembershipField.CUSTOM, PNMembershipField.CHANNEL, PNMembershipField.CHANNEL_CUSTOM }) + .IncludeCount(true) + .Page(new PNPageObject() { Next = "", Prev = "" }) + .ExecuteAsync(); + + PNMembershipsResult getMembeshipsResult = getMembershipsResponse.Result; + PNStatus status = getMembershipsResponse.Status; + // snippet.end + } + + public static async Task SetMembershipsBasicUsage() + { + // snippet.set_memberships_basic_usage + List setMembershipChannelMetadataIdList = + [ + new PNMembership() + { Channel = "my-channel", Custom = new Dictionary() { { "item", "book" } } } + ]; + + PNResult setMembershipsResponse = await pubnub.SetMemberships() + .Uuid("my-uuid") + .Channels(setMembershipChannelMetadataIdList) + .Include(new PNMembershipField[] { PNMembershipField.CUSTOM, PNMembershipField.CHANNEL, PNMembershipField.CHANNEL_CUSTOM }) + .IncludeCount(true) + .ExecuteAsync(); + + PNMembershipsResult setMembershipsResult = setMembershipsResponse.Result; + PNStatus status = setMembershipsResponse.Status; + // snippet.end + } + + public static async Task RemoveMembershipsBasicUsage() + { + // snippet.remove_memberships_basic_usage + List removeMembershipList = + [ + "my-channel", + "your-channel" + ]; + + PNResult removeMembershipsResponse = await pubnub.RemoveMemberships() + .Uuid("uuid") + .Channels(removeMembershipList) + .Include(new PNMembershipField[] { PNMembershipField.CUSTOM, PNMembershipField.CHANNEL, PNMembershipField.CHANNEL_CUSTOM }) + .IncludeCount(true) + .ExecuteAsync(); + + PNMembershipsResult removeMembershipsResult = removeMembershipsResponse.Result; + PNStatus status2 = removeMembershipsResponse.Status; + // snippet.end + } + + public static async Task ManageMembershipsBasicUsage() + { + // snippet.manage_memberships_basic_usage + List setMembrshipList = + [ + new PNMembership() { Channel = "ch1", Custom = new Dictionary() { { "say", "hello" } } }, + new PNMembership() { Channel = "ch2", Custom = new Dictionary() { { "say", "world" } } }, + new PNMembership() { Channel = "ch3", Custom = new Dictionary() { { "say", "bye" } } } + ]; + + List removeMembrshipList = + [ + "ch4" + ]; + + PNResult manageMmbrshipsResponse = await pubnub.ManageMemberships() + .Uuid("my-uuid") + .Set(setMembrshipList) + .Remove(removeMembrshipList) + .Include(new PNMembershipField[] { PNMembershipField.CUSTOM, PNMembershipField.CHANNEL, PNMembershipField.CHANNEL_CUSTOM }) + .IncludeCount(true) + .Page(new PNPageObject() { Next = "", Prev = "" }) + .Sort(new List() { "channel.id:asc" }) + .ExecuteAsync(); + + PNMembershipsResult manageMmbrshipsResult = manageMmbrshipsResponse.Result; + PNStatus status = manageMmbrshipsResponse.Status; + // snippet.end + } + + public static async Task GetChannelMembersBasicUsage() + { + // snippet.get_channel_members_basic_usage + // Get Members (uuids) for a specific channel + PNResult getChannelMembersResponse = await pubnub.GetChannelMembers() + .Channel("my-channel") + .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM }) + .IncludeCount(true) + .ExecuteAsync(); + + PNChannelMembersResult getChannelMembersResult = getChannelMembersResponse.Result; + PNStatus status2 = getChannelMembersResponse.Status; + // snippet.end + } + + public static async Task SetChannelMembersBasicUsage() + { + // snippet.set_channel_members_basic_usage + // Add Members (UUID) for a specific channel + List setMemberChannelList = + [ + new PNChannelMember() + { Uuid = "my-uuid", Custom = new Dictionary() { { "planet", "earth" } } } + ]; + + PNResult setChannelMembersResponse = await pubnub.SetChannelMembers() + .Channel("my-channel") + .Uuids(setMemberChannelList) + .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM }) + .IncludeCount(true) + .ExecuteAsync(); + + PNChannelMembersResult setChannelMembersResult = setChannelMembersResponse.Result; + PNStatus status2 = setChannelMembersResponse.Status; + // snippet.end + } + + public static async Task RemoveChannelMembersBasicUsage() + { + // snippet.remove_channel_members_basic_usage + // Remove Members (UUID) for a specific channel + List removeChannelMemberList = + [ + "my-uuid", + "your-uuid" + ]; + + PNResult removeChannelMembersResponse = await pubnub.RemoveChannelMembers() + .Channel("my-channel") + .Uuids(removeChannelMemberList) + .Include(new PNChannelMemberField[] { PNChannelMemberField.CUSTOM, PNChannelMemberField.UUID, PNChannelMemberField.UUID_CUSTOM }) + .IncludeCount(true) + .ExecuteAsync(); + + PNChannelMembersResult removeChannelMembersResult = removeChannelMembersResponse.Result; + PNStatus status = removeChannelMembersResponse.Status; + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs new file mode 100644 index 00000000..b006974e --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs @@ -0,0 +1,160 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class FilesSample +{ + private static Pubnub pubnub; + + static void InitSample() + { + // snippet.init + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + Pubnub pubnub = new Pubnub(pnConfiguration); + // snippet.end + } + + public static async Task SendFileBasicUsage() + { + // snippet.send_file_basic_usage + try + { + PNResult fileUploadResponse = await pubnub.SendFile() + .Channel("my_channel") + .File("path/to/your/file/cat_picture.jpg") + .Message("Look at this photo!") + .CustomMessageType("file-message") + .ExecuteAsync(); + + PNFileUploadResult fileUploadResult = fileUploadResponse.Result; + PNStatus fileUploadStatus = fileUploadResponse.Status; + + if (!fileUploadStatus.Error && fileUploadResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadStatus)); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + public static async Task ListFilesBasicUsage() + { + // snippet.list_files_basic_usage + PNResult listFilesResponse = await pubnub.ListFiles() + .Channel("my_channel") + .ExecuteAsync(); + PNListFilesResult listFilesResult = listFilesResponse.Result; + PNStatus listFilesStatus = listFilesResponse.Status; + if (!listFilesStatus.Error && listFilesResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(listFilesResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(listFilesStatus)); + } + // snippet.end + } + + public static async Task GetFileUrlBasicUsage() + { + // snippet.get_file_url_basic_usage + PNResult getFileUrlResponse = await pubnub.GetFileUrl() + .Channel("my_channel") + .FileId("d9515cb7-48a7-41a4-9284-f4bf331bc770") + .FileName("cat_picture.jpg") + .ExecuteAsync(); + PNFileUrlResult getFileUrlResult = getFileUrlResponse.Result; + PNStatus getFileUrlStatus = getFileUrlResponse.Status; + if (!getFileUrlStatus.Error && getFileUrlResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(getFileUrlResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(getFileUrlStatus)); + } + // snippet.end + } + + public static async Task DownloadFileBasicUsage(string downloadUrlFileName) + { + // snippet.download_file_basic_usage + PNResult fileDownloadResponse = await pubnub.DownloadFile() + .Channel("my_channel") + .FileId("d9515cb7-48a7-41a4-9284-f4bf331bc770") + .FileName("cat_picture.jpg") + .ExecuteAsync(); + PNDownloadFileResult fileDownloadResult = fileDownloadResponse.Result; + PNStatus fileDownloadStatus = fileDownloadResponse.Status; + if (!fileDownloadStatus.Error && fileDownloadResult != null) + { + fileDownloadResult.SaveFileToLocal(downloadUrlFileName); //saves to bin folder if no path is provided + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileDownloadResult.FileName)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileDownloadStatus)); + } + // snippet.end + } + + public static async Task DeleteFileBasicUsage() + { + // snippet.delete_file_basic_usage + PNResult deleteFileResponse = await pubnub.DeleteFile() + .Channel("my_channel") + .FileId("d9515cb7-48a7-41a4-9284-f4bf331bc770") + .FileName("cat_picture.jpg") + .ExecuteAsync(); + PNDeleteFileResult deleteFileResult = deleteFileResponse.Result; + PNStatus deleteFileStatus = deleteFileResponse.Status; + if (!deleteFileStatus.Error && deleteFileResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(deleteFileResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(deleteFileStatus)); + } + // snippet.end + } + + public static async Task PublishFileMessageBasicUsage() + { + // snippet.publish_file_message_basic_usage + PNResult publishFileMsgResponse = await pubnub.PublishFileMessage() + .Channel("my_channel") + .FileId("d9515cb7-48a7-41a4-9284-f4bf331bc770") + .FileName("cat_picture.jpg") //checks the bin folder if no path is provided + .Message("This is a sample message") + .CustomMessageType("file-message") + .ExecuteAsync(); + PNPublishFileMessageResult publishFileMsgResult = publishFileMsgResponse.Result; + PNStatus publishFileMsgStatus = publishFileMsgResponse.Status; + if (!publishFileMsgStatus.Error && publishFileMsgResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(publishFileMsgResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(publishFileMsgStatus)); + } + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs new file mode 100644 index 00000000..af409ef0 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs @@ -0,0 +1,50 @@ +// snippet.using +using PubnubApi; + +// snippet.end +using System; +using System.Globalization; + +public class LoggingSample +{ + // snippet.custom_logger + // A custom logger that logs information on console. + // Use can implement logger that can log information using log4Net or file etc. + public class PubnubConsoleLogger : IPubnubLogger + { + public void Trace(string traceLog) => + Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [TRACE] {traceLog}"); + + public void Debug(string debugLog) => + Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [DEBUG] {debugLog}"); + + public void Info(string infoLog) => + Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [INFO] {infoLog}"); + + public void Warn(string warningLog) => + Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [WARN] {warningLog}"); + + public void Error(string errorLog) => + Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [ERROR] {errorLog}"); + } + // snippet.end + + public static void EnableLogging() + { + // snippet.enable_logging + var pubnubConfiguration = new PNConfiguration(new UserId("uniqueUserId")) + { + SubscribeKey = "[yourSubscribeKey]", + PublishKey = "[yourPublishKey]", + LogLevel = PubnubLogLevel.Debug, + }; + var pubnub = new Pubnub(pubnubConfiguration); + + var customLogger = new PubnubConsoleLogger(); + pubnub.SetLogger(customLogger); + + // To remove the custom logger. Use RemoveLogger(). + pubnub.RemoveLogger(customLogger); + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs new file mode 100644 index 00000000..eeae12e6 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs @@ -0,0 +1,81 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class MessageActionsSample +{ + private static Pubnub pubnub; + + static void Init() + { + // snippet.init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + public static void AddMessageActionBasicUsage() + { + // snippet.add_message_action_basic_usage + try + { + pubnub.AddMessageAction() + .Channel("my_channel") + .MessageTimetoken(5610547826969050) // Replace with actual message timetoken + .Action(new PNMessageAction { Type = "reaction", Value = "smiley_face" }) + .Execute(new PNAddMessageActionResultExt((result, status) => + { + if (!status.Error && result != null) + { + Console.WriteLine("Message action added successfully."); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + } + })); + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + public static void RemoveMessageActionBasicUsage() + { + // snippet.remove_message_action_basic_usage + pubnub.RemoveMessageAction() + .Channel("my_channel") + .MessageTimetoken(15701761818730000) + .ActionTimetoken(15701775691010000) + .Uuid("mytestuuid") + .Execute(new PNRemoveMessageActionResultExt((result, status) => + { + //empty result of type PNRemoveMessageActionResult. + })); + // snippet.end + } + + public static void GetMessageActionsBasicUsage() + { + // snippet.get_message_actions_basic_usage + pubnub.GetMessageActions() + .Channel("my_channel") + .Execute(new PNGetMessageActionsResultExt((result, status) => + { + //result is of type PNGetMessageActionsResult. + })); + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs new file mode 100644 index 00000000..bb55db67 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs @@ -0,0 +1,133 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class MiscSample +{ + private static Pubnub pubnub; + + static void Init() + { + // snippet.init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + public static void DestroyBasicUsage() + { + // snippet.destroy_basic_usage + // Destroy PubNub instance to clean up resources + pubnub.Destroy(); + + Console.WriteLine("PubNub instance destroyed successfully."); + // snippet.end + } + + public static void EncryptBasicUsage() + { + // snippet.encrypt_basic_usage + string stringToEncrypt = "hello world"; + var crypto = PubnubApi.Security.Crypto.CryptoModule.CreateAesCbcCryptor("test"); + crypto.Encrypt(stringToEncrypt); + // snippet.end + } + + public static void EncryptFileBasicUsage() + { + // snippet.encrypt_file_basic_usage + string source_file = "cat_picture.jpg"; // checks bin folder if no path is provided + string destination_file = "destination_cat_pic.jpg"; // checks bin folder if no path is provided + var crypto = PubnubApi.Security.Crypto.CryptoModule.CreateAesCbcCryptor("test"); + crypto.EncryptFile(source_file, destination_file); + // snippet.end + } + + public static void EncryptFileBytesBasicUsage() + { + // snippet.encrypt_file_bytes_basic_usage + byte[] sourceBytes = System.IO.File.ReadAllBytes("cat_picture.jpg"); // checks bin folder if no path is provided + var crypto = PubnubApi.Security.Crypto.CryptoModule.CreateAesCbcCryptor("test"); + byte[] outputBytes = crypto.Encrypt(sourceBytes); + System.IO.File.WriteAllBytes("destination_cat_pic.jpg", outputBytes); // checks bin folder if no path is provided + // snippet.end + } + + public static void DecryptBasicUsage() + { + // snippet.decrypt_basic_usage + var crypto = PubnubApi.Security.Crypto.CryptoModule.CreateAesCbcCryptor("test"); + crypto.Decrypt("encryptedString"); + // snippet.end + } + + public static void DecryptFileBasicUsage() + { + // snippet.decrypt_file_basic_usage + string source_file = "encrypted_cat_pic.jpg"; // checks bin folder if no path is provided + string destination_file = "cat_pic_original.jpg"; // checks bin folder if no path is provided + var crypto = PubnubApi.Security.Crypto.CryptoModule.CreateAesCbcCryptor("test"); + crypto.DecryptFile(source_file, destination_file); + // snippet.end + } + + public static void DecryptFileBytesBasicUsage() + { + // snippet.decrypt_file_bytes_basic_usage + byte[] sourceBytes = System.IO.File.ReadAllBytes("encrypted_cat_pic.jpg"); // checks bin folder if no path is provided + var crypto = PubnubApi.Security.Crypto.CryptoModule.CreateAesCbcCryptor("test"); + byte[] outputBytes = crypto.Decrypt(sourceBytes); + System.IO.File.WriteAllBytes("cat_pic_original.jpg", outputBytes); // checks bin folder if no path is provided + // snippet.end + } + + public static void DisconnectBasicUsage() + { + // snippet.disconnect_basic_usage + pubnub.Disconnect(); + // snippet.end + } + + public static void GetSubscribedChannelGroupsBasicUsage() + { + // snippet.get_subscribed_channel_groups_basic_usage + List groups = pubnub.GetSubscribedChannelGroups(); + // snippet.end + } + + public static void GetSubscribedChannelsBasicUsage() + { + // snippet.get_subscribed_channels_basic_usage + List channels = pubnub.GetSubscribedChannels(); + // snippet.end + } + + public static void ReconnectBasicUsage() + { + // snippet.reconnect_basic_usage + pubnub.Reconnect(); + // snippet.end + } + + public static void TimeBasicUsage() + { + // snippet.time_basic_usage + pubnub.Time() + .Execute(new PNTimeResultExt( + (result, status) => { + // handle time result. + } + )); + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs new file mode 100644 index 00000000..dd2e46c9 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs @@ -0,0 +1,304 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class PresenceSample +{ + private static Pubnub pubnub; + + static void Init() + { + // snippet.pubnub_init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + public static async Task HereNowBasicUsage() + { + // snippet.here_now_basic_usage + try + { + PNResult herenowResponse = await pubnub.HereNow() + .Channels(new string[] { "coolChannel", "coolChannel2" }) + .IncludeUUIDs(true) + .ExecuteAsync(); + + PNHereNowResult herenowResult = herenowResponse.Result; + PNStatus status = herenowResponse.Status; + + if (!status.Error && herenowResult != null) + { + foreach (KeyValuePair channelData in herenowResult.Channels) + { + Console.WriteLine("---"); + Console.WriteLine("Channel: " + channelData.Value.ChannelName); + Console.WriteLine("Occupancy: " + channelData.Value.Occupancy); + + if (channelData.Value.Occupants != null) + { + foreach (var occupant in channelData.Value.Occupants) + { + Console.WriteLine($"UUID: {occupant.Uuid}"); + Console.WriteLine($"State: {(occupant.State != null ? pubnub.JsonPluggableLibrary.SerializeToJsonString(occupant.State) : "No state")}"); + } + } + } + } + else + { + Console.WriteLine("Error occurred: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + public static void HereNowSynchronous() + { + // snippet.here_now_synchronous + pubnub.HereNow() + // tailor the next two lines to example + .Channels(new string[] { + "coolChannel", + "coolChannel2" + }) + .IncludeUUIDs(true) + .Execute(new PNHereNowResultEx( + (result, status) => { + if (status.Error) { + // handle error + return; + } + + if (result.Channels != null && result.Channels.Count > 0) { + foreach (KeyValuePair kvp in result.Channels) { + PNHereNowChannelData channelData = kvp.Value; + Console.WriteLine("---"); + Console.WriteLine("channel:" + channelData.ChannelName); + Console.WriteLine("occupancy:" + channelData.Occupancy); + Console.WriteLine("Occupants:"); + if (channelData.Occupants != null && channelData.Occupants.Count > 0) { + for (int index = 0; index < channelData.Occupants.Count; index++) { + PNHereNowOccupantData occupant = channelData.Occupants[index]; + Console.WriteLine(string.Format("uuid: {0}", occupant.Uuid)); + Console.WriteLine(string.Format("state:{1}", (occupant.State != null) ? + pubnub.JsonPluggableLibrary.SerializeToJsonString(occupant.State) : "")); + } + } + } + } + } + )); + // snippet.end + } + + public static async Task HereNowReturningState() + { + // snippet.here_now_returning_state + PNResult herenowResponse = await pubnub.HereNow() + .Channels(new string[] { + // who is present on those channels? + "my_channel" + }) + .IncludeState(true) // include state with request (false by default) + .IncludeUUIDs(true) // if false, only shows occupancy count + .ExecuteAsync(); + + PNHereNowResult herenowResult = herenowResponse.Result; + PNStatus status = herenowResponse.Status; + //handle it + // snippet.end + } + + public static async Task HereNowReturnOccupancyOnly() + { + // snippet.here_now_return_occupancy_only + PNResult herenowResponse = await pubnub.HereNow() + .Channels(new string[] { + // who is present on those channels? + "my_channel" + }) + .IncludeState(false) // include state with request (false by default) + .IncludeUUIDs(false) // if false, only shows occupancy count + .ExecuteAsync(); + + PNHereNowResult herenowResult = herenowResponse.Result; + PNStatus status = herenowResponse.Status; + //handle it + // snippet.end + } + + public static async Task WhereNowBasicUsage() + { + // snippet.where_now_basic_usage + PNResult wherenowResponse = await pubnub.WhereNow() + .ExecuteAsync(); + + PNWhereNowResult wherenowResult = wherenowResponse.Result; + PNStatus status = wherenowResponse.Status; + // returns a pojo with channels + // channel groups which I am part of. + // snippet.end + } + + public static void WhereNowSynchronous() + { + // snippet.where_now_synchronous + pubnub.WhereNow() + .Execute(new PNWhereNowResultExt( + (result, status) => { + // returns a pojo with channels + // channel groups which I am part of. + } + )); + // snippet.end + } + + public static async Task WhereNowOtherUuid() + { + // snippet.where_now_other_uuid + PNResult wherenowResponse = await pubnub.WhereNow() + .Uuid("some-other-uuid") // uuid of the user we want to spy on. + .ExecuteAsync(); + + PNWhereNowResult wherenowResult = wherenowResponse.Result; + PNStatus status = wherenowResponse.Status; + // returns a pojo with channels + // channel groups which "some-other-uuid" part of.ere_now_example_1 + // snippet.end + } + + public static async Task SetPresenceStateBasicUsage() + { + // snippet.set_presence_state_basic_usage + Dictionary myState = new Dictionary(); + myState.Add("age", 20); + + PNResult setstateResponse = await pubnub.SetPresenceState() + .Channels(new string[] { + "ch1", + "ch2", + "ch3" + }) + .State(myState) + .ExecuteAsync(); + + PNSetStateResult setstateResult = setstateResponse.Result; + PNStatus status = setstateResponse.Status; + // handle set state response + // snippet.end + } + + public static async Task GetPresenceStateBasicUsage() + { + // snippet.get_presence_state_basic_usage + PNResult getstateResponse = await pubnub.GetPresenceState() + .Channels(new string[] { + // channels to fetch state for + "ch1", + "ch2", + "ch3" + }) + .ChannelGroups(new string[] { + // channel groups to fetch state for + "cg1", + "cg2", + "cg3" + }) + .Uuid("suchUUID") // uuid of user to fetch, or for own uuid + .ExecuteAsync(); + + PNGetStateResult getstateResult = getstateResponse.Result; + PNStatus status = getstateResponse.Status; + // handle response + // snippet.end + } + + public static void SetPresenceStateSynchronous() + { + // snippet.set_presence_state_synchronous + Dictionary myState = new Dictionary(); + myState.Add("age", 20); + + pubnub.SetPresenceState() + .Channels(new string[] { + "ch1", + "ch2", + "ch3" + }) + .State(myState) + .Execute(new PNSetStateResultExt( + (result, status) => { + // handle set state response + } + )); + // snippet.end + } + + public static void GetPresenceStateSynchronous() + { + // snippet.get_presence_state_synchronous + pubnub.GetPresenceState() + .Channels(new string[] { + // channels to fetch state for + "ch1", + "ch2", + "ch3" + }) + .ChannelGroups(new string[] { + // channel groups to fetch state for + "cg1", + "cg2", + "cg3" + }) + .Uuid("suchUUID") // uuid of user to fetch, or for own uuid + .Execute(new PNGetStateResultExt( + (result, status) => { + // handle response + } + )); + // snippet.end + } + + public static async Task SetPresenceStateForChannelGroups() + { + // snippet.set_presence_state_for_channel_groups + Dictionary myState = new Dictionary(); + myState.Add("age", 20); + + PNResult setstateResponse = await pubnub.SetPresenceState() + .ChannelGroups(new string[] { + // apply on those channel groups + "cg1", + "cg2", + "cg3" + }) + .Channels(new string[] { + // apply on those channels + "ch1", + "ch2", + "ch3" + }) + .State(myState) // the new state + .ExecuteAsync(); + + PNSetStateResult setstateResult = setstateResponse.Result; + PNStatus status = setstateResponse.Status; + // on new state for those channels + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs new file mode 100644 index 00000000..92e7a4e1 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs @@ -0,0 +1,930 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class PublishSubscribeSample +{ + private static Pubnub pubnub; + + static void Init() + { + // snippet.pubnub_init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + public static async Task PublishBasicUsage() + { + // snippet.publish_basic_usage + try + { + // Publishing a message to a channel + Dictionary position = new Dictionary + { + { "lat", 32F }, + { "lng", 32F } + }; + + Console.WriteLine("before pub: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(position)); + + PNResult publishResponse = await pubnub.Publish() + .Message(position) + .Channel("my_channel") + .CustomMessageType("text-message") + .ExecuteAsync(); + + PNPublishResult publishResult = publishResponse.Result; + PNStatus status = publishResponse.Status; + + if (!status.Error) + { + Console.WriteLine("pub timetoken: " + publishResult.Timetoken.ToString()); + Console.WriteLine("pub status code : " + status.StatusCode.ToString()); + } + else + { + Console.WriteLine("Error occurred: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + public static void PublishSynchronous() + { + // snippet.publish_synchronous + //Publishing Dictionary + Dictionary position = new Dictionary(); + position.Add("lat", 32F); + position.Add("lng", 32F); + + Console.WriteLine("before pub: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(position)); + + pubnub.Publish() + .Message(position) + .Channel("my_channel") + .CustomMessageType("text-message") + .Execute(new PNPublishResultExt( + (result, status) => + { + Console.WriteLine("pub timetoken: " + result.Timetoken.ToString()); + Console.WriteLine("pub status code : " + status.StatusCode.ToString()); + } + )); + // snippet.end + } + + public static void PublishWithMetadata() + { + // snippet.publish_with_metadata + string[] arrayMessage = new string[] + { + "hello", + "there" + }; + + pubnub.Publish() + .Message(arrayMessage.ToList()) + .Channel("suchChannel") + .ShouldStore(true) + .Meta(new Dictionary() { { "someKey", "someValue" } }) + .UsePOST(true) + .CustomMessageType("text-message") + .Execute(new PNPublishResultExt( + (result, status) => + { + // handle publish result, status always present, result if successful + // status.Error to see if error happened + } + )); + // snippet.end + } + + public static async Task PublishStoreForHours() + { + // snippet.publish_store_for_hours + var publishResult = await pubnub.Publish() + .Channel("coolChannel") + .Message("test") + .ShouldStore(true) + .Ttl(10) + .ExecuteAsync(); + // snippet.end + } + + // snippet.publish_mobile_payload + + public class MobilePayload + { + public Dictionary pn_apns; + public Dictionary pn_gcm; + public Dictionary full_game; + } + + public static void PublishMobilePayload() + { + Dictionary apnsData = new Dictionary(); + apnsData.Add("aps", new Dictionary() + { + { "alert", "Game update 49ers touchdown" }, + { "badge", 2 } + }); + apnsData.Add("teams", new string[] { "49ers", "raiders" }); + apnsData.Add("score", new int[] { 7, 0 }); + + Dictionary gcmData = new Dictionary(); + gcmData.Add("data", new Dictionary() + { + { + "summary", "Game update 49ers touchdown" + }, + { + "teams", new string[] { "49ers", "raiders" } + }, + { + "score", new int[] { 7, 0 } + }, + { + "lastplay", "5yd run up the middle" + }, + }); + + MobilePayload mobilePayload = new MobilePayload(); + mobilePayload.pn_apns = apnsData; + mobilePayload.pn_gcm = gcmData; + mobilePayload.full_game = new Dictionary() + { + { "date", "2014.05.20" }, + { "foobar", "Data that is not pertinent to devices" } + }; + + pubnub.Publish() + .Message(mobilePayload) + .Channel("my_channel") + .ShouldStore(true) + .CustomMessageType("text-message") + .Execute(new PNPublishResultExt( + (result, status) => + { + // Check whether request successfully completed or not. + if (status.Error) + { + // something bad happened. + Console.WriteLine( + $"error while publishing: {pubnub.JsonPluggableLibrary.SerializeToJsonString(status)}"); + } + else + { + Console.WriteLine($"published with timetoken: {result.Timetoken}"); + } + } + )); + } + // snippet.end + + public static void FireBasicUsage() + { + // snippet.fire_basic_usage + string[] arrMessage = new string[] + { + "hello", + "there" + }; + + pubnub.Fire() + .Message(arrMessage.ToList()) + .Channel("my-channel") + .UsePOST(true) + .Execute(new PNPublishResultExt( + (result, status) => + { + if (status.Error) + { + Console.WriteLine( + $"error while publishing: {pubnub.JsonPluggableLibrary.SerializeToJsonString(status)}"); + } + else + { + Console.WriteLine($"published with timetoken: {result.Timetoken}"); + } + } + )); + // snippet.end + } + + public static void SignalBasicUsage() + { + // snippet.signal_basic_usage + Dictionary myMessage = new Dictionary(); + myMessage.Add("msg", "Hello Signals"); + + pubnub.Signal() + .Message(myMessage) + .Channel("foo") + .CustomMessageType("text-message") + .Execute(new PNPublishResultExt((result, status) => + { + if (status.Error) + { + Console.WriteLine(status.ErrorData.Information); + } + else + { + Console.WriteLine(result.Timetoken); + } + })); + // snippet.end + } + + public static void SubscribeBasicUsage() + { + // snippet.subscribe_basic_usage + pubnub.Subscribe() + .Channels(new string[] + { + // subscribe to channels + "my_channel" + }) + .Execute(); + // snippet.end + } + + public static void SubscribeNewBasicUsage() + { + // snippet.subscribe_basic_usage_new + Subscription subscription1 = pubnub.Channel("channelName").Subscription(); + subscription1.Subscribe(); + + SubscriptionSet subscriptionSet = pubnub.SubscriptionSet( + new string[] { "channel1", "channel2" }, + new string[] { "channel_group_1", "channel_group_2" }, + SubscriptionOptions.ReceivePresenceEvents + ); + + subscriptionSet.Subscribe(); + // snippet.end + } + + public static void SubscribeWithLogging() + { + // snippet.subscribe_with_logging + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + // subscribeKey from admin panel + SubscribeKey = "my_subkey", // required + // publishKey from admin panel (only required if publishing) + PublishKey = "my_pubkey", + // logging level declaration + LogLevel = PubnubLogLevel.Debug + }; + + Pubnub pubnub = new Pubnub(pnConfiguration); + + pubnub.Subscribe() + .Channels(new string[] + { + // subscribe to channels + "my_channel" + }) + .Execute(); + // snippet.end + } + + public static void SubscribeMultipleChannels() + { + // snippet.subscribe_multiple_channels + pubnub.Subscribe() + .Channels(new string[] + { + // subscribe to channels information + "my_channel1", + "my_channel2" + }) + .Execute(); + // snippet.end + } + + public static void SubscribeWithPresence() + { + // snippet.subscribe_with_presence + pubnub.Subscribe() + .Channels(new string[] + { + // subscribe to channels + "my_channel" + }) + .WithPresence() // also subscribe to related presence information + .Execute(); + // snippet.end + } + + public static void SubscribeWithState() + { + // snippet.subscribe_with_state + pubnub.AddListener(new SubscribeCallbackExt( + (pubnubObj, message) => { }, + (pubnubObj, presence) => { }, + (pubnubObj, status) => + { + if (status.Category == PNStatusCategory.PNConnectedCategory) + { + Dictionary data = new Dictionary(); + data.Add("FieldA", "Awesome"); + data.Add("FieldB", 10); + + pubnub.SetPresenceState() + .Channels(new string[] { "awesomeChannel" }) + .ChannelGroups(new string[] { "awesomeChannelGroup" }) + .State(data) + .Execute(new PNSetStateResultExt( + (r, s) => + { + // handle set state response + } + )); + } + } + )); + + pubnub.Subscribe() + .Channels(new string[] + { + "awesomeChannel" + }) + .Execute(); + // snippet.end + } + + public static void SubscribeChannelGroup() + { + // snippet.subscribe_channel_group + pubnub.Subscribe() + .Channels(new string[] + { + // subscribe to channels + "ch1", + "ch2" + }) + .ChannelGroups(new string[] + { + // subscribe to channel groups + "cg1", + "cg2" + }) + .WithTimetoken(1337L) // optional, pass a timetoken + .WithPresence() // also subscribe to related presence information + .Execute(); + // snippet.end + } + + public static void SubscribeChannelGroupPresence() + { + // snippet.subscribe_channel_group_presence + pubnub.Subscribe() + .ChannelGroups(new string[] + { + // subscribe to channel groups + "cg1", + "cg2" + }) + .WithTimetoken(1337L) // optional, pass a timetoken + .WithPresence() // also subscribe to related presence information + .Execute(); + // snippet.end + } + + // snippet.subscribe_custom_type + public class Phone + { + public string Number { get; set; } + public string Extenion { get; set; } + + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public PhoneType PhoneType { get; set; } + } + + public enum PhoneType + { + Home, + Mobile, + Work + } + + public static void SubscribeWithCustomType() + { + Phone myPhone = new Phone() + { + Number = "111-222-2222", + PhoneType = PhoneType.Mobile, + Extenion = "11" + }; + + pubnub.Publish() + .Message(myPhone) + .Channel("my_channel") + .ShouldStore(true) + .Execute(new PNPublishResultExt( + (result, status) => + { + // Check whether request successfully completed or not. + if (status.Error) + { + // something bad happened. + Console.WriteLine("error happened while publishing: " + + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + } + else + { + Console.WriteLine("publish worked! timetoken: " + result.Timetoken.ToString()); + } + } + )); + + SubscribeCallbackExt objectListenerSubscribeCallack = new SubscribeCallbackExt( + (pubnubObj, message) => + { + //message.Message gives the Phone object because you subscribed to type Phone during subscribe. + }, + (pubnubObj, presence) => { }, + (pubnubObj, status) => { }); + + pubnub.AddListener(objectListenerSubscribeCallack); + pubnub.Subscribe() + .Channels(new string[] + { + "my_channel" // subscribe to channels + }) + .Execute(); + + //If you are subscribing to multiple message types, then + SubscribeCallbackExt stringListenerSubscribeCallack = new SubscribeCallbackExt( + (pubnubObj, message) => + { + //message.Message gives the string object because you subscribed to type "string" during subscribe. + string phoneStringMessage = message.Message.ToString(); //this is your string message + //using pluggable JSON library from the Pubnub instance, but you can use any form of JSON deserialization you wish + var deserializedMessage = pubnub.JsonPluggableLibrary.DeserializeToObject(phoneStringMessage); + }, + (pubnubObj, presence) => { }, + (pubnubObj, status) => { }); + + pubnub.AddListener(stringListenerSubscribeCallack); + pubnub.Subscribe() + .Channels(new string[] + { + "my_channel" // subscribe to channels + }) + .Execute(); + } + // snippet.end + + public static void CreateSubscriptionSetFromIndividual() + { + // snippet.create_subscription_set_from_individual + // Create a subscription from a channel entity + Subscription subscription1 = pubnub.Channel("channelName").Subscription(); + + // Create a subscription from a channel group entity + Subscription subscription2 = pubnub.ChannelGroup("channelGroupName").Subscription(); + + // create a subscription set from individual entities + SubscriptionSet subscriptionSet = subscription1.Add(subscription2); + + subscriptionSet.Subscribe(); + // snippet.end + } + + public static void WildcardSubscribe() + { + // snippet.wildcard_subscribe + pubnub.Subscribe() + .Channels(new string[] + { + // subscribe to channels information + "foo.*" + }) + .Execute(); + // snippet.end + } + + public static void UnsubscribeBasicUsage() + { + // snippet.unsubscribe_basic_usage + pubnub.Unsubscribe() + .Channels(new string[] + { + "my_channel" + }) + .Execute(); + // snippet.end + } + + public static void UnsubscribeMultipleChannels() + { + // snippet.unsubscribe_multiple_channels + pubnub.Unsubscribe() + .Channels(new string[] + { + "ch1", + "ch2", + "ch3" + }) + .ChannelGroups(new string[] + { + "cg1", + "cg2", + "cg3" + }) + .Execute(); + // snippet.end + } + + public static void UnsubscribeChannelGroup() + { + // snippet.unsubscribe_channel_group + pubnub.Unsubscribe() + .ChannelGroups(new string[] + { + "cg1", + "cg2", + "cg3" + }) + .Execute(); + // snippet.end + } + + public static void UnsubscribeAllBasicUsage() + { + // snippet.unsubscribe_all_basic_usage + pubnub.UnsubscribeAll(); + // snippet.end + } + + public static void AddListenerBasicUsage() + { + // snippet.add_listener_basic_usage + // Add event-specific listeners + // Add a listener to receive Message changes + Subscription subscription1 = pubnub.Channel("channelName").Subscription(); + + subscription1.onMessage += (Pubnub pn, PNMessageResult messageEvent) => + { + Console.WriteLine($"Message received {messageEvent.Message}"); + }; + + subscription1.Subscribe(); + + + // Add multiple listeners + SubscribeCallbackExt eventListener = new SubscribeCallbackExt( + delegate(Pubnub pn, PNMessageResult messageEvent) + { + Console.WriteLine($"received message {messageEvent.Message}"); + }, + delegate(Pubnub pn, PNPresenceEventResult e) { Console.WriteLine("Presence event"); }, + delegate(Pubnub pn, PNSignalResult e) { Console.WriteLine("Signal event"); }, + delegate(Pubnub pn, PNObjectEventResult e) { Console.WriteLine("Object event"); }, + delegate(Pubnub pn, PNMessageActionEventResult e) { Console.WriteLine("Message Action event"); }, + delegate(Pubnub pn, PNFileEventResult e) { Console.WriteLine("File event"); } + ); + + Channel firstChannel = pubnub.Channel("first"); + var subscription = firstChannel.Subscription(SubscriptionOptions.ReceivePresenceEvents); + subscription.AddListener(eventListener); + subscription.Subscribe(); + // snippet.end + } + + public static void AddListenersBasicUsage() + { + // snippet.add_listeners_basic_usage + Subscription subscription1 = pubnub.Channel("channelName").Subscription(); + + SubscriptionSet subscriptionSet = pubnub.SubscriptionSet( + new string[] { "channel1", "channel2" }, + new string[] { "channel_group_1", "channel_group_2" }, + SubscriptionOptions.ReceivePresenceEvents + ); + + SubscribeCallbackExt eventListener = new SubscribeCallbackExt( + delegate(Pubnub pn, PNMessageResult messageEvent) + { + Console.WriteLine($"received message {messageEvent.Message}"); + }, + delegate(Pubnub pn, PNPresenceEventResult e) { Console.WriteLine("Presence event"); }, + delegate(Pubnub pn, PNStatus s) { Console.WriteLine("Status event"); } + ); + + subscription1.AddListener(eventListener); + subscriptionSet.onSignal += (Pubnub pn, PNSignalResult signalEvent) => + { + Console.WriteLine($"Message received {signalEvent.Message}"); + }; + + subscription1.Subscribe(); + subscriptionSet.Subscribe(); + // snippet.end + } + + public static void AddListenerMethod1() + { + // snippet.add_listener_method1 + // Adding listener. + pubnub.AddListener(new SubscribeCallbackExt( + delegate(Pubnub pnObj, PNMessageResult pubMsg) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(pubMsg)); + var channelName = pubMsg.Channel; + var channelGroupName = pubMsg.Subscription; + var pubTT = pubMsg.Timetoken; + var msg = pubMsg.Message; + var publisher = pubMsg.Publisher; + }, + delegate(Pubnub pnObj, PNPresenceEventResult presenceEvnt) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(presenceEvnt)); + var action = presenceEvnt.Event; // Can be join, leave, state-change or timeout + var channelName = presenceEvnt.Channel; // The channel for which the message belongs + var occupancy = presenceEvnt.Occupancy; // No. of users connected with the channel + var state = presenceEvnt.State; // User State + var channelGroupName = + presenceEvnt.Subscription; // The channel group or wildcard subscription match (if exists) + var publishTime = presenceEvnt.Timestamp; // Publish timetoken + var timetoken = presenceEvnt.Timetoken; // Current timetoken + var uuid = presenceEvnt.Uuid; // UUIDs of users who are connected with the channel + }, + delegate(Pubnub pnObj, PNSignalResult signalMsg) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(signalMsg)); + var channelName = signalMsg.Channel; // The channel for which the signal belongs + var channelGroupName = + signalMsg.Subscription; // The channel group or wildcard subscription match (if exists) + var pubTT = signalMsg.Timetoken; // Publish timetoken + var msg = signalMsg.Message; // The Payload + var publisher = signalMsg.Publisher; //The Publisher + }, + delegate(Pubnub pnObj, PNObjectEventResult objectEventObj) + { + var channelName = objectEventObj.Channel; // Channel + var channelMetadata = objectEventObj.ChannelMetadata; //Channel Metadata + var uidMetadata = objectEventObj.UuidMetadata; // UUID metadata + var evnt = objectEventObj.Event; // Event + var type = objectEventObj.Type; // Event type + if (objectEventObj.Type == "uuid") + { + /* got uuid metadata related event. */ + } + else if (objectEventObj.Type == "channel") + { + /* got channel metadata related event. */ + } + else if (objectEventObj.Type == "membership") + { + /* got membership related event. */ + } + + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(objectEventObj)); + }, + delegate(Pubnub pnObj, PNMessageActionEventResult msgActionEvent) + { + //handle message action + var channelName = msgActionEvent.Channel; // The channel for which the message belongs + var msgEvent = msgActionEvent.Action; // message action added or removed + var msgActionType = msgActionEvent.Event; // message action type + var messageTimetoken = msgActionEvent.MessageTimetoken; // The timetoken of the original message + var actionTimetoken = msgActionEvent.ActionTimetoken; //The timetoken of the message action + }, + delegate(Pubnub pnObj, PNFileEventResult fileEvent) + { + //handle file message event + var channelName = fileEvent.Channel; + var chanelGroupName = fileEvent.Subscription; + var fieldId = (fileEvent.File != null) ? fileEvent.File.Id : null; + var fileName = (fileEvent.File != null) ? fileEvent.File.Name : null; + var fileUrl = (fileEvent.File != null) ? fileEvent.File.Url : null; + var fileMessage = fileEvent.Message; + var filePublisher = fileEvent.Publisher; + var filePubTT = fileEvent.Timetoken; + }, + delegate(Pubnub pnObj, PNStatus pnStatus) + { + Console.WriteLine("{0} {1} {2}", pnStatus.Operation, pnStatus.Category, pnStatus.StatusCode); + var affectedChannelGroups = + pnStatus.AffectedChannelGroups; // The channel groups affected in the operation, of type array. + var affectedChannels = + pnStatus.AffectedChannels; // The channels affected in the operation, of type array. + var category = pnStatus.Category; //Returns PNConnectedCategory + var operation = pnStatus.Operation; //Returns PNSubscribeOperation + } + )); + + //Add listener to receive Signal messages + SubscribeCallbackExt signalSubscribeCallback = new SubscribeCallbackExt( + delegate (Pubnub pubnubObj, PNSignalResult message) { + // Handle new signal message stored in message.Message + }, + delegate (Pubnub pubnubObj, PNStatus status) + { + // the status object returned is always related to subscribe but could contain + // information about subscribe, heartbeat, or errors + } + ); + pubnub.AddListener(signalSubscribeCallback); + + //Add listener to receive Events + SubscribeCallbackExt eventListener = new SubscribeCallbackExt( + delegate (Pubnub pnObj, PNObjectEventResult objectEvent) + { + string channelMetadataId = objectEvent.Channel; // The channel + string uuidMetadataId = objectEvent.UuidMetadata.Uuid; // The UUID + string objEvent = objectEvent.Event; // The event name that occurred + string eventType = objectEvent.Type; // The event type that occurred + PNUuidMetadataResult uuidMetadata = objectEvent.UuidMetadata; // UuidMetadata + PNChannelMetadataResult channelMetadata = objectEvent.ChannelMetadata; // ChannelMetadata + }, + delegate (Pubnub pnObj, PNStatus status) + { + + } + ); + pubnub.AddListener(eventListener); + // snippet.end + } + + // snippet.add_listener_method2 + public class DevSubscribeCallback : SubscribeCallback + { + public override void Message(Pubnub pubnub, PNMessageResult message) + { + // Handle new message stored in message.Message + } + + public override void Presence(Pubnub pubnub, PNPresenceEventResult presence) + { + // handle incoming presence data + } + + public override void Signal(Pubnub pubnub, PNSignalResult signal) + { + // Handle new signal message stored in signal.Message + } + + public override void Status(Pubnub pubnub, PNStatus status) + { + // the status object returned is always related to subscribe but could contain + // information about subscribe, heartbeat, or errors + // use the PNOperationType to switch on different options + switch (status.Operation) + { + // let's combine unsubscribe and subscribe handling for ease of use + case PNOperationType.PNSubscribeOperation: + case PNOperationType.PNUnsubscribeOperation: + // note: subscribe statuses never have traditional + // errors, they just have categories to represent the + // different issues or successes that occur as part of subscribe + switch (status.Category) + { + case PNStatusCategory.PNConnectedCategory: + // this is expected for a subscribe, this means there is no error or issue whatsoever + break; + case PNStatusCategory.PNReconnectedCategory: + // this usually occurs if subscribe temporarily fails but reconnects. This means + // there was an error but there is no longer any issue + break; + case PNStatusCategory.PNDisconnectedCategory: + // this is the expected category for an unsubscribe. This means there + // was no error in unsubscribing from everything + break; + case PNStatusCategory.PNUnexpectedDisconnectCategory: + // this is usually an issue with the internet connection, this is an error, handle appropriately + break; + case PNStatusCategory.PNAccessDeniedCategory: + // this means that Access Manager does allow this client to subscribe to this + // channel and channel group configuration. This is another explicit error + break; + default: + // More errors can be directly specified by creating explicit cases for other + // error categories of `PNStatusCategory` such as `PNTimeoutCategory` or `PNMalformedFilterExpressionCategory` or `PNDecryptionErrorCategory` + break; + } + + break; + case PNOperationType.PNHeartbeatOperation: + // heartbeat operations can in fact have errors, so it is important to check first for an error. + if (status.Error) + { + // There was an error with the heartbeat operation, handle here + } + else + { + // heartbeat operation was successful + } + + break; + default: + // Encountered unknown status type + break; + } + } + + public override void ObjectEvent(Pubnub pubnub, PNObjectEventResult objectEvent) + { + // handle incoming user, space and membership event data + } + + public override void MessageAction(Pubnub pubnub, PNMessageActionEventResult messageAction) + { + // handle incoming message action events + } + + public override void File(Pubnub pubnub, PNFileEventResult fileEvent) + { + // handle incoming file messages + } + } + + public static void AddListenerMethod2() + { + // Usage of the above listener + DevSubscribeCallback regularListener = new DevSubscribeCallback(); + pubnub.AddListener(regularListener); + } + // snippet.end + + public static void RemoveListener() + { + // snippet.remove_listener + SubscribeCallbackExt listenerSubscribeCallback = new SubscribeCallbackExt( + (pubnubObj, message) => { }, + (pubnubObj, presence) => { }, + (pubnubObj, status) => { }); + + pubnub.AddListener(listenerSubscribeCallback); + + // some time later + pubnub.RemoveListener(listenerSubscribeCallback); + // snippet.end + } + + public static void AddConnectionStatusListener() + { + // snippet.add_connection_status_listener + SubscribeCallbackExt eventListener = new SubscribeCallbackExt( + delegate(Pubnub pn, PNStatus e) { Console.WriteLine("Status event"); } + ); + + pubnub.AddListener(eventListener); + // snippet.end + } + + public static void UnsubscribeNewBasicUsage() + { + // snippet.unsubscribe_new_basic_usage + Subscription subscription1 = pubnub.Channel("channelName").Subscription(); + + SubscriptionSet subscriptionSet = pubnub.SubscriptionSet( + new string[] { "channel1", "channel2" }, + new string[] { "channel_group_1", "channel_group_2" }, + SubscriptionOptions.ReceivePresenceEvents + ); + + subscription1.Subscribe(); + subscriptionSet.Subscribe(); + + subscription1.Unsubscribe(); + subscriptionSet.Unsubscribe(); + // snippet.end + } + + public static void UnsubscribeAllNewBasicUsage() + { + // snippet.unsubscribe_all_new_basic_usage + Subscription subscription1 = pubnub.Channel("channelName").Subscription(); + + SubscriptionSet subscriptionSet = pubnub.SubscriptionSet( + new string[] { "channel1", "channel2" }, + new string[] { "channel_group_1", "channel_group_2" }, + SubscriptionOptions.ReceivePresenceEvents + ); + + subscription1.Subscribe(); + subscriptionSet.Subscribe(); + + pubnub.UnsubscribeAll(); + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs new file mode 100644 index 00000000..2f8e1143 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs @@ -0,0 +1,170 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class PushSample +{ + private static Pubnub pubnub; + + static void Init() + { + // snippet.pubnub_init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + // snippet.add_device_to_channel_basic_usage + public class PushNotificationCallback : PNCallback + { + public override void OnResponse(PNPushAddChannelResult result, PNStatus status) + { + if (!status.Error && result != null) + { + Console.WriteLine("Push notifications added to channels successfully."); + } + else + { + Console.WriteLine("Failed to add push notifications: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + } + } + } + + public static void AddDeviceToChannelBasicUsage() + { + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + try + { + // For FCM + pubnub.AddPushNotificationsOnChannels() + .PushType(PNPushType.FCM) + .Channels(new string[] { "ch1", "ch2", "ch3" }) + .DeviceId("googleDevice") + .Execute(new PushNotificationCallback()); + } + catch (Exception ex) + { + Console.WriteLine($"FCM operation failed due to error: {ex.Message}"); + } + + try + { + // For APNS2 + pubnub.AddPushNotificationsOnChannels() + .PushType(PNPushType.APNS2) + .Channels(new string[] { "ch1", "ch2", "ch3" }) + .DeviceId("appleDevice") + .Topic("myapptopic") + .Environment(PushEnvironment.Development) + .Execute(new PushNotificationCallback()); + } + catch (Exception ex) + { + Console.WriteLine($"APNS2 operation failed due to error: {ex.Message}"); + } + } + // snippet.end + + public static void ListChannelsForDeviceBasicUsage() + { + // snippet.list_channels_for_device_basic_usage + // for FCM/GCM + pubnub.AuditPushChannelProvisions() + .DeviceId("googleDevice") + .PushType(PNPushType.FCM) + .Execute(new PNPushListProvisionsResultExt((r, s) => + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + })); + + // for APNS2 + pubnub.AuditPushChannelProvisions() + .DeviceId("appleDevice") + .PushType(PNPushType.APNS2) + .Topic("myapptopic") + .Environment(PushEnvironment.Development) + .Execute(new PNPushListProvisionsResultExt((r, s) => + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + })); + // snippet.end + } + + public static void RemoveDeviceFromChannelBasicUsage() + { + // snippet.remove_device_from_channel_basic_usage + // for FCM/GCM + pubnub.RemovePushNotificationsFromChannels() + .DeviceId("googleDevice") + .Channels(new string[] { + "ch1", + "ch2", + "ch3" + }) + .PushType(PNPushType.FCM) + .Execute(new PNPushRemoveChannelResultExt((r, s) => + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + })); + + // for APNS2 + pubnub.RemovePushNotificationsFromChannels() + .DeviceId("appleDevice") + .Channels(new string[] { + "ch1", + "ch2", + "ch3" + }) + .PushType(PNPushType.APNS2) + .Topic("myapptopic") + .Environment(PushEnvironment.Development) + .Execute(new PNPushRemoveChannelResultExt((r, s) => + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + })); + // snippet.end + } + + public static void RemoveAllPushNotificationsBasicUsage() + { + // snippet.remove_all_push_notifications_basic_usage + // for FCM/GCM + pubnub.RemoveAllPushNotificationsFromDeviceWithPushToken() + .DeviceId("googleDevice") + .PushType(PNPushType.FCM) + .Execute(new PNPushRemoveAllChannelsResultExt((r, s) => { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + })); + + // for APNS2 + pubnub.RemoveAllPushNotificationsFromDeviceWithPushToken() + .DeviceId("appleDevice") + .PushType(PNPushType.APNS2) + .Topic("myapptopic") + .Environment(PushEnvironment.Development) + .Execute(new PNPushRemoveAllChannelsResultExt((r, s) => { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + })); + // snippet.end + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs new file mode 100644 index 00000000..4adbe8cd --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs @@ -0,0 +1,340 @@ +// snippet.using +using PubnubApi; + +// snippet.end + +public class StorageAndPlaybackSample +{ + private static Pubnub pubnub; + + static void Init() + { + // snippet.pubnub_init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = new Pubnub(pnConfiguration); + + // snippet.end + } + + public static async Task FetchHistoryBasicUsage() + { + // snippet.fetch_history_basic_usage + try + { + // Fetch historical messages + PNResult fetchHistoryResponse = await pubnub.FetchHistory() + .Channels(new string[] { "my_channel" }) + .IncludeMeta(true) + .IncludeCustomMessageType(true) + .MaximumPerChannel(25) + .ExecuteAsync(); + + PNFetchHistoryResult fetchHistoryResult = fetchHistoryResponse.Result; + PNStatus status = fetchHistoryResponse.Status; + + if (!status.Error && fetchHistoryResult != null) + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fetchHistoryResult)); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + } + } + catch (Exception ex) + { + Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + } + // snippet.end + } + + public static void FetchHistorySynchronous() + { + // snippet.fetch_history_synchronous + pubnub.FetchHistory() + .Channels(new string[] { "my_channel" }) + .IncludeMeta(true) + .MaximumPerChannel(25) + .Execute(new PNFetchHistoryResultExt((result, status) => + { + + })); + // snippet.end + } + + public static async Task DeleteMessagesBasicUsage() + { + // snippet.delete_messages_basic_usage + PNResult delMsgResponse = await pubnub.DeleteMessages() + .Channel("history_channel") + .Start(15088506076921021) + .End(15088532035597390) + .ExecuteAsync(); + + PNDeleteMessageResult delMsgResult = delMsgResponse.Result; + PNStatus status = delMsgResponse.Status; + + if (status != null && status.Error) + { + //Check for any error + Console.WriteLine(status.ErrorData.Information); + } + else if (delMsgResult != null) + { + //Expect empty object + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(delMsgResult)); + } + // snippet.end + } + + public static void DeleteMessagesSynchronous() + { + // snippet.delete_messages_synchronous + pubnub.DeleteMessages() + .Channel("history_channel") + .Start(15088506076921021) + .End(15088532035597390) + .Execute(new PNDeleteMessageResultExt( + (result, status) => { + if (status != null && status.Error) { + //Check for any error + Console.WriteLine(status.ErrorData.Information); + } + else if (result != null) { + //Expect empty object + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(result)); + } + } + )); + // snippet.end + } + + public static async Task DeleteSpecificMessage() + { + // snippet.delete_specific_message + PNResult delMsgResponse = await pubnub.DeleteMessages() + .Channel("history_channel") + .Start(15526611838554309) + .End(15526611838554310) + .ExecuteAsync(); + + PNDeleteMessageResult delMsgResult = delMsgResponse.Result; + PNStatus status = delMsgResponse.Status; + + if (status != null && status.Error) + { + //Check for any error + Console.WriteLine(status.ErrorData.Information); + } + else if (delMsgResult != null) + { + //Expect empty object + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(delMsgResult)); + } + // snippet.end + } + + public static async Task MessageCountsBasicUsage() + { + // snippet.message_counts_basic_usage + PNResult msgCountResponse = await pubnub.MessageCounts() + .Channels(new string[] { "message_count_channel" }) + .ChannelsTimetoken(new long[] { 15088506076921021 }) + .ExecuteAsync(); + + PNMessageCountResult msgCountResult = msgCountResponse.Result; + PNStatus status = msgCountResponse.Status; + + if (status != null && status.Error) + { + //Check for any error + Console.WriteLine(status.ErrorData.Information); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(msgCountResult)); + } + // snippet.end + } + + public static void MessageCountsSynchronous() + { + // snippet.message_counts_synchronous + pubnub.MessageCounts() + .Channels(new string[] { "message_count_channel" }) + .ChannelsTimetoken(new long[] { 15088506076921021 }) + .Execute(new PNMessageCountResultExt( + (result, status) => { + if (status != null && status.Error) + { + //Check for any error + Console.WriteLine(status.ErrorData.Information); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(result)); + } + })); + // snippet.end + } + + public static async Task MessageCountsMultipleChannels() + { + // snippet.message_counts_multiple_channels + PNResult msgCountResponse = await pubnub.MessageCounts() + .Channels(new string[] { "message_count_channel", "message_count_channel2" }) + .ChannelsTimetoken(new long[] { 15088506076921021, 15088506076921131 }) + .ExecuteAsync(); + + PNMessageCountResult msgCountResult = msgCountResponse.Result; + PNStatus status = msgCountResponse.Status; + + if (status != null && status.Error) + { + //Check for any error + Console.WriteLine(status.ErrorData.Information); + } + else + { + Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(msgCountResult)); + } + // snippet.end + } + + public static async Task HistoryBasicUsage() + { + // snippet.history_basic_usage + PNResult historyResponse = await pubnub.History() + .Channel("history_channel") // where to fetch history from + .Count(100) // how many items to fetch + .ExecuteAsync(); + // snippet.end + } + + public static void HistorySynchronous() + { + // snippet.history_synchronous + pubnub.History() + .Channel("history_channel") // where to fetch history from + .Count(100) // how many items to fetch + .Execute(new PNHistoryResultExt( + (result, status) => { + } + )); + // snippet.end + } + + public static async Task HistoryReverse() + { + // snippet.history_reverse + PNResult historyResponse = await pubnub.History() + .Channel("my_channel") // where to fetch history from + .Count(3) // how many items to fetch + .Reverse(true) // should go in reverse? + .ExecuteAsync(); + // snippet.end + } + + public static async Task HistoryStartTimetoken() + { + // snippet.history_start_timetoken + PNResult historyResponse = await pubnub.History() + .Channel("my_channel") // where to fetch history from + .Start(13847168620721752L) // first timestamp + .Reverse(true) // should go in reverse? + .ExecuteAsync(); + // snippet.end + } + + public static async Task HistoryStartEndTimetoken() + { + // snippet.history_start_end_timetoken + PNResult historyResponse = await pubnub.History() + .Channel("my_channel") // where to fetch history from + .Count(100) // how many items to fetch + .Start(-1) // first timestamp + .End(13847168819178600L) // last timestamp + .Reverse(true) // should go in reverse? + .ExecuteAsync(); + // snippet.end + } + + public static async Task HistoryIncludeTimetoken() + { + // snippet.history_include_timetoken + PNResult historyResponse = await pubnub.History() + .Channel("history_channel") // where to fetch history from + .Count(100) // how many items to fetch + .IncludeTimetoken(true) // include timetoken with each entry + .ExecuteAsync(); + // snippet.end + } + + // snippet.history_paging_example + public class PubnubRecursiveHistoryFetcher { + private static Pubnub pubnub; + + public abstract class CallbackSkeleton { + public abstract void HandleResponse(PNHistoryResult result); + } + + public PubnubRecursiveHistoryFetcher() { + // NOTICE: for demo/demo pub/sub keys Message Persistence is disabled, + // so use your pub/sub keys instead + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); + pnConfiguration.SubscribeKey = "demo"; + pubnub = new Pubnub(pnConfiguration); + } + + static public void Main() { + PubnubRecursiveHistoryFetcher fetcher = new PubnubRecursiveHistoryFetcher(); + GetAllMessages(new DemoCallbackSkeleton()); + } + + public static void GetAllMessages(CallbackSkeleton callback) { + GetAllMessages(-1L, callback); + } + + public static void GetAllMessages(long startTimestamp, CallbackSkeleton callback) { + CountdownEvent latch = new CountdownEvent(1); + + pubnub.History() + .Channel("history_channel") // where to fetch history from + .Count(100) // how many items to fetch + .Start(startTimestamp) // first timestamp + .Execute(new DemoHistoryResult(callback)); + } + + public class DemoHistoryResult : PNCallback { + CallbackSkeleton internalCallback; + public DemoHistoryResult(CallbackSkeleton callback) { + this.internalCallback = callback; + } + public override void OnResponse(PNHistoryResult result, PNStatus status) { + if (!status.Error && result != null && result.Messages != null && result.Messages.Count > 0) { + Console.WriteLine(result.Messages.Count); + Console.WriteLine("start:" + result.StartTimeToken.ToString()); + Console.WriteLine("end:" + result.EndTimeToken.ToString()); + + internalCallback.HandleResponse(result); + GetAllMessages(result.EndTimeToken, this.internalCallback); + } + } + }; + + public class DemoCallbackSkeleton : CallbackSkeleton { + public override void HandleResponse(PNHistoryResult result) { + //Handle the result + } + } + } + // snippet.end +} \ No newline at end of file From 11b43b99d5188c031ba547d4056bb1b16512bba0 Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Mon, 30 Jun 2025 15:51:51 +0200 Subject: [PATCH 02/10] adapt samples for Unity, add PubnubUnityUtils.NewUnityPubnub() utility method --- .../PubNub/Runtime/Util/PNManagerBehaviour.cs | 12 +- .../PubNub/Runtime/Util/PubnubUnityUtils.cs | 34 +++ .../Runtime/Util/PubnubUnityUtils.cs.meta | 3 + .../Assets/PubNub/Snippets/AccessManager.meta | 8 + .../AccessManager/AccessManagerSample.cs | 107 ++++----- .../AccessManager/AccessManagerSample.cs.meta | 11 + .../AccessManager/AccessManagerV2Sample.cs | 29 ++- .../AccessManagerV2Sample.cs.meta | 11 + .../AccessManager/GrantTokenExample.cs | 63 +++++ .../AccessManager/GrantTokenExample.cs.meta | 3 + .../Assets/PubNub/Snippets/ChannelGroup.meta | 8 + .../ChannelGroup/AddChannelsToGroupExample.cs | 45 ++++ .../AddChannelsToGroupExample.cs.meta | 3 + .../ChannelGroup/ChannelGroupsSample.cs | 44 +--- .../ChannelGroup/ChannelGroupsSample.cs.meta | 11 + .../Assets/PubNub/Snippets/Configuration.meta | 8 + .../Configuration/ConfigurationSample.cs | 73 +++--- .../Configuration/ConfigurationSample.cs.meta | 11 + .../PubnubConfigurationExample.cs | 51 ++++ .../PubnubConfigurationExample.cs.meta | 3 + .../Assets/PubNub/Snippets/Entities.meta | 8 + .../Snippets/Entities/EntitiesSample.cs | 102 ++++---- .../Snippets/Entities/EntitiesSample.cs.meta | 11 + .../Entities/GetAllUuidMetadataExample.cs | 51 ++++ .../GetAllUuidMetadataExample.cs.meta | 3 + PubNubUnity/Assets/PubNub/Snippets/Files.meta | 8 + .../PubNub/Snippets/Files/FilesSample.cs | 61 ++--- .../PubNub/Snippets/Files/FilesSample.cs.meta | 11 + .../PubNub/Snippets/Files/SendFileExample.cs | 55 +++++ .../Snippets/Files/SendFileExample.cs.meta | 3 + .../Assets/PubNub/Snippets/Logging.meta | 8 + .../PubNub/Snippets/Logging/LoggingSample.cs | 37 +-- .../Snippets/Logging/LoggingSample.cs.meta | 11 + .../PubNub/Snippets/MessageActions.meta | 8 + .../MessageActions/AddMessageActionExample.cs | 46 ++++ .../AddMessageActionExample.cs.meta | 3 + .../MessageActions/MessageActionsSample.cs | 42 +--- .../MessageActionsSample.cs.meta | 11 + PubNubUnity/Assets/PubNub/Snippets/Misc.meta | 8 + .../Assets/PubNub/Snippets/Misc/MiscSample.cs | 26 +- .../PubNub/Snippets/Misc/MiscSample.cs.meta | 11 + .../Snippets/Misc/PubnubCleanupExample.cs | 13 + .../Misc/PubnubCleanupExample.cs.meta | 3 + .../Assets/PubNub/Snippets/Presence.meta | 8 + .../Snippets/Presence/HereNowExample.cs | 65 +++++ .../Snippets/Presence/HereNowExample.cs.meta | 3 + .../Snippets/Presence/PresenceSample.cs | 69 ++---- .../Snippets/Presence/PresenceSample.cs.meta | 11 + .../Assets/PubNub/Snippets/Publish.meta | 8 + .../Publish/PublishSubscribeSample.cs | 227 +++++++++--------- .../Publish/PublishSubscribeSample.cs.meta | 11 + .../Publish/PubnubBasicUsageExample.cs | 64 +++++ .../Publish/PubnubBasicUsageExample.cs.meta | 3 + PubNubUnity/Assets/PubNub/Snippets/Push.meta | 8 + .../Push/AddPushNotificationsExample.cs | 64 +++++ .../Push/AddPushNotificationsExample.cs.meta | 3 + .../Assets/PubNub/Snippets/Push/PushSample.cs | 87 ++----- .../PubNub/Snippets/Push/PushSample.cs.meta | 11 + .../Assets/PubNub/Snippets/Storage.meta | 8 + .../Storage/FetchLastMessageExample.cs | 52 ++++ .../Storage/FetchLastMessageExample.cs.meta | 3 + .../Storage/StorageAndPlaybackSample.cs | 80 +++--- .../Storage/StorageAndPlaybackSample.cs.meta | 11 + 63 files changed, 1280 insertions(+), 594 deletions(-) create mode 100644 PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs create mode 100644 PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/AccessManager.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/ChannelGroup.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Configuration.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Entities.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Files.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Logging.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/MessageActions.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Misc.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Presence.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Publish.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Push.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Storage.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs.meta create mode 100644 PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Runtime/Util/PNManagerBehaviour.cs b/PubNubUnity/Assets/PubNub/Runtime/Util/PNManagerBehaviour.cs index de42dc20..980c5d5e 100644 --- a/PubNubUnity/Assets/PubNub/Runtime/Util/PNManagerBehaviour.cs +++ b/PubNubUnity/Assets/PubNub/Runtime/Util/PNManagerBehaviour.cs @@ -31,18 +31,10 @@ public Pubnub Initialize(string userId) { return pubnub; } - pnConfiguration.UserId = userId; - var pnConfig = ((PNConfiguration)pnConfiguration); - pubnub = pnConfiguration.EnableWebGLBuildMode - ? new Pubnub(pnConfig, httpTransportService: new UnityWebGLHttpClientService(), - ipnsdkSource: new UnityPNSDKSource()) - : new Pubnub(pnConfig, ipnsdkSource: new UnityPNSDKSource()); - if (pnConfiguration.LogToUnityConsole) { - pubnub.SetLogger(new UnityPubNubLogger(pubnub.InstanceId)); - } - pubnub.SetJsonPluggableLibrary(new NewtonsoftJsonUnity(pnConfig)); + pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration, userId); pubnub.AddListener(listener); return pubnub; + } protected virtual void OnDestroy() { diff --git a/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs b/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs new file mode 100644 index 00000000..06390c7c --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs @@ -0,0 +1,34 @@ +namespace PubnubApi.Unity { + public static class PubnubUnityUtils { + /// + /// Creates a new Pubnub instance with Unity specific settings (like WebGL setup, logging, and JSON library) + /// + /// Pubnub configuration object + /// Flag for enabling WebGL mode - sets httpTransportService to UnityWebGLHttpClientService + /// Flag to set Unity specific logger (UnityPubNubLogger) + /// + public static Pubnub NewUnityPubnub(PNConfiguration configuration, bool webGLBuildMode = false, bool unityLogging = false) { + var pubnub = webGLBuildMode + ? new Pubnub(configuration, httpTransportService: new UnityWebGLHttpClientService(), + ipnsdkSource: new UnityPNSDKSource()) + : new Pubnub(configuration, ipnsdkSource: new UnityPNSDKSource()); + if (unityLogging) { + pubnub.SetLogger(new UnityPubNubLogger(pubnub.InstanceId)); + } + pubnub.SetJsonPluggableLibrary(new NewtonsoftJsonUnity(configuration)); + return pubnub; + } + + /// + /// Creates a new Pubnub instance with Unity specific settings (like WebGL setup, logging, and JSON library) + /// + /// Pubnub configuration Scriptable Object asset + /// Client user ID + /// + public static Pubnub NewUnityPubnub(PNConfigAsset configurationAsset, string userId) { + configurationAsset.UserId = userId; + var pnConfig = ((PNConfiguration)configurationAsset); + return NewUnityPubnub(pnConfig, configurationAsset.EnableWebGLBuildMode, configurationAsset.LogToUnityConsole); + } + } +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs.meta b/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs.meta new file mode 100644 index 00000000..6280bb17 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d793402d3dca47048dc54bece922054c +timeCreated: 1750938569 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager.meta b/PubNubUnity/Assets/PubNub/Snippets/AccessManager.meta new file mode 100644 index 00000000..959723ea --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ea0a53e383d01847a46bb75f0bfb127 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs index 56bcf4ab..d9775c4e 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs @@ -1,7 +1,13 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +using UnityEngine; class AccessManagerSample { @@ -17,46 +23,15 @@ static void PubnubInit() PublishKey = "demo" }; //Create a new PubNub instance - Pubnub pubnub = new Pubnub(pnConfiguration); - - // snippet.end - } - - static async Task BasicUsage() - { - // snippet.basic_usage - try - { - //Perform token granting operation - PNResult grantTokenResponse = await pubnub.GrantToken() - .TTL(15) - .AuthorizedUuid("my-authorized-uuid") - .Resources(new PNTokenResources - { - Channels = new Dictionary - { - { "my-channel", new PNTokenAuthValues { Read = true, Write = true } } - } - }) - .ExecuteAsync(); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); - //Parse operation response - PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; - PNStatus grantTokenStatus = grantTokenResponse.Status; + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - if (!grantTokenStatus.Error && grantTokenResult != null) - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); - } - else - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); - } - } - catch (Exception ex) - { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); - } // snippet.end } @@ -73,9 +48,9 @@ static async Task GrantTokenComplex() { "channel-b", new PNTokenAuthValues() { Read = true, Write = true } }, { "channel-c", new PNTokenAuthValues() { Read = true, Write = true } }, { "channel-d", new PNTokenAuthValues() { Read = true, Write = true } }}, - ChannelGroups = new Dictionary() { + ChannelGroups = new Dictionary() { { "channel-group-b", new PNTokenAuthValues() { Read = true } } }, - Uuids = new Dictionary() { + Uuids = new Dictionary() { { "uuid-c", new PNTokenAuthValues() { Get = true } }, { "uuid-d", new PNTokenAuthValues() { Get = true, Update = true } }} }) @@ -84,15 +59,15 @@ static async Task GrantTokenComplex() PNStatus grantTokenStatus = grantTokenResponse.Status; if (!grantTokenStatus.Error && grantTokenResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); } // snippet.end } - + static async Task GrantTokenWithRegex() { // snippet.grant_token_regex @@ -109,15 +84,15 @@ static async Task GrantTokenWithRegex() PNStatus grantTokenStatus = grantTokenResponse.Status; if (!grantTokenStatus.Error && grantTokenResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); } // snippet.end } - + static async Task GrantTokenComplexWithRegex() { // snippet.grant_token_complex_with_regex @@ -147,41 +122,41 @@ static async Task GrantTokenComplexWithRegex() PNStatus grantTokenStatus = grantTokenResponse.Status; if (!grantTokenStatus.Error && grantTokenResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); } // snippet.end } - + static async Task GrantTokenOldBasicUsage() { // snippet.basic_usage_old PNResult grantTokenResponse = await pubnub.GrantToken() .TTL(15) .AuthorizedUserId("my-authorized-userId") - .Resources(new PNTokenResources() + .Resources(new PNTokenResources() { Spaces = new Dictionary() { { "my-space", new PNTokenAuthValues() { Read = true } } } // False to disallow - }) + }) .ExecuteAsync(); PNAccessManagerTokenResult grantTokenResult = grantTokenResponse.Result; PNStatus grantTokenStatus = grantTokenResponse.Status; //PNAccessManagerTokenResult is a parsed and abstracted response from the server if (!grantTokenStatus.Error && grantTokenResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); } // snippet.end } - + static async Task GrantTokenOldComplex() { // snippet.grant_token_complex_old @@ -195,7 +170,7 @@ static async Task GrantTokenOldComplex() { "space-b", new PNTokenAuthValues() { Read = true, Write = true } }, { "space-c", new PNTokenAuthValues() { Read = true, Write = true } }, { "space-d", new PNTokenAuthValues() { Read = true, Write = true } }}, - Users = new Dictionary() { + Users = new Dictionary() { { "user-c", new PNTokenAuthValues() { Get = true } }, { "user-d", new PNTokenAuthValues() { Get = true, Update = true } }} }) @@ -204,15 +179,15 @@ static async Task GrantTokenOldComplex() PNStatus grantTokenStatus = grantTokenResponse.Status; if (!grantTokenStatus.Error && grantTokenResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); } // snippet.end } - + static async Task GrantTokenOldWithRegex() { // snippet.grant_token_old_regex @@ -229,15 +204,15 @@ static async Task GrantTokenOldWithRegex() PNStatus grantTokenStatus = grantTokenResponse.Status; if (!grantTokenStatus.Error && grantTokenResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); } // snippet.end } - + static async Task GrantTokenOldComplexWithRegex() { // snippet.grant_token_complex_old_with_regex @@ -265,15 +240,15 @@ static async Task GrantTokenOldComplexWithRegex() PNStatus grantTokenStatus = grantTokenResponse.Status; if (!grantTokenStatus.Error && grantTokenResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(grantTokenStatus)); } // snippet.end } - + static async Task RevokeTokenBasicUsage() { // snippet.revoke_token @@ -285,11 +260,11 @@ static async Task RevokeTokenBasicUsage() PNStatus revokeTokenStatus = revokeTokenResponse.Status; if (!revokeTokenStatus.Error && revokeTokenResult != null) { - Console.WriteLine("Revoke token success"); + Debug.Log("Revoke token success"); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(revokeTokenStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(revokeTokenStatus)); } // snippet.end } diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs.meta new file mode 100644 index 00000000..304af706 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 528743e1d6a2ade4ab32385c8f0e7dbb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs index 31857986..4a2bd816 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs @@ -1,7 +1,9 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System.Threading.Tasks; public class AccessManagerV2Sample { @@ -17,8 +19,15 @@ static void PubnubInit() PublishKey = "demo" }; //Create a new PubNub instance - Pubnub pubnub = new Pubnub(pnConfiguration); - + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ + // snippet.end } @@ -56,7 +65,7 @@ static async Task Grant() //PNAccessManagerGrantResult is a parsed and abstracted response from server // snippet.end } - + static void GrantCallback() { // snippet.grant_callback @@ -91,7 +100,7 @@ static void GrantCallback() )); // snippet.end } - + static async Task GrantTTL() { // snippet.grant_ttl @@ -113,7 +122,7 @@ static async Task GrantTTL() //PNAccessManagerGrantResult is a parsed and abstracted response from server // snippet.end } - + static async Task GrantPresence() { // snippet.grant_presence @@ -131,7 +140,7 @@ static async Task GrantPresence() //PNAccessManagerGrantResult is a parsed and abstracted response from server // snippet.end } - + static async Task GrantChannelGroup() { // snippet.grant_group @@ -158,7 +167,7 @@ static async Task GrantChannelGroup() //PNAccessManagerGrantResult is a parsed and abstracted response from server // snippet.end } - + static async Task GrantWithAuthKey() { // snippet.grant_auth_key @@ -180,7 +189,7 @@ static async Task GrantWithAuthKey() //PNAccessManagerGrantResult is a parsed and abstracted response from server // snippet.end } - + static async Task GrantAppLevel() { // snippet.grant_app_level @@ -195,7 +204,7 @@ static async Task GrantAppLevel() //PNAccessManagerGrantResult is a parsed and abstracted response from server // snippet.end } - + static async Task GrantChannelLevel() { // snippet.grant_channel_level @@ -213,7 +222,7 @@ static async Task GrantChannelLevel() //PNAccessManagerGrantResult is a parsed and abstracted response from server // snippet.end } - + static async Task GrantUserLevel() { // snippet.grant_user_level diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs.meta new file mode 100644 index 00000000..858907a6 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b770e03dcd090c0468b165d82a53f790 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs new file mode 100644 index 00000000..47677915 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs @@ -0,0 +1,63 @@ +// snippet.grant_token_example +using System.Collections.Generic; +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +public class GrantTokenExample : MonoBehaviour { + //Reference to a pubnub manager previously setup in Unity Editor + //For more details see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + //NOTE: For Access Management to work the keyset must have PAM enabled + [SerializeField] private PNManagerBehaviour pubnubManager; + + //An editor-serialized string with the test channel ID + [SerializeField] private string testChannelId = "test_channel_id"; + + private async void Start() { + //Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + //Creating a full access set for the sake of demonstration + var fullAccess = new PNTokenAuthValues() { + Read = true, + Write = true, + Create = true, + Get = true, + Delete = true, + Join = true, + Update = true, + Manage = true + }; + + //Asynchronously executing a full-access grant operation for the test channel for user ID specified in the config + //The $"{testChannelId}{Constants.Pnpres}" addition ensured full access to the channel with PubNub Presence operations + var grantResult = await pubnub.GrantToken().TTL(30).AuthorizedUuid(pubnub.PNConfig.UserId).Resources( + new PNTokenResources() { + Channels = new Dictionary() { + { + testChannelId, fullAccess + }, + { + $"{testChannelId}{Constants.Pnpres}", fullAccess + } + } + }) + .ExecuteAsync(); + + //Doing simple error handling in case something went wrong during the grant operation + if (grantResult.Status.Error) { + Debug.LogError($"Error in grant operation: {grantResult.Status.ErrorData.Information}"); + } + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs.meta new file mode 100644 index 00000000..86282e7f --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0946c8d7955244c7b23c905456d7e83c +timeCreated: 1751289480 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup.meta b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup.meta new file mode 100644 index 00000000..fecf9015 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ec2565c21e71cd84dbab4e6d343d515b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs new file mode 100644 index 00000000..a68914f3 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs @@ -0,0 +1,45 @@ +// snippet.add_to_group +using PubnubApi.Unity; +using UnityEngine; + +public class AddChannelsToGroupExample : MonoBehaviour { + // Reference to a pubnub manager previously setup in Unity Editor + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + // An editor-serialized string for the channel group ID + [SerializeField] private string channelGroupId = "cg1"; + + // An editor-serialized array for the channels to add + [SerializeField] private string[] channelsToAdd = { "ch1", "ch2", "ch3" }; + + private async void Start() { + // Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + // Adding channels to the specified channel group + var cgAddChResponse = await pubnub.AddChannelsToChannelGroup() + .ChannelGroup(channelGroupId) + .Channels(channelsToAdd) + .ExecuteAsync(); + + // Checking the status of the operation + var status = cgAddChResponse.Status; + if (status.Error) { + Debug.LogError($"Error adding channels to group: {status.ErrorData.Information}"); + } else { + Debug.Log($"Successfully added channels to group {channelGroupId}"); + } + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta new file mode 100644 index 00000000..450d550f --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 248969c7c72a4171b61cc08091457a8f +timeCreated: 1751289375 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs index e5126967..e3f90fdb 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs @@ -1,7 +1,9 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System.Threading.Tasks; public class ChannelGroupsSample { @@ -17,40 +19,18 @@ static void PubnubInit() PublishKey = "demo" }; //Create a new PubNub instance - Pubnub pubnub = new Pubnub(pnConfiguration); - - // snippet.end - } - - static async Task AddToGroup() - { - // snippet.add_to_group - try - { - PNResult cgAddChResponse = await pubnub.AddChannelsToChannelGroup() - .ChannelGroup("myChannelGroup") - .Channels(new string[] { "channel1", "channel2", "channel3" }) - .ExecuteAsync(); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); - PNChannelGroupsAddChannelResult cgAddChResult = cgAddChResponse.Result; - PNStatus cgAddChStatus = cgAddChResponse.Status; + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - if (!cgAddChStatus.Error && cgAddChResult != null) - { - Console.WriteLine("Channels successfully added to the channel group."); - } - else - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(cgAddChStatus)); - } - } - catch (Exception ex) - { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); - } // snippet.end } - + static async Task ListFromGroup() { // snippet.list @@ -59,7 +39,7 @@ static async Task ListFromGroup() .ExecuteAsync(); // snippet.end } - + static async Task RemoveFromGroup() { // snippet.remove @@ -71,7 +51,7 @@ static async Task RemoveFromGroup() .ExecuteAsync(); // snippet.end } - + static async Task DeleteGroup() { // snippet.delete diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta new file mode 100644 index 00000000..29f96239 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f10a604345cc8c4f96f237517fb8d34 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration.meta b/PubNubUnity/Assets/PubNub/Snippets/Configuration.meta new file mode 100644 index 00000000..2e346d17 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Configuration.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f4bc54b604c637b4dab5d05fb45b6c5d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs index 0143131c..116ba97e 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs @@ -1,5 +1,6 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end @@ -8,6 +9,8 @@ using PubnubApi.Security.Crypto.Cryptors; // snippet.end +using System.Collections.Generic; + public class ConfigurationSample { private static Pubnub pubnub; @@ -17,7 +20,7 @@ static void PubnubInit() // snippet.init_config PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); // snippet.end - + // snippet.crypto // encrypts using 256-bit AES-CBC cipher (recommended) // decrypts data encrypted with the legacy and the 256-bit AES-CBC ciphers @@ -29,17 +32,37 @@ static void PubnubInit() pnConfiguration.CryptoModule = new CryptoModule(new LegacyCryptor("enigma"), new List { new AesCbcCryptor("enigma") }); // snippet.end - + // snippet.new_pubnub - Pubnub pubnub = new Pubnub(pnConfiguration); - + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ + // snippet.end } + static void VariousInitializations() { + PNConfiguration pnConfig = null; + { + // snippet.web_gl_init_one + var pubnub = new Pubnub(pnConfig, httpTransportService: new UnityWebGLHttpClientService(), + ipnsdkSource: new UnityPNSDKSource()); + // snippet.end + } + { + // snippet.web_gl_init_two + var pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfig, webGLBuildMode: true); + // snippet.end + } + } + static void BasicUsage() { - // snippet.basic_usage - // Create a configuration instance for PubNub PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) { SubscribeKey = "demo", // Required @@ -55,22 +78,10 @@ static void BasicUsage() PresenceTimeout = 120, // Presence timeout }; - // Configure presence timeout with custom interval - pnConfiguration.SetPresenceTimeoutWithCustomInterval(120, 59); - - // Encryption configuration (Optional) - pnConfiguration.CryptoModule = new CryptoModule( - new AesCbcCryptor("enigma"), - new List { new LegacyCryptor("enigma") }); - - // Initialize a new PubNub instance with the created confiiguration - Pubnub pubnub = new Pubnub(pnConfiguration); - // snippet.end - // snippet.user_id pnConfiguration.UserId = new UserId("myUserId"); // snippet.end - + // snippet.get_user_id UserId currentUserId = pubnub.GetCurrentUserId(); // snippet.end @@ -85,14 +96,14 @@ static void ChangeUserId() pnConfiguration.UserId = new UserId("myUserId"); // snippet.end } - + static void SetAndGetAuthKey() { // snippet.set_auth_key PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); pnConfiguration.AuthKey = "authKey"; // snippet.end - + // snippet.get_auth_key string sampleAuthKey = pnConfiguration.AuthKey; // snippet.end @@ -104,7 +115,7 @@ static void FilterExpression() PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); pnConfiguration.FilterExpression = "such=wow"; // snippet.end - + // snippet.get_filter_expression string filterExpression = pnConfiguration.FilterExpression; // snippet.end @@ -122,10 +133,10 @@ static void InitWithUUID() }; // Create the PubNub instance with the configuration - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); // snippet.end } - + static void InitNonSecure() { // snippet.init_non_secure @@ -133,10 +144,10 @@ static void InitNonSecure() pnConfiguration.PublishKey = "my_pubkey"; pnConfiguration.SubscribeKey = "my_subkey"; pnConfiguration.Secure = false; - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); // snippet.end } - + static void InitSecure() { // snippet.init_secure @@ -144,10 +155,10 @@ static void InitSecure() pnConfiguration.PublishKey = "my_pubkey"; pnConfiguration.SubscribeKey = "my_subkey"; pnConfiguration.Secure = true; - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); // snippet.end } - + static void InitSecretKey() { // snippet.init_secret_key @@ -157,16 +168,16 @@ static void InitSecretKey() pnConfiguration.SecretKey = "my_secretkey"; pnConfiguration.Secure = true; - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); // snippet.end } - + static void InitReadOnly() { // snippet.init_read_only PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); pnConfiguration.SubscribeKey = "my_subkey"; - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); // snippet.end } } \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs.meta new file mode 100644 index 00000000..558388f5 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 099b09c0af1f5ae42b467e6f6c0a3ede +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs new file mode 100644 index 00000000..8f561092 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs @@ -0,0 +1,51 @@ +// snippet.configuration_basic_usage +using System.Collections.Generic; +using PubnubApi; +using PubnubApi.Security.Crypto; +using PubnubApi.Security.Crypto.Cryptors; +using PubnubApi.Unity; +using UnityEngine; + +public class PubnubConfigurationExample : MonoBehaviour { + // Serialized fields to allow configuration within Unity Editor + [SerializeField] private string userId = "myUniqueUserId"; + [SerializeField] private string subscribeKey = "demo"; // Replace with your actual SubscribeKey + [SerializeField] private string publishKey = "demo"; // Replace with your actual PublishKey if publishing is needed + [SerializeField] private string secretKey = "yourSecretKey"; // Used if Access Manager operations are needed + [SerializeField] private string authKey = "authKey"; // Used if Access Manager is enabled + [SerializeField] private string filterExpression = "such=wow"; + [SerializeField] private bool useSSL = true; + [SerializeField] private bool logToUnityConsole = true; + + //Note that you can always use the PnConfigAsset Scriptable Object for setting these values in editor + [SerializeField] private PNConfigAsset configAsset; + + private void Start() { + // Initialize a PNConfiguration object with the provided values + PNConfiguration pnConfiguration = new PNConfiguration(new UserId(userId)) { + SubscribeKey = subscribeKey, + PublishKey = publishKey, + SecretKey = secretKey, + AuthKey = authKey, + Secure = useSSL, + CryptoModule = new CryptoModule(new AesCbcCryptor("enigma"), new List { new LegacyCryptor("enigma") }), + LogLevel = PubnubLogLevel.All, + SubscribeTimeout = 310, + NonSubscribeRequestTimeout = 300, + FilterExpression = filterExpression, + HeartbeatNotificationOption = PNHeartbeatNotificationOption.All + }; + + pnConfiguration.SetPresenceTimeoutWithCustomInterval(120, 59); + pnConfiguration.PresenceTimeout = 120; + + // Create a PubNub instance and perform Unity-specific setup + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration, unityLogging: logToUnityConsole); + + // Analogous setup with the Scriptable Object config: + Pubnub anotherPubnub = PubnubUnityUtils.NewUnityPubnub(configAsset); + + Debug.Log("PubNub configured and ready to use."); + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs.meta new file mode 100644 index 00000000..25265f97 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 21eacb17228f45439c5ee3042bbdf16e +timeCreated: 1751288835 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities.meta b/PubNubUnity/Assets/PubNub/Snippets/Entities.meta new file mode 100644 index 00000000..fead476d --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Entities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b7a43c20193a1a47ac9587cbb11c632 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs index b09b5e2a..99099dd0 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs @@ -1,7 +1,12 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEngine; public class EntitiesSample { @@ -20,37 +25,15 @@ static void Init() }; // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); - - // snippet.end - } + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - public static async Task GetAllUuidMetadataBasicUsage() - { - // snippet.get_all_uuid_metadata_basic_usage - try - { - PNResult getAllUuidMetadataResponse = await pubnub.GetAllUuidMetadata() - .IncludeCustom(true) - .IncludeCount(true) - .ExecuteAsync(); - - PNGetAllUuidMetadataResult getAllUuidMetadataResult = getAllUuidMetadataResponse.Result; - PNStatus status = getAllUuidMetadataResponse.Status; - - if (!status.Error && getAllUuidMetadataResult != null) - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(getAllUuidMetadataResult)); - } - else - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); - } - } - catch (Exception ex) - { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); - } // snippet.end } @@ -163,7 +146,7 @@ public static async Task SetChannelMetadataIterativeUpdate() .Description(description) .Custom(customField) .ExecuteAsync(); - Console.WriteLine("The channel has been created with name and description.\n"); + Debug.Log("The channel has been created with name and description.\n"); // Fetch current object with custom fields PNResult currentObjectResponse = await pubnub.GetChannelMetadata() @@ -188,11 +171,11 @@ public static async Task SetChannelMetadataIterativeUpdate() .Name(currentObject?.Name) .Description(currentObject?.Description) .ExecuteAsync(); - Console.WriteLine($"Object has been updated.\n {setChannelMetadataResponse.Result}"); + Debug.Log($"Object has been updated.\n {setChannelMetadataResponse.Result}"); } catch (Exception ex) { - Console.WriteLine(ex.Message); + Debug.Log(ex.Message); } // snippet.end } @@ -229,10 +212,10 @@ public static async Task SetMembershipsBasicUsage() { // snippet.set_memberships_basic_usage List setMembershipChannelMetadataIdList = - [ - new PNMembership() - { Channel = "my-channel", Custom = new Dictionary() { { "item", "book" } } } - ]; + new() { + new PNMembership() + { Channel = "my-channel", Custom = new Dictionary() { { "item", "book" } } } + }; PNResult setMembershipsResponse = await pubnub.SetMemberships() .Uuid("my-uuid") @@ -250,10 +233,10 @@ public static async Task RemoveMembershipsBasicUsage() { // snippet.remove_memberships_basic_usage List removeMembershipList = - [ - "my-channel", - "your-channel" - ]; + new() { + "my-channel", + "your-channel" + }; PNResult removeMembershipsResponse = await pubnub.RemoveMemberships() .Uuid("uuid") @@ -271,16 +254,15 @@ public static async Task ManageMembershipsBasicUsage() { // snippet.manage_memberships_basic_usage List setMembrshipList = - [ - new PNMembership() { Channel = "ch1", Custom = new Dictionary() { { "say", "hello" } } }, - new PNMembership() { Channel = "ch2", Custom = new Dictionary() { { "say", "world" } } }, - new PNMembership() { Channel = "ch3", Custom = new Dictionary() { { "say", "bye" } } } - ]; + new() { + new PNMembership() + { Channel = "ch1", Custom = new Dictionary() { { "say", "hello" } } }, + new PNMembership() + { Channel = "ch2", Custom = new Dictionary() { { "say", "world" } } }, + new PNMembership() { Channel = "ch3", Custom = new Dictionary() { { "say", "bye" } } } + }; - List removeMembrshipList = - [ - "ch4" - ]; + List removeMembrshipList = new() { "ch4" }; PNResult manageMmbrshipsResponse = await pubnub.ManageMemberships() .Uuid("my-uuid") @@ -317,11 +299,11 @@ public static async Task SetChannelMembersBasicUsage() // snippet.set_channel_members_basic_usage // Add Members (UUID) for a specific channel List setMemberChannelList = - [ - new PNChannelMember() - { Uuid = "my-uuid", Custom = new Dictionary() { { "planet", "earth" } } } - ]; - + new() { + new PNChannelMember() + { Uuid = "my-uuid", Custom = new Dictionary() { { "planet", "earth" } } } + }; + PNResult setChannelMembersResponse = await pubnub.SetChannelMembers() .Channel("my-channel") .Uuids(setMemberChannelList) @@ -339,10 +321,10 @@ public static async Task RemoveChannelMembersBasicUsage() // snippet.remove_channel_members_basic_usage // Remove Members (UUID) for a specific channel List removeChannelMemberList = - [ - "my-uuid", - "your-uuid" - ]; + new() { + "my-uuid", + "your-uuid" + }; PNResult removeChannelMembersResponse = await pubnub.RemoveChannelMembers() .Channel("my-channel") @@ -355,4 +337,4 @@ public static async Task RemoveChannelMembersBasicUsage() PNStatus status = removeChannelMembersResponse.Status; // snippet.end } -} \ No newline at end of file +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs.meta new file mode 100644 index 00000000..68d06b9d --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d75b4d98bf06d84d9bbf8af5dd2cd0f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs new file mode 100644 index 00000000..17232794 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs @@ -0,0 +1,51 @@ +// snippet.get_all_uuid_metadata_basic_usage +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +public class GetAllUuidMetadataExample : MonoBehaviour { + // Reference to a pubnub manager previously setup in Unity Editor + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + private async void Start() { + // Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + // Fetching all UUID metadata + var getAllUuidMetadataResponse = await pubnub.GetAllUuidMetadata() + .IncludeCustom(true) + .IncludeCount(true) + .ExecuteAsync(); + + // Extracting the result and status + var getAllUuidMetadataResult = getAllUuidMetadataResponse.Result; + var status = getAllUuidMetadataResponse.Status; + + // Handling errors and logging results + if (status.Error) { + Debug.LogError($"Error fetching UUID metadata: {status.ErrorData.Information}"); + } else if (getAllUuidMetadataResult?.Uuids != null) { + Debug.Log("Successfully fetched UUID metadata:"); + foreach (var uuidMetadata in getAllUuidMetadataResult.Uuids) { + Debug.Log($"UUID: {uuidMetadata.Uuid}, Name: {uuidMetadata.Name}"); + if (uuidMetadata.Custom != null) { + foreach (var kvp in uuidMetadata.Custom) { + Debug.Log($"Custom Key: {kvp.Key}, Value: {kvp.Value}"); + } + } + } + } + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs.meta new file mode 100644 index 00000000..5ad66937 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 839bd11e849e4508b9a5ee74b71aba7b +timeCreated: 1751287801 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files.meta b/PubNubUnity/Assets/PubNub/Snippets/Files.meta new file mode 100644 index 00000000..757c2f9e --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Files.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8e74ea101fed9654d88dea6578e8d690 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs index b006974e..59f39026 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs @@ -1,7 +1,11 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System.Threading.Tasks; +using UnityEngine; +using System; public class FilesSample { @@ -17,38 +21,15 @@ static void InitSample() Secure = true }; - Pubnub pubnub = new Pubnub(pnConfiguration); - // snippet.end - } - - public static async Task SendFileBasicUsage() - { - // snippet.send_file_basic_usage - try - { - PNResult fileUploadResponse = await pubnub.SendFile() - .Channel("my_channel") - .File("path/to/your/file/cat_picture.jpg") - .Message("Look at this photo!") - .CustomMessageType("file-message") - .ExecuteAsync(); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); - PNFileUploadResult fileUploadResult = fileUploadResponse.Result; - PNStatus fileUploadStatus = fileUploadResponse.Status; + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - if (!fileUploadStatus.Error && fileUploadResult != null) - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadResult)); - } - else - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadStatus)); - } - } - catch (Exception ex) - { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); - } // snippet.end } @@ -62,11 +43,11 @@ public static async Task ListFilesBasicUsage() PNStatus listFilesStatus = listFilesResponse.Status; if (!listFilesStatus.Error && listFilesResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(listFilesResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(listFilesResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(listFilesStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(listFilesStatus)); } // snippet.end } @@ -83,11 +64,11 @@ public static async Task GetFileUrlBasicUsage() PNStatus getFileUrlStatus = getFileUrlResponse.Status; if (!getFileUrlStatus.Error && getFileUrlResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(getFileUrlResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(getFileUrlResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(getFileUrlStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(getFileUrlStatus)); } // snippet.end } @@ -105,11 +86,11 @@ public static async Task DownloadFileBasicUsage(string downloadUrlFileName) if (!fileDownloadStatus.Error && fileDownloadResult != null) { fileDownloadResult.SaveFileToLocal(downloadUrlFileName); //saves to bin folder if no path is provided - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileDownloadResult.FileName)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileDownloadResult.FileName)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileDownloadStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(fileDownloadStatus)); } // snippet.end } @@ -126,11 +107,11 @@ public static async Task DeleteFileBasicUsage() PNStatus deleteFileStatus = deleteFileResponse.Status; if (!deleteFileStatus.Error && deleteFileResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(deleteFileResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(deleteFileResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(deleteFileStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(deleteFileStatus)); } // snippet.end } @@ -149,11 +130,11 @@ public static async Task PublishFileMessageBasicUsage() PNStatus publishFileMsgStatus = publishFileMsgResponse.Status; if (!publishFileMsgStatus.Error && publishFileMsgResult != null) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(publishFileMsgResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(publishFileMsgResult)); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(publishFileMsgStatus)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(publishFileMsgStatus)); } // snippet.end } diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs.meta new file mode 100644 index 00000000..bef22f79 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a255a4755cb51bb4086c03bdfe2abf74 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs new file mode 100644 index 00000000..01720ba0 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs @@ -0,0 +1,55 @@ +// snippet.send_file_basic_usage +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +public class SendFileExample : MonoBehaviour { + // Reference to a pubnub manager previously setup in Unity Editor + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + // An editor-serialized string for the channel ID + [SerializeField] private string channelId = "my_channel"; + + // An editor-serialized string for the file path + [SerializeField] private string filePath = "cat_picture.jpg"; + + // An editor-serialized string for the cipher key + [SerializeField] private string cipherKey = "my_cipher_key"; + + private async void Start() { + // Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + // Sending a file to the specified channel + var fileUploadResponse = await pubnub.SendFile() + .Channel(channelId) + .File(filePath) // checks the bin folder if no path is provided + .CipherKey(cipherKey) // Deprecated: Prefer setting up in PubNub config + .Message("Look at this photo!") + .CustomMessageType("file-message") + .ExecuteAsync(); + + // Extracting the result and status + var fileUploadResult = fileUploadResponse.Result; + var fileUploadStatus = fileUploadResponse.Status; + + // Handling errors and logging results + if (!fileUploadStatus.Error && fileUploadResult != null) { + Debug.Log($"File uploaded successfully: {pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadResult)}"); + } else { + Debug.LogError($"Error uploading file: {pubnub.JsonPluggableLibrary.SerializeToJsonString(fileUploadStatus)}"); + } + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs.meta new file mode 100644 index 00000000..b3f47c6d --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 30b861d12d1349c48311cd8b632ab6b1 +timeCreated: 1751288575 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Logging.meta b/PubNubUnity/Assets/PubNub/Snippets/Logging.meta new file mode 100644 index 00000000..e12ac6a7 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Logging.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5eced3c72c03e0c4b8f7c3281ffe26d6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs index af409ef0..ce0b0179 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs @@ -8,24 +8,24 @@ public class LoggingSample { // snippet.custom_logger - // A custom logger that logs information on console. + // A custom logger that logs information on Unity console. // Use can implement logger that can log information using log4Net or file etc. - public class PubnubConsoleLogger : IPubnubLogger - { - public void Trace(string traceLog) => - Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [TRACE] {traceLog}"); + // You can find a default Unity-specific logger in UnityPubNubLogger.cs + public class PubnubUnityConsoleLoggerExample : IPubnubLogger { + public void Trace(string traceLog) => + UnityEngine.Debug.Log($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [TRACE] {traceLog}"); - public void Debug(string debugLog) => - Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [DEBUG] {debugLog}"); + public void Debug(string debugLog) => + UnityEngine.Debug.Log($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [DEBUG] {debugLog}"); - public void Info(string infoLog) => - Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [INFO] {infoLog}"); + public void Info(string infoLog) => + UnityEngine.Debug.Log($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [INFO] {infoLog}"); - public void Warn(string warningLog) => - Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [WARN] {warningLog}"); + public void Warn(string warningLog) => + UnityEngine.Debug.LogWarning($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [WARN] {warningLog}"); - public void Error(string errorLog) => - Console.WriteLine($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [ERROR] {errorLog}"); + public void Error(string errorLog) => + UnityEngine.Debug.LogError($"[{DateTime.Now.ToString(CultureInfo.InvariantCulture)}] [ERROR] {errorLog}"); } // snippet.end @@ -40,11 +40,18 @@ public static void EnableLogging() }; var pubnub = new Pubnub(pubnubConfiguration); - var customLogger = new PubnubConsoleLogger(); + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ + + var customLogger = new PubnubUnityConsoleLoggerExample(); pubnub.SetLogger(customLogger); // To remove the custom logger. Use RemoveLogger(). pubnub.RemoveLogger(customLogger); // snippet.end } -} \ No newline at end of file +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs.meta new file mode 100644 index 00000000..f8c3818b --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 39f1af75d2ce28346b57d04ccf829bc0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions.meta b/PubNubUnity/Assets/PubNub/Snippets/MessageActions.meta new file mode 100644 index 00000000..f06995af --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/MessageActions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd39201ec6149574c819571433311b56 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs new file mode 100644 index 00000000..cd8ff971 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs @@ -0,0 +1,46 @@ +// snippet.add_message_action_basic_usage +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +public class AddMessageActionExample : MonoBehaviour { + // Reference to a pubnub manager previously setup in Unity Editor + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + // An editor-serialized string for the channel ID + [SerializeField] private string channelId = "my_channel"; + + // An editor-serialized timetoken for the message + [SerializeField] private long messageTimetoken = 5610547826969050; + + private void Start() { + // Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + // Adding a message action (reaction) to a specified message + pubnub.AddMessageAction() + .Channel(channelId) + .MessageTimetoken(messageTimetoken) + .Action(new PNMessageAction { Type = "reaction", Value = "smiley_face" }) + .Execute((result, status) => { + // Handling the result of the operation + if (status.Error) { + Debug.LogError($"Error adding message action: {status.ErrorData.Information}"); + } else { + Debug.Log($"Successfully added message action: {pubnub.JsonPluggableLibrary.SerializeToJsonString(result)}"); + } + }); + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs.meta new file mode 100644 index 00000000..41012bb4 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 11419223532b4d31ad960b629af6bef7 +timeCreated: 1751288487 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs index eeae12e6..4a8c6d7b 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs @@ -1,7 +1,10 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using UnityEngine; +using System; public class MessageActionsSample { @@ -19,36 +22,15 @@ static void Init() }; // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - // snippet.end - } - - public static void AddMessageActionBasicUsage() - { - // snippet.add_message_action_basic_usage - try - { - pubnub.AddMessageAction() - .Channel("my_channel") - .MessageTimetoken(5610547826969050) // Replace with actual message timetoken - .Action(new PNMessageAction { Type = "reaction", Value = "smiley_face" }) - .Execute(new PNAddMessageActionResultExt((result, status) => - { - if (!status.Error && result != null) - { - Console.WriteLine("Message action added successfully."); - } - else - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); - } - })); - } - catch (Exception ex) - { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); - } // snippet.end } @@ -78,4 +60,4 @@ public static void GetMessageActionsBasicUsage() })); // snippet.end } -} \ No newline at end of file +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs.meta new file mode 100644 index 00000000..89e9bcc5 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a4c574312ea9b14e9cca673bca2a356 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc.meta b/PubNubUnity/Assets/PubNub/Snippets/Misc.meta new file mode 100644 index 00000000..3b13817a --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Misc.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6fad00bea1e423749a386b42d77f4d72 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs index bb55db67..384ff04f 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs @@ -1,12 +1,15 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System.Collections.Generic; +using UnityEngine; public class MiscSample { private static Pubnub pubnub; - + static void Init() { // snippet.init @@ -19,18 +22,15 @@ static void Init() }; // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); - - // snippet.end - } - - public static void DestroyBasicUsage() - { - // snippet.destroy_basic_usage - // Destroy PubNub instance to clean up resources - pubnub.Destroy(); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - Console.WriteLine("PubNub instance destroyed successfully."); // snippet.end } @@ -130,4 +130,4 @@ public static void TimeBasicUsage() )); // snippet.end } -} \ No newline at end of file +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs.meta new file mode 100644 index 00000000..b31146f2 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed74207c8347fc8458e9731bf44ba184 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs new file mode 100644 index 00000000..eb638290 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs @@ -0,0 +1,13 @@ +// snippet.cleanup_basic_usage +using PubnubApi; +using UnityEngine; + +public class PubnubCleanupExample : MonoBehaviour { + private void OnApplicationQuit() { + // Performing cleanup operations + Debug.Log("Cleaning up PubNub resources..."); + Pubnub.CleanUp(); + Debug.Log("Cleanup complete."); + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs.meta new file mode 100644 index 00000000..c14f550c --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3dff4c9bc0b141cab2d5ce06a9df88af +timeCreated: 1751288283 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence.meta b/PubNubUnity/Assets/PubNub/Snippets/Presence.meta new file mode 100644 index 00000000..5b8f404d --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Presence.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0d88b70744e9d784eb7af1d98961b0df +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs new file mode 100644 index 00000000..bd467525 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs @@ -0,0 +1,65 @@ +// snippet.here_now_basic_usage +using System.Collections.Generic; +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +public class HereNowExample : MonoBehaviour { + // Reference to a pubnub manager previously setup in Unity Editor + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + // An editor-serialized array with test channel IDs + [SerializeField] private string[] testChannelIds = { "coolChannel", "coolChannel2" }; + + private async void Start() { + // Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + // Executing the HereNow operation to get a list of UUIDs subscribed to channels + var herenowResponse = await pubnub.HereNow() + .Channels(testChannelIds) + .IncludeUUIDs(true) + .ExecuteAsync(); + + // Result and status of the HereNow operation + var herenowResult = herenowResponse.Result; + var status = herenowResponse.Status; + + // Handling potential errors + if (status.Error) { + Debug.LogError($"Error in HereNow operation: {status.ErrorData.Information}"); + } else { + if (herenowResult?.Channels != null && herenowResult.Channels.Count > 0) { + foreach (KeyValuePair kvp in herenowResult.Channels) { + PNHereNowChannelData channelData = kvp.Value; + + Debug.Log("---"); + Debug.Log($"channel: {channelData.ChannelName}"); + Debug.Log($"occupancy: {channelData.Occupancy}"); + Debug.Log("Occupants:"); + + if (channelData.Occupants != null && channelData.Occupants.Count > 0) { + foreach (var occupant in channelData.Occupants) { + Debug.Log($"uuid: {occupant.Uuid}"); + Debug.Log($"state: {(occupant.State != null ? pubnub.JsonPluggableLibrary.SerializeToJsonString(occupant.State) : "No state")}"); + } + } + } + } else { + Debug.Log("No occupants found."); + } + } + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs.meta new file mode 100644 index 00000000..a0216c3a --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: be9ff8d463f9417594b27022c93055d0 +timeCreated: 1751287483 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs index dd2e46c9..501f2df5 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs @@ -1,7 +1,12 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEngine; +using System; public class PresenceSample { @@ -19,51 +24,15 @@ static void Init() }; // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); - - // snippet.end - } - - public static async Task HereNowBasicUsage() - { - // snippet.here_now_basic_usage - try - { - PNResult herenowResponse = await pubnub.HereNow() - .Channels(new string[] { "coolChannel", "coolChannel2" }) - .IncludeUUIDs(true) - .ExecuteAsync(); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); - PNHereNowResult herenowResult = herenowResponse.Result; - PNStatus status = herenowResponse.Status; + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - if (!status.Error && herenowResult != null) - { - foreach (KeyValuePair channelData in herenowResult.Channels) - { - Console.WriteLine("---"); - Console.WriteLine("Channel: " + channelData.Value.ChannelName); - Console.WriteLine("Occupancy: " + channelData.Value.Occupancy); - - if (channelData.Value.Occupants != null) - { - foreach (var occupant in channelData.Value.Occupants) - { - Console.WriteLine($"UUID: {occupant.Uuid}"); - Console.WriteLine($"State: {(occupant.State != null ? pubnub.JsonPluggableLibrary.SerializeToJsonString(occupant.State) : "No state")}"); - } - } - } - } - else - { - Console.WriteLine("Error occurred: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); - } - } - catch (Exception ex) - { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); - } // snippet.end } @@ -87,15 +56,15 @@ public static void HereNowSynchronous() if (result.Channels != null && result.Channels.Count > 0) { foreach (KeyValuePair kvp in result.Channels) { PNHereNowChannelData channelData = kvp.Value; - Console.WriteLine("---"); - Console.WriteLine("channel:" + channelData.ChannelName); - Console.WriteLine("occupancy:" + channelData.Occupancy); - Console.WriteLine("Occupants:"); + Debug.Log("---"); + Debug.Log("channel:" + channelData.ChannelName); + Debug.Log("occupancy:" + channelData.Occupancy); + Debug.Log("Occupants:"); if (channelData.Occupants != null && channelData.Occupants.Count > 0) { for (int index = 0; index < channelData.Occupants.Count; index++) { PNHereNowOccupantData occupant = channelData.Occupants[index]; - Console.WriteLine(string.Format("uuid: {0}", occupant.Uuid)); - Console.WriteLine(string.Format("state:{1}", (occupant.State != null) ? + Debug.Log(string.Format("uuid: {0}", occupant.Uuid)); + Debug.Log(string.Format("state:{1}", (occupant.State != null) ? pubnub.JsonPluggableLibrary.SerializeToJsonString(occupant.State) : "")); } } @@ -301,4 +270,4 @@ public static async Task SetPresenceStateForChannelGroups() // on new state for those channels // snippet.end } -} \ No newline at end of file +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs.meta new file mode 100644 index 00000000..1b234d87 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 519c0e5dbecdc7a478be01cac813f584 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish.meta b/PubNubUnity/Assets/PubNub/Snippets/Publish.meta new file mode 100644 index 00000000..7bfaaedd --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Publish.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a625ba849a1a850429794d40ffd21c82 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs index 92e7a4e1..49b03f65 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs @@ -2,6 +2,12 @@ using PubnubApi; // snippet.end +using System.Collections.Generic; +using System.Threading.Tasks; +using UnityEngine; +using System; +using System.Linq; +using PubnubApi.Unity; public class PublishSubscribeSample { @@ -19,7 +25,14 @@ static void Init() }; // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ // snippet.end } @@ -36,7 +49,7 @@ public static async Task PublishBasicUsage() { "lng", 32F } }; - Console.WriteLine("before pub: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(position)); + Debug.Log("before pub: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(position)); PNResult publishResponse = await pubnub.Publish() .Message(position) @@ -49,17 +62,17 @@ public static async Task PublishBasicUsage() if (!status.Error) { - Console.WriteLine("pub timetoken: " + publishResult.Timetoken.ToString()); - Console.WriteLine("pub status code : " + status.StatusCode.ToString()); + Debug.Log("pub timetoken: " + publishResult.Timetoken.ToString()); + Debug.Log("pub status code : " + status.StatusCode.ToString()); } else { - Console.WriteLine("Error occurred: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); + Debug.LogError("Error occurred: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); } } catch (Exception ex) { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); + Debug.LogError($"Request cannot be executed due to error: {ex.Message}"); } // snippet.end } @@ -72,7 +85,7 @@ public static void PublishSynchronous() position.Add("lat", 32F); position.Add("lng", 32F); - Console.WriteLine("before pub: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(position)); + Debug.Log("before pub: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(position)); pubnub.Publish() .Message(position) @@ -81,8 +94,8 @@ public static void PublishSynchronous() .Execute(new PNPublishResultExt( (result, status) => { - Console.WriteLine("pub timetoken: " + result.Timetoken.ToString()); - Console.WriteLine("pub status code : " + status.StatusCode.ToString()); + Debug.Log("pub timetoken: " + result.Timetoken.ToString()); + Debug.Log("pub status code : " + status.StatusCode.ToString()); } )); // snippet.end @@ -184,12 +197,12 @@ public static void PublishMobilePayload() if (status.Error) { // something bad happened. - Console.WriteLine( + Debug.Log( $"error while publishing: {pubnub.JsonPluggableLibrary.SerializeToJsonString(status)}"); } else { - Console.WriteLine($"published with timetoken: {result.Timetoken}"); + Debug.Log($"published with timetoken: {result.Timetoken}"); } } )); @@ -214,12 +227,12 @@ public static void FireBasicUsage() { if (status.Error) { - Console.WriteLine( + Debug.Log( $"error while publishing: {pubnub.JsonPluggableLibrary.SerializeToJsonString(status)}"); } else { - Console.WriteLine($"published with timetoken: {result.Timetoken}"); + Debug.Log($"published with timetoken: {result.Timetoken}"); } } )); @@ -240,11 +253,11 @@ public static void SignalBasicUsage() { if (status.Error) { - Console.WriteLine(status.ErrorData.Information); + Debug.Log(status.ErrorData.Information); } else { - Console.WriteLine(result.Timetoken); + Debug.Log(result.Timetoken); } })); // snippet.end @@ -292,7 +305,7 @@ public static void SubscribeWithLogging() LogLevel = PubnubLogLevel.Debug }; - Pubnub pubnub = new Pubnub(pnConfiguration); + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); pubnub.Subscribe() .Channels(new string[] @@ -335,30 +348,28 @@ public static void SubscribeWithPresence() public static void SubscribeWithState() { // snippet.subscribe_with_state - pubnub.AddListener(new SubscribeCallbackExt( - (pubnubObj, message) => { }, - (pubnubObj, presence) => { }, - (pubnubObj, status) => - { - if (status.Category == PNStatusCategory.PNConnectedCategory) - { - Dictionary data = new Dictionary(); - data.Add("FieldA", "Awesome"); - data.Add("FieldB", 10); - - pubnub.SetPresenceState() - .Channels(new string[] { "awesomeChannel" }) - .ChannelGroups(new string[] { "awesomeChannelGroup" }) - .State(data) - .Execute(new PNSetStateResultExt( - (r, s) => - { - // handle set state response - } - )); - } - } - )); + var listener = new SubscribeCallbackListener(); + listener.onStatus += (pubnubObj, status) => + { + if (status.Category == PNStatusCategory.PNConnectedCategory) + { + Dictionary data = new Dictionary(); + data.Add("FieldA", "Awesome"); + data.Add("FieldB", 10); + + pubnub.SetPresenceState() + .Channels(new string[] { "awesomeChannel" }) + .ChannelGroups(new string[] { "awesomeChannelGroup" }) + .State(data) + .Execute(new PNSetStateResultExt( + (r, s) => + { + // handle set state response + } + )); + } + }; + pubnub.AddListener(listener); pubnub.Subscribe() .Channels(new string[] @@ -444,23 +455,20 @@ public static void SubscribeWithCustomType() if (status.Error) { // something bad happened. - Console.WriteLine("error happened while publishing: " + + Debug.Log("error happened while publishing: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); } else { - Console.WriteLine("publish worked! timetoken: " + result.Timetoken.ToString()); + Debug.Log("publish worked! timetoken: " + result.Timetoken.ToString()); } } )); - SubscribeCallbackExt objectListenerSubscribeCallack = new SubscribeCallbackExt( - (pubnubObj, message) => - { - //message.Message gives the Phone object because you subscribed to type Phone during subscribe. - }, - (pubnubObj, presence) => { }, - (pubnubObj, status) => { }); + SubscribeCallbackListener objectListenerSubscribeCallack = new SubscribeCallbackListener(); + objectListenerSubscribeCallack.onMessage += (pubnubObj, message) => { + //message.Message gives the Phone object because you subscribed to type Phone during subscribe. + }; pubnub.AddListener(objectListenerSubscribeCallack); pubnub.Subscribe() @@ -471,18 +479,15 @@ public static void SubscribeWithCustomType() .Execute(); //If you are subscribing to multiple message types, then - SubscribeCallbackExt stringListenerSubscribeCallack = new SubscribeCallbackExt( - (pubnubObj, message) => - { - //message.Message gives the string object because you subscribed to type "string" during subscribe. - string phoneStringMessage = message.Message.ToString(); //this is your string message - //using pluggable JSON library from the Pubnub instance, but you can use any form of JSON deserialization you wish - var deserializedMessage = pubnub.JsonPluggableLibrary.DeserializeToObject(phoneStringMessage); - }, - (pubnubObj, presence) => { }, - (pubnubObj, status) => { }); + SubscribeCallbackListener stringListenerSubscribeCallback = new SubscribeCallbackListener(); + stringListenerSubscribeCallback.onMessage += (pubnubObj, message) => { + //message.Message gives the string object because you subscribed to type "string" during subscribe. + string phoneStringMessage = message.Message.ToString(); //this is your string message + //using pluggable JSON library from the Pubnub instance, but you can use any form of JSON deserialization you wish + var deserializedMessage = pubnub.JsonPluggableLibrary.DeserializeToObject(phoneStringMessage); + }; - pubnub.AddListener(stringListenerSubscribeCallack); + pubnub.AddListener(stringListenerSubscribeCallback); pubnub.Subscribe() .Channels(new string[] { @@ -583,23 +588,24 @@ public static void AddListenerBasicUsage() subscription1.onMessage += (Pubnub pn, PNMessageResult messageEvent) => { - Console.WriteLine($"Message received {messageEvent.Message}"); + Debug.Log($"Message received {messageEvent.Message}"); }; subscription1.Subscribe(); // Add multiple listeners - SubscribeCallbackExt eventListener = new SubscribeCallbackExt( + SubscribeCallbackListener eventListener = new SubscribeCallbackListener( delegate(Pubnub pn, PNMessageResult messageEvent) { - Console.WriteLine($"received message {messageEvent.Message}"); + Debug.Log($"received message {messageEvent.Message}"); }, - delegate(Pubnub pn, PNPresenceEventResult e) { Console.WriteLine("Presence event"); }, - delegate(Pubnub pn, PNSignalResult e) { Console.WriteLine("Signal event"); }, - delegate(Pubnub pn, PNObjectEventResult e) { Console.WriteLine("Object event"); }, - delegate(Pubnub pn, PNMessageActionEventResult e) { Console.WriteLine("Message Action event"); }, - delegate(Pubnub pn, PNFileEventResult e) { Console.WriteLine("File event"); } + delegate(Pubnub pn, PNPresenceEventResult e) { Debug.Log("Presence event"); }, + delegate(Pubnub pn, PNSignalResult e) { Debug.Log("Signal event"); }, + delegate(Pubnub pn, PNObjectEventResult e) { Debug.Log("Object event"); }, + delegate(Pubnub pn, PNMessageActionEventResult e) { Debug.Log("Message Action event"); }, + delegate(Pubnub pn, PNFileEventResult e) { Debug.Log("File event"); }, + delegate(Pubnub pn, PNStatus e) { Debug.Log("Status event"); } ); Channel firstChannel = pubnub.Channel("first"); @@ -620,19 +626,17 @@ public static void AddListenersBasicUsage() SubscriptionOptions.ReceivePresenceEvents ); - SubscribeCallbackExt eventListener = new SubscribeCallbackExt( - delegate(Pubnub pn, PNMessageResult messageEvent) - { - Console.WriteLine($"received message {messageEvent.Message}"); - }, - delegate(Pubnub pn, PNPresenceEventResult e) { Console.WriteLine("Presence event"); }, - delegate(Pubnub pn, PNStatus s) { Console.WriteLine("Status event"); } - ); + SubscribeCallbackListener eventListener = new SubscribeCallbackListener(); + eventListener.onMessage += delegate(Pubnub pn, PNMessageResult messageEvent) { + Debug.Log($"received message {messageEvent.Message}"); + }; + eventListener.onPresence += delegate(Pubnub pn, PNPresenceEventResult e) { Debug.Log("Presence event"); }; + eventListener.onStatus += delegate(Pubnub pn, PNStatus s) { Debug.Log("Status event"); }; subscription1.AddListener(eventListener); subscriptionSet.onSignal += (Pubnub pn, PNSignalResult signalEvent) => { - Console.WriteLine($"Message received {signalEvent.Message}"); + Debug.Log($"Message received {signalEvent.Message}"); }; subscription1.Subscribe(); @@ -644,10 +648,10 @@ public static void AddListenerMethod1() { // snippet.add_listener_method1 // Adding listener. - pubnub.AddListener(new SubscribeCallbackExt( + pubnub.AddListener(new SubscribeCallbackListener( delegate(Pubnub pnObj, PNMessageResult pubMsg) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(pubMsg)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(pubMsg)); var channelName = pubMsg.Channel; var channelGroupName = pubMsg.Subscription; var pubTT = pubMsg.Timetoken; @@ -656,7 +660,7 @@ public static void AddListenerMethod1() }, delegate(Pubnub pnObj, PNPresenceEventResult presenceEvnt) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(presenceEvnt)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(presenceEvnt)); var action = presenceEvnt.Event; // Can be join, leave, state-change or timeout var channelName = presenceEvnt.Channel; // The channel for which the message belongs var occupancy = presenceEvnt.Occupancy; // No. of users connected with the channel @@ -669,7 +673,7 @@ public static void AddListenerMethod1() }, delegate(Pubnub pnObj, PNSignalResult signalMsg) { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(signalMsg)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(signalMsg)); var channelName = signalMsg.Channel; // The channel for which the signal belongs var channelGroupName = signalMsg.Subscription; // The channel group or wildcard subscription match (if exists) @@ -697,7 +701,7 @@ public static void AddListenerMethod1() /* got membership related event. */ } - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(objectEventObj)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(objectEventObj)); }, delegate(Pubnub pnObj, PNMessageActionEventResult msgActionEvent) { @@ -722,7 +726,7 @@ public static void AddListenerMethod1() }, delegate(Pubnub pnObj, PNStatus pnStatus) { - Console.WriteLine("{0} {1} {2}", pnStatus.Operation, pnStatus.Category, pnStatus.StatusCode); + Debug.Log($"{pnStatus.Operation} {pnStatus.Category} {pnStatus.StatusCode}"); var affectedChannelGroups = pnStatus.AffectedChannelGroups; // The channel groups affected in the operation, of type array. var affectedChannels = @@ -731,36 +735,28 @@ public static void AddListenerMethod1() var operation = pnStatus.Operation; //Returns PNSubscribeOperation } )); - + //Add listener to receive Signal messages - SubscribeCallbackExt signalSubscribeCallback = new SubscribeCallbackExt( - delegate (Pubnub pubnubObj, PNSignalResult message) { - // Handle new signal message stored in message.Message - }, - delegate (Pubnub pubnubObj, PNStatus status) - { - // the status object returned is always related to subscribe but could contain - // information about subscribe, heartbeat, or errors - } - ); + SubscribeCallbackListener signalSubscribeCallback = new SubscribeCallbackListener(); + signalSubscribeCallback.onSignal += delegate (Pubnub pubnubObj, PNSignalResult message) { + // Handle new signal message stored in message.Message + }; + signalSubscribeCallback.onStatus += delegate (Pubnub pubnubObj, PNStatus status) { + // the status object returned is always related to subscribe but could contain + // information about subscribe, heartbeat, or errors + }; pubnub.AddListener(signalSubscribeCallback); - - //Add listener to receive Events - SubscribeCallbackExt eventListener = new SubscribeCallbackExt( - delegate (Pubnub pnObj, PNObjectEventResult objectEvent) - { - string channelMetadataId = objectEvent.Channel; // The channel - string uuidMetadataId = objectEvent.UuidMetadata.Uuid; // The UUID - string objEvent = objectEvent.Event; // The event name that occurred - string eventType = objectEvent.Type; // The event type that occurred - PNUuidMetadataResult uuidMetadata = objectEvent.UuidMetadata; // UuidMetadata - PNChannelMetadataResult channelMetadata = objectEvent.ChannelMetadata; // ChannelMetadata - }, - delegate (Pubnub pnObj, PNStatus status) - { - } - ); + //Add listener to receive Events + SubscribeCallbackListener eventListener = new SubscribeCallbackListener(); + eventListener.onObject += delegate(Pubnub pnObj, PNObjectEventResult objectEvent) { + string channelMetadataId = objectEvent.Channel; // The channel + string uuidMetadataId = objectEvent.UuidMetadata.Uuid; // The UUID + string objEvent = objectEvent.Event; // The event name that occurred + string eventType = objectEvent.Type; // The event type that occurred + PNUuidMetadataResult uuidMetadata = objectEvent.UuidMetadata; // UuidMetadata + PNChannelMetadataResult channelMetadata = objectEvent.ChannelMetadata; // ChannelMetadata + }; pubnub.AddListener(eventListener); // snippet.end } @@ -868,11 +864,7 @@ public static void AddListenerMethod2() public static void RemoveListener() { // snippet.remove_listener - SubscribeCallbackExt listenerSubscribeCallback = new SubscribeCallbackExt( - (pubnubObj, message) => { }, - (pubnubObj, presence) => { }, - (pubnubObj, status) => { }); - + SubscribeCallbackListener listenerSubscribeCallback = new SubscribeCallbackListener(); pubnub.AddListener(listenerSubscribeCallback); // some time later @@ -883,9 +875,8 @@ public static void RemoveListener() public static void AddConnectionStatusListener() { // snippet.add_connection_status_listener - SubscribeCallbackExt eventListener = new SubscribeCallbackExt( - delegate(Pubnub pn, PNStatus e) { Console.WriteLine("Status event"); } - ); + SubscribeCallbackListener eventListener = new SubscribeCallbackListener(); + eventListener.onStatus += delegate(Pubnub pn, PNStatus e) { Debug.Log("Status event"); }; pubnub.AddListener(eventListener); // snippet.end diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs.meta new file mode 100644 index 00000000..a1852cbe --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b35143dfc3a48543819cca0b9def635 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs new file mode 100644 index 00000000..831a9041 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs @@ -0,0 +1,64 @@ +// snippet.pubnub_basic_usage +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +public class PubnubBasicUsageExample : MonoBehaviour { + + //Reference to a pubnub manager previously setup in Unity Editor + //For more details see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + //An editor-serialized string with the test channel ID + [SerializeField] private string testChannelId = "test_channel_id"; + + private async void Start() { + //Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + //Subscribing to string messages on an example channel + pubnub.Subscribe().Channels(new []{testChannelId}).Execute(); + + //Setting up a simple callback on receiving a message + pubnubManager.listener.onMessage += (pn, result) => { + Debug.Log($"Received a message on {result.Channel}: {result.Message}"); + }; + + //Sending a message that will be received by our callback + var publishResult = await pubnub.Publish().Message("Hello from PubNub!").Channel(testChannelId).ExecuteAsync(); + + //Doing simple error handling in case something went wrong during the publish + if (publishResult.Status.Error) { + Debug.LogError($"Error in publish operation: {publishResult.Status.ErrorData.Information}"); + } + } + + // You can also use Pubnub inside Unity without any editor-side setup: + private async void NoEditorSetupExample() { + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + //Setting up a simple callback on receiving a message + SubscribeCallbackListener listener = new SubscribeCallbackListener(); + listener.onMessage += (pn, result) => { + Debug.Log($"Received a message on {result.Channel}: {result.Message}"); + }; + pubnub.AddListener(listener); + + //Subscribing to string messages on an example channel + pubnub.Subscribe().Channels(new []{testChannelId}).Execute(); + + //Sending a message that will be received by our callback + var publishResult = await pubnub.Publish().Message("Hello from PubNub!").Channel(testChannelId).ExecuteAsync(); + + //Doing simple error handling in case something went wrong during the publish + if (publishResult.Status.Error) { + Debug.LogError($"Error in publish operation: {publishResult.Status.ErrorData.Information}"); + } + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs.meta new file mode 100644 index 00000000..ac38d676 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3b9308767dac40979f0e274c02869a54 +timeCreated: 1751287203 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push.meta b/PubNubUnity/Assets/PubNub/Snippets/Push.meta new file mode 100644 index 00000000..99d23e81 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Push.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f11711cf8daa474082ed8ffa49ffc6e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs new file mode 100644 index 00000000..6a69eccb --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs @@ -0,0 +1,64 @@ +// snippet.add_device_to_channel_basic_usage +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +public class AddPushNotificationsExample : MonoBehaviour { + // Reference to a pubnub manager previously setup in Unity Editor + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + // An editor-serialized array for the channels to add notifications + [SerializeField] private string[] channels = { "ch1", "ch2", "ch3" }; + + // An editor-serialized string for the device IDs + [SerializeField] private string fcmDeviceId = "googleDevice"; + [SerializeField] private string apnsDeviceId = "appleDevice"; + + // An editor-serialized string for the APNS2 topic + [SerializeField] private string apnsTopic = "myapptopic"; + + private void Start() { + // Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + // Adding FCM/GCM push notifications + pubnub.AddPushNotificationsOnChannels() + .PushType(PNPushType.FCM) + .Channels(channels) + .DeviceId(fcmDeviceId) + .Execute((result, status) => { + if (status.Error) { + Debug.LogError($"Error adding FCM notifications: {status.ErrorData.Information}"); + } else { + Debug.Log("Successfully added FCM notifications."); + } + }); + + // Adding APNS2 push notifications + pubnub.AddPushNotificationsOnChannels() + .PushType(PNPushType.APNS2) + .Channels(channels) + .DeviceId(apnsDeviceId) + .Topic(apnsTopic) + .Environment(PushEnvironment.Development) + .Execute((result, status) => { + if (status.Error) { + Debug.LogError($"Error adding APNS2 notifications: {status.ErrorData.Information}"); + } else { + Debug.Log("Successfully added APNS2 notifications."); + } + }); + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs.meta new file mode 100644 index 00000000..c19b4801 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0287251cb767449a97e32fa43704ac76 +timeCreated: 1751288096 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs index 2f8e1143..10bb6bcd 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs @@ -1,7 +1,10 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using UnityEngine; +using System; public class PushSample { @@ -19,71 +22,17 @@ static void Init() }; // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); - - // snippet.end - } - - // snippet.add_device_to_channel_basic_usage - public class PushNotificationCallback : PNCallback - { - public override void OnResponse(PNPushAddChannelResult result, PNStatus status) - { - if (!status.Error && result != null) - { - Console.WriteLine("Push notifications added to channels successfully."); - } - else - { - Console.WriteLine("Failed to add push notifications: " + pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); - } - } - } - - public static void AddDeviceToChannelBasicUsage() - { - // Configuration - PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) - { - SubscribeKey = "demo", - PublishKey = "demo", - Secure = true - }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); - // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); - - try - { - // For FCM - pubnub.AddPushNotificationsOnChannels() - .PushType(PNPushType.FCM) - .Channels(new string[] { "ch1", "ch2", "ch3" }) - .DeviceId("googleDevice") - .Execute(new PushNotificationCallback()); - } - catch (Exception ex) - { - Console.WriteLine($"FCM operation failed due to error: {ex.Message}"); - } + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - try - { - // For APNS2 - pubnub.AddPushNotificationsOnChannels() - .PushType(PNPushType.APNS2) - .Channels(new string[] { "ch1", "ch2", "ch3" }) - .DeviceId("appleDevice") - .Topic("myapptopic") - .Environment(PushEnvironment.Development) - .Execute(new PushNotificationCallback()); - } - catch (Exception ex) - { - Console.WriteLine($"APNS2 operation failed due to error: {ex.Message}"); - } + // snippet.end } - // snippet.end public static void ListChannelsForDeviceBasicUsage() { @@ -94,7 +43,7 @@ public static void ListChannelsForDeviceBasicUsage() .PushType(PNPushType.FCM) .Execute(new PNPushListProvisionsResultExt((r, s) => { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); })); // for APNS2 @@ -105,7 +54,7 @@ public static void ListChannelsForDeviceBasicUsage() .Environment(PushEnvironment.Development) .Execute(new PNPushListProvisionsResultExt((r, s) => { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); })); // snippet.end } @@ -124,7 +73,7 @@ public static void RemoveDeviceFromChannelBasicUsage() .PushType(PNPushType.FCM) .Execute(new PNPushRemoveChannelResultExt((r, s) => { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); })); // for APNS2 @@ -140,7 +89,7 @@ public static void RemoveDeviceFromChannelBasicUsage() .Environment(PushEnvironment.Development) .Execute(new PNPushRemoveChannelResultExt((r, s) => { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); })); // snippet.end } @@ -153,7 +102,7 @@ public static void RemoveAllPushNotificationsBasicUsage() .DeviceId("googleDevice") .PushType(PNPushType.FCM) .Execute(new PNPushRemoveAllChannelsResultExt((r, s) => { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); })); // for APNS2 @@ -163,8 +112,8 @@ public static void RemoveAllPushNotificationsBasicUsage() .Topic("myapptopic") .Environment(PushEnvironment.Development) .Execute(new PNPushRemoveAllChannelsResultExt((r, s) => { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(r)); })); // snippet.end } -} \ No newline at end of file +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs.meta new file mode 100644 index 00000000..ed910f00 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3a0bb5b5f3ae7f4cb48424e9e051f6a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage.meta b/PubNubUnity/Assets/PubNub/Snippets/Storage.meta new file mode 100644 index 00000000..edcb16b3 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Storage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c34321e2eea32c9429b0f533164ad460 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs b/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs new file mode 100644 index 00000000..f603ef4b --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs @@ -0,0 +1,52 @@ +// snippet.fetch_history_basic_usage +using PubnubApi.Unity; +using UnityEngine; + +public class FetchLastMessageExample : MonoBehaviour { + // Reference to a pubnub manager previously setup in Unity Editor + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + [SerializeField] private PNManagerBehaviour pubnubManager; + + // An editor-serialized string for the channel ID + [SerializeField] private string channelId = "my_channel"; + + private async void Start() { + // Getting a reference to the Pubnub instance + var pubnub = pubnubManager.pubnub; + + // Note that you can also initialize Pubnub instance for Unity directly from code: + /* + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + }; + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + */ + + // Fetching the last message from the specified channel + var fetchHistoryResponse = await pubnub.FetchHistory() + .Channels(new string[] { channelId }) + .IncludeMeta(true) + .MaximumPerChannel(1) // Changed to 1 to specifically get the last message + .IncludeCustomMessageType(true) + .ExecuteAsync(); + + // Checking the result and status of the fetch operation + var fetchResult = fetchHistoryResponse.Result; + var status = fetchHistoryResponse.Status; + + if (status.Error) { + Debug.LogError($"Error fetching history: {status.ErrorData.Information}"); + } else if (fetchResult != null && fetchResult.Messages.ContainsKey(channelId)) { + var messages = fetchResult.Messages[channelId]; + if (messages.Count > 0) { + var lastMessage = messages[0]; + Debug.Log($"Last message: {lastMessage.Entry}, Timetoken: {lastMessage.Timetoken}"); + } else { + Debug.Log("No messages found."); + } + } + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs.meta new file mode 100644 index 00000000..56bad2b9 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 94ee21f242634b37b519bd955009ff38 +timeCreated: 1751286943 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs b/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs index 4adbe8cd..6913e868 100644 --- a/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs +++ b/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs @@ -1,7 +1,12 @@ // snippet.using using PubnubApi; +using PubnubApi.Unity; // snippet.end +using System.Threading.Tasks; +using UnityEngine; +using System; +using System.Threading; public class StorageAndPlaybackSample { @@ -19,40 +24,15 @@ static void Init() }; // Initialize PubNub - Pubnub pubnub = new Pubnub(pnConfiguration); - - // snippet.end - } + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ - public static async Task FetchHistoryBasicUsage() - { - // snippet.fetch_history_basic_usage - try - { - // Fetch historical messages - PNResult fetchHistoryResponse = await pubnub.FetchHistory() - .Channels(new string[] { "my_channel" }) - .IncludeMeta(true) - .IncludeCustomMessageType(true) - .MaximumPerChannel(25) - .ExecuteAsync(); - - PNFetchHistoryResult fetchHistoryResult = fetchHistoryResponse.Result; - PNStatus status = fetchHistoryResponse.Status; - - if (!status.Error && fetchHistoryResult != null) - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(fetchHistoryResult)); - } - else - { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(status)); - } - } - catch (Exception ex) - { - Console.WriteLine($"Request cannot be executed due to error: {ex.Message}"); - } // snippet.end } @@ -85,12 +65,12 @@ public static async Task DeleteMessagesBasicUsage() if (status != null && status.Error) { //Check for any error - Console.WriteLine(status.ErrorData.Information); + Debug.Log(status.ErrorData.Information); } else if (delMsgResult != null) { //Expect empty object - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(delMsgResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(delMsgResult)); } // snippet.end } @@ -106,11 +86,11 @@ public static void DeleteMessagesSynchronous() (result, status) => { if (status != null && status.Error) { //Check for any error - Console.WriteLine(status.ErrorData.Information); + Debug.Log(status.ErrorData.Information); } else if (result != null) { //Expect empty object - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(result)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(result)); } } )); @@ -132,12 +112,12 @@ public static async Task DeleteSpecificMessage() if (status != null && status.Error) { //Check for any error - Console.WriteLine(status.ErrorData.Information); + Debug.Log(status.ErrorData.Information); } else if (delMsgResult != null) { //Expect empty object - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(delMsgResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(delMsgResult)); } // snippet.end } @@ -156,11 +136,11 @@ public static async Task MessageCountsBasicUsage() if (status != null && status.Error) { //Check for any error - Console.WriteLine(status.ErrorData.Information); + Debug.Log(status.ErrorData.Information); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(msgCountResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(msgCountResult)); } // snippet.end } @@ -176,11 +156,11 @@ public static void MessageCountsSynchronous() if (status != null && status.Error) { //Check for any error - Console.WriteLine(status.ErrorData.Information); + Debug.Log(status.ErrorData.Information); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(result)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(result)); } })); // snippet.end @@ -200,11 +180,11 @@ public static async Task MessageCountsMultipleChannels() if (status != null && status.Error) { //Check for any error - Console.WriteLine(status.ErrorData.Information); + Debug.Log(status.ErrorData.Information); } else { - Console.WriteLine(pubnub.JsonPluggableLibrary.SerializeToJsonString(msgCountResult)); + Debug.Log(pubnub.JsonPluggableLibrary.SerializeToJsonString(msgCountResult)); } // snippet.end } @@ -291,7 +271,7 @@ public PubnubRecursiveHistoryFetcher() { // so use your pub/sub keys instead PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")); pnConfiguration.SubscribeKey = "demo"; - pubnub = new Pubnub(pnConfiguration); + pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); } static public void Main() { @@ -320,9 +300,9 @@ public DemoHistoryResult(CallbackSkeleton callback) { } public override void OnResponse(PNHistoryResult result, PNStatus status) { if (!status.Error && result != null && result.Messages != null && result.Messages.Count > 0) { - Console.WriteLine(result.Messages.Count); - Console.WriteLine("start:" + result.StartTimeToken.ToString()); - Console.WriteLine("end:" + result.EndTimeToken.ToString()); + Debug.Log(result.Messages.Count); + Debug.Log("start:" + result.StartTimeToken.ToString()); + Debug.Log("end:" + result.EndTimeToken.ToString()); internalCallback.HandleResponse(result); GetAllMessages(result.EndTimeToken, this.internalCallback); @@ -337,4 +317,4 @@ public override void HandleResponse(PNHistoryResult result) { } } // snippet.end -} \ No newline at end of file +} \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs.meta b/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs.meta new file mode 100644 index 00000000..5bd75c97 --- /dev/null +++ b/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 326889fd92331ce4395c7562bcfb2a6d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 53a6c26981293db6111afc5da9e767ec2fb11f56 Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Mon, 30 Jun 2025 16:01:34 +0200 Subject: [PATCH 03/10] move snippets to be excluded from package export --- PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager.meta | 0 .../{PubNub => }/Snippets/AccessManager/AccessManagerSample.cs | 0 .../Snippets/AccessManager/AccessManagerSample.cs.meta | 0 .../{PubNub => }/Snippets/AccessManager/AccessManagerV2Sample.cs | 0 .../Snippets/AccessManager/AccessManagerV2Sample.cs.meta | 0 .../{PubNub => }/Snippets/AccessManager/GrantTokenExample.cs | 0 .../{PubNub => }/Snippets/AccessManager/GrantTokenExample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/ChannelGroup.meta | 0 .../Snippets/ChannelGroup/AddChannelsToGroupExample.cs | 0 .../Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta | 0 .../{PubNub => }/Snippets/ChannelGroup/ChannelGroupsSample.cs | 0 .../Snippets/ChannelGroup/ChannelGroupsSample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Configuration.meta | 0 .../{PubNub => }/Snippets/Configuration/ConfigurationSample.cs | 0 .../Snippets/Configuration/ConfigurationSample.cs.meta | 0 .../Snippets/Configuration/PubnubConfigurationExample.cs | 0 .../Snippets/Configuration/PubnubConfigurationExample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Entities.meta | 0 .../Assets/{PubNub => }/Snippets/Entities/EntitiesSample.cs | 0 .../Assets/{PubNub => }/Snippets/Entities/EntitiesSample.cs.meta | 0 .../{PubNub => }/Snippets/Entities/GetAllUuidMetadataExample.cs | 0 .../Snippets/Entities/GetAllUuidMetadataExample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Files.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Files/FilesSample.cs | 0 .../Assets/{PubNub => }/Snippets/Files/FilesSample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Files/SendFileExample.cs | 0 .../Assets/{PubNub => }/Snippets/Files/SendFileExample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Logging.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Logging/LoggingSample.cs | 0 .../Assets/{PubNub => }/Snippets/Logging/LoggingSample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/MessageActions.meta | 0 .../Snippets/MessageActions/AddMessageActionExample.cs | 0 .../Snippets/MessageActions/AddMessageActionExample.cs.meta | 0 .../{PubNub => }/Snippets/MessageActions/MessageActionsSample.cs | 0 .../Snippets/MessageActions/MessageActionsSample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Misc.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Misc/MiscSample.cs | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Misc/MiscSample.cs.meta | 0 .../Assets/{PubNub => }/Snippets/Misc/PubnubCleanupExample.cs | 0 .../{PubNub => }/Snippets/Misc/PubnubCleanupExample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Presence.meta | 0 .../Assets/{PubNub => }/Snippets/Presence/HereNowExample.cs | 0 .../Assets/{PubNub => }/Snippets/Presence/HereNowExample.cs.meta | 0 .../Assets/{PubNub => }/Snippets/Presence/PresenceSample.cs | 0 .../Assets/{PubNub => }/Snippets/Presence/PresenceSample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Publish.meta | 0 .../{PubNub => }/Snippets/Publish/PublishSubscribeSample.cs | 0 .../{PubNub => }/Snippets/Publish/PublishSubscribeSample.cs.meta | 0 .../{PubNub => }/Snippets/Publish/PubnubBasicUsageExample.cs | 0 .../{PubNub => }/Snippets/Publish/PubnubBasicUsageExample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Push.meta | 0 .../{PubNub => }/Snippets/Push/AddPushNotificationsExample.cs | 0 .../Snippets/Push/AddPushNotificationsExample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Push/PushSample.cs | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Push/PushSample.cs.meta | 0 PubNubUnity/Assets/{PubNub => }/Snippets/Storage.meta | 0 .../{PubNub => }/Snippets/Storage/FetchLastMessageExample.cs | 0 .../{PubNub => }/Snippets/Storage/FetchLastMessageExample.cs.meta | 0 .../{PubNub => }/Snippets/Storage/StorageAndPlaybackSample.cs | 0 .../Snippets/Storage/StorageAndPlaybackSample.cs.meta | 0 60 files changed, 0 insertions(+), 0 deletions(-) rename PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager/AccessManagerSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager/AccessManagerSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager/AccessManagerV2Sample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager/AccessManagerV2Sample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager/GrantTokenExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/AccessManager/GrantTokenExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/ChannelGroup.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/ChannelGroup/AddChannelsToGroupExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/ChannelGroup/ChannelGroupsSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Configuration.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Configuration/ConfigurationSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Configuration/ConfigurationSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Configuration/PubnubConfigurationExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Configuration/PubnubConfigurationExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Entities.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Entities/EntitiesSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Entities/EntitiesSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Entities/GetAllUuidMetadataExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Entities/GetAllUuidMetadataExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Files.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Files/FilesSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Files/FilesSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Files/SendFileExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Files/SendFileExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Logging.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Logging/LoggingSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Logging/LoggingSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/MessageActions.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/MessageActions/AddMessageActionExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/MessageActions/AddMessageActionExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/MessageActions/MessageActionsSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/MessageActions/MessageActionsSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Misc.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Misc/MiscSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Misc/MiscSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Misc/PubnubCleanupExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Misc/PubnubCleanupExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Presence.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Presence/HereNowExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Presence/HereNowExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Presence/PresenceSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Presence/PresenceSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Publish.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Publish/PublishSubscribeSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Publish/PublishSubscribeSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Publish/PubnubBasicUsageExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Publish/PubnubBasicUsageExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Push.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Push/AddPushNotificationsExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Push/AddPushNotificationsExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Push/PushSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Push/PushSample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Storage.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Storage/FetchLastMessageExample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Storage/FetchLastMessageExample.cs.meta (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Storage/StorageAndPlaybackSample.cs (100%) rename PubNubUnity/Assets/{PubNub => }/Snippets/Storage/StorageAndPlaybackSample.cs.meta (100%) diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager.meta b/PubNubUnity/Assets/Snippets/AccessManager.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/AccessManager.meta rename to PubNubUnity/Assets/Snippets/AccessManager.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs b/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs rename to PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs.meta b/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerSample.cs.meta rename to PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs b/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerV2Sample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs rename to PubNubUnity/Assets/Snippets/AccessManager/AccessManagerV2Sample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs.meta b/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerV2Sample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/AccessManager/AccessManagerV2Sample.cs.meta rename to PubNubUnity/Assets/Snippets/AccessManager/AccessManagerV2Sample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs b/PubNubUnity/Assets/Snippets/AccessManager/GrantTokenExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs rename to PubNubUnity/Assets/Snippets/AccessManager/GrantTokenExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs.meta b/PubNubUnity/Assets/Snippets/AccessManager/GrantTokenExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/AccessManager/GrantTokenExample.cs.meta rename to PubNubUnity/Assets/Snippets/AccessManager/GrantTokenExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup.meta b/PubNubUnity/Assets/Snippets/ChannelGroup.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/ChannelGroup.meta rename to PubNubUnity/Assets/Snippets/ChannelGroup.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs b/PubNubUnity/Assets/Snippets/ChannelGroup/AddChannelsToGroupExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs rename to PubNubUnity/Assets/Snippets/ChannelGroup/AddChannelsToGroupExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta b/PubNubUnity/Assets/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta rename to PubNubUnity/Assets/Snippets/ChannelGroup/AddChannelsToGroupExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs b/PubNubUnity/Assets/Snippets/ChannelGroup/ChannelGroupsSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs rename to PubNubUnity/Assets/Snippets/ChannelGroup/ChannelGroupsSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta b/PubNubUnity/Assets/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta rename to PubNubUnity/Assets/Snippets/ChannelGroup/ChannelGroupsSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration.meta b/PubNubUnity/Assets/Snippets/Configuration.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Configuration.meta rename to PubNubUnity/Assets/Snippets/Configuration.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs b/PubNubUnity/Assets/Snippets/Configuration/ConfigurationSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs rename to PubNubUnity/Assets/Snippets/Configuration/ConfigurationSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs.meta b/PubNubUnity/Assets/Snippets/Configuration/ConfigurationSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Configuration/ConfigurationSample.cs.meta rename to PubNubUnity/Assets/Snippets/Configuration/ConfigurationSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs b/PubNubUnity/Assets/Snippets/Configuration/PubnubConfigurationExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs rename to PubNubUnity/Assets/Snippets/Configuration/PubnubConfigurationExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs.meta b/PubNubUnity/Assets/Snippets/Configuration/PubnubConfigurationExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Configuration/PubnubConfigurationExample.cs.meta rename to PubNubUnity/Assets/Snippets/Configuration/PubnubConfigurationExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities.meta b/PubNubUnity/Assets/Snippets/Entities.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Entities.meta rename to PubNubUnity/Assets/Snippets/Entities.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs b/PubNubUnity/Assets/Snippets/Entities/EntitiesSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs rename to PubNubUnity/Assets/Snippets/Entities/EntitiesSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs.meta b/PubNubUnity/Assets/Snippets/Entities/EntitiesSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Entities/EntitiesSample.cs.meta rename to PubNubUnity/Assets/Snippets/Entities/EntitiesSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs b/PubNubUnity/Assets/Snippets/Entities/GetAllUuidMetadataExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs rename to PubNubUnity/Assets/Snippets/Entities/GetAllUuidMetadataExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs.meta b/PubNubUnity/Assets/Snippets/Entities/GetAllUuidMetadataExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Entities/GetAllUuidMetadataExample.cs.meta rename to PubNubUnity/Assets/Snippets/Entities/GetAllUuidMetadataExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files.meta b/PubNubUnity/Assets/Snippets/Files.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Files.meta rename to PubNubUnity/Assets/Snippets/Files.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs b/PubNubUnity/Assets/Snippets/Files/FilesSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs rename to PubNubUnity/Assets/Snippets/Files/FilesSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs.meta b/PubNubUnity/Assets/Snippets/Files/FilesSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Files/FilesSample.cs.meta rename to PubNubUnity/Assets/Snippets/Files/FilesSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs b/PubNubUnity/Assets/Snippets/Files/SendFileExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs rename to PubNubUnity/Assets/Snippets/Files/SendFileExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs.meta b/PubNubUnity/Assets/Snippets/Files/SendFileExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Files/SendFileExample.cs.meta rename to PubNubUnity/Assets/Snippets/Files/SendFileExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Logging.meta b/PubNubUnity/Assets/Snippets/Logging.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Logging.meta rename to PubNubUnity/Assets/Snippets/Logging.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs b/PubNubUnity/Assets/Snippets/Logging/LoggingSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs rename to PubNubUnity/Assets/Snippets/Logging/LoggingSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs.meta b/PubNubUnity/Assets/Snippets/Logging/LoggingSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Logging/LoggingSample.cs.meta rename to PubNubUnity/Assets/Snippets/Logging/LoggingSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions.meta b/PubNubUnity/Assets/Snippets/MessageActions.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/MessageActions.meta rename to PubNubUnity/Assets/Snippets/MessageActions.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs b/PubNubUnity/Assets/Snippets/MessageActions/AddMessageActionExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs rename to PubNubUnity/Assets/Snippets/MessageActions/AddMessageActionExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs.meta b/PubNubUnity/Assets/Snippets/MessageActions/AddMessageActionExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/MessageActions/AddMessageActionExample.cs.meta rename to PubNubUnity/Assets/Snippets/MessageActions/AddMessageActionExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs b/PubNubUnity/Assets/Snippets/MessageActions/MessageActionsSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs rename to PubNubUnity/Assets/Snippets/MessageActions/MessageActionsSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs.meta b/PubNubUnity/Assets/Snippets/MessageActions/MessageActionsSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/MessageActions/MessageActionsSample.cs.meta rename to PubNubUnity/Assets/Snippets/MessageActions/MessageActionsSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc.meta b/PubNubUnity/Assets/Snippets/Misc.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Misc.meta rename to PubNubUnity/Assets/Snippets/Misc.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs b/PubNubUnity/Assets/Snippets/Misc/MiscSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs rename to PubNubUnity/Assets/Snippets/Misc/MiscSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs.meta b/PubNubUnity/Assets/Snippets/Misc/MiscSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Misc/MiscSample.cs.meta rename to PubNubUnity/Assets/Snippets/Misc/MiscSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs b/PubNubUnity/Assets/Snippets/Misc/PubnubCleanupExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs rename to PubNubUnity/Assets/Snippets/Misc/PubnubCleanupExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs.meta b/PubNubUnity/Assets/Snippets/Misc/PubnubCleanupExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Misc/PubnubCleanupExample.cs.meta rename to PubNubUnity/Assets/Snippets/Misc/PubnubCleanupExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence.meta b/PubNubUnity/Assets/Snippets/Presence.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Presence.meta rename to PubNubUnity/Assets/Snippets/Presence.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs b/PubNubUnity/Assets/Snippets/Presence/HereNowExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs rename to PubNubUnity/Assets/Snippets/Presence/HereNowExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs.meta b/PubNubUnity/Assets/Snippets/Presence/HereNowExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Presence/HereNowExample.cs.meta rename to PubNubUnity/Assets/Snippets/Presence/HereNowExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs b/PubNubUnity/Assets/Snippets/Presence/PresenceSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs rename to PubNubUnity/Assets/Snippets/Presence/PresenceSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs.meta b/PubNubUnity/Assets/Snippets/Presence/PresenceSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Presence/PresenceSample.cs.meta rename to PubNubUnity/Assets/Snippets/Presence/PresenceSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish.meta b/PubNubUnity/Assets/Snippets/Publish.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Publish.meta rename to PubNubUnity/Assets/Snippets/Publish.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs b/PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs rename to PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs.meta b/PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Publish/PublishSubscribeSample.cs.meta rename to PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs b/PubNubUnity/Assets/Snippets/Publish/PubnubBasicUsageExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs rename to PubNubUnity/Assets/Snippets/Publish/PubnubBasicUsageExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs.meta b/PubNubUnity/Assets/Snippets/Publish/PubnubBasicUsageExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Publish/PubnubBasicUsageExample.cs.meta rename to PubNubUnity/Assets/Snippets/Publish/PubnubBasicUsageExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push.meta b/PubNubUnity/Assets/Snippets/Push.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Push.meta rename to PubNubUnity/Assets/Snippets/Push.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs b/PubNubUnity/Assets/Snippets/Push/AddPushNotificationsExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs rename to PubNubUnity/Assets/Snippets/Push/AddPushNotificationsExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs.meta b/PubNubUnity/Assets/Snippets/Push/AddPushNotificationsExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Push/AddPushNotificationsExample.cs.meta rename to PubNubUnity/Assets/Snippets/Push/AddPushNotificationsExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs b/PubNubUnity/Assets/Snippets/Push/PushSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs rename to PubNubUnity/Assets/Snippets/Push/PushSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs.meta b/PubNubUnity/Assets/Snippets/Push/PushSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Push/PushSample.cs.meta rename to PubNubUnity/Assets/Snippets/Push/PushSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage.meta b/PubNubUnity/Assets/Snippets/Storage.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Storage.meta rename to PubNubUnity/Assets/Snippets/Storage.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs b/PubNubUnity/Assets/Snippets/Storage/FetchLastMessageExample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs rename to PubNubUnity/Assets/Snippets/Storage/FetchLastMessageExample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs.meta b/PubNubUnity/Assets/Snippets/Storage/FetchLastMessageExample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Storage/FetchLastMessageExample.cs.meta rename to PubNubUnity/Assets/Snippets/Storage/FetchLastMessageExample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs b/PubNubUnity/Assets/Snippets/Storage/StorageAndPlaybackSample.cs similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs rename to PubNubUnity/Assets/Snippets/Storage/StorageAndPlaybackSample.cs diff --git a/PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs.meta b/PubNubUnity/Assets/Snippets/Storage/StorageAndPlaybackSample.cs.meta similarity index 100% rename from PubNubUnity/Assets/PubNub/Snippets/Storage/StorageAndPlaybackSample.cs.meta rename to PubNubUnity/Assets/Snippets/Storage/StorageAndPlaybackSample.cs.meta From 2013a9ce0c551ecb16f6ea3382b0e2d10742a3a1 Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Thu, 3 Jul 2025 15:15:12 +0200 Subject: [PATCH 04/10] add getting started and entities snippets --- .../GettingStarted/GettingStartedExample.cs | 51 ++++++++ .../GettingStarted/GettingStartedSample.cs | 115 ++++++++++++++++++ .../Publish/PublishSubscribeSample.cs | 42 +++++++ 3 files changed, 208 insertions(+) create mode 100644 PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs create mode 100644 PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs diff --git a/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs new file mode 100644 index 00000000..a1d4d563 --- /dev/null +++ b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs @@ -0,0 +1,51 @@ +// snippet.getting_started_full +using UnityEngine; +using PubnubApi; +using PubnubApi.Unity; + +public class PNManager : PNManagerBehaviour { + // UserId identifies this client. + public string userId; + + private async void Awake() { + if (string.IsNullOrEmpty(userId)) { + // It is recommended to change the UserId to a meaningful value to be able to identify this client. + userId = System.Guid.NewGuid().ToString(); + } + + // Listener example. + listener.onStatus += OnPnStatus; + listener.onMessage += OnPnMessage; + + // Initialize will create a PubNub instance, pass the configuration object, and prepare the listener. + Initialize(userId); + + // Modern API example + Channel channel = pubnub.Channel("TestChannel"); + Subscription subscription = channel.Subscription(); + subscription.Subscribe(); + + // Or legacy subscription example + // pubnub.Subscribe().Channels(new[] { "TestChannel" }).Execute(); + + // Publish example + await pubnub.Publish().Channel("TestChannel").Message("Hello World from Unity!").ExecuteAsync(); + } + + void OnPnStatus(Pubnub pn, PNStatus status) { + Debug.Log(status.Category == PNStatusCategory.PNConnectedCategory ? "Connected" : "Not connected"); + } + + void OnPnMessage(Pubnub pn, PNMessageResult result) { + Debug.Log($"Message received: {result.Message}"); + } + + protected override void OnDestroy() { + // Use OnDestroy to clean up, e.g. unsubscribe from listeners. + listener.onStatus -= OnPnStatus; + listener.onMessage -= OnPnMessage; + + base.OnDestroy(); + } +} +// snippet.end \ No newline at end of file diff --git a/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs new file mode 100644 index 00000000..d82bfd4c --- /dev/null +++ b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs @@ -0,0 +1,115 @@ +// snippet.using +using PubnubApi; +using PubnubApi.Unity; +using UnityEngine; + +// snippet.end + +public class GettingStartedSample { + + private static Pubnub pubnub; + + static void Init() + { + // snippet.pubnub_init + // Configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Initialize PubNub + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // If you're using Unity Editor setup you can get the Pubnub instance from PNManagerBehaviour + // For more details, see https://www.pubnub.com/docs/sdks/unity#configure-pubnub + /* + [SerializeField] private PNManagerBehaviour pubnubManager; + Pubnub pubnub = pubnubManager.pubnub; + */ + + // snippet.end + } + + static void InitProgramatically() + { + // snippet.init_code + // Initialize PubNub using the configuration + PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) + { + SubscribeKey = "demo", + PublishKey = "demo", + Secure = true + }; + + // Create the PubNub instance with the configuration + Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); + + // You can also initializa a "raw" pubnub instance but would have to then setup all Unity-specific functionality by yourself + Pubnub rawPubnub = new Pubnub(pnConfiguration); + // snippet.end + } + + static void AddListeners() { + PNManagerBehaviour pnManagerBehaviour = null; + + // snippet.add_listeners + // Get the listener from a PNManagerBehaviour: + var listener = pnManagerBehaviour.listener; + // Alternatively, create your own and add it to the Pubnub instance: + var createdListener = new SubscribeCallbackListener(); + pubnub.AddListener(createdListener); + + // Add callbacks + listener.onStatus += OnPnStatus; + listener.onMessage += OnPnMessage; + + // Status event handler + void OnPnStatus(Pubnub pn, PNStatus status) { + Debug.Log(status.Category == PNStatusCategory.PNConnectedCategory ? "Connected" : "Not connected"); + } + + // Message event handler + void OnPnMessage(Pubnub pn, PNMessageResult result) { + Debug.Log($"Message received: {result.Message}"); + } + // snippet.end + } + + static void CreateSubscription() { + // snippet.create_subscription + // Subscribe to a channel using modern API + Channel channel = pubnub.Channel("TestChannel"); + Subscription subscription = channel.Subscription(); + subscription.Subscribe(); + + // Or using the legacy API + pubnub.Subscribe().Channels(new[] { "TestChannel" }).Execute(); + // snippet.end + } + + static async void PublishMessages() { + Transform transform = null; + // snippet.publish_messages + // Publish a simple message + await pubnub.Publish().Channel("TestChannel").Message("Hello World from Unity!").ExecuteAsync(); + + // Publish a Unity object using the GetJsonSafe extension method for handling circular references + await pubnub.Publish().Channel("TestChannel").Message(transform.position.GetJsonSafe()).ExecuteAsync(); + + // Using a callback instead of async/await + pubnub.Publish() + .Channel("TestChannel") + .Message("Hello World from Unity!") + .Execute((result, status) => { + if (!status.Error) { + Debug.Log("Message sent successfully!"); + } else { + Debug.LogError("Failed to send message: " + status.ErrorData.Information); + } + }); + // snippet.end + } +} diff --git a/PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs b/PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs index 49b03f65..329ab04a 100644 --- a/PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs +++ b/PubNubUnity/Assets/Snippets/Publish/PublishSubscribeSample.cs @@ -918,4 +918,46 @@ public static void UnsubscribeAllNewBasicUsage() pubnub.UnsubscribeAll(); // snippet.end } + + public static void Entities() { + // snippet.create_channel + var channel = pubnub.Channel("channelName"); + + // Listener to add relevant callbacks to + SubscribeCallbackListener channelListener = new SubscribeCallbackListener(); + + channel.Subscription().AddListener(channelListener); + channel.Subscription().Subscribe(); + // snippet.end + + // snippet.create_channel_group + var channelGroup = pubnub.ChannelGroup("channelGroupName"); + + // Listener to add relevant callbacks to + SubscribeCallbackListener channelGroupListener = new SubscribeCallbackListener(); + + channelGroup.Subscription().AddListener(channelGroupListener); + channelGroup.Subscription().Subscribe(); + // snippet.end + + // snippet.create_channel_metadata + var channelMetadata = pubnub.ChannelMetadata("channelMetadata"); + + // Listener to add relevant callbacks to + SubscribeCallbackListener channelMetadataListener = new SubscribeCallbackListener(); + + channelMetadata.Subscription().AddListener(channelMetadataListener); + channelMetadata.Subscription().Subscribe(); + // snippet.end + + // snippet.create_user_metadata + var userMetadata = pubnub.UserMetadata("userMetadata"); + + // Listener to add relevant callbacks to + SubscribeCallbackListener userMetadataListener = new SubscribeCallbackListener(); + + userMetadata.Subscription().AddListener(userMetadataListener); + userMetadata.Subscription().Subscribe(); + // snippet.end + } } \ No newline at end of file From 912c2e97d065747b59aadddcfb72e22c435d6577 Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Mon, 7 Jul 2025 15:37:22 +0200 Subject: [PATCH 05/10] import latest C# DLL --- .../Assets/PubNub/Runtime/Plugins/CBOR.dll | Bin 194048 -> 0 bytes .../PubNub/Runtime/Plugins/CBOR.dll.meta | 75 - .../Assets/PubNub/Runtime/Plugins/CBOR.xml | 6997 -------- .../PubNub/Runtime/Plugins/CBOR.xml.meta | 7 - .../Assets/PubNub/Runtime/Plugins/Numbers.dll | Bin 295936 -> 0 bytes .../PubNub/Runtime/Plugins/Numbers.dll.meta | 33 - .../Assets/PubNub/Runtime/Plugins/Numbers.xml | 13500 ---------------- .../PubNub/Runtime/Plugins/PubnubApiUnity.dll | Bin 831488 -> 835584 bytes .../PubNub/Runtime/Plugins/PubnubApiUnity.xml | 41 + .../PubNub/Runtime/Plugins/URIUtility.dll | Bin 18432 -> 0 bytes .../Runtime/Plugins/URIUtility.dll.meta | 33 - .../PubNub/Runtime/Plugins/URIUtility.xml | 378 - PubNubUnity/Assets/PubNub/Snippets.meta | 3 - .../Numbers.xml.meta => Snippets.meta} | 5 +- .../GettingStarted.meta} | 5 +- .../GettingStartedExample.cs.meta | 11 + .../GettingStartedSample.cs.meta | 11 + 17 files changed, 69 insertions(+), 21030 deletions(-) delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.dll delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.dll.meta delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml.meta delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.dll delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.dll.meta delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.xml delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.dll delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.dll.meta delete mode 100644 PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.xml delete mode 100644 PubNubUnity/Assets/PubNub/Snippets.meta rename PubNubUnity/Assets/{PubNub/Runtime/Plugins/Numbers.xml.meta => Snippets.meta} (57%) rename PubNubUnity/Assets/{PubNub/Runtime/Plugins/URIUtility.xml.meta => Snippets/GettingStarted.meta} (57%) create mode 100644 PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs.meta create mode 100644 PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs.meta diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.dll b/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.dll deleted file mode 100644 index 5c06bec88c01633f78067fc83397cd214bb9964b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194048 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 diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.dll.meta b/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.dll.meta deleted file mode 100644 index 241c4736..00000000 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.dll.meta +++ /dev/null @@ -1,75 +0,0 @@ -fileFormatVersion: 2 -guid: abe26334fe762df46893ffc1cf8e4a18 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - : Any - second: - enabled: 0 - settings: - Exclude Editor: 0 - Exclude Linux64: 0 - Exclude OSXUniversal: 0 - Exclude WebGL: 0 - Exclude Win: 0 - Exclude Win64: 0 - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 1 - settings: - CPU: AnyCPU - DefaultValueInitialized: true - OS: AnyOS - - first: - Standalone: Linux64 - second: - enabled: 1 - settings: - CPU: AnyCPU - - first: - Standalone: OSXUniversal - second: - enabled: 1 - settings: - CPU: None - - first: - Standalone: Win - second: - enabled: 1 - settings: - CPU: x86 - - first: - Standalone: Win64 - second: - enabled: 1 - settings: - CPU: x86_64 - - first: - WebGL: WebGL - second: - enabled: 1 - settings: {} - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml b/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml deleted file mode 100644 index 04e7285d..00000000 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml +++ /dev/null @@ -1,6997 +0,0 @@ - - - - CBOR - - - - Contains methods useful for reading and writing data, with - a focus on CBOR. - - - Parses a number whose format follows the JSON - specification. The method uses a JSONOptions with all default - properties except for a PreserveNegativeZero property of - false. - A text string to parse as a JSON number. - A CBOR object that represents the parsed number. Returns - positive zero if the number is a zero that starts with a minus sign - (such as "-0" or "-0.0"). Returns null if the parsing fails, - including if the string is null or empty. - - - Parses a number whose format follows the JSON - specification (RFC 8259). The method uses a JSONOptions with all - default properties except for a PreserveNegativeZero property of - false. - A text string to parse as a JSON number. - If true, no decimal points or exponents - are allowed in the string. The default is false. - If true, only positive numbers are - allowed (the leading minus is disallowed). The default is - false. - A CBOR object that represents the parsed number. Returns - positive zero if the number is a zero that starts with a minus sign - (such as "-0" or "-0.0"). Returns null if the parsing fails, - including if the string is null or empty. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A text string representing - a valid JSON number is not allowed to contain white space - characters, including spaces. - - - Parses a number whose format follows the JSON - specification (RFC 8259). - A text string to parse as a JSON number. - If true, no decimal points or exponents - are allowed in the string. The default is false. - If true, the leading minus is disallowed - in the string. The default is false. - If true, returns positive zero - if the number is a zero that starts with a minus sign (such as "-0" - or "-0.0"). Otherwise, returns negative zero in this case. The - default is false. - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the string is null or - empty. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A text string representing - a valid JSON number is not allowed to contain white space - characters, including spaces. - - - Parses a number whose format follows the JSON - specification (RFC 8259) and converts that number to a CBOR - object. - A text string to parse as a JSON number. - An object containing options to control how - JSON numbers are decoded to CBOR objects. Can be null, in which - case a JSONOptions object with all default properties is used - instead. - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the string is null or - empty. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A text string representing - a valid JSON number is not allowed to contain white space - characters, including spaces. - - - Parses a number whose format follows the JSON - specification (RFC 8259) from a portion of a text string, and - converts that number to a CBOR object. - A text string containing the portion to parse as - a JSON number. - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the string is null or - empty. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - The parameter is null. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A text string representing - a valid JSON number is not allowed to contain white space - characters, including spaces. - - - Parses a number whose format follows the JSON - specification (RFC 8259) and converts that number to a CBOR - object. - A text string to parse as a JSON number. - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An object containing options to control how - JSON numbers are decoded to CBOR objects. Can be null, in which - case a JSONOptions object with all default properties is used - instead. - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the string is null or empty - or is 0 or less. - The parameter is null. - Unsupported conversion - kind. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A text string representing - a valid JSON number is not allowed to contain white space - characters, including spaces. - - - Parses a number from a byte sequence whose format follows - the JSON specification (RFC 8259) and converts that number to a - CBOR object. - A sequence of bytes to parse as a JSON - number. - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An object containing options to control how - JSON numbers are decoded to CBOR objects. Can be null, in which - case a JSONOptions object with all default properties is used - instead. - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the byte sequence is null - or empty or is 0 or less. - The parameter is null. - Unsupported conversion - kind. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A byte sequence - representing a valid JSON number is not allowed to contain white - space characters, including spaces. - - - Parses a number from a byte sequence whose format follows - the JSON specification (RFC 8259) and converts that number to a - CBOR object. - A sequence of bytes to parse as a JSON - number. - An object containing options to control how - JSON numbers are decoded to CBOR objects. Can be null, in which - case a JSONOptions object with all default properties is used - instead. - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the byte sequence is null - or empty. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A byte sequence - representing a valid JSON number is not allowed to contain white - space characters, including spaces. - - - Parses a number whose format follows the JSON - specification (RFC 8259) from a portion of a byte sequence, and - converts that number to a CBOR object. - A sequence of bytes to parse as a JSON - number. - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the byte sequence is null - or empty. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - The parameter is null. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A byte sequence - representing a valid JSON number is not allowed to contain white - space characters, including spaces. - - - Parses a number from a byte sequence whose format follows - the JSON specification. The method uses a JSONOptions with all - default properties except for a PreserveNegativeZero property of - false. - A byte sequence to parse as a JSON - number. - A CBOR object that represents the parsed number. Returns - positive zero if the number is a zero that starts with a minus sign - (such as "-0" or "-0.0"). Returns null if the parsing fails, - including if the byte sequence is null or empty. - - - Parses a number from a sequence of char s whose - format follows the JSON specification (RFC 8259) and converts that - number to a CBOR object. - A sequence of char s to parse as a JSON - number. - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An object containing options to control how - JSON numbers are decoded to CBOR objects. Can be null, in which - case a JSONOptions object with all default properties is used - instead. - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the sequence of char - s is null or empty or is 0 or - less. - The parameter is null. - Unsupported conversion - kind. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A sequence of char - s representing a valid JSON number is not allowed to contain white - space characters, including spaces. - - - Parses a number from a sequence of char s whose - format follows the JSON specification (RFC 8259) and converts that - number to a CBOR object. - A sequence of char s to parse as a JSON - number. - An object containing options to control how - JSON numbers are decoded to CBOR objects. Can be null, in which - case a JSONOptions object with all default properties is used - instead. - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the sequence of char - s is null or empty. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A sequence of char - s representing a valid JSON number is not allowed to contain white - space characters, including spaces. - - - Parses a number whose format follows the JSON - specification (RFC 8259) from a portion of a sequence of - char s, and converts that number to a CBOR object. - A sequence of char s to parse as a JSON - number. - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - A CBOR object that represents the parsed number. Returns - null if the parsing fails, including if the sequence of char - s is null or empty. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - The parameter is null. - Roughly speaking, a valid JSON number consists of an - optional minus sign, one or more basic digits (starting with 1 to 9 - unless there is only one digit and that digit is 0), an optional - decimal point (".", full stop) with one or more basic digits, and - an optional letter E or e with an optional plus or minus sign and - one or more basic digits (the exponent). A sequence of char - s representing a valid JSON number is not allowed to contain white - space characters, including spaces. - - - Parses a number from a sequence of char s whose - format follows the JSON specification. The method uses a - JSONOptions with all default properties except for a - PreserveNegativeZero property of false. - A sequence of char s to parse as a JSON - number. - A CBOR object that represents the parsed number. Returns - positive zero if the number is a zero that starts with a minus sign - (such as "-0" or "-0.0"). Returns null if the parsing fails, - including if the sequence of char s is null or - empty. - - - - A class for converting date-time objects to and from tagged - CBOR objects. - In this class's documentation, the "number of seconds since - the start of 1970" is based on the POSIX definition of "seconds - since the Epoch", a definition that does not count leap seconds. - This number of seconds assumes the use of a proleptic Gregorian - calendar, in which the rules regarding the number of days in each - month and which years are leap years are the same for all years as - they were in 1970 (including without regard to time zone - differences or transitions from other calendars to the - Gregorian). - - - A converter object where FromCBORObject accepts CBOR - objects with tag 0 (date/time strings) and tag 1 (number of seconds - since the start of 1970), and ToCBORObject converts date/time - objects (DateTime in DotNet, and Date in Java) to CBOR objects of - tag 0. - - - A converter object where FromCBORObject accepts CBOR - objects with tag 0 (date/time strings) and tag 1 (number of seconds - since the start of 1970), and ToCBORObject converts date/time - objects (DateTime in DotNet, and Date in Java) to CBOR objects of - tag 1. The ToCBORObject conversion is lossless only if the number - of seconds since the start of 1970 can be represented exactly as an - integer in the interval [-(2^64), 2^64 - 1] or as a 64-bit - floating-point number in the IEEE 754r binary64 format; the - conversion is lossy otherwise. The ToCBORObject conversion will - throw an exception if the conversion to binary64 results in - positive infinity, negative infinity, or not-a-number. - - - A converter object where FromCBORObject accepts untagged - CBOR integer or CBOR floating-point objects that give the number of - seconds since the start of 1970, and where ToCBORObject converts - date/time objects (DateTime in DotNet, and Date in Java) to such - untagged CBOR objects. The ToCBORObject conversion is lossless only - if the number of seconds since the start of 1970 can be represented - exactly as an integer in the interval [-(2^64), 2^64 - 1] or as a - 64-bit floating-point number in the IEEE 754r binary64 format; the - conversion is lossy otherwise. The ToCBORObject conversion will - throw an exception if the conversion to binary64 results in - positive infinity, negative infinity, or not-a-number. - - - Conversion type for date-time conversion. - - - FromCBORObject accepts CBOR objects with tag 0 (date/time - strings) and tag 1 (number of seconds since the start of 1970), and - ToCBORObject converts date/time objects to CBOR objects of tag - 0. - - - FromCBORObject accepts objects with tag 0 (date/time - strings) and tag 1 (number of seconds since the start of 1970), and - ToCBORObject converts date/time objects to CBOR objects of tag 1. - The ToCBORObject conversion is lossless only if the number of - seconds since the start of 1970 can be represented exactly as an - integer in the interval [-(2^64), 2^64 - 1] or as a 64-bit - floating-point number in the IEEE 754r binary64 format; the - conversion is lossy otherwise. The ToCBORObject conversion will - throw an exception if the conversion to binary64 results in - positive infinity, negative infinity, or not-a-number. - - - FromCBORObject accepts untagged CBOR integer or CBOR - floating-point objects that give the number of seconds since the - start of 1970, and ToCBORObject converts date/time objects - (DateTime in DotNet, and Date in Java) to such untagged CBOR - objects. The ToCBORObject conversion is lossless only if the number - of seconds since the start of 1970 can be represented exactly as an - integer in the interval [-(2^64), 2^64 - 1] or as a 64-bit - floating-point number in the IEEE 754r binary64 format; the - conversion is lossy otherwise. The ToCBORObject conversion will - throw an exception if the conversion to binary64 results in - positive infinity, negative infinity, or not-a-number. - - - Initializes a new instance of the - class. - - - Gets the conversion type for this date - converter. - The conversion type for this date converter. - - - Initializes a new instance of the - class. - Conversion type giving the rules for - converting dates and times to and from CBOR objects. - - - Converts a CBOR object to a DateTime (in DotNet) or a Date - (in Java). - A CBOR object that specifies a date/time - according to the conversion type used to create this date - converter. - A DateTime or Date that encodes the date/time specified in - the CBOR object. - The parameter is null. - The format of the CBOR - object is not supported, or another error occurred in - conversion. - - - Tries to extract the fields of a date and time in the form - of a CBOR object. - A CBOR object that specifies a date/time - according to the conversion type used to create this date - converter. - An array whose first element will store the - year. The array's length must be 1 or greater. If this function - fails, the first element is set to null. - An array that will store the fields - (other than the year) of the date and time. The array's length must - be 7 or greater. If this function fails, the first seven elements - are set to 0. If this method is successful, the first seven - elements of the array (starting at 0) will be as follows: - - 0 - Month of the year, from 1 (January) through 12 - (December). - 1 - Day of the month, from 1 through 31. - 2 - Hour of the day, from 0 through 23. - 3 - Minute of the hour, from 0 through 59. - 4 - Second of the minute, from 0 through 59. - 5 - Fractional seconds, expressed in nanoseconds. This value - cannot be less than 0 and must be less than 1000*1000*1000. - 6 - Number of minutes to subtract from this date and time to - get global time. This number can be positive or negative, but - cannot be less than -1439 or greater than 1439. For tags 0 and 1, - this value is always 0.. - Either true if the method is successful, or - false otherwise. - The parameter or is null, or - contains fewer elements than required. - - - Converts a date/time in the form of a year, month, and day - to a CBOR object. The hour, minute, and second are treated as - 00:00:00 by this method, and the time offset is treated as 0 by - this method. - The year. - Month of the year, from 1 (January) through 12 - (December). - Day of the month, from 1 through 31. - A CBOR object encoding the given date fields according to - the conversion type used to create this date converter. - An error occurred in - conversion. - - - Converts a date/time in the form of a year, month, day, - hour, minute, and second to a CBOR object. The time offset is - treated as 0 by this method. - The year. - Month of the year, from 1 (January) through 12 - (December). - Day of the month, from 1 through 31. - Hour of the day, from 0 through 23. - Minute of the hour, from 0 through 59. - Second of the minute, from 0 through - 59. - A CBOR object encoding the given date fields according to - the conversion type used to create this date converter. - An error occurred in - conversion. - - - Converts a date/time in the form of a year, month, day, - hour, minute, second, fractional seconds, and time offset to a CBOR - object. - The year. - An array that will store the fields - (other than the year) of the date and time. See the - TryGetDateTimeFields method for information on the "lesserFields" - parameter. - A CBOR object encoding the given date fields according to - the conversion type used to create this date converter. - The parameter is null. - An error occurred in - conversion. - - - Converts a date/time in the form of a year, month, day, - hour, minute, second, fractional seconds, and time offset to a CBOR - object. - The year. - An array that will store the fields - (other than the year) of the date and time. See the - TryGetDateTimeFields method for information on the "lesserFields" - parameter. - A CBOR object encoding the given date fields according to - the conversion type used to create this date converter. - The parameter or is - null. - An error occurred in - conversion. - - - Converts a DateTime (in DotNet) or Date (in Java) to a - CBOR object in a manner specified by this converter's conversion - type. - The parameter is a - DateTime object. - A CBOR object encoding the date/time in the DateTime or - Date according to the conversion type used to create this date - converter. - An error occurred in - conversion. - - - Tries to extract the fields of a date and time in the form - of a CBOR object. - A CBOR object that specifies a date/time - according to the conversion type used to create this date - converter. - Will store the year. If this function fails, the - year is set to null. - An array that will store the fields - (other than the year) of the date and time. The array's length must - be 7 or greater. If this function fails, the first seven elements - are set to 0. For more information, see the (EInteger[], int) - overload of this method. - Either true if the method is successful, or - false otherwise. - - - Specifies options for encoding and decoding CBOR - objects. - - - Default options for CBOR objects. Disallow duplicate keys, - and always encode strings using definite-length encoding. - - - Default options for CBOR objects serialized using the - CTAP2 canonicalization (used in Web Authentication, among other - specifications). Disallow duplicate keys, and always encode strings - using definite-length encoding. - - - Initializes a new instance of the - class with all the - default options. - - - Initializes a new instance of the - class. - A value indicating whether to - always encode strings with a definite-length encoding. - A value indicating whether to - disallow duplicate keys when reading CBOR objects from a data - stream. - - - Initializes a new instance of the - class. - A value indicating whether to - encode strings with a definite-length encoding in certain - cases. - A value indicating whether to - allow duplicate keys when reading CBOR objects from a data - stream. - A value indicating whether CBOR - objects are written out using the CTAP2 canonical CBOR encoding - form, which is useful for implementing Web Authentication. - - - Initializes a new instance of the - class. - A string setting forth the options to - use. This is a semicolon-separated list of options, each of which - has a key and a value separated by an equal sign ("="). Whitespace - and line separators are not allowed to appear between the - semicolons or between the equal signs, nor may the string begin or - end with whitespace. The string can be empty, but cannot be null. - The following is an example of this parameter: - allowduplicatekeys=true;ctap2Canonical=true. The key can be - any one of the following where the letters can be any combination - of basic upper-case and/or basic lower-case letters: - allowduplicatekeys, ctap2canonical, - resolvereferences, useindeflengthstrings, - allowempty, float64, keepkeyorder. Keys - other than these are ignored in this version of the CBOR library. - The key float64 was introduced in version 4.4 of this - library. The key keepkeyorder was introduced in version 4.5 - of this library.(Keys are compared using a basic case-insensitive - comparison, in which two strings are equal if they match after - converting the basic upper-case letters A to Z (U+0041 to U+005A) - in both strings to basic lower-case letters.) If two or more - key/value pairs have equal keys (in a basic case-insensitive - comparison), the value given for the last such key is used. The - four keys just given can have a value of 1, true, - yes, or on (where the letters can be any combination - of basic upper-case and/or basic lower-case letters), which means - true, and any other value meaning false. For example, - allowduplicatekeys=Yes and allowduplicatekeys=1 both - set the AllowDuplicateKeys property to true. In the future, - this class may allow other keys to store other kinds of values, not - just true or false. - The parameter is null. - - - Gets the values of this options object's properties in - text form. - A text string containing the values of this options - object's properties. The format of the string is the same as the - one described in the String constructor for this class. - - - Gets a value indicating whether to resolve references to - sharable objects and sharable strings in the process of decoding a - CBOR object. Enabling this property, however, can cause a security - risk if a decoded CBOR object is then re-encoded. - A value indicating whether to resolve references to sharable - objects and sharable strings. The default is false. - - About sharable objects and references - Sharable objects are marked with tag 28, and references to - those objects are marked with tag 29 (where a reference of 0 means - the first sharable object in the CBOR stream, a reference of 1 - means the second, and so on). Sharable strings (byte strings and - text strings) appear within an enclosing object marked with tag - 256, and references to them are marked with tag 25; in general, a - string is sharable only if storing its reference rather than the - string would save space. - Note that unlike most other tags, these tags generally care - about the relative order in which objects appear in a CBOR stream; - thus they are not interoperable with CBOR implementations that - follow the generic CBOR data model (since they may list map keys in - an unspecified order). Interoperability problems with these tags - can be reduced by not using them to mark keys or values of a map or - to mark objects within those keys or values. - Security Note - When this property is enabled and a decoded CBOR object - contains references to sharable CBOR objects within it, those - references will be replaced with the sharable objects they refer to - (but without making a copy of those objects). However, if shared - references are deeply nested and used multiple times, these - references can result in a CBOR object that is orders of magnitude - bigger than if shared references weren't resolved, and this can - cause a denial of service when the decoded CBOR object is then - serialized (e.g., with EncodeToBytes(), ToString(), - ToJSONString(), or WriteTo ), because object - references are expanded in the process. - For example, the following object in CBOR diagnostic - notation, [28(["xxx", "yyy"]), 28([29(0), 29(0), 29(0)]), - 28([29(1), 29(1)]), 28([29(2), 29(2)]), 28([29(3), 29(3)]), - 28([29(4), 29(4)]), 28([29(5), 29(5)])], expands to a CBOR - object with a serialized size of about 1831 bytes when this - property is enabled, as opposed to about 69 bytes when this - property is disabled. - One way to mitigate security issues with this property is to - limit the maximum supported size a CBORObject can have once - serialized to CBOR or JSON. This can be done by passing a so-called - "limited memory stream" to the WriteTo or WriteJSONTo - methods when serializing the object to JSON or CBOR. A "limited - memory stream" is a Stream (or OutputStream in Java) - that throws an exception if it would write more bytes than a given - maximum size or would seek past that size. (See the documentation - for CBORObject.WriteTo or CBORObject.WriteJSONTo for - example code.) Another mitigation is to check the CBOR object's - type before serializing it, since only arrays and maps can have the - security problem described here, or to check the maximum nesting - depth of a CBOR array or map before serializing - it. - - - Gets a value indicating whether to encode strings with an - indefinite-length encoding under certain circumstances. - A value indicating whether to encode strings with an - indefinite-length encoding under certain circumstances. The default - is false. - - - Gets a value indicating whether to preserve the order in - which a CBOR map's keys appear when decoding a CBOR object, by - using maps created as though by CBORObject.NewOrderedMap. If false, - key order is not guaranteed to be preserved when decoding - CBOR. - A value indicating whether to preserve the order in which a - CBOR map's keys appear when decoding a CBOR object. The default is - false. - - - Gets a value indicating whether decoding a CBOR object - will return null instead of a CBOR object if the stream has - no content or the end of the stream is reached before decoding - begins. Used only when decoding CBOR objects. - A value indicating whether decoding a CBOR object will - return null instead of a CBOR object if the stream has no - content or the end of the stream is reached before decoding begins. - The default is false. - - - Gets a value indicating whether to allow duplicate keys - when reading CBOR objects from a data stream. Used only when - decoding CBOR objects. If this property is true and a CBOR - map has two or more values with the same key, the last value of - that key set forth in the CBOR map is taken. - A value indicating whether to allow duplicate keys when - reading CBOR objects from a data stream. The default is - false. - - - Gets a value indicating whether to encode floating-point - numbers in a CBOR object in their 64-bit encoding form regardless - of whether their value can be encoded without loss in a smaller - form. Used only when encoding CBOR objects. - Gets a value indicating whether to encode floating-point - numbers in a CBOR object in their 64-bit encoding form regardless - of whether their value can be encoded without loss in a smaller - form. Used only when encoding CBOR objects. The default is - false. - - - Gets a value indicating whether CBOR objects: - - When encoding, are written out using the CTAP2 canonical CBOR - encoding form, which is useful for implementing Web Authentication - (WebAuthn). - When decoding, are checked for compliance with the CTAP2 - canonical encoding form. In this form, CBOR tags are - not used, map keys are written out in a canonical order, a maximum - depth of four levels of arrays and/or maps is allowed, duplicate - map keys are not allowed when decoding, and floating-point numbers - are written out in their 64-bit encoding form regardless of whether - their value can be encoded without loss in a smaller form. This - implementation allows CBOR objects whose canonical form exceeds - 1024 bytes, the default maximum size for CBOR objects in that form - according to the FIDO Client-to-Authenticator Protocol 2 - specification. - true if CBOR objects are written out using the CTAP2 - canonical CBOR encoding form; otherwise, false. The default - is false. - - - Exception thrown for errors involving CBOR data. - This library may throw exceptions of this type in certain - cases, notably when errors occur, and may supply messages to those - exceptions (the message can be accessed through the Message - property in.NET or the getMessage() method in Java). These - messages are intended to be read by humans to help diagnose the - error (or other cause of the exception); they are not intended to - be parsed by computer programs, and the exact text of the messages - may change at any time between versions of this - library. - - - Initializes a new instance of the - class. - - - Initializes a new instance of the - class. - The parameter is a - text string. - - - Initializes a new instance of the - class. Uses the given - message and inner exception. - The parameter is a - text string. - The parameter is an Exception object. - - - An instance of a number that CBOR or certain CBOR tags can - represent. For this purpose, infinities and not-a-number or NaN - values are considered numbers. Currently, this class can store one - of the following kinds of numbers: 64-bit signed integers or binary - floating-point numbers; or arbitrary-precision integers, decimal - numbers, binary numbers, or rational numbers. - - - Specifies the underlying form of this CBOR number - object. - - - A 64-bit signed integer. - - - A 64-bit binary floating-point number. - - - An arbitrary-precision integer. - - - An arbitrary-precision decimal number. - - - An arbitrary-precision binary number. - - - An arbitrary-precision rational number. - - - Converts this object's value to a CBOR object. - A CBOR object that stores this object's value. - - - Gets this value's sign: -1 if nonzero and negative; 1 if - nonzero and positive; 0 if zero. Not-a-number (NaN) values are - positive or negative depending on what sign is stored in their - underlying forms. - This value's sign. - - - Creates a CBOR number object from a CBOR object - representing a number (that is, one for which the IsNumber property - in.NET or the isNumber() method in Java returns true). - The parameter is a CBOR object representing a - number. - A CBOR number object, or null if the given CBOR object is - null or does not represent a number. - - - Gets the underlying form of this CBOR number - object. - The underlying form of this CBOR number object. - - - Returns whether this object's value, converted to an - integer by discarding its fractional part, would be -(2^31) or - greater, and less than 2^31. - true if this object's value, converted to an - integer by discarding its fractional part, would be -(2^31) or - greater, and less than 2^31; otherwise, false. - - - Returns whether this object's value, converted to an - integer by discarding its fractional part, would be -(2^63) or - greater, and less than 2^63. - true if this object's value, converted to an - integer by discarding its fractional part, would be -(2^63) or - greater, and less than 2^63; otherwise, false. - - - Returns whether this object's value, converted to an - integer by discarding its fractional part, would be 0 or greater, - and less than 2^64. - true if this object's value, converted to an - integer by discarding its fractional part, would be 0 or greater, - and less than 2^64; otherwise, false. - - - Returns whether this object's value can be converted to a - 32-bit floating point number without its value being rounded to - another numerical value. - true if this object's value can be converted to a - 32-bit floating point number without its value being rounded to - another numerical value, or if this is a not-a-number value, even - if the value's diagnostic information can' t fit in a 32-bit - floating point number; otherwise, false. - - - Returns whether this object's value can be converted to a - 64-bit floating point number without its value being rounded to - another numerical value. - true if this object's value can be converted to a - 64-bit floating point number without its value being rounded to - another numerical value, or if this is a not-a-number value, even - if the value's diagnostic information can't fit in a 64-bit - floating point number; otherwise, false. - - - Gets a value indicating whether this CBOR object - represents a finite number. - true if this CBOR object represents a finite - number; otherwise, false. - - - Gets a value indicating whether this object represents an - integer number, that is, a number without a fractional part. - Infinity and not-a-number are not considered integers. - true if this object represents an integer number, - that is, a number without a fractional part; otherwise, - false. - - - Gets a value indicating whether this object is a negative - number. - true if this object is a negative number; - otherwise, false. - - - Gets a value indicating whether this object's value equals - 0. - true if this object's value equals 0; otherwise, - false. - - - Converts this object to an arbitrary-precision integer. - See the ToObject overload taking a type for more - information. - The closest arbitrary-precision integer to this - object. - This value is infinity or - not-a-number. - - - Converts this object to an arbitrary-precision integer if - its value is an integer. - The arbitrary-precision integer given by object. - This value is infinity or - not-a-number or is not an exact integer. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a byte (from 0 to - 255). - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 255. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a byte (from 0 to 255). - This number, converted to a byte (from 0 to 255). Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) without rounding to a - different numerical value. - This number's value as a byte (from 0 to 255). - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 255. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - decimal number. - The number to convert as a byte (from 0 to - 255). - This number's value as an arbitrary-precision decimal - number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 16-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -32768 or greater than - 32767. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit signed integer. - This number, converted to a 16-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer without rounding to a - different numerical value. - This number's value as a 16-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -32768 or - greater than 32767. - - - Converts a 16-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as a 16-bit signed - integer. - This number's value as an arbitrary-precision decimal - number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -2147483648 or greater - than 2147483647. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -2147483648 - or greater than 2147483647. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 64-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -9223372036854775808 - or greater than 9223372036854775807. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit signed integer. - This number, converted to a 64-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer without rounding to a - different numerical value. - This number's value as a 64-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than - -9223372036854775808 or greater than - 9223372036854775807. - - - Returns the value of this object in text form. - A text string representing the value of this - object. - - - Returns whether this object's numerical value is an - integer, is -(2^31) or greater, and is less than 2^31. - true if this object's numerical value is an - integer, is -(2^31) or greater, and is less than 2^31; otherwise, - false. - - - Returns whether this object's numerical value is an - integer, is -(2^63) or greater, and is less than 2^63. - true if this object's numerical value is an - integer, is -(2^63) or greater, and is less than 2^63; otherwise, - false. - - - Returns whether this object's numerical value is an - integer, is 0 or greater, and is less than 2^64. - true if this object's numerical value is an - integer, is 0 or greater, and is less than 2^64; otherwise, - false. - - - Gets a value indicating whether this object represents - infinity. - true if this object represents infinity; otherwise, - false. - - - Gets a value indicating whether this object represents - positive infinity. - true if this object represents positive infinity; - otherwise, false. - - - Gets a value indicating whether this object represents - negative infinity. - true if this object represents negative infinity; - otherwise, false. - - - Gets a value indicating whether this object represents a - not-a-number value. - true if this object represents a not-a-number - value; otherwise, false. - - - Converts this object to a decimal number. - A decimal number for this object's value. - - - Converts this object to an arbitrary-precision binary - floating point number. See the ToObject overload taking a type for - more information. - An arbitrary-precision binary floating-point number for - this object's value. - - - Converts this object to a rational number. See the - ToObject overload taking a type for more information. - A rational number for this object's value. - - - Returns the absolute value of this CBOR number. - This object's absolute value without its negative - sign. - - - Returns a CBOR number with the same value as this one but - with the sign reversed. - A CBOR number with the same value as this one but with the - sign reversed. - - - Returns the sum of this number and another - number. - The number to add with this one. - The sum of this number and another number. - The parameter is null. - The exact result of the - operation might be too big to fit in memory (or might require more - than 2 gigabytes of memory to store). - - - Returns a number that expresses this number minus - another. - The second operand to the subtraction. - A CBOR number that expresses this number minus the given - number. - The parameter is null. - The exact result of the - operation might be too big to fit in memory (or might require more - than 2 gigabytes of memory to store). - - - Returns a CBOR number expressing the product of this - number and the given number. - The second operand to the multiplication - operation. - A number expressing the product of this number and the - given number. - The parameter is null. - The exact result of the - operation might be too big to fit in memory (or might require more - than 2 gigabytes of memory to store). - - - Returns the quotient of this number and another - number. - The right-hand side (divisor) to the division - operation. - The quotient of this number and another one. - The parameter is null. - The exact result of the - operation might be too big to fit in memory (or might require more - than 2 gigabytes of memory to store). - - - Returns the remainder when this number is divided by - another number. - The right-hand side (dividend) of the remainder - operation. - The remainder when this number is divided by the other - number. - The parameter is null. - The exact result of the - operation might be too big to fit in memory (or might require more - than 2 gigabytes of memory to store). - - - Compares this CBOR number with a 32-bit signed integer. In - this implementation, the two numbers' mathematical values are - compared. Here, NaN (not-a-number) is considered greater than any - number. - A value to compare with. Can be null. - A negative number, if this value is less than the other - object; or 0, if both values are equal; or a positive number, if - this value is less than the other object or if the other object is - null. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares this CBOR number with a 64-bit signed integer. In - this implementation, the two numbers' mathematical values are - compared. Here, NaN (not-a-number) is considered greater than any - number. - A value to compare with. Can be null. - A negative number, if this value is less than the other - object; or 0, if both values are equal; or a positive number, if - this value is less than the other object or if the other object is - null. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares this CBOR number with another. In this - implementation, the two numbers' mathematical values are compared. - Here, NaN (not-a-number) is considered greater than any - number. - A value to compare with. Can be null. - A negative number, if this value is less than the other - object; or 0, if both values are equal; or a positive number, if - this value is less than the other object or if the other object is - null. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Returns whether one object's value is less than - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if the first object's value is less than the - other's; otherwise, false. - The parameter is null. - - - Returns whether one object's value is up to - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if one object's value is up to another's; - otherwise, false. - The parameter is null. - - - Returns whether one object's value is greater than - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if one object's value is greater than - another's; otherwise, false. - The parameter is null. - - - Returns whether one object's value is at least - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if one object's value is at least another's; - otherwise, false. - The parameter is null. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to an 8-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -128 or greater than - 127. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as an 8-bit signed integer. - This number, converted to an 8-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer without rounding to a - different numerical value. - This number's value as an 8-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -128 or - greater than 127. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 16-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 65535. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit unsigned integer. - This number, converted to a 16-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 16-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 65535. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 4294967295. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 4294967295. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 64-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 18446744073709551615. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit unsigned integer. - This number, converted to a 64-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 64-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 18446744073709551615. - - - - Represents an object in Concise Binary Object Representation - (CBOR) and contains methods for reading and writing CBOR data. CBOR - is an Internet Standard and defined in RFC 8949. - - Converting CBOR objects - There are many ways to get a CBOR object, including from - bytes, objects, streams and JSON, as described below. - To and from byte arrays: The - CBORObject.DecodeFromBytes method converts a byte array in CBOR - format to a CBOR object. The EncodeToBytes method converts a CBOR - object to its corresponding byte array in CBOR format. - To and from data streams: The CBORObject.Write methods - write many kinds of objects to a data stream, including numbers, - CBOR objects, strings, and arrays of numbers and strings. The - CBORObject.Read method reads a CBOR object from a data - stream. - To and from other objects: The - CBORObject.FromObject method converts many kinds of objects - to a CBOR object, including numbers, strings, and arrays and maps - of numbers and strings. Methods like AsNumber and AsString convert - a CBOR object to different types of object. The - CBORObject.ToObject method converts a CBOR object to an - object of a given type; for example, a CBOR array to a native - List (or ArrayList in Java), or a CBOR integer to an - int or long. - To and from JSON: This class also doubles as a reader - and writer of JavaScript Object Notation (JSON). The - CBORObject.FromJSONString method converts JSON in text string form - to a CBOR object, and the ToJSONString method converts a CBOR - object to a JSON string. (Note that the conversion from CBOR to - JSON is not always without loss and may make it impossible to - recover the original object when converting the JSON back to CBOR. - See the ToJSONString documentation.) Likewise, ToJSONBytes and - FromJSONBytes work with JSON in the form of byte arrays rather than - text strings. - In addition, the CBORObject.WriteJSON method writes many - kinds of objects as JSON to a data stream, including numbers, CBOR - objects, strings, and arrays of numbers and strings. The - CBORObject.Read method reads a CBOR object from a JSON data - stream. - Comparison Considerations: - Instances of CBORObject should not be compared for equality - using the "==" operator; it's possible to create two CBOR objects - with the same value but not the same reference. (The "==" operator - might only check if each side of the operator is the same - instance.) - This class's natural ordering (under the CompareTo method) is - consistent with the Equals method, meaning that two values that - compare as equal under the CompareTo method are also equal under - the Equals method; this is a change in version 4.0. Two otherwise - equal objects with different tags are not treated as equal by both - CompareTo and Equals. To strip the tags from a CBOR object before - comparing, use the Untag method. - Thread Safety: - Certain CBOR objects are immutable (their values can't be - changed), so they are inherently safe for use by multiple - threads. - CBOR objects that are arrays, maps, and byte strings (whether - or not they are tagged) are mutable, but this class doesn't attempt - to synchronize reads and writes to those objects by multiple - threads, so those objects are not thread safe without such - synchronization. - One kind of CBOR object is called a map, or a list of - key-value pairs. Keys can be any kind of CBOR object, including - numbers, strings, arrays, and maps. However, untagged text strings - (which means GetTags returns an empty array and the Type property, - or "getType()" in Java, returns TextString) are the most suitable - to use as keys; other kinds of CBOR object are much better used as - map values instead, keeping in mind that some of them are not - thread safe without synchronizing reads and writes to them. - To find the type of a CBOR object, call its Type property (or - "getType()" in Java). The return value can be Integer, - FloatingPoint, Boolean, SimpleValue, or TextString for immutable - CBOR objects, and Array, Map, or ByteString for mutable CBOR - objects. - Nesting Depth: - The DecodeFromBytes and Read methods can only read objects - with a limited maximum depth of arrays and maps nested within other - arrays and maps. The code sets this maximum depth to 500 (allowing - more than enough nesting for most purposes), but it's possible that - stack overflows in some runtimes might lower the effective maximum - nesting depth. When the nesting depth goes above 500, the - DecodeFromBytes and Read methods throw a CBORException. - The ReadJSON and FromJSONString methods currently have - nesting depths of 1000. - - - Represents the value false. - - - A not-a-number value. - - - The value negative infinity. - - - Represents the value null. - - - The value positive infinity. - - - Represents the value true. - - - Represents the value undefined. - - - Gets a CBOR object for the number zero. - - - Gets the number of keys in this map, or the number of - items in this array, or 0 if this item is neither an array nor a - map. - The number of keys in this map, or the number of items in - this array, or 0 if this item is neither an array nor a - map. - - - Gets the last defined tag for this CBOR data item, or -1 - if the item is untagged. - The last defined tag for this CBOR data item, or -1 if the - item is untagged. - - - Gets a value indicating whether this value is a CBOR false - value, whether tagged or not. - true if this value is a CBOR false value; otherwise, - false. - - - Gets a value indicating whether this CBOR object - represents a finite number. - true if this CBOR object represents a finite number; - otherwise, false. - - - Gets a value indicating whether this object represents an - integer number, that is, a number without a fractional part. - Infinity and not-a-number are not considered integers. - true if this object represents an integer number, - that is, a number without a fractional part; otherwise, - false. - - - Gets a value indicating whether this CBOR object is a CBOR - null value, whether tagged or not. - true if this value is a CBOR null value; otherwise, - false. - - - Gets a value indicating whether this data item has at - least one tag. - true if this data item has at least one tag; - otherwise, false. - - - Gets a value indicating whether this value is a CBOR true - value, whether tagged or not. - true if this value is a CBOR true value; otherwise, - false. - - - Gets a value indicating whether this value is a CBOR - undefined value, whether tagged or not. - true if this value is a CBOR undefined value; - otherwise, false. - - - Gets a value indicating whether this object's value equals - 0. - true if this object's value equals 0; otherwise, - false. - - - Gets a collection of the keys of this CBOR object. In - general, the order in which those keys occur is undefined unless - this is a map created using the NewOrderedMap method. - A collection of the keys of this CBOR object. To avoid - potential problems, the calling code should not modify the CBOR map - or the returned collection while iterating over the returned - collection. - This object is not a - map. - - - Gets a value indicating whether this object is a negative - number. - true if this object is a negative number; otherwise, - false. - - - Gets the outermost tag for this CBOR data item, or -1 if - the item is untagged. - The outermost tag for this CBOR data item, or -1 if the item - is untagged. - - - Gets this value's sign: -1 if negative; 1 if positive; 0 - if zero. Throws an exception if this is a not-a-number - value. - This value's sign: -1 if negative; 1 if positive; 0 if - zero. - This object does not - represent a number, or this object is a not-a-number (NaN) - value. - - - Gets the simple value ID of this CBOR object, or -1 if the - object is not a simple value. In this method, objects with a CBOR - type of Boolean or SimpleValue are simple values, whether they are - tagged or not. - The simple value ID of this object if it's a simple value, - or -1 if this object is not a simple value. - - - Gets a value indicating whether this CBOR object stores a - number (including infinity or a not-a-number or NaN value). - Currently, this is true if this item is untagged and has a CBORType - of Integer or FloatingPoint, or if this item has only one tag and - that tag is 2, 3, 4, 5, 30, 264, 265, 268, 269, or 270 with the - right data type. - A value indicating whether this CBOR object stores a - number. - - - Gets the general data type of this CBOR object. This - method disregards the tags this object has, if any. - The general data type of this CBOR object. - - - Gets a collection of the key/value pairs stored in this - CBOR object, if it's a map. Returns one entry for each key/value - pair in the map. In general, the order in which those entries occur - is undefined unless this is a map created using the NewOrderedMap - method. - A collection of the key/value pairs stored in this CBOR map, - as a read-only view of those pairs. To avoid potential problems, - the calling code should not modify the CBOR map while iterating - over the returned collection. - This object is not a - map. - - - Gets a collection of the values of this CBOR object, if - it's a map or an array. If this object is a map, returns one value - for each key in the map; in general, the order in which those keys - occur is undefined unless this is a map created using the - NewOrderedMap method. If this is an array, returns all the values - of the array in the order they are listed. (This method can't be - used to get the bytes in a CBOR byte string; for that, use the - GetByteString method instead.). - A collection of the values of this CBOR map or array. To - avoid potential problems, the calling code should not modify the - CBOR map or array or the returned collection while iterating over - the returned collection. - This object is not a - map or an array. - - - Gets the value of a CBOR object by integer index in this - array or by integer key in this map. - Index starting at 0 of the element, or the - integer key to this map. (If this is a map, the given index can be - any 32-bit signed integer, even a negative one.). - The CBOR object referred to by index or key in this array - or map. If this is a CBOR map, returns null (not - CBORObject.Null ) if an item with the given key doesn't - exist (but this behavior may change to throwing an exception in - version 5.0 or later). - This object is not an - array or map. - This object is an array and the - index is less than 0 or at least the size of the array. - The parameter "value" is - null (as opposed to CBORObject.Null). - - - Gets the value of a CBOR object by integer index in this - array or by CBOR object key in this map, or a default value if that - value is not found. - An arbitrary object. If this is a CBOR map, this - parameter is converted to a CBOR object serving as the key to the - map or index to the array, and can be null. If this is a CBOR - array, the key must be an integer 0 or greater and less than the - size of the array, and may be any object convertible to a CBOR - integer. - A value to return if an item with the - given key doesn't exist, or if the CBOR object is an array and the - key is not an integer 0 or greater and less than the size of the - array. - The CBOR object referred to by index or key in this array - or map. If this is a CBOR map, returns null (not - CBORObject.Null ) if an item with the given key doesn't - exist. - - - Gets the value of a CBOR object by integer index in this - array or by CBOR object key in this map. - A CBOR object serving as the key to the map or - index to the array. If this is a CBOR array, the key must be an - integer 0 or greater and less than the size of the array. - The CBOR object referred to by index or key in this array - or map. If this is a CBOR map, returns null (not - CBORObject.Null ) if an item with the given key doesn't - exist. - The key is null (as opposed - to CBORObject.Null); or the set method is called and the value is - null. - This CBOR object is an array - and the key is not an integer 0 or greater and less than the size - of the array. - This object is not a - map or an array. - - - Gets the value of a CBOR object in this map, using a - string as the key. - A key that points to the desired value. - The CBOR object referred to by key in this map. Returns - null if an item with the given key doesn't exist. - The key is - null. - This object is not a - map. - - - Finds the sum of two CBOR numbers. - The parameter is a - CBOR object. - The parameter is a - CBOR object. - A CBOR object. - Either or both operands are not - numbers (as opposed to Not-a-Number, NaN). - The parameter or is null. - - - - Generates a CBOR object from an array of CBOR-encoded - bytes. - A byte array in which a single CBOR object is - encoded. - A CBOR object decoded from the given byte array. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is - empty. - The parameter is null. - - - - Generates a sequence of CBOR objects from an array of - CBOR-encoded bytes. - A byte array in which any number of CBOR objects - (including zero) are encoded, one after the other. Can be empty, - but cannot be null. - An array of CBOR objects decoded from the given byte - array. Returns an empty array if is - empty. - There was an error in - reading or parsing the data. This includes cases where the last - CBOR object in the data was read only partly. - The parameter is null. - - - - Generates a sequence of CBOR objects from an array of - CBOR-encoded bytes. - A byte array in which any number of CBOR objects - (including zero) are encoded, one after the other. Can be empty, - but cannot be null. - Specifies options to control how the CBOR - object is decoded. See - for more information. - In this method, the AllowEmpty property is treated as always set - regardless of that value as specified in this parameter. - An array of CBOR objects decoded from the given byte - array. Returns an empty array if is - empty. - There was an error in - reading or parsing the data. This includes cases where the last - CBOR object in the data was read only partly. - The parameter is null, or the parameter - is null. - - - Generates a list of CBOR objects from an array of bytes in - JavaScript Object Notation (JSON) text sequence format (RFC 7464). - The byte array must be in UTF-8 encoding and may not begin with a - byte-order mark (U+FEFF). - A byte array in which a JSON text sequence is - encoded. - A list of CBOR objects read from the JSON sequence. - Objects that could not be parsed are replaced with null (as - opposed to CBORObject.Null ) in the given list. - The parameter is null. - The byte array is not - empty and does not begin with a record separator byte (0x1e), or an - I/O error occurred. - Generally, each JSON text in a JSON text sequence is - written as follows: Write a record separator byte (0x1e), then - write the JSON text in UTF-8 (without a byte order mark, U+FEFF), - then write the line feed byte (0x0a). RFC 7464, however, uses a - more liberal syntax for parsing JSON text sequences. - - - Converts this object to a byte array in JavaScript Object - Notation (JSON) format. The JSON text will be written out in UTF-8 - encoding, without a byte order mark, to the byte array. See the - overload to ToJSONString taking a JSONOptions argument for further - information. - A byte array containing the converted in JSON - format. - - - Converts this object to a byte array in JavaScript Object - Notation (JSON) format. The JSON text will be written out in UTF-8 - encoding, without a byte order mark, to the byte array. See the - overload to ToJSONString taking a JSONOptions argument for further - information. - Specifies options to control writing the - CBOR object to JSON. - A byte array containing the converted object in JSON - format. - The parameter is null. - - - Generates a list of CBOR objects from an array of bytes in - JavaScript Object Notation (JSON) text sequence format (RFC 7464), - using the specified options to control the decoding process. The - byte array must be in UTF-8 encoding and may not begin with a - byte-order mark (U+FEFF). - A byte array in which a JSON text sequence is - encoded. - Specifies options to control the JSON - decoding process. - A list of CBOR objects read from the JSON sequence. - Objects that could not be parsed are replaced with null (as - opposed to CBORObject.Null ) in the given list. - The parameter is null. - The byte array is not - empty and does not begin with a record separator byte (0x1e), or an - I/O error occurred. - Generally, each JSON text in a JSON text sequence is - written as follows: Write a record separator byte (0x1e), then - write the JSON text in UTF-8 (without a byte order mark, U+FEFF), - then write the line feed byte (0x0a). RFC 7464, however, uses a - more liberal syntax for parsing JSON text sequences. - - - Generates a CBOR object from an array of CBOR-encoded - bytes, using the given CBOREncodeOptions - object to control - the decoding process. - A byte array in which a single CBOR object is - encoded. - Specifies options to control how the CBOR - object is decoded. See - for more information. - A CBOR object decoded from the given byte array. Returns - null (as opposed to CBORObject.Null) if is - empty and the AllowEmpty property is set on the given options - object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. - The parameter is null, or the parameter - is null. - - The following example (originally written in C# for the.NET - version) implements a method that decodes a text string from a CBOR - byte array. It's successful only if the CBOR object contains an - untagged text string. - private static String DecodeTextString(byte[] bytes) { if (bytes == - null) { throw new ArgumentNullException(nameof(mapObj));} - if - (bytes.Length == 0 || bytes[0]<0x60 || bytes[0]>0x7f) {throw new - CBORException();} return CBORObject.DecodeFromBytes(bytes, - CBOREncodeOptions.Default).AsString(); } - . - - - - Divides a CBORObject object by the value of a CBORObject - object. - The parameter is a - CBOR object. - The parameter is a - CBOR object. - The quotient of the two objects. - The parameter or is null. - - - - Generates a CBOR object from a text string in JavaScript - Object Notation (JSON) format. - If a JSON object has duplicate keys, a CBORException is - thrown. This is a change in version 4.0. - Note that if a CBOR object is converted to JSON with - ToJSONString, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A text string in JSON format. The entire string - must contain a single JSON object and not multiple objects. The - string may not begin with a byte-order mark (U+FEFF). - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - A CBOR object. - The parameter is null. - The string is not in - JSON format. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - - - Generates a CBOR object from a text string in JavaScript - Object Notation (JSON) format, using the specified options to - control the decoding process. - Note that if a CBOR object is converted to JSON with - ToJSONString, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A text string in JSON format. The entire string - must contain a single JSON object and not multiple objects. The - string may not begin with a byte-order mark (U+FEFF). - Specifies options to control the JSON - decoding process. - A CBOR object containing the JSON data decoded. - The parameter or is null. - The string is not in - JSON format. - - - - Generates a CBOR object from a text string in JavaScript - Object Notation (JSON) format. - If a JSON object has duplicate keys, a CBORException is - thrown. This is a change in version 4.0. - Note that if a CBOR object is converted to JSON with - ToJSONString, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A text string in JSON format. The entire string - must contain a single JSON object and not multiple objects. The - string may not begin with a byte-order mark (U+FEFF). - A CBOR object. - The parameter is null. - The string is not in - JSON format. - - - Generates a CBOR object from a text string in JavaScript - Object Notation (JSON) format, using the specified options to - control the decoding process. - Note that if a CBOR object is converted to JSON with - ToJSONString, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A text string in JSON format. The entire string - must contain a single JSON object and not multiple objects. The - string may not begin with a byte-order mark (U+FEFF). - Specifies options to control the decoding - process. This method uses only the AllowDuplicateKeys property of - this object. - A CBOR object containing the JSON data decoded. - The parameter or is null. - The string is not in - JSON format. - - - Generates a CBOR object from a text string in JavaScript - Object Notation (JSON) format, using the specified options to - control the decoding process. - Note that if a CBOR object is converted to JSON with - ToJSONString, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - The parameter is a text - string. - An index, starting at 0, showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - The parameter is a Cbor.JSONOptions object. - A CBOR object containing the JSON data decoded. - The parameter or is null. - The string is not in - JSON format. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - - - Converts this CBOR object to an object of an arbitrary - type. See the documentation for the overload of this method taking - a CBORTypeMapper parameter for more information. This method - doesn't use a CBORTypeMapper parameter to restrict which data types - are eligible for Plain-Old-Data serialization. - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: - For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method (such as int - or - String - ) or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - The converted object. - The given type - , or this object's CBOR type, is not - supported, or the given object's nesting is too deep, or another - error occurred when serializing the object. - The parameter is null. - - Java offers no easy way to express a generic type, at least - none as easy as C#'s typeof - operator. The following example, - written in Java, is a way to specify that the return value will be - an ArrayList of String objects. - Type arrayListString = new ParameterizedType() { public Type[] - getActualTypeArguments() { /* Contains one type parameter, - String*/ - return new Type[] { String.class }; } - public Type getRawType() { /* Raw type is - ArrayList */ return ArrayList.class; } - public Type getOwnerType() { - return null; } }; - ArrayList<String> array = (ArrayList<String>) - cborArray.ToObject(arrayListString); - By comparison, the C# version is much shorter. - var array = (List<String>)cborArray.ToObject( - typeof(List<String>)); - . - - - - Converts this CBOR object to an object of an arbitrary - type. See the documentation for the overload of this method taking - a CBORTypeMapper and PODOptions parameters parameters for more - information. - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method (such as int or - String ) or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. - The converted object. - The given type - , or this object's CBOR type, is not - supported, or the given object's nesting is too deep, or another - error occurred when serializing the object. - The parameter is null. - - - Converts this CBOR object to an object of an arbitrary - type. See the documentation for the overload of this method taking - a CBORTypeMapper and PODOptions parameters for more information. - This method (without a CBORTypeMapper parameter) allows all data - types not otherwise handled to be eligible for Plain-Old-Data - serialization. - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method (such as int or - String ) or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - Specifies options for controlling - deserialization of CBOR objects. - The converted object. - The given type , or this object's CBOR type, is not - supported. - The parameter is null. - The given object's - nesting is too deep, or another error occurred when serializing the - object. - - - Converts this CBOR object to an object of an - arbitrary type. The following cases are checked in the logical - order given (rather than the strict order in which they are - implemented by this library): - If the type is - CBORObject - , return this object. - If the given - object is CBORObject.Null - (with or without tags), returns - null - . - If the object is of a type corresponding - to a type converter mentioned in the - parameter, that converter will be used to convert the CBOR object - to an object of the given type. Type converters can be used to - override the default conversion behavior of almost any - object. - If the type is object - , return this - object. - If the type is char - , converts - single-character CBOR text strings and CBOR integers from 0 through - 65535 to a char - object and returns that char - object. - If the type is bool - ( boolean - in - Java), returns the result of AsBoolean. - If the type is - short - , returns this number as a 16-bit signed integer after - converting its value to an integer by discarding its fractional - part, and throws an exception if this object's value is infinity or - a not-a-number value, or does not represent a number (currently - InvalidOperationException, but may change in the next major - version), or if the value, once converted to an integer by - discarding its fractional part, is less than -32768 or greater than - 32767 (currently OverflowException, but may change in the next - major version). - If the type is long - , returns - this number as a 64-bit signed integer after converting its value - to an integer by discarding its fractional part, and throws an - exception if this object's value is infinity or a not-a-number - value, or does not represent a number (currently - InvalidOperationException, but may change in the next major - version), or if the value, once converted to an integer by - discarding its fractional part, is less than -2^63 or greater than - 2^63-1 (currently OverflowException, but may change in the next - major version). - If the type is short - , the same - rules as for long - are used, but the range is from -32768 - through 32767 and the return type is short - . - If - the type is byte - , the same rules as for long - are - used, but the range is from 0 through 255 and the return type is - byte - . - If the type is sbyte - , the same - rules as for long - are used, but the range is from -128 - through 127 and the return type is sbyte - . - If - the type is ushort - , the same rules as for long - are - used, but the range is from 0 through 65535 and the return type is - ushort - . - If the type is uint - , the same - rules as for long - are used, but the range is from 0 through - 2^31-1 and the return type is uint - . - If the - type is ulong - , the same rules as for long - are used, - but the range is from 0 through 2^63-1 and the return type is - ulong - . - If the type is int - or a - primitive floating-point type ( float - , double - , as - well as decimal - in.NET), returns the result of the - corresponding As* method. - If the type is String - , returns the result of AsString. - If the type is - EFloat - , EDecimal - , EInteger - , or - ERational - in the PeterO.Numbers - - library (in .NET) or the com.github.peteroupc/numbers - - artifact (in Java), or if the type is BigInteger - or - BigDecimal - in the Java version, converts the given object to - a number of the corresponding type and throws an exception - (currently InvalidOperationException) if the object does not - represent a number (for this purpose, infinity and not-a-number - values, but not CBORObject.Null - , are considered numbers). - Currently, this is equivalent to the result of AsEFloat() - , - AsEDecimal() - , AsEInteger - , or AsERational() - , - respectively, but may change slightly in the next major version. - Note that in the case of EFloat - , if this object represents - a decimal number with a fractional part, the conversion may lose - information depending on the number, and if the object is a - rational number with a nonterminating binary expansion, the number - returned is a binary floating-point number rounded to a high but - limited precision. In the case of EDecimal - , if this object - expresses a rational number with a nonterminating decimal - expansion, returns a decimal number rounded to 34 digits of - precision. In the case of EInteger - , if this CBOR object - expresses a floating-point number, it is converted to an integer by - discarding its fractional part, and if this CBOR object expresses a - rational number, it is converted to an integer by dividing the - numerator by the denominator and discarding the fractional part of - the result, and this method throws an exception (currently - OverflowException, but may change in the next major version) if - this object expresses infinity or a not-a-number value. - In the.NET version, if the type is a nullable (e.g., - Nullable<int> - or int? - , returns null - if - this CBOR object is null, or this object's value converted to the - nullable's underlying type, e.g., int - . - If the - type is an enumeration ( Enum - ) type and this CBOR object is - a text string or an integer, returns the appropriate enumerated - constant. (For example, if MyEnum - includes an entry for - MyValue - , this method will return MyEnum.MyValue - if - the CBOR object represents "MyValue" - or the underlying value - for MyEnum.MyValue - .) Note: - If an integer is - converted to a.NET Enum constant, and that integer is shared by - more than one constant of the same type, it is undefined which - constant from among them is returned. (For example, if - MyEnum.Zero=0 - and MyEnum.Null=0 - , converting 0 to - MyEnum - may return either MyEnum.Zero - or - MyEnum.Null - .) As a result, .NET Enum types with constants - that share an underlying value should not be passed to this - method. - If the type is byte[] - (a - one-dimensional byte array) and this CBOR object is a byte string, - returns a byte array which this CBOR byte string's data will be - copied to. (This method can't be used to encode CBOR data to a byte - array; for that, use the EncodeToBytes method instead.) - If the type is a one-dimensional or multidimensional array - type and this CBOR object is an array, returns an array containing - the items in this CBOR object. - If the type is List, - ReadOnlyCollection or the generic or non-generic IList, - ICollection, IEnumerable, IReadOnlyCollection, or IReadOnlyList (or - ArrayList, List, Collection, or Iterable in Java), and if this CBOR - object is an array, returns an object conforming to the type, - class, or interface passed to this method, where the object will - contain all items in this CBOR array. - If the type is - Dictionary, ReadOnlyDictionary or the generic or non-generic - IDictionary or IReadOnlyDictionary (or HashMap or Map in Java), and - if this CBOR object is a map, returns an object conforming to the - type, class, or interface passed to this method, where the object - will contain all keys and values in this CBOR map. - If - the type is an enumeration constant ("enum"), and this CBOR object - is an integer or text string, returns the enumeration constant with - the given number or name, respectively. (Enumeration constants made - up of multiple enumeration constants, as allowed by .NET, can only - be matched by number this way.) - If the type is - DateTime - (or Date - in Java) , returns a date/time - object if the CBOR object's outermost tag is 0 or 1. For tag 1, - this method treats the CBOR object as a number of seconds since the - start of 1970, which is based on the POSIX definition of "seconds - since the Epoch", a definition that does not count leap seconds. In - this method, this number of seconds assumes the use of a proleptic - Gregorian calendar, in which the rules regarding the number of days - in each month and which years are leap years are the same for all - years as they were in 1970 (including without regard to time zone - differences or transitions from other calendars to the Gregorian). - The string format used in tag 0 supports only years up to 4 decimal - digits long. For tag 1, CBOR objects that express infinity or - not-a-number (NaN) are treated as invalid by this method. This - default behavior for DateTime - and Date - can be changed - by passing a suitable CBORTypeMapper to this method, such as a - CBORTypeMapper that registers a CBORDateConverter for - DateTime - or Date - objects. See the examples. - If the type is Uri - (or URI - in Java), returns a - URI object if possible. - If the type is Guid - (or - UUID - in Java), returns a UUID object if possible. - Plain-Old-Data deserialization: If the object is a type not - specially handled above, the type includes a zero-parameter - constructor (default or not), this CBOR object is a CBOR map, and - the "mapper" parameter (if any) allows this type to be eligible for - Plain-Old-Data deserialization, then this method checks the given - type for eligible setters as follows: - (*) In the .NET - version, eligible setters are the public, nonstatic setters of - properties with a public, nonstatic getter. Eligible setters also - include public, nonstatic, non- const - , non- readonly - fields. If a class has two properties and/or fields of the form "X" - and "IsX", where "X" is any name, or has multiple properties and/or - fields with the same name, those properties and fields are - ignored. - (*) In the Java version, eligible setters are - public, nonstatic methods starting with "set" followed by a - character other than a basic digit or lower-case letter, that is, - other than "a" to "z" or "0" to "9", that take one parameter. The - class containing an eligible setter must have a public, nonstatic - method with the same name, but starting with "get" or "is" rather - than "set", that takes no parameters and does not return void. (For - example, if a class has "public setValue(String)" and "public - getValue()", "setValue" is an eligible setter. However, - "setValue()" and "setValue(String, int)" are not eligible setters.) - In addition, public, nonstatic, nonfinal fields are also eligible - setters. If a class has two or more otherwise eligible setters - (methods and/or fields) with the same name, but different parameter - type, they are not eligible setters. - Then, the method - creates an object of the given type and invokes each eligible - setter with the corresponding value in the CBOR map, if any. Key - names in the map are matched to eligible setters according to the - rules described in the - documentation. Note that for security reasons, certain types are - not supported even if they contain eligible setters. For the Java - version, the object creation may fail in the case of a nested - nonstatic class. - - - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: - For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method, such as int - or - String - , or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. Can be - null. - Specifies options for controlling - deserialization of CBOR objects. - The converted object. - The given type - , or this object's CBOR type, is not - supported, or the given object's nesting is too deep, or another - error occurred when serializing the object. - The parameter or is null. - - The following example (originally written in C# for the - DotNet version) uses a CBORTypeMapper to change how CBOR objects - are converted to DateTime objects. In this case, the ToObject - method assumes the CBOR object is an untagged number giving the - number of seconds since the start of 1970. - var conv = new CBORTypeMapper().AddConverter(typeof(DateTime), - CBORDateConverter.UntaggedNumber); - var obj = CBORObject.FromObject().ToObject<DateTime>(conv); - Java offers no easy way to express a generic type, at least - none as easy as C#'s typeof - operator. The following example, - written in Java, is a way to specify that the return value will be - an ArrayList of String objects. - Type arrayListString = new ParameterizedType() { public Type[] - getActualTypeArguments() { /* Contains one type parameter, - String*/ - return new Type[] { String.class }; } - public Type getRawType() { /* Raw type is - ArrayList */ return ArrayList.class; } public Type getOwnerType() { - return null; } }; ArrayList<String> array = - (ArrayList<String>) cborArray.ToObject(arrayListString); - By comparison, the C# version is much shorter. - var array = (List<String>)cborArray.ToObject( - typeof(List<String>)); - . - - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes, using the given CBOREncodeOptions object - to control the decoding process. It is equivalent to - DecodeFromBytes followed by ToObject. See the documentation for - those methods for more information. - A byte array in which a single CBOR object is - encoded. - Specifies options to control how the CBOR object - is decoded. See - for more - information. - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method, such as int or - String, or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. Can be - null. - Specifies options for controlling deserialization - of CBOR objects. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type , or this object's CBOR - type, is not supported, or the given object's nesting is too deep, - or another error occurred when serializing the object. - The parameter is null, or the parameter is - null, or the parameter or is null. - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes, using the given CBOREncodeOptions object - to control the decoding process. It is equivalent to - DecodeFromBytes followed by ToObject. See the documentation for - those methods for more information. - A byte array in which a single CBOR object is - encoded. - Specifies options to control how the CBOR object - is decoded. See - for more - information. - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method, such as int or - String, or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type , or this object's CBOR - type, is not supported, or the given object's nesting is too deep, - or another error occurred when serializing the object. - The parameter is null, or the parameter is - null, or the parameter is null. - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes. It is equivalent to DecodeFromBytes followed by - ToObject. See the documentation for those methods for more - information. - A byte array in which a single CBOR object is - encoded. - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method, such as int or - String, or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. Can be - null. - Specifies options for controlling deserialization - of CBOR objects. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type , or this object's CBOR - type, is not supported, or the given object's nesting is too deep, - or another error occurred when serializing the object. - The parameter is null, or the parameter or - is null. - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes. It is equivalent to DecodeFromBytes followed by - ToObject. See the documentation for those methods for more - information. - A byte array in which a single CBOR object is - encoded. - The type, class, or interface that this method's - return value will belong to. To express a generic type in Java, see - the example. Note: For security reasons, an application - should not base this parameter on user input or other externally - supplied data. Whenever possible, this parameter should be either a - type specially handled by this method, such as int or - String, or a plain-old-data type (POCO or POJO type) within - the control of the application. If the plain-old-data type - references other data types, those types should likewise meet - either criterion above. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type , or this object's CBOR - type, is not supported, or the given object's nesting is too deep, - or another error occurred when serializing the object. - The parameter is null, or the parameter is - null. - - - Generates a CBOR object from a 64-bit signed - integer. - The parameter is a - 64-bit signed integer. - A CBOR object. - - - Generates a CBOR object from a CBOR object. - The parameter is a - CBOR object. - Same as , or "CBORObject.Null" is - is null. - - - Calculates the number of bytes this CBOR object takes when - serialized as a byte array using the EncodeToBytes() method. - This calculation assumes that integers, lengths of maps and arrays, - lengths of text and byte strings, and tag numbers are encoded in - their shortest form; that floating-point numbers are encoded in - their shortest value-preserving form; and that no indefinite-length - encodings are used. - The number of bytes this CBOR object takes when serialized - as a byte array using the EncodeToBytes() method. - The CBOR object has an - extremely deep level of nesting, including if the CBOR object is or - has an array or map that includes itself. - - - Generates a CBOR object from an arbitrary-precision - integer. The CBOR object is generated as follows: - - If the number is null, returns CBORObject.Null. - Otherwise, if the number is greater than or equal to -(2^64) - and less than 2^64, the CBOR object will have the object type - Integer and the appropriate value. - Otherwise, the CBOR object will have tag 2 (zero or positive) - or 3 (negative) and the appropriate value. - An arbitrary-precision integer. Can be - null. - The given number encoded as a CBOR object. Returns - CBORObject.Null if is - null. - - - Generates a CBOR object from an arbitrary-precision binary - floating-point number. The CBOR object is generated as follows - (this is a change in version 4.0): - - If the number is null, returns CBORObject.Null. - Otherwise, if the number expresses infinity, not-a-number, or - negative zero, the CBOR object will have tag 269 and the - appropriate format. - Otherwise, if the number's exponent is at least 2^64 or less - than -(2^64), the CBOR object will have tag 265 and the appropriate - format. - Otherwise, the CBOR object will have tag 5 and the - appropriate format. - An arbitrary-precision binary floating-point - number. Can be null. - The given number encoded as a CBOR object. Returns - CBORObject.Null if is null. - - - Generates a CBOR object from an arbitrary-precision - rational number. The CBOR object is generated as follows (this is a - change in version 4.0): - - If the number is null, returns CBORObject.Null. - Otherwise, if the number expresses infinity, not-a-number, or - negative zero, the CBOR object will have tag 270 and the - appropriate format. - Otherwise, the CBOR object will have tag 30 and the - appropriate format. - An arbitrary-precision rational number. Can - be null. - The given number encoded as a CBOR object. Returns - CBORObject.Null if is null. - - - Generates a CBOR object from a decimal number. The CBOR - object is generated as follows (this is a change in version 4.0): - - If the number is null, returns CBORObject.Null. - Otherwise, if the number expresses infinity, not-a-number, or - negative zero, the CBOR object will have tag 268 and the - appropriate format. - If the number's exponent is at least 2^64 or less than - -(2^64), the CBOR object will have tag 264 and the appropriate - format. - Otherwise, the CBOR object will have tag 4 and the - appropriate format. - An arbitrary-precision decimal number. Can - be null. - The given number encoded as a CBOR object. Returns - CBORObject.Null if is null. - - - Generates a CBOR object from a text string. - A text string value. Can be null. - A CBOR object representing the string, or CBORObject.Null - if stringValue is null. - The string contains an unpaired - surrogate code point. - - - Generates a CBOR object from a 32-bit signed - integer. - The parameter is a - 32-bit signed integer. - A CBOR object. - - - Generates a CBOR object from a 16-bit signed - integer. - The parameter is a - 16-bit signed integer. - A CBOR object generated from the given integer. - - - Returns the CBOR true value or false value, depending on - "value". - Either true or false. - CBORObject.True if value is true; otherwise - CBORObject.False. - - - Generates a CBOR object from a byte (0 to 255). - The parameter is a - byte (from 0 to 255). - A CBOR object generated from the given integer. - - - Generates a CBOR object from a 32-bit floating-point - number. The input value can be a not-a-number (NaN) value (such as - Single.NaN in DotNet or Float.NaN in Java); however, NaN - values have multiple forms that are equivalent for many - applications' purposes, and Single.NaN / Float.NaN is - only one of these equivalent forms. In fact, - CBORObject.FromObject(Single.NaN) or - CBORObject.FromObject(Float.NaN) could produce a - CBOR-encoded object that differs between DotNet and Java, because - Single.NaN / Float.NaN may have a different form in - DotNet and Java (for example, the NaN value's sign may be negative - in DotNet, but positive in Java). - The parameter is a - 32-bit floating-point number. - A CBOR object generated from the given number. - - - Generates a CBOR object from a 64-bit floating-point - number. The input value can be a not-a-number (NaN) value (such as - Double.NaN ); however, NaN values have multiple forms that - are equivalent for many applications' purposes, and - Double.NaN is only one of these equivalent forms. In fact, - CBORObject.FromObject(Double.NaN) could produce a - CBOR-encoded object that differs between DotNet and Java, because - Double.NaN may have a different form in DotNet and Java (for - example, the NaN value's sign may be negative in DotNet, but - positive in Java). - The parameter is a - 64-bit floating-point number. - A CBOR object generated from the given number. - - - Generates a CBOR object from an array of 8-bit bytes; the - byte array is copied to a new byte array in this process. (This - method can't be used to decode CBOR data from a byte array; for - that, use the DecodeFromBytes method instead.). - An array of 8-bit bytes; can be null. - A CBOR object where each element of the given byte array - is copied to a new array, or CBORObject.Null if the value is - null. - - - Generates a CBOR object from an array of CBOR - objects. - An array of CBOR objects. - A CBOR object where each element of the given array is - copied to a new array, or CBORObject.Null if the value is - null. - - - Generates a CBOR object from an array of 32-bit - integers. - An array of 32-bit integers. - A CBOR array object where each element of the given array - is copied to a new array, or CBORObject.Null if the value is - null. - - - Generates a CBOR object from an array of 64-bit - integers. - An array of 64-bit integers. - A CBOR array object where each element of the given array - is copied to a new array, or CBORObject.Null if the value is - null. - - - Generates a CBORObject from an arbitrary object. See the - overload of this method that takes CBORTypeMapper and PODOptions - arguments. - The parameter is an - arbitrary object, which can be null. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - A CBOR object corresponding to the given object. Returns - CBORObject.Null if the object is null. - - - Generates a CBORObject from an arbitrary object. See the - overload of this method that takes CBORTypeMapper and PODOptions - arguments. - The parameter is an - arbitrary object. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - An object containing options to control how - certain objects are converted to CBOR objects. - A CBOR object corresponding to the given object. Returns - CBORObject.Null if the object is null. - The parameter is null. - - - Generates a CBORObject from an arbitrary object. See the - overload of this method that takes CBORTypeMapper and PODOptions - arguments. - The parameter is an - arbitrary object. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - An object containing optional converters to - convert objects of certain types to CBOR objects. - A CBOR object corresponding to the given object. Returns - CBORObject.Null if the object is null. - The parameter is null. - - - Generates a CBORObject from an arbitrary object, - using the given options to control how certain objects are - converted to CBOR objects. The following cases are checked in the - logical order given (rather than the strict order in which they are - implemented by this library): - null - is - converted to CBORObject.Null - . - A - CBORObject - is returned as itself. - If the object - is of a type corresponding to a type converter mentioned in the - parameter, that converter will be used to - convert the object to a CBOR object. Type converters can be used to - override the default conversion behavior of almost any - object. - A char - is converted to an integer (from - 0 through 65535), and returns a CBOR object of that integer. (This - is a change in version 4.0 from previous versions, which converted - char - , except surrogate code points from 0xd800 through - 0xdfff, into single-character text strings.) - A - bool - ( boolean - in Java) is converted to - CBORObject.True - or CBORObject.False - . - A - byte - is converted to a CBOR integer from 0 through - 255. - A primitive integer type ( int - , - short - , long - , as well as sbyte - , - ushort - , uint - , and ulong - in.NET) is converted - to the corresponding CBOR integer. - A primitive - floating-point type ( float - , double - , as well as - decimal - in.NET) is converted to the corresponding CBOR - number. - A String - is converted to a CBOR text - string. To create a CBOR byte string object from String - , - see the example given in . - In the.NET version, a nullable is converted to - CBORObject.Null - if the nullable's value is null - , or - converted according to the nullable's underlying type, if that type - is supported by this method. - In the Java version, a - number of type BigInteger - or BigDecimal - is converted - to the corresponding CBOR number. - A number of type - EDecimal - , EFloat - , EInteger - , and - ERational - in the PeterO.Numbers - - library (in .NET) or the com.github.peteroupc/numbers - - artifact (in Java) is converted to the corresponding CBOR - number. - An array other than byte[] - is converted - to a CBOR array. In the.NET version, a multidimensional array is - converted to an array of arrays. - A byte[] - (1-dimensional byte array) is converted to a CBOR byte string; the - byte array is copied to a new byte array in this process. (This - method can't be used to decode CBOR data from a byte array; for - that, use the DecodeFromBytes - method instead.) - An object implementing IDictionary (Map in Java) is converted - to a CBOR map containing the keys and values enumerated. - An object implementing IEnumerable (Iterable in Java) is - converted to a CBOR array containing the items enumerated. - An enumeration ( Enum - ) object is converted to its - underlying value - in the.NET version, or the result of its - ordinal() - method in the Java version. - An object - of type DateTime - , Uri - , or Guid - ( Date - , URI - , or UUID - , respectively, in Java) will be - converted to a tagged CBOR object of the appropriate kind. By - default, DateTime - / Date - will be converted to a tag-0 - string following the date format used in the Atom syndication - format, but this behavior can be changed by passing a suitable - CBORTypeMapper to this method, such as a CBORTypeMapper that - registers a CBORDateConverter for DateTime - or Date - objects. See the examples. - If the object is a type not - specially handled above, this method checks the parameter for eligible getters as follows: - (*) In the .NET version, eligible getters are the public, - nonstatic getters of read/write properties (and also those of - read-only properties in the case of a compiler-generated type or an - F# type). Eligible getters also include public, nonstatic, non- - const - , non- readonly - fields. If a class has two - properties and/or fields of the form "X" and "IsX", where "X" is - any name, or has multiple properties and/or fields with the same - name, those properties and fields are ignored. - (*) In - the Java version, eligible getters are public, nonstatic methods - starting with "get" or "is" (either word followed by a character - other than a basic digit or lower-case letter, that is, other than - "a" to "z" or "0" to "9"), that take no parameters and do not - return void, except that methods named "getClass" are not eligible - getters. In addition, public, nonstatic, nonfinal fields are also - eligible getters. If a class has two otherwise eligible getters - (methods and/or fields) of the form "isX" and "getX", where "X" is - the same in both, or two such getters with the same name but - different return type, they are not eligible getters. - Then, the method returns a CBOR map with each eligible - getter's name or property name as each key, and with the - corresponding value returned by that getter as that key's value. - Before adding a key-value pair to the map, the key's name is - adjusted according to the rules described in the documentation. Note that for - security reasons, certain types are not supported even if they - contain eligible getters. - - REMARK: - .NET - enumeration ( Enum - ) constants could also have been - converted to text strings with ToString() - , but that method - will return multiple names if the given Enum object is a - combination of Enum objects (e.g. if the object is - FileAccess.Read | FileAccess.Write - ). More generally, if - Enums are converted to text strings, constants from Enum types with - the Flags - attribute, and constants from the same Enum type - that share an underlying value, should not be passed to this - method. - - An arbitrary object to convert to a CBOR object. - NOTE: - For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int - or String - ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - . - An object containing optional converters to - convert objects of certain types to CBOR objects. Can be - null. - An object containing options to control how - certain objects are converted to CBOR objects. - A CBOR object corresponding to the given object. Returns - CBORObject.Null if the object is null. - The parameter is null. - An error occurred while - converting the given object to a CBOR object. - - The following example (originally written in C# for the - DotNet version) uses a CBORTypeMapper to change how DateTime - objects are converted to CBOR. In this case, such objects are - converted to CBOR objects with tag 1 that store numbers giving the - number of seconds since the start of 1970. - var conv = new CBORTypeMapper().AddConverter(typeof(DateTime), - CBORDateConverter.TaggedNumber); - CBORObject obj = CBORObject.FromObject(DateTime.Now, conv); - The following example generates a CBOR object from a 64-bit - signed integer that is treated as a 64-bit unsigned integer (such - as DotNet's UInt64, which has no direct equivalent in the Java - language), in the sense that the value is treated as 2^64 plus the - original value if it's negative. - long x = -40L; /* Example 64-bit value treated as 2^64-40.*/ - CBORObject obj = CBORObject.FromObject( - v < 0 ? EInteger.FromInt32(1).ShiftLeft(64).Add(v) : - EInteger.FromInt64(v)); - In the Java version, which has java.math.BigInteger, the - following can be used instead: - long x = -40L; /* Example 64-bit value treated as 2^64-40.*/ - CBORObject obj = CBORObject.FromObject( - v < 0 ? BigInteger.valueOf(1).shiftLeft(64).add(BigInteger.valueOf(v)) : - BigInteger.valueOf(v)); - - - - Generates a CBOR object from this one, but gives the - resulting object a tag in addition to its existing tags (the new - tag is made the outermost tag). - Tag number. The tag number 55799 can be - used to mark a "self-described CBOR" object. This document does not - attempt to list all CBOR tags and their meanings. An up-to-date - list can be found at the CBOR Tags registry maintained by the - Internet Assigned Numbers Authority( - iana.org/assignments/cbor-tags ). - A CBOR object with the same value as this one but given - the tag in addition to its existing - tags (the new tag is made the outermost tag). - The parameter is less than 0 or greater than - 2^64-1. - The parameter is null. - - - Generates a CBOR object from an arbitrary object and gives - the resulting object a tag in addition to its existing tags (the - new tag is made the outermost tag). - The parameter is - an arbitrary object, which can be null. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - Tag number. The tag number 55799 can be - used to mark a "self-described CBOR" object. This document does not - attempt to list all CBOR tags and their meanings. An up-to-date - list can be found at the CBOR Tags registry maintained by the - Internet Assigned Numbers Authority( - iana.org/assignments/cbor-tags ). - A CBOR object where the object - is converted to a CBOR object and given the tag . If is null, returns - a version of CBORObject.Null with the given tag. - The parameter is less than 0 or greater than - 2^64-1. - The parameter is null. - - - Generates a CBOR object from an arbitrary object and gives - the resulting object a tag in addition to its existing tags (the - new tag is made the outermost tag). - A 32-bit integer that specifies a tag - number. The tag number 55799 can be used to mark a "self-described - CBOR" object. This document does not attempt to list all CBOR tags - and their meanings. An up-to-date list can be found at the CBOR - Tags registry maintained by the Internet Assigned Numbers Authority - ( - iana.org/assignments/cbor-tags ). - A CBOR object with the same value as this one but given - the tag in addition to its existing - tags (the new tag is made the outermost tag). - The parameter is less than 0. - - - Generates a CBOR object from an arbitrary object and gives - the resulting object a tag in addition to its existing tags (the - new tag is made the outermost tag). - The parameter is an arbitrary object, which can be null. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - A 32-bit integer that specifies a tag - number. The tag number 55799 can be used to mark a "self-described - CBOR" object. This document does not attempt to list all CBOR tags - and their meanings. An up-to-date list can be found at the CBOR - Tags registry maintained by the Internet Assigned Numbers Authority - ( - iana.org/assignments/cbor-tags ). - A CBOR object where the object is converted to a CBOR object and given the - tag . If "valueOb" is null, returns a - version of CBORObject.Null with the given tag. - The parameter is less than 0. - - - Creates a CBOR object from a simple value - number. - The parameter is a 32-bit signed integer. - A CBOR object. - The parameter is less than 0, greater than 255, or from 24 - through 31. - - - Multiplies two CBOR numbers. - The parameter is a - CBOR object. - The parameter is a - CBOR object. - The product of the two numbers. - Either or both operands are not - numbers (as opposed to Not-a-Number, NaN). - The parameter or is null. - - - Creates a new empty CBOR array. - A new CBOR array. - - - Creates a new empty CBOR map that stores its keys in an - undefined order. - A new CBOR map. - - - Creates a new empty CBOR map that ensures that keys are - stored in the order in which they are first inserted. - A new CBOR map. - - - - Reads a sequence of objects in CBOR format from a data - stream. This method will read CBOR objects from the stream until - the end of the stream is reached or an error occurs, whichever - happens first. - A readable data stream. - An array containing the CBOR objects that were read from - the data stream. Returns an empty array if there is no unread data - in the stream. - The parameter is null, or the parameter "options" is - null. - There was an error in - reading or parsing the data, including if the last CBOR object was - read only partially. - - - - Reads a sequence of objects in CBOR format from a data - stream. This method will read CBOR objects from the stream until - the end of the stream is reached or an error occurs, whichever - happens first. - A readable data stream. - Specifies the options to use when decoding - the CBOR data stream. See CBOREncodeOptions for more information. - In this method, the AllowEmpty property is treated as set - regardless of the value of that property specified in this - parameter. - An array containing the CBOR objects that were read from - the data stream. Returns an empty array if there is no unread data - in the stream. - The parameter is null, or the parameter is null. - There was an error in - reading or parsing the data, including if the last CBOR object was - read only partially. - - - - Reads an object in CBOR format from a data stream. This - method will read from the stream until the end of the CBOR object - is reached or an error occurs, whichever happens - first. - A readable data stream. - A CBOR object that was read. - The parameter is null. - There was an error in - reading or parsing the data. - - - Reads an object in CBOR format from a data stream, using - the specified options to control the decoding process. This method - will read from the stream until the end of the CBOR object is - reached or an error occurs, whichever happens first. - A readable data stream. - Specifies the options to use when decoding - the CBOR data stream. See CBOREncodeOptions for more - information. - A CBOR object that was read. - The parameter is null. - There was an error in - reading or parsing the data. - - - Generates a CBOR object from a data stream in JavaScript - Object Notation (JSON) format. The JSON stream may begin with a - byte-order mark (U+FEFF). Since version 2.0, the JSON stream can be - in UTF-8, UTF-16, or UTF-32 encoding; the encoding is detected by - assuming that the first character read must be a byte-order mark or - a nonzero basic character (U+0001 to U+007F). (In previous - versions, only UTF-8 was allowed.). (This behavior may change to - supporting only UTF-8, with or without a byte order mark, in - version 5.0 or later, perhaps with an option to restore the - previous behavior of also supporting UTF-16 and UTF-32.). - A readable data stream. The sequence of bytes - read from the data stream must contain a single JSON object and not - multiple objects. - A CBOR object. - The parameter is null. - An I/O error - occurred. - The data stream - contains invalid encoding or is not in JSON format. - - - Generates a list of CBOR objects from a data stream in - JavaScript Object Notation (JSON) text sequence format (RFC 7464). - The data stream must be in UTF-8 encoding and may not begin with a - byte-order mark (U+FEFF). - A readable data stream. The sequence of bytes - read from the data stream must either be empty or begin with a - record separator byte (0x1e). - A list of CBOR objects read from the JSON sequence. - Objects that could not be parsed are replaced with null (as - opposed to CBORObject.Null ) in the given list. - The parameter is null. - An I/O error - occurred. - The data stream is not - empty and does not begin with a record separator byte - (0x1e). - Generally, each JSON text in a JSON text sequence is - written as follows: Write a record separator byte (0x1e), then - write the JSON text in UTF-8 (without a byte order mark, U+FEFF), - then write the line feed byte (0x0a). RFC 7464, however, uses a - more liberal syntax for parsing JSON text sequences. - - - Generates a CBOR object from a data stream in JavaScript - Object Notation (JSON) format, using the specified options to - control the decoding process. The JSON stream may begin with a - byte-order mark (U+FEFF). Since version 2.0, the JSON stream can be - in UTF-8, UTF-16, or UTF-32 encoding; the encoding is detected by - assuming that the first character read must be a byte-order mark or - a nonzero basic character (U+0001 to U+007F). (In previous - versions, only UTF-8 was allowed.). - A readable data stream. The sequence of bytes - read from the data stream must contain a single JSON object and not - multiple objects. - Contains options to control the JSON decoding - process. This method uses only the AllowDuplicateKeys property of - this object. - A CBOR object containing the JSON data decoded. - The parameter is null. - An I/O error - occurred. - The data stream - contains invalid encoding or is not in JSON format. - - - Generates a list of CBOR objects from a data stream in - JavaScript Object Notation (JSON) text sequence format (RFC 7464). - The data stream must be in UTF-8 encoding and may not begin with a - byte-order mark (U+FEFF). - A readable data stream. The sequence of bytes - read from the data stream must either be empty or begin with a - record separator byte (0x1e). - Specifies options to control how JSON - texts in the stream are decoded to CBOR. See the JSONOptions - class. - A list of CBOR objects read from the JSON sequence. - Objects that could not be parsed are replaced with null (as - opposed to CBORObject.Null ) in the given list. - The parameter is null. - An I/O error - occurred. - The data stream is not - empty and does not begin with a record separator byte - (0x1e). - Generally, each JSON text in a JSON text sequence is - written as follows: Write a record separator byte (0x1e), then - write the JSON text in UTF-8 (without a byte order mark, U+FEFF), - then write the line feed byte (0x0a). RFC 7464, however, uses a - more liberal syntax for parsing JSON text sequences. - - - Generates a CBOR object from a data stream in JavaScript - Object Notation (JSON) format, using the specified options to - control the decoding process. The JSON stream may begin with a - byte-order mark (U+FEFF). Since version 2.0, the JSON stream can be - in UTF-8, UTF-16, or UTF-32 encoding; the encoding is detected by - assuming that the first character read must be a byte-order mark or - a nonzero basic character (U+0001 to U+007F). (In previous - versions, only UTF-8 was allowed.). (This behavior may change to - supporting only UTF-8, with or without a byte order mark, in - version 5.0 or later, perhaps with an option to restore the - previous behavior of also supporting UTF-16 and UTF-32.). - A readable data stream. The sequence of bytes - read from the data stream must contain a single JSON object and not - multiple objects. - Specifies options to control how the JSON - stream is decoded to CBOR. See the JSONOptions class. - A CBOR object containing the JSON data decoded. - The parameter is null. - An I/O error - occurred. - The data stream - contains invalid encoding or is not in JSON format. - - - - Generates a CBOR object from a byte array in JavaScript - Object Notation (JSON) format. - If a JSON object has duplicate keys, a CBORException is - thrown. - Note that if a CBOR object is converted to JSON with - ToJSONBytes, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A byte array in JSON format. The entire byte - array must contain a single JSON object and not multiple objects. - The byte array may begin with a byte-order mark (U+FEFF). The byte - array can be in UTF-8, UTF-16, or UTF-32 encoding; the encoding is - detected by assuming that the first character read must be a - byte-order mark or a nonzero basic character (U+0001 to U+007F). - (This behavior may change to supporting only UTF-8, with or without - a byte order mark, in version 5.0 or later, perhaps with an option - to restore the previous behavior of also supporting UTF-16 and - UTF-32.). - A CBOR object containing the JSON data decoded. - The parameter is null. - The byte array contains - invalid encoding or is not in JSON format. - - - Generates a CBOR object from a byte array in JavaScript - Object Notation (JSON) format, using the specified options to - control the decoding process. - Note that if a CBOR object is converted to JSON with - ToJSONBytes, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A byte array in JSON format. The entire byte - array must contain a single JSON object and not multiple objects. - The byte array may begin with a byte-order mark (U+FEFF). The byte - array can be in UTF-8, UTF-16, or UTF-32 encoding; the encoding is - detected by assuming that the first character read must be a - byte-order mark or a nonzero basic character (U+0001 to U+007F). - (This behavior may change to supporting only UTF-8, with or without - a byte order mark, in version 5.0 or later, perhaps with an option - to restore the previous behavior of also supporting UTF-16 and - UTF-32.). - Specifies options to control how the JSON - data is decoded to CBOR. See the JSONOptions class. - A CBOR object containing the JSON data decoded. - The parameter or is - null. - The byte array contains - invalid encoding or is not in JSON format. - - - - Generates a CBOR object from a byte array in JavaScript - Object Notation (JSON) format. - If a JSON object has duplicate keys, a CBORException is - thrown. - Note that if a CBOR object is converted to JSON with - ToJSONBytes, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A byte array, the specified portion of which is - in JSON format. The specified portion of the byte array must - contain a single JSON object and not multiple objects. The portion - may begin with a byte-order mark (U+FEFF). The portion can be in - UTF-8, UTF-16, or UTF-32 encoding; the encoding is detected by - assuming that the first character read must be a byte-order mark or - a nonzero basic character (U+0001 to U+007F). (This behavior may - change to supporting only UTF-8, with or without a byte order mark, - in version 5.0 or later, perhaps with an option to restore the - previous behavior of also supporting UTF-16 and UTF-32.). - An index, starting at 0, showing where the - desired portion of begins. - The length, in bytes, of the desired portion of - (but not more than 's length). - A CBOR object containing the JSON data decoded. - The parameter is null. - The byte array contains - invalid encoding or is not in JSON format. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Generates a CBOR object from a byte array in JavaScript - Object Notation (JSON) format, using the specified options to - control the decoding process. - Note that if a CBOR object is converted to JSON with - ToJSONBytes, then the JSON is converted back to CBOR with - this method, the new CBOR object will not necessarily be the same - as the old CBOR object, especially if the old CBOR object uses data - types not supported in JSON, such as integers in map - keys. - A byte array, the specified portion of which is - in JSON format. The specified portion of the byte array must - contain a single JSON object and not multiple objects. The portion - may begin with a byte-order mark (U+FEFF). The portion can be in - UTF-8, UTF-16, or UTF-32 encoding; the encoding is detected by - assuming that the first character read must be a byte-order mark or - a nonzero basic character (U+0001 to U+007F). (This behavior may - change to supporting only UTF-8, with or without a byte order mark, - in version 5.0 or later, perhaps with an option to restore the - previous behavior of also supporting UTF-16 and UTF-32.). - An index, starting at 0, showing where the - desired portion of begins. - The length, in bytes, of the desired portion of - (but not more than 's length). - Specifies options to control how the JSON - data is decoded to CBOR. See the JSONOptions class. - A CBOR object containing the JSON data decoded. - The parameter or is - null. - The byte array contains - invalid encoding or is not in JSON format. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Finds the remainder that results when a CBORObject object - is divided by the value of a CBOR object. - The parameter is a - CBOR object. - The parameter is a - CBOR object. - The remainder of the two numbers. - The parameter or is null. - - - Finds the difference between two CBOR number - objects. - The parameter is a - CBOR object. - The parameter is a - CBOR object. - The difference of the two objects. - Either or both operands are not - numbers (as opposed to Not-a-Number, NaN). - The parameter or is null. - - - - Writes a text string in CBOR format to a data stream. The - string will be encoded using definite-length encoding regardless of - its length. - The string to write. Can be null. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a text string in CBOR format to a data stream, - using the given options to control the encoding process. - The string to write. Can be null. - A writable data stream. - Options for encoding the data to - CBOR. - The parameter is null. - An I/O error - occurred. - - - Writes a binary floating-point number in CBOR format to a - data stream, as though it were converted to a CBOR object via - CBORObject.FromObject(EFloat) and then written out. - An arbitrary-precision binary floating-point - number. Can be null. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a rational number in CBOR format to a data stream, - as though it were converted to a CBOR object via - CBORObject.FromObject(ERational) and then written out. - An arbitrary-precision rational number. Can - be null. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a decimal floating-point number in CBOR format to a - data stream, as though it were converted to a CBOR object via - CBORObject.FromObject(EDecimal) and then written out. - The arbitrary-precision decimal number to - write. Can be null. - Stream to write to. - The parameter is null. - An I/O error - occurred. - - - Writes a arbitrary-precision integer in CBOR format to a - data stream. - Arbitrary-precision integer to write. Can be - null. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a 64-bit signed integer in CBOR format to a data - stream. - The value to write. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a 32-bit signed integer in CBOR format to a data - stream. - The value to write. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a 16-bit signed integer in CBOR format to a data - stream. - The value to write. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a Boolean value in CBOR format to a data - stream. - The value to write. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a byte (0 to 255) in CBOR format to a data stream. - If the value is less than 24, writes that byte. If the value is 25 - to 255, writes the byte 24, then this byte's value. - The value to write. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a 32-bit floating-point number in CBOR format to a - data stream. The number is written using the shortest - floating-point encoding possible; this is a change from previous - versions. - The value to write. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a 64-bit floating-point number in CBOR format to a - data stream. The number is written using the shortest - floating-point encoding possible; this is a change from previous - versions. - The value to write. - A writable data stream. - The parameter is null. - An I/O error - occurred. - - - Writes a CBOR object to a CBOR data stream. - The value to write. Can be null. - A writable data stream. - The parameter is null. - - - - Writes a CBOR object to a CBOR data stream. See the - three-parameter Write method that takes a - CBOREncodeOptions. - The arbitrary object to be serialized. Can - be null. - A writable data stream. - - - Writes an arbitrary object to a CBOR data stream, using - the specified options for controlling how the object is encoded to - CBOR data format. If the object is convertible to a CBOR map or a - CBOR object that contains CBOR maps, the order in which the keys to - those maps are written out to the data stream is undefined unless - the map was created using the NewOrderedMap method. The example - code given in - can - be used to write out certain keys of a CBOR map in a given order. - Currently, the following objects are supported: - - Lists of CBORObject. - Maps of CBORObject. The order in which the keys to the map - are written out to the data stream is undefined unless the map was - created using the NewOrderedMap method. - Null. - Byte arrays, which will always be written as definite-length - byte strings. - String objects. The strings will be encoded using - definite-length encoding regardless of their length. - Any object accepted by the FromObject static - methods. - The arbitrary object to be serialized. Can - be null. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - A writable data stream. - CBOR options for encoding the CBOR object to - bytes. - The object's type is not - supported. - The parameter or is null. - - - Converts an arbitrary object to a text string in - JavaScript Object Notation (JSON) format, as in the ToJSONString - method, and writes that string to a data stream in UTF-8. If the - object is convertible to a CBOR map, or to a CBOR object that - contains CBOR maps, the order in which the keys to those maps are - written out to the JSON string is undefined unless the map was - created using the NewOrderedMap method. The example code given in - PeterO.Cbor.CBORObject.ToJSONString(PeterO.Cbor.JSONOptions) - can be used to write out certain keys of a CBOR map in a given - order to a JSON string. - The parameter is an - arbitrary object. Can be null. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - A writable data stream. - The parameter is null. - - - Gets this object's absolute value. - This object's absolute without its negative - sign. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - - - - Adds a new key and its value to this CBOR map, or adds the - value if the key doesn't exist. - NOTE: This method can't be used to add a tag to an existing - CBOR object. To create a CBOR object with a given tag, call the - CBORObject.FromObjectAndTag method and pass the CBOR object - and the desired tag number to that method. - An object representing the key, which will be - converted to a CBORObject. Can be null, in which case this value is - converted to CBORObject.Null. - An object representing the value, which will - be converted to a CBORObject. Can be null, in which case this value - is converted to CBORObject.Null. - This instance. - The parameter already exists in this map. - This object is not a - map. - The parameter or has an unsupported - type. - - - Adds a new object to the end of this array. (Used to - throw ArgumentNullException on a null reference, but now converts - the null reference to CBORObject.Null, for convenience with the - Object overload of this method). - NOTE: This method - can't be used to add a tag to an existing CBOR object. To create a - CBOR object with a given tag, call the - CBORObject.FromObjectAndTag - method and pass the CBOR object - and the desired tag number to that method. - - The parameter is a CBOR - object. - This instance. - This object is not an - array. - - The following example creates a CBOR array and adds several - CBOR objects, one of which has a custom CBOR tag, to that array. - Note the chaining behavior made possible by this method. - CBORObject obj = CBORObject.NewArray() .Add(CBORObject.False) - .Add(CBORObject.FromObject(5)) .Add(CBORObject.FromObject("text - string")) .Add(CBORObject.FromObjectAndTag(9999, 1)); - . - - - - Converts an object to a CBOR object and adds it to - the end of this array. - NOTE: This method can't be used - to add a tag to an existing CBOR object. To create a CBOR object - with a given tag, call the CBORObject.FromObjectAndTag - method and pass the CBOR object and the desired tag number to that - method. - - A CBOR object (or an object convertible to a CBOR - object) to add to this CBOR array. - This instance. - This instance is not an - array. - The type of is not supported. - - The following example creates a CBOR array and adds several - CBOR objects, one of which has a custom CBOR tag, to that array. - Note the chaining behavior made possible by this method. - CBORObject obj = CBORObject.NewArray() .Add(CBORObject.False) .Add(5) - .Add("text string") .Add(CBORObject.FromObjectAndTag(9999, 1)); - . - - - - Converts this object to an arbitrary-precision integer. - See the ToObject overload taking a type for more - information. - The closest arbitrary-precision integer to this - object. - This object does not - represent a number (for the purposes of this method, infinity and - not-a-number values, but not CBORObject.Null, are - considered numbers). - This object's value is infinity - or not-a-number (NaN). - - - Returns false if this object is a CBOR false, null, or - undefined value (whether or not the object has tags); otherwise, - true. - False if this object is a CBOR false, null, or undefined - value; otherwise, true. - - - Converts this object to a byte (0 to 255). Floating point - values are converted to integers by discarding their fractional - parts. - The closest byte-sized integer to this object. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value exceeds the - range of a byte (would be less than 0 or greater than 255 when - converted to an integer by discarding its fractional - part). - - - Converts this object to a 64-bit floating point - number. - The closest 64-bit floating point number to this object. - The return value can be positive infinity or negative infinity if - this value exceeds the range of a 64-bit floating point - number. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - - - Converts this object to a decimal number. - A decimal number for this object's value. - This object does not - represent a number (for the purposes of this method, infinity and - not-a-number values, but not CBORObject.Null, are - considered numbers). - - - Converts this object to an arbitrary-precision binary - floating point number. See the ToObject overload taking a type for - more information. - An arbitrary-precision binary floating-point number for - this object's value. - This object does not - represent a number (for the purposes of this method, infinity and - not-a-number values, but not CBORObject.Null, are - considered numbers). - - - Converts this object to a rational number. See the - ToObject overload taking a type for more information. - A rational number for this object's value. - This object does not - represent a number (for the purposes of this method, infinity and - not-a-number values, but not CBORObject.Null, are - considered numbers). - - - Converts this object to a 16-bit signed integer. Floating - point values are converted to integers by discarding their - fractional parts. - The closest 16-bit signed integer to this - object. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value exceeds the - range of a 16-bit signed integer. - - - Converts this object to a 32-bit signed integer if this - CBOR object's type is Integer. This method disregards the tags this - object has, if any. - The 32-bit signed integer stored by this object. - This object's type is - not CBORType.Integer - . - This object's value exceeds the - range of a 32-bit signed integer. - - The following example code (originally written in C# for - the.NET Framework) shows a way to check whether a given CBOR object - stores a 32-bit signed integer before getting its value. - CBORObject obj = CBORObject.FromInt32(99999); - if (obj.CanValueFitInInt32()) { /* Not an Int32; - handle the error */ Console.WriteLine("Not a 32-bit integer."); } else { - Console.WriteLine("The value is " + obj.AsInt32Value()); } - . - - - - Converts this object to a 64-bit signed integer if this - CBOR object's type is Integer. This method disregards the tags this - object has, if any. - The 64-bit signed integer stored by this object. - This object's type is - not CBORType.Integer - . - This object's value exceeds the - range of a 64-bit signed integer. - - The following example code (originally written in C# for - the.NET Framework) shows a way to check whether a given CBOR object - stores a 64-bit signed integer before getting its value. - CBORObject obj = CBORObject.FromInt64(99999); - if (obj.CanValueFitInInt64()) { - /* Not an Int64; handle the error*/ - Console.WriteLine("Not a 64-bit integer."); } else { - Console.WriteLine("The value is " + obj.AsInt64Value()); } - . - - - - Returns whether this CBOR object stores an integer - (CBORType.Integer) within the range of a 64-bit signed integer. - This method disregards the tags this object has, if any. - true if this CBOR object stores an integer - (CBORType.Integer) whose value is at least -(2^63) and less than - 2^63; otherwise, false. - - - Returns whether this CBOR object stores an integer - (CBORType.Integer) within the range of a 32-bit signed integer. - This method disregards the tags this object has, if any. - true if this CBOR object stores an integer - (CBORType.Integer) whose value is at least -(2^31) and less than - 2^31; otherwise, false. - - - Converts this object to an arbitrary-precision integer if - this CBOR object's type is Integer. This method disregards the tags - this object has, if any. (Note that CBOR stores untagged integers - at least -(2^64) and less than 2^64.). - The integer stored by this object. - This object's type is - not CBORType.Integer. - - - Converts this object to the bits of a 64-bit - floating-point number if this CBOR object's type is FloatingPoint. - This method disregards the tags this object has, if any. - The bits of a 64-bit floating-point number stored by this - object. The most significant bit is the sign (set means negative, - clear means nonnegative); the next most significant 11 bits are the - exponent area; and the remaining bits are the significand area. If - all the bits of the exponent area are set and the significand area - is 0, this indicates infinity. If all the bits of the exponent area - are set and the significand area is other than 0, this indicates - not-a-number (NaN). - This object's type is - not CBORType.FloatingPoint. - - - Converts this object to a 64-bit floating-point number if - this CBOR object's type is FloatingPoint. This method disregards - the tags this object has, if any. - The 64-bit floating-point number stored by this - object. - This object's type is - not CBORType.FloatingPoint. - - - Converts this object to a CBOR number. (NOTE: To determine - whether this method call can succeed, call the IsNumber - property (isNumber() method in Java) before calling this - method.). - The number represented by this object. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - - - Converts this object to a 32-bit signed integer. - Non-integer number values are converted to integers by discarding - their fractional parts. (NOTE: To determine whether this method - call can succeed, call AsNumber().CanTruncatedIntFitInInt32 - before calling this method. See the example.). - The closest 32-bit signed integer to this - object. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value exceeds the - range of a 32-bit signed integer. - - The following example code (originally written in C# for - the.NET Framework) shows a way to check whether a given CBOR object - stores a 32-bit signed integer before getting its value. - CBORObject obj = CBORObject.FromInt32(99999); - if (obj.AsNumber().CanTruncatedIntFitInInt32()) { - /* Not an Int32; handle the error */ - Console.WriteLine("Not a 32-bit integer."); } else { - Console.WriteLine("The value is " + obj.AsInt32()); } - . - - - - Converts this object to a 64-bit signed integer. - Non-integer numbers are converted to integers by discarding their - fractional parts. (NOTE: To determine whether this method call can - succeed, call AsNumber().CanTruncatedIntFitInInt64 - before - calling this method. See the example.). - The closest 64-bit signed integer to this - object. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value exceeds the - range of a 64-bit signed integer. - - The following example code (originally written in C# for - the.NET Framework) shows a way to check whether a given CBOR object - stores a 64-bit signed integer before getting its value. - CBORObject obj = CBORObject.FromInt64(99999); - if (obj.IsIntegral && obj.AsNumber().CanFitInInt64()) { - /* Not an Int64; handle the error */ - Console.WriteLine("Not a 64-bit integer."); } else { - Console.WriteLine("The value is " + obj.AsInt64()); } - . - - - - Converts this object to a 32-bit floating point - number. - The closest 32-bit floating point number to this object. - The return value can be positive infinity or negative infinity if - this object's value exceeds the range of a 32-bit floating point - number. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - - - Gets the value of this object as a text string. - Gets this object's string. - This object's type is - not a text string (for the purposes of this method, infinity and - not-a-number values, but not CBORObject.Null, are - considered numbers). To check the CBOR object for null before - conversion, use the following idiom (originally written in C# for - the.NET version): (cbor == null || cbor.IsNull) ? null : - cbor.AsString(). - This method is not the "reverse" of the FromObject - method in the sense that FromObject can take either a text string - or null, but this method can accept only text strings. The - ToObject method is closer to a "reverse" version to - FromObject than the AsString method: - ToObject<String>(cbor) in DotNet, or - ToObject(String.class) in Java, will convert a CBOR object - to a DotNet or Java String if it represents a text string, or to - null if IsNull returns true for the CBOR - object, and will fail in other cases. - - - Returns whether this object's value can be converted to a - 64-bit floating point number without its value being rounded to - another numerical value. - true if this object's value can be converted to a - 64-bit floating point number without its value being rounded to - another numerical value, or if this is a not-a-number value, even - if the value's diagnostic information can't fit in a 64-bit - floating point number; otherwise, false. - - - Returns whether this object's numerical value is an - integer, is -(2^31) or greater, and is less than 2^31. - true if this object's numerical value is an - integer, is -(2^31) or greater, and is less than 2^31; otherwise, - false. - - - Returns whether this object's numerical value is an - integer, is -(2^63) or greater, and is less than 2^63. - true if this object's numerical value is an - integer, is -(2^63) or greater, and is less than 2^63; otherwise, - false. - - - Returns whether this object's value can be converted to a - 32-bit floating point number without its value being rounded to - another numerical value. - true if this object's value can be converted to a - 32-bit floating point number without its value being rounded to - another numerical value, or if this is a not-a-number value, even - if the value's diagnostic information can' t fit in a 32-bit - floating point number; otherwise, false. - - - Returns whether this object's value, converted to an - integer by discarding its fractional part, would be -(2^31) or - greater, and less than 2^31. - true if this object's value, converted to an - integer by discarding its fractional part, would be -(2^31) or - greater, and less than 2^31; otherwise, false. - - - Returns whether this object's value, converted to an - integer by discarding its fractional part, would be -(2^63) or - greater, and less than 2^63. - true if this object's value, converted to an - integer by discarding its fractional part, would be -(2^63) or - greater, and less than 2^63; otherwise, false. - - - Compares two CBOR objects. This implementation was changed - in version 4.0. - In this implementation: - - The null pointer (null reference) is considered less than any - other object. - If the two objects are both integers (CBORType.Integer) both - floating-point values, both byte strings, both simple values - (including True and False), or both text strings, their CBOR - encodings (as though EncodeToBytes were called on each integer) are - compared as though by a byte-by-byte comparison. (This means, for - example, that positive integers sort before negative - integers). - If both objects have a tag, they are compared first by the - tag's value then by the associated item (which itself can have a - tag). - If both objects are arrays, they are compared item by item. - In this case, if the arrays have different numbers of items, the - array with more items is treated as greater than the other - array. - If both objects are maps, their key-value pairs, sorted by - key in accordance with this method, are compared, where each pair - is compared first by key and then by value. In this case, if the - maps have different numbers of key-value pairs, the map with more - pairs is treated as greater than the other map. - If the two objects have different types, the object whose - type comes first in the order of untagged integers, untagged byte - strings, untagged text strings, untagged arrays, untagged maps, - tagged objects, untagged simple values (including True and False) - and untagged floating point values sorts before the other - object. - This method is consistent with the Equals - method. - A value to compare with. - A negative number, if this value is less than the other - object; or 0, if both values are equal; or a positive number, if - this value is less than the other object or if the other object is - null. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares this object and another CBOR object, ignoring the - tags they have, if any. See the CompareTo method for more - information on the comparison function. - A value to compare with. - Less than 0, if this value is less than the other object; - or 0, if both values are equal; or greater than 0, if this value is - less than the other object or if the other object is - null. - - - Determines whether a value of the given key exists in this - object. - The parameter is an - arbitrary object. - true if the given key is found, or false if - the given key is not found or this object is not a map. - - - Determines whether a value of the given key exists in this - object. - An object that serves as the key. If this is - null, checks for CBORObject.Null. - true if the given key is found, or false if - the given key is not found or this object is not a map. - - - Determines whether a value of the given key exists in this - object. - A text string that serves as the key. If this is - null, checks for CBORObject.Null. - true if the given key (as a CBOR object) is found, - or false if the given key is not found or this object is not - a map. - - - - Writes the binary representation of this CBOR object and - returns a byte array of that representation. If the CBOR object - contains CBOR maps, or is a CBOR map itself, the order in which the - keys to the map are written out to the byte array is undefined - unless the map was created using the NewOrderedMap method. The - example code given in - can - be used to write out certain keys of a CBOR map in a given order. - For the CTAP2 (FIDO Client-to-Authenticator Protocol 2) canonical - ordering, which is useful for implementing Web Authentication, call - EncodeToBytes(new CBOREncodeOptions("ctap2canonical=true")) - rather than this method. - A byte array in CBOR format. - - - Writes the binary representation of this CBOR object and - returns a byte array of that representation, using the specified - options for encoding the object to CBOR format. For the CTAP2 (FIDO - Client-to-Authenticator Protocol 2) canonical ordering, which is - useful for implementing Web Authentication, call this method as - follows: EncodeToBytes(new - CBOREncodeOptions("ctap2canonical=true")). - Options for encoding the data to - CBOR. - A byte array in CBOR format. - The parameter is null. - - - Gets the CBOR object referred to by a JSON Pointer - according to RFC6901. For more information, see the overload taking - a default value parameter. - A JSON pointer according to RFC 6901. - An object within this CBOR object. Returns this object if - pointer is the empty string (even if this object has a CBOR type - other than array or map). - Thrown if the pointer - is null, or if the pointer is invalid, or if there is no object at - the given pointer, or the special key "-" appears in the pointer in - the context of an array (not a map), or if the pointer is non-empty - and this object has a CBOR type other than array or - map. - - - Gets the CBOR object referred to by a JSON Pointer - according to RFC6901, or a default value if the operation fails. - The syntax for a JSON Pointer is: -
'/' KEY '/' KEY [...]
where KEY represents a key into - the JSON object or its sub-objects in the hierarchy. For example, -
/foo/2/bar
means the same as -
obj['foo'][2]['bar']
in JavaScript. If "~" and/or "/" - occurs in a key, it must be escaped with "~0" or "~1", - respectively, in a JSON pointer. JSON pointers also support the - special key "-" (as in "/foo/-") to indicate the end of an array, - but this method treats this key as an error since it refers to a - nonexistent item. Indices to arrays (such as 2 in the example) must - contain only basic digits 0 to 9 and no leading zeros. (Note that - RFC 6901 was published before JSON was extended to support - top-level values other than arrays and key-value - dictionaries.).
- A JSON pointer according to RFC 6901. - The parameter is a Cbor.CBORObject object. - An object within the specified JSON object. Returns this - object if pointer is the empty string (even if this object has a - CBOR type other than array or map). Returns if the pointer is null, or if the pointer is - invalid, or if there is no object at the given pointer, or the - special key "-" appears in the pointer in the context of an array - (not a map), or if the pointer is non-empty and this object has a - CBOR type other than array or map. -
- - Returns a copy of this object after applying the - operations in a JSON patch, in the form of a CBOR object. JSON - patches are specified in RFC 6902 and their format is summarized in - the remarks below. - A JSON patch in the form of a CBOR object; it - has the form summarized in the remarks. - The result of the patch operation. - The parameter is null or the patch operation failed. - Remarks: A JSON patch is an array with one or more - maps. Each map has the following keys: - - "op" - Required. This key's value is the patch operation and - must be "add", "remove", "move", "copy", "test", or "replace", in - basic lower case letters and no other case combination. - "value" - Required if the operation is "add", "replace", or - "test" and specifies the item to add (insert), or that will replace - the existing item, or to check an existing item for equality, - respectively. (For "test", the operation fails if the existing item - doesn't match the specified value.) - "path" - Required for all operations. A JSON Pointer (RFC - 6901) specifying the destination path in the CBOR object for the - operation. For more information, see RFC 6901 or the documentation - for AtJSONPointer(pointer, defaultValue). - "from" - Required if the operation is "move" or "copy". A - JSON Pointer (RFC 6901) specifying the path in the CBOR object - where the source value is located. - - - Determines whether this object and another object are - equal and have the same type. Not-a-number values can be considered - equal by this method. - The parameter is an - arbitrary object. - true if the objects are equal; otherwise, - false. In this method, two objects are not equal if they - don't have the same type or if one is null and the other - isn't. - - - Compares the equality of two CBOR objects. Not-a-number - values can be considered equal by this method. - The object to compare. - true if the objects are equal; otherwise, - false. In this method, two objects are not equal if they - don't have the same type or if one is null and the other - isn't. - - - Gets the backing byte array used in this CBOR object, if - this object is a byte string, without copying the data to a new - byte array. Any changes in the returned array's contents will be - reflected in this CBOR object. Note, though, that the array's - length can't be changed. - The byte array held by this CBOR object. - This object is not a - byte string. - - - Calculates the hash code of this object. The hash code for - a given instance of this class is not guaranteed to be the same - across versions of this class, and no application or process IDs - are used in the hash code calculation. - A 32-bit hash code. - - - Gets a list of all tags, from outermost to - innermost. - An array of tags, or the empty string if this object is - untagged. - - - Returns whether this object has only one tag. - true if this object has only one tag; otherwise, - false. - - - Returns whether this object has only one tag and that tag - is the given number. - The tag number. - true if this object has only one tag and that tag - is the given number; otherwise, false. - The parameter is less than 0. - - - Returns whether this object has only one tag and that tag - is the given number, expressed as an arbitrary-precision - integer. - An arbitrary-precision integer. - true if this object has only one tag and that tag - is the given number; otherwise, false. - The parameter is null. - The parameter is less than 0. - - - Gets the number of tags this object has. - The number of tags this object has. - - - Returns whether this object has an innermost tag and that - tag is of the given number. - The tag number. - true if this object has an innermost tag and that - tag is of the given number; otherwise, false. - The parameter is less than 0. - - - Returns whether this object has an innermost tag and that - tag is of the given number, expressed as an arbitrary-precision - number. - The tag number. - true if this object has an innermost tag and that - tag is of the given number; otherwise, false. - The parameter is null. - The parameter is less than 0. - - - Returns whether this object has an outermost tag and that - tag is of the given number. - The tag number. - true if this object has an outermost tag and that - tag is of the given number; otherwise, false. - The parameter is less than 0. - - - Returns whether this object has an outermost tag and that - tag is of the given number. - The tag number. - true if this object has an outermost tag and that - tag is of the given number; otherwise, false. - The parameter is null. - The parameter is less than 0. - - - Returns whether this object has a tag of the given - number. - The tag value to search for. - true if this object has a tag of the given number; - otherwise, false. - The parameter is less than 0. - The parameter is null. - - - Returns whether this object has a tag of the given - number. - The tag value to search for. - true if this object has a tag of the given number; - otherwise, false. - The parameter is null. - The parameter is less than 0. - - - Inserts an object at the specified position in this CBOR - array. - Index starting at 0 to insert at. - An object representing the value, which will - be converted to a CBORObject. Can be null, in which case this value - is converted to CBORObject.Null. - This instance. - This object is not an - array. - The parameter has an unsupported type; or is not a valid index into this array. - - - Gets a value indicating whether this CBOR object - represents infinity. - true if this CBOR object represents infinity; - otherwise, false. - - - Gets a value indicating whether this CBOR object - represents a not-a-number value (as opposed to whether this object - does not express a number). - true if this CBOR object represents a not-a-number - value (as opposed to whether this object does not represent a - number as defined by the IsNumber property or isNumber() - method in Java); otherwise, false. - - - Gets a value indicating whether this CBOR object - represents negative infinity. - true if this CBOR object represents negative - infinity; otherwise, false. - - - Gets a value indicating whether this CBOR object - represents positive infinity. - true if this CBOR object represents positive - infinity; otherwise, false. - - - Gets this object's value with the sign reversed. - The reversed-sign form of this number. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - - - Removes all items from this CBOR array or all keys and - values from this CBOR map. - This object is not a - CBOR array or CBOR map. - - - If this object is an array, removes the first instance of - the specified item (once converted to a CBOR object) from the - array. If this object is a map, removes the item with the given key - (once converted to a CBOR object) from the map. - The item or key (once converted to a CBOR object) - to remove. - true if the item was removed; otherwise, - false. - The parameter is null (as opposed to CBORObject.Null). - The object is not an - array or map. - - - Removes the item at the given index of this CBOR - array. - The index, starting at 0, of the item to - remove. - Returns "true" if the object was removed. Returns "false" - if the given index is less than 0, or is at least as high as the - number of items in the array. - This object is not a - CBOR array. - - - If this object is an array, removes the first instance of - the specified item from the array. If this object is a map, removes - the item with the given key from the map. - The item or key to remove. - true if the item was removed; otherwise, - false. - The parameter is null (as opposed to CBORObject.Null). - The object is not an - array or map. - - - Maps an object to a key in this CBOR map, or adds the - value if the key doesn't exist. If this is a CBOR array, instead - sets the value at the given index to the given value. - If this instance is a CBOR map, this parameter is - an object representing the key, which will be converted to a - CBORObject; in this case, this parameter can be null, in which case - this value is converted to CBORObject.Null. If this instance is a - CBOR array, this parameter must be a 32-bit signed integer( - int ) identifying the index (starting from 0) of the item to - set in the array. - An object representing the value, which will - be converted to a CBORObject. Can be null, in which case this value - is converted to CBORObject.Null. - This instance. - This object is not a - map or an array. - The parameter or has an unsupported type, - or this instance is a CBOR array and is less - than 0, is the size of this array or greater, or is not a 32-bit - signed integer ( int ). - - - Converts this object to a text string in JavaScript Object - Notation (JSON) format. See the overload to ToJSONString taking a - JSONOptions argument for further information. - If the CBOR object contains CBOR maps, or is a CBOR map - itself, the order in which the keys to the map are written out to - the JSON string is undefined unless the map was created using the - NewOrderedMap method. Map keys other than untagged text strings are - converted to JSON strings before writing them out (for example, - 22("Test") is converted to "Test" and true is - converted to "true" ). After such conversion, if two or more - keys for the same map are identical, this method throws a - CBORException. The example code given in - PeterO.Cbor.CBORObject.ToJSONString(PeterO.Cbor.JSONOptions) - can be used to write out certain keys of a CBOR map in a given - order to a JSON string, or to write out a CBOR object as part of a - JSON text sequence. - Warning: In general, if this CBOR object contains - integer map keys or uses other features not supported in JSON, and - the application converts this CBOR object to JSON and back to CBOR, - the application - should not expect the new CBOR object to be exactly the same - as the original. This is because the conversion in many cases may - have to convert unsupported features in JSON to supported features - which correspond to a different feature in CBOR (such as converting - integer map keys, which are supported in CBOR but not JSON, to text - strings, which are supported in both). - A text string containing the converted object in JSON - format. - - - - Converts this object to a text string in JavaScript - Object Notation (JSON) format, using the specified - options to control the encoding process. This function - works not only with arrays and maps, but also integers, - strings, byte arrays, and other JSON data types. Notes: - - If this object contains maps with non-string - keys, the keys are converted to JSON strings before writing the map - as a JSON string. - If this object represents a number - (the IsNumber property, or isNumber() method in Java, returns - true), then it is written out as a number. - If the CBOR - object contains CBOR maps, or is a CBOR map itself, the order in - which the keys to the map are written out to the JSON string is - undefined unless the map was created using the NewOrderedMap - method. Map keys other than untagged text strings are converted to - JSON strings before writing them out (for example, - 22("Test") - is converted to "Test" - and true - is - converted to "true" - ). After such conversion, if two or more - keys for the same map are identical, this method throws a - CBORException. - If a number in the form of an - arbitrary-precision binary floating-point number has a very high - binary exponent, it will be converted to a double before being - converted to a JSON string. (The resulting double could overflow to - infinity, in which case the arbitrary-precision binary - floating-point number is converted to null.) - The - string will not begin with a byte-order mark (U+FEFF); RFC 8259 - (the JSON specification) forbids placing a byte-order mark at the - beginning of a JSON string. - Byte strings are converted - to Base64 URL without whitespace or padding by default (see section - 3.4.5.3 of RFC 8949). A byte string will instead be converted to - traditional base64 without whitespace and with padding if it has - tag 22, or base16 for tag 23. (To create a CBOR object with a given - tag, call the CBORObject.FromObjectAndTag - method and pass - the CBOR object and the desired tag number to that method.) - Rational numbers will be converted to their exact form, if - possible, otherwise to a high-precision approximation. (The - resulting approximation could overflow to infinity, in which case - the rational number is converted to null.) - Simple - values other than true and false will be converted to null. (This - doesn't include floating-point numbers.) - Infinity and - not-a-number will be converted to null. - - Warning: - In general, if this CBOR object contains - integer map keys or uses other features not supported in JSON, and - the application converts this CBOR object to JSON and back to CBOR, - the application should not - expect the new CBOR object to be - exactly the same as the original. This is because the conversion in - many cases may have to convert unsupported features in JSON to - supported features which correspond to a different feature in CBOR - (such as converting integer map keys, which are supported in CBOR - but not JSON, to text strings, which are supported in both). - The example code given below (originally written in C# for - the.NET version) can be used to write out certain keys of a CBOR - map in a given order to a JSON string. - /* Generates a JSON string of 'mapObj' whose keys are in the order - given - in 'keys' . Only keys found in 'keys' will be written if they exist in - 'mapObj'. */ private static string KeysToJSONMap(CBORObject mapObj, - IList<CBORObject> keys) { if (mapObj == null) { throw new - ArgumentNullException)nameof(mapObj));} - if (keys == null) { throw new - ArgumentNullException)nameof(keys));} - if (obj.Type != CBORType.Map) { - throw new ArgumentException("'obj' is not a map."); } StringBuilder - builder = new StringBuilder(); var first = true; builder.Append("{"); - for (CBORObject key in keys) { if (mapObj.ContainsKey(key)) { if - (!first) {builder.Append(", ");} var keyString=(key.CBORType == - CBORType.String) ? key.AsString() : key.ToJSONString(); - builder.Append(CBORObject.FromObject(keyString) .ToJSONString()) - .Append(":").Append(mapObj[key].ToJSONString()); first=false; } } return - builder.Append("}").ToString(); } - . - - Specifies options to control writing the CBOR - object to JSON. - A text string containing the converted object in JSON - format. - The parameter is null. - - - Returns this CBOR object in a text form intended to be - read by humans. The value returned by this method is not intended - to be parsed by computer programs, and the exact text of the value - may change at any time between versions of this library. - The returned string is not necessarily in JavaScript Object - Notation (JSON); to convert CBOR objects to JSON strings, use the - PeterO.Cbor.CBORObject.ToJSONString(PeterO.Cbor.JSONOptions) - method instead. - A text representation of this object. - - - Gets an object with the same value as this one but without - the tags it has, if any. If this object is an array, map, or byte - string, the data will not be copied to the returned object, so - changes to the returned object will be reflected in this - one. - A CBOR object. - - - Gets an object with the same value as this one but without - this object's outermost tag, if any. If this object is an array, - map, or byte string, the data will not be copied to the returned - object, so changes to the returned object will be reflected in this - one. - A CBOR object. - - - Converts this object to a text string in JavaScript Object - Notation (JSON) format, as in the ToJSONString method, and writes - that string to a data stream in UTF-8. If the CBOR object contains - CBOR maps, or is a CBOR map, the order in which the keys to the map - are written out to the JSON string is undefined unless the map was - created using the NewOrderedMap method. The example code given in - PeterO.Cbor.CBORObject.ToJSONString(PeterO.Cbor.JSONOptions) - can be used to write out certain keys of a CBOR map in a given - order to a JSON string. - A writable data stream. - An I/O error - occurred. - The parameter is null. - - The following example (originally written in C# for the.NET - version) writes out a CBOR object as part of a JSON text sequence - (RFC 7464). - - stream.WriteByte(0x1e); /* RS */ - cborObject.WriteJSONTo(stream); /* JSON */ - stream.WriteByte(0x0a); /* LF */ - - The following example (originally written in C# for the.NET - version) shows how to use the LimitedMemoryStream - class - (implemented in LimitedMemoryStream.cs - in the peteroupc/CBOR - open-source repository) to limit the size of supported JSON - serializations of CBOR objects. - - /* maximum supported JSON size in bytes*/ - var maxSize = 20000; - using (var ms = new LimitedMemoryStream(maxSize)) { - cborObject.WriteJSONTo(ms); - var bytes = ms.ToArray(); - } - - The following example (written in Java for the Java version) - shows how to use a subclassed OutputStream - together with a - ByteArrayOutputStream - to limit the size of supported JSON - serializations of CBOR objects. - - /* maximum supported JSON size in bytes*/ - final int maxSize = 20000; - ByteArrayOutputStream ba = new ByteArrayOutputStream(); - /* throws UnsupportedOperationException if too big*/ - cborObject.WriteJSONTo(new FilterOutputStream(ba) { - private int size = 0; - public void write(byte[] b, int off, int len) throws IOException { - if (len>(maxSize-size)) { - throw new UnsupportedOperationException(); - } - size+=len; out.write(b, off, len); - } - public void write(byte b) throws IOException { - if (size >= maxSize) { - throw new UnsupportedOperationException(); - } - size++; out.write(b); - } - }); - byte[] bytes = ba.toByteArray(); - - The following example (originally written in C# for the.NET - version) shows how to use a.NET MemoryStream to limit the size of - supported JSON serializations of CBOR objects. The disadvantage is - that the extra memory needed to do so can be wasteful, especially - if the average serialized object is much smaller than the maximum - size given (for example, if the maximum size is 20000 bytes, but - the average serialized object has a size of 50 bytes). - - var backing = new byte[20000]; /* maximum supported JSON size in - bytes*/ - byte[] bytes1, bytes2; - using (var ms = new MemoryStream(backing)) { - /* throws NotSupportedException if too big*/ - cborObject.WriteJSONTo(ms); - bytes1 = new byte[ms.Position]; - /* Copy serialized data if successful*/ - System.ArrayCopy(backing, 0, bytes1, 0, (int)ms.Position); - /* Reset memory stream*/ - ms.Position = 0; - cborObject2.WriteJSONTo(ms); - bytes2 = new byte[ms.Position]; - /* Copy serialized data if successful*/ - System.ArrayCopy(backing, 0, bytes2, 0, (int)ms.Position); - } - - - - - Converts this object to a text string in JavaScript Object - Notation (JSON) format, as in the ToJSONString method, and writes - that string to a data stream in UTF-8, using the given JSON options - to control the encoding process. If the CBOR object contains CBOR - maps, or is a CBOR map, the order in which the keys to the map are - written out to the JSON string is undefined unless the map was - created using the NewOrderedMap method. The example code given in - PeterO.Cbor.CBORObject.ToJSONString(PeterO.Cbor.JSONOptions) - can be used to write out certain keys of a CBOR map in a given - order to a JSON string. - A writable data stream. - An object containing the options to control - writing the CBOR object to JSON. - An I/O error - occurred. - The parameter is null. - - - Generates a CBOR object from a floating-point number - represented by its bits. - The bits of a floating-point number - number to write. - The number of bytes of the stored - floating-point number; this also specifies the format of the - "floatingBits" parameter. This value can be 2 if "floatingBits"'s - lowest (least significant) 16 bits identify the floating-point - number in IEEE 754r binary16 format; or 4 if "floatingBits"'s - lowest (least significant) 32 bits identify the floating-point - number in IEEE 754r binary32 format; or 8 if "floatingBits" - identifies the floating point number in IEEE 754r binary64 format. - Any other values for this parameter are invalid. - A CBOR object storing the given floating-point - number. - The parameter is other than 2, 4, or 8. - - - Writes the bits of a floating-point number in CBOR format - to a data stream. - A writable data stream. - The bits of a floating-point number - number to write. - The number of bytes of the stored - floating-point number; this also specifies the format of the - "floatingBits" parameter. This value can be 2 if "floatingBits"'s - lowest (least significant) 16 bits identify the floating-point - number in IEEE 754r binary16 format; or 4 if "floatingBits"'s - lowest (least significant) 32 bits identify the floating-point - number in IEEE 754r binary32 format; or 8 if "floatingBits" - identifies the floating point number in IEEE 754r binary64 format. - Any other values for this parameter are invalid. This method will - write one plus this many bytes to the data stream. - The number of 8-bit bytes ordered to be written to the - data stream. - The parameter is other than 2, 4, or 8. - The parameter is null. - - - Writes the bits of a floating-point number in CBOR format - to a data stream. - A writable data stream. - The bits of a floating-point number - number to write. - The number of bytes of the stored - floating-point number; this also specifies the format of the - "floatingBits" parameter. This value can be 2 if "floatingBits"'s - lowest (least significant) 16 bits identify the floating-point - number in IEEE 754r binary16 format; or 4 if "floatingBits"'s - lowest (least significant) 32 bits identify the floating-point - number in IEEE 754r binary32 format; or 8 if "floatingBits" - identifies the floating point number in IEEE 754r binary64 format. - Any other values for this parameter are invalid. - If true, writes the shortest form of the - floating-point number that preserves its value. If false, this - method will write the number in the form given by 'floatingBits' by - writing one plus the number of bytes given by 'byteCount' to the - data stream. - The number of 8-bit bytes ordered to be written to the - data stream. - The parameter is other than 2, 4, or 8. - The parameter is null. - - - Writes a 64-bit binary floating-point number in CBOR - format to a data stream, either in its 64-bit form, or its rounded - 32-bit or 16-bit equivalent. - A writable data stream. - The double-precision floating-point number - to write. - The number of 8-bit bytes of the stored - number. This value can be 2 to store the number in IEEE 754r - binary16, rounded to nearest, ties to even; or 4 to store the - number in IEEE 754r binary32, rounded to nearest, ties to even; or - 8 to store the number in IEEE 754r binary64. Any other values for - this parameter are invalid. - The number of 8-bit bytes ordered to be written to the - data stream. - The parameter is other than 2, 4, or 8. - The parameter is null. - - - Writes a 32-bit binary floating-point number in CBOR - format to a data stream, either in its 64- or 32-bit form, or its - rounded 16-bit equivalent. - A writable data stream. - The single-precision floating-point number - to write. - The number of 8-bit bytes of the stored - number. This value can be 2 to store the number in IEEE 754r - binary16, rounded to nearest, ties to even; or 4 to store the - number in IEEE 754r binary32; or 8 to store the number in IEEE 754r - binary64. Any other values for this parameter are invalid. - The number of 8-bit bytes ordered to be written to the - data stream. - The parameter is other than 2, 4, or 8. - The parameter is null. - - - Writes a CBOR major type number and an integer 0 or - greater associated with it to a data stream, where that integer is - passed to this method as a 64-bit signed integer. This is a - low-level method that is useful for implementing custom CBOR - encoding methodologies. This method encodes the given major type - and value in the shortest form allowed for the major - type. - A writable data stream. - The CBOR major type to write. This is a - number from 0 through 7 as follows. 0: integer 0 or greater; 1: - negative integer; 2: byte string; 3: UTF-8 text string; 4: array; - 5: map; 6: tag; 7: simple value. See RFC 8949 for details on these - major types. - An integer 0 or greater associated with the - major type, as follows. 0: integer 0 or greater; 1: the negative - integer's absolute value is 1 plus this number; 2: length in bytes - of the byte string; 3: length in bytes of the UTF-8 text string; 4: - number of items in the array; 5: number of key-value pairs in the - map; 6: tag number; 7: simple value number, which must be in the - interval [0, 23] or [32, 255]. - The number of bytes ordered to be written to the data - stream. - Value is from 24 to 31 and - major type is 7. - The parameter is null. - There are other useful things to note when encoding CBOR - that are not covered by this WriteValue method. To mark the start - of an indefinite-length array, write the 8-bit byte 0x9f to the - output stream. To mark the start of an indefinite-length map, write - the 8-bit byte 0xbf to the output stream. To mark the end of an - indefinite-length array or map, write the 8-bit byte 0xff to the - output stream. For examples, see the WriteValue(Stream, int, int) - overload. - - - Writes a CBOR major type number and an integer 0 or - greater associated with it to a data stream, where that integer is - passed to this method as a 32-bit signed integer. This is a - low-level method that is useful for implementing custom CBOR - encoding methodologies. This method encodes the given major type - and value in the shortest form allowed for the major - type. - A writable data stream. - The CBOR major type to write. This is a - number from 0 through 7 as follows. 0: integer 0 or greater; 1: - negative integer; 2: byte string; 3: UTF-8 text string; 4: array; - 5: map; 6: tag; 7: simple value. See RFC 8949 for details on these - major types. - An integer 0 or greater associated with the - major type, as follows. 0: integer 0 or greater; 1: the negative - integer's absolute value is 1 plus this number; 2: length in bytes - of the byte string; 3: length in bytes of the UTF-8 text string; 4: - number of items in the array; 5: number of key-value pairs in the - map; 6: tag number; 7: simple value number, which must be in the - interval [0, 23] or [32, 255]. - The number of bytes ordered to be written to the data - stream. - Value is from 24 to 31 and - major type is 7. - The parameter is null. - There are other useful things to note when encoding CBOR - that are not covered by this WriteValue method. To mark the start - of an indefinite-length array, write the 8-bit byte 0x9f to the - output stream. To mark the start of an indefinite-length map, write - the 8-bit byte 0xbf to the output stream. To mark the end of an - indefinite-length array or map, write the 8-bit byte 0xff to the - output stream. - - In the following example, an array of three objects is - written as CBOR to a data stream. - /* array, length 3*/ - CBORObject.WriteValue(stream, 4, 3); - /* item 1 */ - CBORObject.Write("hello world", stream); - CBORObject.Write(25, stream); /* item 2*/ - CBORObject.Write(false, stream); /* item 3*/ - In the following example, a map consisting of two key-value - pairs is written as CBOR to a data stream. - CBORObject.WriteValue(stream, 5, 2); /* map, 2 - pairs*/ - CBORObject.Write("number", stream); /* key 1 */ - CBORObject.Write(25, stream); /* value 1 */ - CBORObject.Write("string", stream); /* key 2*/ - CBORObject.Write("hello", stream); /* value 2*/ - In the following example (originally written in C# for - the.NET Framework version), a text string is written as CBOR to a - data stream. - string str = "hello world"; byte[] bytes = - DataUtilities.GetUtf8Bytes(str, true); CBORObject.WriteValue(stream, 4, - bytes.Length); stream.Write(bytes, 0, bytes.Length); - . - - - - Writes a CBOR major type number and an integer 0 or - greater associated with it to a data stream, where that integer is - passed to this method as an arbitrary-precision integer. This is a - low-level method that is useful for implementing custom CBOR - encoding methodologies. This method encodes the given major type - and value in the shortest form allowed for the major - type. - A writable data stream. - The CBOR major type to write. This is a - number from 0 through 7 as follows. 0: integer 0 or greater; 1: - negative integer; 2: byte string; 3: UTF-8 text string; 4: array; - 5: map; 6: tag; 7: simple value. See RFC 8949 for details on these - major types. - An integer 0 or greater associated with - the major type, as follows. 0: integer 0 or greater; 1: the - negative integer's absolute value is 1 plus this number; 2: length - in bytes of the byte string; 3: length in bytes of the UTF-8 text - string; 4: number of items in the array; 5: number of key-value - pairs in the map; 6: tag number; 7: simple value number, which must - be in the interval [0, 23] or [32, 255]. For major types 0 to 6, - this number may not be greater than 2^64 - 1. - The number of bytes ordered to be written to the data - stream. - The parameter is 7 and value is greater than 255. - The parameter or is - null. - There are other useful things to note when encoding CBOR - that are not covered by this WriteValue method. To mark the start - of an indefinite-length array, write the 8-bit byte 0x9f to the - output stream. To mark the start of an indefinite-length map, write - the 8-bit byte 0xbf to the output stream. To mark the end of an - indefinite-length array or map, write the 8-bit byte 0xff to the - output stream. - - - Writes this CBOR object to a data stream. If the - CBOR object contains CBOR maps, or is a CBOR map, the order in - which the keys to the map are written out to the data stream is - undefined unless the map was created using the NewOrderedMap - method. See the examples (originally written in C# for the.NET - version) for ways to write out certain keys of a CBOR map in a - given order. In the case of CBOR objects of type FloatingPoint, the - number is written using the shortest floating-point encoding - possible; this is a change from previous versions. - - A writable data stream. - The parameter is null. - An I/O error - occurred. - - The following example shows a method that writes each key of - 'mapObj' to 'outputStream', in the order given in 'keys', where - 'mapObj' is written out in the form of a CBOR definite-length - map - . Only keys found in 'keys' will be written if they exist - in 'mapObj'. - private static void WriteKeysToMap(CBORObject mapObj, - IList<CBORObject> keys, Stream outputStream) { - if (mapObj == null) { - throw new ArgumentNullException(nameof(mapObj));} - if (keys == null) - {throw new ArgumentNullException(nameof(keys));} - if (outputStream == - null) {throw new ArgumentNullException(nameof(outputStream));} - if - (obj.Type!=CBORType.Map) { throw new ArgumentException("'obj' is not a - map."); } int keyCount = 0; for (CBORObject key in keys) { if - (mapObj.ContainsKey(key)) { keyCount++; } } - CBORObject.WriteValue(outputStream, 5, keyCount); for (CBORObject key in - keys) { if (mapObj.ContainsKey(key)) { key.WriteTo(outputStream); - mapObj[key].WriteTo(outputStream); } } } - The following example shows a method that writes each key of - 'mapObj' to 'outputStream', in the order given in 'keys', where - 'mapObj' is written out in the form of a CBOR indefinite-length - map - . Only keys found in 'keys' will be written if they exist - in 'mapObj'. - private static void WriteKeysToIndefMap(CBORObject mapObj, - IList<CBORObject> keys, Stream outputStream) { if (mapObj == null) - { throw new ArgumentNullException(nameof(mapObj));} - if (keys == null) - {throw new ArgumentNullException(nameof(keys));} - if (outputStream == - null) {throw new ArgumentNullException(nameof(outputStream));} - if - (obj.Type!=CBORType.Map) { throw new ArgumentException("'obj' is not a - map."); } outputStream.WriteByte((byte)0xBF); for (CBORObject key in - keys) { if (mapObj.ContainsKey(key)) { key.WriteTo(outputStream); - mapObj[key].WriteTo(outputStream); } } - outputStream.WriteByte((byte)0xff); } - The following example shows a method that writes out a list - of objects to 'outputStream' as an indefinite-length CBOR - array - . - private static void WriteToIndefArray(IList<object> list, - Stream - outputStream) { if (list == null) { throw new - ArgumentNullException(nameof(list));} - if (outputStream == null) {throw - new ArgumentNullException(nameof(outputStream));} - outputStream.WriteByte((byte)0x9f); for (object item in list) { new - CBORObject(item).WriteTo(outputStream); } - outputStream.WriteByte((byte)0xff); } - The following example (originally written in C# for the.NET - version) shows how to use the LimitedMemoryStream - class - (implemented in LimitedMemoryStream.cs - in the peteroupc/CBOR - open-source repository) to limit the size of supported CBOR - serializations. - - /* maximum supported CBOR size in bytes*/ - var maxSize = 20000; - using (var ms = new LimitedMemoryStream(maxSize)) { - cborObject.WriteTo(ms); - var bytes = ms.ToArray(); - } - - The following example (written in Java for the Java version) - shows how to use a subclassed OutputStream - together with a - ByteArrayOutputStream - to limit the size of supported CBOR - serializations. - - /* maximum supported CBOR size in bytes*/ - final int maxSize = 20000; - ByteArrayOutputStream ba = new ByteArrayOutputStream(); - /* throws UnsupportedOperationException if too big*/ - cborObject.WriteTo(new FilterOutputStream(ba) { - private int size = 0; - public void write(byte[] b, int off, int len) throws IOException { - if (len>(maxSize-size)) { - throw new UnsupportedOperationException(); - } - size+=len; out.write(b, off, len); - } - public void write(byte b) throws IOException { - if (size >= maxSize) { - throw new UnsupportedOperationException(); - } - size++; out.write(b); - } - }); - byte[] bytes = ba.toByteArray(); - - The following example (originally written in C# for the.NET - version) shows how to use a.NET MemoryStream to limit the size of - supported CBOR serializations. The disadvantage is that the extra - memory needed to do so can be wasteful, especially if the average - serialized object is much smaller than the maximum size given (for - example, if the maximum size is 20000 bytes, but the average - serialized object has a size of 50 bytes). - - var backing = new byte[20000]; /* maximum supported CBOR size in - bytes*/ - byte[] bytes1, bytes2; - using (var ms = new MemoryStream(backing)) { - /* throws NotSupportedException if too big*/ - cborObject.WriteTo(ms); - bytes1 = new byte[ms.Position]; - /* Copy serialized data if successful*/ - System.ArrayCopy(backing, 0, bytes1, 0, (int)ms.Position); - /* Reset memory stream*/ - ms.Position = 0; - cborObject2.WriteTo(ms); - bytes2 = new byte[ms.Position]; - /* Copy serialized data if successful*/ - System.ArrayCopy(backing, 0, bytes2, 0, (int)ms.Position); - } - - - - - Writes this CBOR object to a data stream, using the - specified options for encoding the data to CBOR format. If the CBOR - object contains CBOR maps, or is a CBOR map, the order in which the - keys to the map are written out to the data stream is undefined - unless the map was created using the NewOrderedMap method. The - example code given in - can - be used to write out certain keys of a CBOR map in a given order. - In the case of CBOR objects of type FloatingPoint, the number is - written using the shortest floating-point encoding possible; this - is a change from previous versions. - A writable data stream. - Options for encoding the data to - CBOR. - The parameter is null. - An I/O error - occurred. - Unexpected data - type". - - - Returns whether one object's value is less than - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if one object's value is less than another's; - otherwise, false. - The parameter is null. - - - Returns whether one object's value is up to - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if one object's value is up to another's; - otherwise, false. - The parameter is null. - - - Returns whether one object's value is greater than - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if one object's value is greater than - another's; otherwise, false. - The parameter is null. - - - Returns whether one object's value is at least - another's. - The left-hand side of the comparison. - The right-hand side of the comparison. - true if one object's value is at least another's; - otherwise, false. - The parameter is null. - - - Converts this object to a 16-bit unsigned integer after - discarding any fractional part, if any, from its value. - A 16-bit unsigned integer. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value, if - converted to an integer by discarding its fractional part, is - outside the range of a 16-bit unsigned integer. - - - Converts this object to a 32-bit unsigned integer after - discarding any fractional part, if any, from its value. - A 32-bit unsigned integer. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value, if - converted to an integer by discarding its fractional part, is - outside the range of a 32-bit unsigned integer. - - - Converts this object to an 8-bit signed integer. - An 8-bit signed integer. - - - Writes a CBOR major type number and an integer 0 or - greater associated with it to a data stream, where that integer is - passed to this method as a 32-bit unsigned integer. This is a - low-level method that is useful for implementing custom CBOR - encoding methodologies. This method encodes the given major type - and value in the shortest form allowed for the major - type. - A writable data stream. - The CBOR major type to write. This is a - number from 0 through 7 as follows. 0: integer 0 or greater; 1: - negative integer; 2: byte string; 3: UTF-8 text string; 4: array; - 5: map; 6: tag; 7: simple value. See RFC 7049 for details on these - major types. - An integer 0 or greater associated with the - major type, as follows. 0: integer 0 or greater; 1: the negative - integer's absolute value is 1 plus this number; 2: length in bytes - of the byte string; 3: length in bytes of the UTF-8 text string; 4: - number of items in the array; 5: number of key-value pairs in the - map; 6: tag number; 7: simple value number, which must be in the - interval [0, 23] or [32, 255]. - The number of bytes ordered to be written to the data - stream. - The parameter is null. - - - Writes a CBOR major type number and an integer 0 or - greater associated with it to a data stream, where that integer is - passed to this method as a 64-bit unsigned integer. This is a - low-level method that is useful for implementing custom CBOR - encoding methodologies. This method encodes the given major type - and value in the shortest form allowed for the major - type. - A writable data stream. - The CBOR major type to write. This is a - number from 0 through 7 as follows. 0: integer 0 or greater; 1: - negative integer; 2: byte string; 3: UTF-8 text string; 4: array; - 5: map; 6: tag; 7: simple value. See RFC 7049 for details on these - major types. - An integer 0 or greater associated with the - major type, as follows. 0: integer 0 or greater; 1: the negative - integer's absolute value is 1 plus this number; 2: length in bytes - of the byte string; 3: length in bytes of the UTF-8 text string; 4: - number of items in the array; 5: number of key-value pairs in the - map; 6: tag number; 7: simple value number, which must be in the - interval [0, 23] or [32, 255]. - The number of bytes ordered to be written to the data - stream. - The parameter is 7 and value is greater than 255. - The parameter is null. - - - Converts this object to a DotNet decimal. - The closest big integer to this object. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value exceeds the - range of a DotNet decimal. - - - Converts this object to a 64-bit unsigned integer after - discarding any fractional part, if any, from its value. - A 64-bit unsigned integer. - This object does not - represent a number (for this purpose, infinities and not-a-number - or NaN values, but not CBORObject.Null, are considered - numbers). - This object's value, if - converted to an integer by discarding its fractional part, is - outside the range of a 64-bit unsigned integer. - - - Writes an 8-bit signed integer in CBOR format to a data - stream. - The parameter is an - 8-bit signed integer. - A writable data stream. - - - Writes a 64-bit unsigned integer in CBOR format to a data - stream. - A 64-bit unsigned integer. - A writable data stream. - The parameter is null. - - - Converts a.NET decimal to a CBOR object. - The parameter is a - Decimal object. - A CBORObject object with the same value as the.NET - decimal. - - - Writes a 32-bit unsigned integer in CBOR format to a data - stream. - A 32-bit unsigned integer. - A writable data stream. - - - Writes a 16-bit unsigned integer in CBOR format to a data - stream. - A 16-bit unsigned integer. - A writable data stream. - - - Converts a signed 8-bit integer to a CBOR - object. - The parameter is an - 8-bit signed integer. - A CBORObject object. - - - Converts a 64-bit unsigned integer to a CBOR - object. - A 64-bit unsigned integer. - A CBORObject object. - - - Converts a 32-bit unsigned integer to a CBOR - object. - A 32-bit unsigned integer. - A CBORObject object. - - - Converts a 16-bit unsigned integer to a CBOR - object. - A 16-bit unsigned integer. - A CBORObject object. - - - Generates a CBOR object from this one, but gives the - resulting object a tag in addition to its existing tags (the new - tag is made the outermost tag). - A 64-bit integer that specifies a tag number. The - tag number 55799 can be used to mark a "self-described CBOR" - object. This document does not attempt to list all CBOR tags and - their meanings. An up-to-date list can be found at the CBOR Tags - registry maintained by the Internet Assigned Numbers Authority( - iana.org/assignments/cbor-tags ). - A CBOR object with the same value as this one but given - the tag in addition to its existing tags - (the new tag is made the outermost tag). - - - Generates a CBOR object from an arbitrary object and gives - the resulting object a tag. - The parameter is an arbitrary - object, which can be null. - NOTE: For security reasons, whenever possible, an - application should not base this parameter on user input or other - externally supplied data unless the application limits this - parameter's inputs to types specially handled by this method (such - as int or String ) and/or to plain-old-data types - (POCO or POJO types) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above.. - A 64-bit integer that specifies a tag number. The - tag number 55799 can be used to mark a "self-described CBOR" - object. This document does not attempt to list all CBOR tags and - their meanings. An up-to-date list can be found at the CBOR Tags - registry maintained by the Internet Assigned Numbers Authority( - iana.org/assignments/cbor-tags ). - A CBOR object where the object is - converted to a CBOR object and given the tag - . If "valueOb" is null, returns a version of CBORObject.Null with - the given tag. - - - - Converts this CBOR object to an object of an arbitrary type. - See - for - further information. - The type, class, or interface that this - method's return value will belong to. Note: For security - reasons, an application should not base this parameter on user - input or other externally supplied data. Whenever possible, this - parameter should be either a type specially handled by this method - (such as int or String ) or a plain-old-data type - (POCO or POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - The converted object. - The given type "T", or this - object's CBOR type, is not supported. - - - - Converts this CBOR object to an object of an arbitrary type. - See - for - further information. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. - The type, class, or interface that this - method's return value will belong to. Note: For security - reasons, an application should not base this parameter on user - input or other externally supplied data. Whenever possible, this - parameter should be either a type specially handled by this method - (such as int or String ) or a plain-old-data type - (POCO or POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - The converted object. - The given type "T", or this - object's CBOR type, is not supported. - - - - Converts this CBOR object to an object of an arbitrary type. - See - for - further information. - Specifies options for controlling - deserialization of CBOR objects. - The type, class, or interface that this - method's return value will belong to. Note: For security - reasons, an application should not base this parameter on user - input or other externally supplied data. Whenever possible, this - parameter should be either a type specially handled by this method - (such as int or String ) or a plain-old-data type - (POCO or POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - The converted object. - The given type "T", or this - object's CBOR type, is not supported. - - - - Converts this CBOR object to an object of an arbitrary type. - See - for - further information. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. - Specifies options for controlling - deserialization of CBOR objects. - The type, class, or interface that this - method's return value will belong to. Note: For security - reasons, an application should not base this parameter on user - input or other externally supplied data. Whenever possible, this - parameter should be either a type specially handled by this method - (such as int or String ) or a plain-old-data type - (POCO or POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - The converted object. - The given type "T", or this - object's CBOR type, is not supported. - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes, using the given CBOREncodeOptions object - to control the decoding process. It is equivalent to - DecodeFromBytes followed by ToObject. See the documentation for - those methods for more information. - A byte array in which a single CBOR object is - encoded. - Specifies options to control how the CBOR object - is decoded. See - for more - information. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. Can be - null. - Specifies options for controlling deserialization - of CBOR objects. - The type, class, or interface that this - method's return value will belong to. To express a generic type in - Java, see the example. Note: For security reasons, an - application should not base this parameter on user input or other - externally supplied data. Whenever possible, this parameter should - be either a type specially handled by this method, such as - int or String, or a plain-old-data type (POCO or - POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type "T", or this object's CBOR type, is not - supported, or the given object's nesting is too deep, or another - error occurred when serializing the object. - The parameter is null, or the parameter is - null, or the parameter "T" or is - null. - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes, using the given CBOREncodeOptions object - to control the decoding process. It is equivalent to - DecodeFromBytes followed by ToObject. See the documentation for - those methods for more information. - A byte array in which a single CBOR object is - encoded. - Specifies options to control how the CBOR object - is decoded. See - for more - information. - The type, class, or interface that this - method's return value will belong to. Note: For security - reasons, an application should not base this parameter on user - input or other externally supplied data. Whenever possible, this - parameter should be either a type specially handled by this method, - such as int or String, or a plain-old-data type - (POCO or POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type "T", or this object's CBOR type, is not - supported, or the given object's nesting is too deep, or another - error occurred when serializing the object. - The parameter is null, or the parameter is - null. - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes. It is equivalent to DecodeFromBytes followed by - ToObject. See the documentation for those methods for more - information. - A byte array in which a single CBOR object is - encoded. - This parameter controls which data types are - eligible for Plain-Old-Data deserialization and includes custom - converters from CBOR objects to certain data types. Can be - null. - Specifies options for controlling deserialization - of CBOR objects. - The type, class, or interface that this - method's return value will belong to. To express a generic type in - Java, see the example. Note: For security reasons, an - application should not base this parameter on user input or other - externally supplied data. Whenever possible, this parameter should - be either a type specially handled by this method, such as - int or String, or a plain-old-data type (POCO or - POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type "T", or this object's CBOR type, is not - supported, or the given object's nesting is too deep, or another - error occurred when serializing the object. - The parameter is null, or the parameter "T" or is null. - - - Generates an object of an arbitrary type from an array of - CBOR-encoded bytes. It is equivalent to DecodeFromBytes followed by - ToObject. See the documentation for those methods for more - information. - A byte array in which a single CBOR object is - encoded. - The type, class, or interface that this - method's return value will belong to. To express a generic type in - Java, see the example. Note: For security reasons, an - application should not base this parameter on user input or other - externally supplied data. Whenever possible, this parameter should - be either a type specially handled by this method, such as - int or String, or a plain-old-data type (POCO or - POJO type) within the control of the application. If the - plain-old-data type references other data types, those types should - likewise meet either criterion above. - An object of the given type decoded from the given byte - array. Returns null (as opposed to CBORObject.Null) if is empty and the AllowEmpty property is set on the - given CBOREncodeOptions object. - There was an error in - reading or parsing the data. This includes cases where not all of - the byte array represents a CBOR object. This exception is also - thrown if the parameter is empty unless the - AllowEmpty property is set on the given options object. Also thrown - if the given type "T", or this object's CBOR type, is not - supported, or the given object's nesting is too deep, or another - error occurred when serializing the object. - The parameter is null. - - - Does an addition on two CBOR objects and returns their - result. - The parameter is a CBOR - object. - The parameter is a CBOR - object. - The sum of the two objects. - - - Subtracts a CBORObject object from a CBORObject - object. - The parameter is a CBOR - object. - The parameter is a CBOR - object. - The difference of the two objects. - - - Multiplies a CBORObject object by the value of a - CBORObject object. - The parameter is a CBOR - object. - The parameter is a CBOR - object. - The product of the two numbers. - - - Divides a CBORObject object by the value of a CBORObject - object. - The parameter is a CBOR - object. - The parameter is a CBOR - object. - The quotient of the two objects. - - - Finds the remainder that results when a CBORObject object - is divided by the value of a CBORObject object. - The parameter is a CBOR - object. - The parameter is a CBOR - object. - The remainder of the two numbers. - - - Represents a type that a CBOR object can have. - - - This property is no longer used. - - - The simple values true and false. - - - A "simple value" other than floating point values, true, - and false. - - - An array of bytes. - - - A text string. - - - An array of CBOR objects. - - - A map of CBOR objects. - - - An integer in the interval [-(2^64), 2^64 - 1], or an - integer of major type 0 and 1. - - - A 16-, 32-, or 64-bit binary floating-point - number. - - - Holds converters to customize the serialization and - deserialization behavior of CBORObject.FromObject and - CBORObject#ToObject, as well as type filters for - ToObject. - - - Initializes a new instance of the - class. - - - Registers an object that converts objects of a given type - to CBOR objects (called a CBOR converter). If the CBOR converter - converts to and from CBOR objects, it should implement the - ICBORToFromConverter interface and provide ToCBORObject and - FromCBORObject methods. If the CBOR converter only supports - converting to (not from) CBOR objects, it should implement the - ICBORConverter interface and provide a ToCBORObject - method. - A Type object specifying the type that the - converter converts to CBOR objects. - The parameter - is an ICBORConverter object. - Must be the same as the "type" - parameter. - This object. - The parameter or is null. - Converter doesn't contain a - proper ToCBORObject method". - - - Returns whether the given Java or.NET type name fits the - filters given in this mapper. - The fully qualified name of a Java or.NET - class (e.g., java.math.BigInteger or - System.Globalization.CultureInfo ). - Either true if the given Java or.NET type name fits - the filters given in this mapper, or false - otherwise. - - - Adds a prefix of a Java or.NET type for use in type - matching. A type matches a prefix if its fully qualified name is or - begins with that prefix, using codepoint-by-codepoint - (case-sensitive) matching. - The prefix of a Java or.NET type (e.g., - `java.math.` or `System.Globalization`). - This object. - The parameter is null. - The parameter is empty. - - - Adds the fully qualified name of a Java or.NET type for - use in type matching. - The fully qualified name of a Java or.NET class - (e.g., java.math.BigInteger or - System.Globalization.CultureInfo ). - This object. - The parameter is null. - The parameter is empty. - - - Contains utility methods that may have use outside of the - CBORObject class. - - - Internal API. - The parameter is an - internal parameter. - A CBORObject object. - - - Interface implemented by classes that convert objects of - arbitrary types to CBOR objects. - Type to convert to a CBOR object. - - - Converts an object to a CBOR object. - An object to convert to a CBOR object. - A CBOR object. - - - This is an internal API. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - This is an internal API. - The parameter is an - arbitrary object. - The return value is an internal value. - - - Classes that implement this interface can support - conversions from CBOR objects to a custom type and back. - Type of objects to convert to and from CBOR - objects. - - - Converts a CBOR object to a custom type. - A CBOR object to convert to the custom - type. - An object of the custom type after conversion. - - - An interface for reading Unicode characters from a data - source. - - - Reads a Unicode character from a data source. - Either a Unicode code point (from 0-0xd7ff or from 0xe000 - to 0x10ffff), or the value -1 indicating the end of the - source. - - - Reads a sequence of Unicode code points from a data - source. - Output buffer. - Index in the output buffer to start writing - to. - Maximum number of code points to - write. - Either a Unicode code point (from 0-0xd7ff or from 0xe000 - to 0x10ffff), or the value -1 indicating the end of the - source. - Either "index" or - "length" is less than 0 or greater than - "chars"'s length, or "chars"'s length - minus "index" is less than - "length". - The parameter is null. - - - Includes options to control how CBOR objects are converted - to and from JavaScript Object Notation (JSON). - - - Specifies how JSON numbers are converted to CBOR objects - when decoding JSON (such as via FromJSONString or - ReadJSON ). None of these conversion modes affects how CBOR - objects are later encoded (such as via EncodeToBytes - ). - - - JSON numbers are decoded to CBOR using the full precision - given in the JSON text. The number will be converted to a CBOR - object as follows: If the number's exponent is 0 (after shifting - the decimal point to the end of the number without changing its - value), use the rules given in the - CBORObject.FromObject(EInteger) method; otherwise, use the - rules given in the CBORObject.FromObject(EDecimal) method. - An exception in version 4.x involves negative zeros; if the - negative zero's exponent is 0, it's written as a CBOR - floating-point number; otherwise the negative zero is written as an - EDecimal. - - - JSON numbers are decoded to CBOR as their closest-rounded - approximation as 64-bit binary floating-point numbers (using the - round-to-nearest/ties-to-even rounding mode). (In some cases, - numbers extremely close to zero may underflow to positive or - negative zero, and numbers of extremely large absolute value may - overflow to infinity.). It's important to note that this mode - affects only how JSON numbers are - decoded to a CBOR object; it doesn't affect how - EncodeToBytes and other methods encode CBOR objects. - Notably, by default, EncodeToBytes encodes CBOR - floating-point values to the CBOR format in their 16-bit - ("half-float"), 32-bit ("single-precision"), or 64-bit - ("double-precision") encoding form depending on the - value. - - - A JSON number is decoded to CBOR objects either as a CBOR - integer (major type 0 or 1) if the JSON number represents an - integer at least -(2^53)+1 and less than 2^53, or as their - closest-rounded approximation as 64-bit binary floating-point - numbers (using the round-to-nearest/ties-to-even rounding mode) - otherwise. For example, the JSON number - 0.99999999999999999999999999999999999 is not an integer, so it's - converted to its closest 64-bit binary floating-point - approximation, namely 1.0. (In some cases, numbers extremely close - to zero may underflow to positive or negative zero, and numbers of - extremely large absolute value may overflow to infinity.). It's - important to note that this mode affects only how JSON numbers are - decoded to a CBOR object; it doesn't affect how - EncodeToBytes and other methods encode CBOR objects. - Notably, by default, EncodeToBytes encodes CBOR - floating-point values to the CBOR format in their 16-bit - ("half-float"), 32-bit ("single-precision"), or 64-bit - ("double-precision") encoding form depending on the - value. - - - A JSON number is decoded to CBOR objects either as a CBOR - integer (major type 0 or 1) if the number's closest-rounded - approximation as a 64-bit binary floating-point number (using the - round-to-nearest/ties-to-even rounding mode) represents an integer - at least -(2^53)+1 and less than 2^53, or as that approximation - otherwise. For example, the JSON number - 0.99999999999999999999999999999999999 is the integer 1 when rounded - to its closest 64-bit binary floating-point approximation (1.0), so - it's converted to the CBOR integer 1 (major type 0). (In some - cases, numbers extremely close to zero may underflow to zero, and - numbers of extremely large absolute value may overflow to - infinity.). It's important to note that this mode affects only how - JSON numbers are - decoded to a CBOR object; it doesn't affect how - EncodeToBytes and other methods encode CBOR objects. - Notably, by default, EncodeToBytes encodes CBOR - floating-point values to the CBOR format in their 16-bit - ("half-float"), 32-bit ("single-precision"), or 64-bit - ("double-precision") encoding form depending on the - value. - - - JSON numbers are decoded to CBOR as their closest-rounded - approximation to an IEEE 854 decimal128 value, using the - round-to-nearest/ties-to-even rounding mode and the rules for the - EDecimal form of that approximation as given in the - CBORObject.FromObject(EDecimal) method. (In some cases, - numbers extremely close to zero may underflow to zero, and numbers - of extremely large absolute value may overflow to - infinity.). - - - Initializes a new instance of the - class with default - options. - - - Initializes a new instance of the - class with the given value - for the Base64Padding option. - Whether padding is included when - writing data in base64url or traditional base64 format to - JSON. - - - Initializes a new instance of the - class with the given values - for the options. - Whether padding is included when - writing data in base64url or traditional base64 format to - JSON. - Whether surrogate code points not - part of a surrogate pair (which consists of two consecutive - char s forming one Unicode code point) are each replaced - with a replacement character (U+FFFD). The default is false; an - exception is thrown when such code points are encountered. - - - Initializes a new instance of the - class. - A string setting forth the options to - use. This is a semicolon-separated list of options, each of which - has a key and a value separated by an equal sign ("="). Whitespace - and line separators are not allowed to appear between the - semicolons or between the equal signs, nor may the string begin or - end with whitespace. The string can be empty, but cannot be null. - The following is an example of this parameter: - base64padding=false;replacesurrogates=true. The key can be - any one of the following where the letters can be any combination - of basic upper-case and/or basic lower-case letters: - base64padding, replacesurrogates, - allowduplicatekeys, preservenegativezero, - numberconversion, writebasic, keepkeyorder. - Other keys are ignored in this version of the CBOR library. (Keys - are compared using a basic case-insensitive comparison, in which - two strings are equal if they match after converting the basic - upper-case letters A to Z (U+0041 to U+005A) in both strings to - basic lower-case letters.) If two or more key/value pairs have - equal keys (in a basic case-insensitive comparison), the value - given for the last such key is used. The first four keys just given - can have a value of 1, true, yes, or - on (where the letters can be any combination of basic - upper-case and/or basic lower-case letters), which means true, and - any other value meaning false. The last key, - numberconversion, can have a value of any name given in the - JSONOptions.ConversionMode enumeration (where the letters - can be any combination of basic upper-case and/or basic lower-case - letters), and any other value is unrecognized. (If the - numberconversion key is not given, its value is treated as - full. If that key is given, but has an unrecognized value, - an exception is thrown.) For example, base64padding=Yes and - base64padding=1 both set the Base64Padding property - to true, and numberconversion=double sets the - NumberConversion property to ConversionMode.Double - . - The parameter is null. In the future, this class may allow - other keys to store other kinds of values, not just true or - false. - An unrecognized value for - numberconversion was given. - - - Gets the values of this options object's properties in - text form. - A text string containing the values of this options - object's properties. The format of the string is the same as the - one described in the String constructor for this class. - - - The default options for converting CBOR objects to - JSON. - - - Gets a value indicating whether the Base64Padding property - is true. This property has no effect; in previous versions, this - property meant that padding was written out when writing base64url - or traditional base64 to JSON. - A value indicating whether the Base64Padding property is - true. - - - Gets a value indicating whether the JSON decoder should - preserve the distinction between positive zero and negative zero - when the decoder decodes JSON to a floating-point number format - that makes this distinction. For a value of false, if the - result of parsing a JSON string would be a floating-point negative - zero, that result is a positive zero instead. (Note that this - property has no effect for conversion kind - IntOrFloatFromDouble, where floating-point zeros are not - possible.). - A value indicating whether to preserve the distinction - between positive zero and negative zero when decoding JSON. The - default is true. - - - Gets a value indicating how JSON numbers are decoded to - CBOR objects. None of the conversion modes affects how CBOR objects - are later encoded (such as via EncodeToBytes ). - A value indicating how JSON numbers are decoded to CBOR. The - default is ConversionMode.Full. - - - Gets a value indicating whether JSON is written using only - code points from the Basic Latin block (U+0000 to U+007F), also - known as ASCII. - A value indicating whether JSON is written using only code - points from the Basic Latin block (U+0000 to U+007F), also known as - ASCII. Default is false. - - - Gets a value indicating whether to preserve the order in - which a map's keys appear when decoding JSON, by using maps created - as though by CBORObject.NewOrderedMap. If false, key order is not - guaranteed to be preserved when decoding JSON. - A value indicating whether to preserve the order in which a - CBOR map's keys appear when decoding JSON. The default is - false. - - - Gets a value indicating whether to allow duplicate keys - when reading JSON. Used only when decoding JSON. If this property - is true and a JSON object has two or more values with the - same key, the last value of that key set forth in the JSON object - is taken. - A value indicating whether to allow duplicate keys when - reading JSON. The default is false. - - - Gets a value indicating whether surrogate code points not - part of a surrogate pair (which consists of two consecutive - char s forming one Unicode code point) are each replaced - with a replacement character (U+FFFD). If false, an exception is - thrown when such code points are encountered. - True, if surrogate code points not part of a surrogate pair - are each replaced with a replacement character, or false if an - exception is thrown when such code points are encountered. The - default is false. - - - Gets an index into the specified object, if the object is - an array and is not greater than the array's length. - The index contained in this instance, or -1 if the object - isn't a JSON array or is greater than the array's length. - - - Gets all children of the specified JSON object that - contain the specified key; the method will remove matching keys. As - an example, consider this object: -
[{"key":"value1","foo":"foovalue"},
-            {"key":"value2","bar":"barvalue"}, {"baz":"bazvalue"}]
If - getPointersToKey is called on this object with a keyToFind called - "key", we get the following Map as the return value: -
{ "/0" => "value1", // "/0" points to {"foo":"foovalue"} "/1"
-            => "value2" /* "/1" points to {"bar":"barvalue"} */ }
and the - JSON object will change to the following: -
[{"foo":"foovalue"}, {"bar":"barvalue"},
-            {"baz","bazvalue"}]
.
- The object to search. - The key to search for. - A map: - - The keys in the map are JSON Pointers to the objects within - root that contained a key named - keyToFind. To get the actual JSON object, call - JSONPointer.GetObject, passing - root and the pointer as arguments. - The values in the map are the values of each of those keys - named - keyToFind. The JSON Pointers are relative to - the root object. - The parameter is null. -
- - Gets all children of the specified JSON object that - contain the specified key; the method will not remove matching - keys. As an example, consider this object: -
[{"key":"value1","foo":"foovalue"},
-            {"key":"value2","bar":"barvalue"}, {"baz":"bazvalue"}]
If - getPointersToKey is called on this object with a keyToFind called - "key", we get the following Map as the return value: -
{ "/0" => "value1", // "/0" points to
-            {"key":"value1","foo":"foovalue"} "/1" => "value2" // "/1" points
-            to {"key":"value2","bar":"barvalue"} }
and the JSON object - will remain unchanged. - - The keys in the map are JSON Pointers to the objects within - root that contained a key named - keyToFind. To get the actual JSON object, call - JSONPointer.GetObject, passing - root and the pointer as arguments. - The values in the map are the values of each of those keys - named - keyToFind. The JSON Pointers are relative to - the root object.
- Object to search. - The key to search for. - A map:. - The parameter is null. -
- - Options for controlling how certain DotNET or Java - objects, such as so-called "plain old data" objects (better known - as POCOs in DotNET or POJOs in Java), are converted to CBOR - objects. - - - Initializes a new instance of the - class with all the default - options. - - - Initializes a new instance of the - class. - The parameter is not used. - The value of the "UseCamelCase" - property. - - - Initializes a new instance of the - class. - A string setting forth the options to - use. This is a semicolon-separated list of options, each of which - has a key and a value separated by an equal sign ("="). Whitespace - and line separators are not allowed to appear between the - semicolons or between the equal signs, nor may the string begin or - end with whitespace. The string can be empty, but cannot be null. - The following is an example of this parameter: - usecamelcase=true. The key can be any one of the following - where the letters can be any combination of basic upper-case and/or - basic lower-case letters: usecamelcase. Other keys are - ignored in this version of the CBOR library. (Keys are compared - using a basic case-insensitive comparison, in which two strings are - equal if they match after converting the basic upper-case letters A - to Z (U+0041 to U+005A) in both strings to basic lower-case - letters.) If two or more key/value pairs have equal keys (in a - basic case-insensitive comparison), the value given for the last - such key is used. The key just given can have a value of 1, - true, yes, or on (where the letters can be - any combination of basic upper-case and/or basic lower-case - letters), which means true, and any other value meaning false. For - example, usecamelcase=Yes and usecamelcase=1 both set - the UseCamelCase property to true. In the future, this class - may allow other keys to store other kinds of values, not just true - or false. - The parameter is null. - - - Gets the values of this options object's properties in - text form. - A text string containing the values of this options - object's properties. The format of the string is the same as the - one described in the String constructor for this class. - - - The default settings for "plain old data" - options. - - - - Gets a value indicating whether property, field, and method - names are converted to camel case before they are used as keys. - This option changes the behavior of key name serialization as - follows. If "useCamelCase" is false : - - In the .NET version, all key names are capitalized, meaning - the first letter in the name is converted to a basic upper-case - letter if it's a basic lower-case letter ("a" to "z"). (For - example, "Name" and "IsName" both remain unchanged.) - In the Java version, all field names are capitalized, and for - each eligible method name, the word "get" or "set" is removed from - the name if the name starts with that word, then the name is - capitalized. (For example, "getName" and "setName" both become - "Name", and "isName" becomes "IsName".) - If "useCamelCase" is true : - - In the .NET version, for each eligible property or field - name, the word "Is" is removed from the name if the name starts - with that word, then the name is converted to camel case, meaning - the first letter in the name is converted to a basic lower-case - letter if it's a basic upper-case letter ("A" to "Z"). (For - example, "Name" and "IsName" both become "name".) - In the Java version: For each eligible method name, the word - "get", "set", or "is" is removed from the name if the name starts - with that word, then the name is converted to camel case. (For - example, "getName", "setName", and "isName" all become "name".) For - each eligible field name, the word "is" is removed from the name if - the name starts with that word, then the name is converted to camel - case. (For example, "name" and "isName" both become - "name".) - In the description above, a name "starts with" a word if that - word begins the name and is followed by a character other than a - basic digit or basic lower-case letter, that is, other than "a" to - "z" or "0" to "9". - true If the names are converted to camel case; - otherwise, false. This property is true by - default. - - - Implements CBOR string references, described at - http://cbor.schmorp.de/stringref. - - - Contains methods useful for reading and writing text - strings. It is designed to have no dependencies other than the - basic runtime class library. - Many of these methods work with text encoded in UTF-8, an - encoding form of the Unicode Standard which uses one byte to encode - the most basic characters and two to four bytes to encode other - characters. For example, the GetUtf8 method converts a text - string to an array of bytes in UTF-8. - In C# and Java, text strings are represented as sequences of - 16-bit values called char s. These sequences are well-formed - under UTF-16, a 16-bit encoding form of Unicode, except if they - contain unpaired surrogate code points. (A surrogate code point is - used to encode supplementary characters, those with code points - U+10000 or higher, in UTF-16. A surrogate pair is a high surrogate, - U+D800 to U+DBFF, followed by a low surrogate, U+DC00 to U+DFFF. An - unpaired surrogate code point is a surrogate not appearing in a - surrogate pair.) Many of the methods in this class allow setting - the behavior to follow when unpaired surrogate code points are - found in text strings, such as throwing an error or treating the - unpaired surrogate as a replacement character - (U+FFFD). - - - Generates a text string from a UTF-8 byte array. - A byte array containing text encoded in - UTF-8. - If true, replaces invalid encoding with the - replacement character (U+FFFD). If false, stops processing when - invalid UTF-8 is seen. - A string represented by the UTF-8 byte array. - The parameter is null. - The string is not valid UTF-8 - and is false. - - - Finds the number of Unicode code points in the given text - string. Unpaired surrogate code points increase this number by 1. - This is not necessarily the length of the string in "char" - s. - The parameter is a text - string. - The number of Unicode code points in the given - string. - The parameter is null. - - - Generates a text string from a portion of a UTF-8 byte - array. - A byte array containing text encoded in - UTF-8. - Offset into the byte array to start - reading. - Length, in bytes, of the UTF-8 text - string. - If true, replaces invalid encoding with the - replacement character (U+FFFD). If false, stops processing when - invalid UTF-8 is seen. - A string represented by the UTF-8 byte array. - The parameter is null. - The portion of the byte array - is not valid UTF-8 and is - false. - The parameter is less than 0, is - less than 0, or offset plus bytesCount is greater than the length - of "data" . - - - - Encodes a string in UTF-8 as a byte array. This method does - not insert a byte-order mark (U+FEFF) at the beginning of the - encoded byte array. - REMARK: It is not recommended to use - Encoding.UTF8.GetBytes in.NET, or the getBytes() - method in Java to do this. For instance, getBytes() encodes - text strings in a default (so not fixed) character encoding, which - can be undesirable. - The parameter is a text - string. - If true, replaces unpaired surrogate code - points with the replacement character (U+FFFD). If false, stops - processing when an unpaired surrogate code point is seen. - The string encoded in UTF-8. - The parameter is null. - The string contains an unpaired - surrogate code point and is false, or an - internal error occurred. - - - - Encodes a string in UTF-8 as a byte array. This method does - not insert a byte-order mark (U+FEFF) at the beginning of the - encoded byte array. - REMARK: It is not recommended to use - Encoding.UTF8.GetBytes in.NET, or the getBytes() - method in Java to do this. For instance, getBytes() encodes - text strings in a default (so not fixed) character encoding, which - can be undesirable. - The parameter is a text - string. - If true, replaces unpaired surrogate code - points with the replacement character (U+FFFD). If false, stops - processing when an unpaired surrogate code point is seen. - If true, replaces carriage return - (CR) not followed by line feed (LF) and LF not preceded by CR with - CR-LF pairs. - The string encoded in UTF-8. - The parameter is null. - The string contains an unpaired - surrogate code point and is false, or an - internal error occurred. - - - Calculates the number of bytes needed to encode a string - in UTF-8. - The parameter is a text - string. - If true, treats unpaired surrogate code - points as having 3 UTF-8 bytes (the UTF-8 length of the replacement - character U+FFFD). - The number of bytes needed to encode the given string in - UTF-8, or -1 if the string contains an unpaired surrogate code - point and is false. - The parameter is null. - - - Gets the Unicode code point just before the given index of - the string. - The parameter is a text - string. - Index of the current position into the - string. - The Unicode code point at the previous position. Returns - -1 if is 0 or less, or is greater than or - equal to the string's length. Returns the replacement character - (U+FFFD) if the code point at the previous position is an unpaired - surrogate code point. If the return value is 65536 (0x10000) or - greater, the code point takes up two UTF-16 code units. - The parameter is null. - - - Gets the Unicode code point just before the given index of - the string. - The parameter is a text - string. - Index of the current position into the - string. - Specifies what kind of value to - return if the previous code point is an unpaired surrogate code - point: if 0, return the replacement character (U+FFFD); if 1, - return the value of the surrogate code point; if neither 0 nor 1, - return -1. - The Unicode code point at the previous position. Returns - -1 if is 0 or less, or is greater than or - equal to the string's length. Returns a value as specified under - if the code point at the - previous position is an unpaired surrogate code point. If the - return value is 65536 (0x10000) or greater, the code point takes up - two UTF-16 code units. - The parameter is null. - - - Gets the Unicode code point at the given index of the - string. - The parameter is a text - string. - Index of the current position into the - string. - The Unicode code point at the given position. Returns -1 - if is 0 or less, or is greater than or - equal to the string's length. Returns the replacement character - (U+FFFD) if the code point at that position is an unpaired - surrogate code point. If the return value is 65536 (0x10000) or - greater, the code point takes up two UTF-16 code units. - The parameter is null. - - - Gets the Unicode code point at the given index of the - string. - The parameter is a text - string. - Index of the current position into the - string. - Specifies what kind of value to - return if the code point at the given index is an unpaired - surrogate code point: if 0, return the replacement character (U + - FFFD); if 1, return the value of the surrogate code point; if - neither 0 nor 1, return -1. - The Unicode code point at the given position. Returns -1 - if is 0 or less, or is greater than or - equal to the string's length. Returns a value as specified under - if the code point at that - position is an unpaired surrogate code point. If the return value - is 65536 (0x10000) or greater, the code point takes up two UTF-16 - code units. - The parameter is null. - - The following example shows how to iterate a text string code - point by code point, terminating the loop when an unpaired - surrogate is found. - for (var i = 0;i<str.Length; ++i) { int codePoint = - DataUtilities.CodePointAt(str, i, 2); if (codePoint < 0) { break; /* - Unpaired surrogate */ } Console.WriteLine("codePoint:"+codePoint); if - (codePoint >= 0x10000) { i++; /* Supplementary code point */ } } - . - - - - Returns a string with the basic upper-case letters A to Z - (U+0041 to U+005A) converted to the corresponding basic lower-case - letters. Other characters remain unchanged. - The parameter is a text - string. - The converted string, or null if is - null. - - - Returns a string with the basic lower-case letters A to Z - (U+0061 to U+007A) converted to the corresponding basic upper-case - letters. Other characters remain unchanged. - The parameter is a text - string. - The converted string, or null if is - null. - - - Compares two strings in Unicode code point order. Unpaired - surrogate code points are treated as individual code - points. - The first string. Can be null. - The second string. Can be null. - A value indicating which string is " less" or " greater" . - 0: Both strings are equal or null. Less than 0: a is null and b - isn't; or the first code point that's different is less in A than - in B; or b starts with a and is longer than a. Greater than 0: b is - null and a isn't; or the first code point that's different is - greater in A than in B; or a starts with b and is longer than - b. - - - Writes a portion of a string in UTF-8 encoding to a data - stream. - A string to write. - The Index starting at 0 where the string - portion to write begins. - The length of the string portion to - write. - A writable data stream. - If true, replaces unpaired surrogate code - points with the replacement character (U+FFFD). If false, stops - processing when an unpaired surrogate code point is seen. - 0 if the entire string portion was written; or -1 if the - string portion contains an unpaired surrogate code point and - is false. - The parameter is null or is - null. - An I/O error - occurred. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - - - Writes a portion of a string in UTF-8 encoding to a data - stream. - A string to write. - The Index starting at 0 where the string - portion to write begins. - The length of the string portion to - write. - A writable data stream. - If true, replaces unpaired surrogate code - points with the replacement character (U+FFFD). If false, stops - processing when an unpaired surrogate code point is seen. - If true, replaces carriage return - (CR) not followed by line feed (LF) and LF not preceded by CR with - CR-LF pairs. - 0 if the entire string portion was written; or -1 if the - string portion contains an unpaired surrogate code point and - is false. - The parameter is null or is - null. - The parameter is less than 0, is less - than 0, or plus - is greater than the string's length. - An I/O error - occurred. - - - Writes a string in UTF-8 encoding to a data - stream. - A string to write. - A writable data stream. - If true, replaces unpaired surrogate code - points with the replacement character (U+FFFD). If false, stops - processing when an unpaired surrogate code point is seen. - 0 if the entire string was written; or -1 if the string - contains an unpaired surrogate code point and is false. - The parameter is null or is - null. - An I/O error - occurred. - - - Reads a string in UTF-8 encoding from a byte - array. - A byte array containing a UTF-8 text - string. - Offset into the byte array to start - reading. - Length, in bytes, of the UTF-8 text - string. - A string builder object where the resulting - string will be stored. - If true, replaces invalid encoding with the - replacement character (U+FFFD). If false, stops processing when - invalid UTF-8 is seen. - 0 if the entire string was read without errors, or -1 if - the string is not valid UTF-8 and is - false. - The parameter is null or is - null. - The parameter is less than 0, is - less than 0, or offset plus bytesCount is greater than the length - of . - - - Reads a string in UTF-8 encoding from a data stream in - full and returns that string. Replaces invalid encoding with the - replacement character (U+FFFD). - A readable data stream. - The string read. - An I/O error - occurred. - The parameter is null. - - - Reads a string in UTF-8 encoding from a data stream and - returns that string. - A readable data stream. - The length, in bytes, of the string. If - this is less than 0, this function will read until the end of the - stream. - If true, replaces invalid encoding with the - replacement character (U+FFFD). If false, throws an error if an - unpaired surrogate code point is seen. - The string read. - An I/O error occurred; or, - the string is not valid UTF-8 and is - false. - The parameter is null. - - - Reads a string in UTF-8 encoding from a data - stream. - A readable data stream. - The length, in bytes, of the string. If - this is less than 0, this function will read until the end of the - stream. - A string builder object where the resulting - string will be stored. - If true, replaces invalid encoding with the - replacement character (U+FFFD). If false, stops processing when an - unpaired surrogate code point is seen. - 0 if the entire string was read without errors, -1 if the - string is not valid UTF-8 and is false, - or -2 if the end of the stream was reached before the last - character was read completely (which is only the case if is 0 or greater). - An I/O error - occurred. - The parameter is null or is - null. - -
-
diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml.meta b/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml.meta deleted file mode 100644 index 278ce7bd..00000000 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/CBOR.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: dfd01c5723faac04a9159478a0df2e05 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.dll b/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.dll deleted file mode 100644 index f38aa243c105abd70200672dd1560d1f25442300..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295936 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

eo^9h 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 U8@N4k-T$o!{s&(FD=F~*0NSZq%m4rY diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.dll.meta b/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.dll.meta deleted file mode 100644 index 21cb426e..00000000 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.dll.meta +++ /dev/null @@ -1,33 +0,0 @@ -fileFormatVersion: 2 -guid: 6a8f5e72a2428e546820610cf82c511f -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - Windows Store Apps: WindowsStoreApps - second: - enabled: 0 - settings: - CPU: AnyCPU - userData: - assetBundleName: - assetBundleVariant: diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.xml b/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.xml deleted file mode 100644 index 8ece5a1a..00000000 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.xml +++ /dev/null @@ -1,13500 +0,0 @@ - - - - Numbers - - - -

Contains parameters for controlling the precision, - rounding, and exponent range of arbitrary-precision numbers. (The - "E" stands for "extended", and has this prefix to group it with the - other classes common to this library, particularly EDecimal, - EFloat, and ERational.). - Thread safety: With one exception, instances of this - class are immutable and are safe to use among multiple threads. The - one exception involves the Flags property. If the context's - HasFlags property (a read-only property) is true, - the Flags property is mutable, thus making the context - mutable. This class doesn't synchronize access to such mutable - contexts, so applications should provide their own synchronization - if a context with the HasFlags property set to true - will be shared among multiple threads and at least one of those - threads needs to write the Flags property (which can happen, - for example, by passing the context to most methods of - EDecimal such as Add ). - - - Signals that the exponent was adjusted to fit the exponent - range. - - - Signals a division of a nonzero number by zero. - - - Signals that the result was rounded to a different - mathematical value, but as close as possible to the - original. - - - Signals an invalid operation. - - - Signals that an operand was rounded to a different - mathematical value before an operation. - - - Signals that the result is non-zero and the exponent is - higher than the highest exponent allowed. - - - Signals that the result was rounded to fit the precision; - either the value or the exponent may have changed from the - original. - - - Signals that the result's exponent, before rounding, is - lower than the lowest exponent allowed. - - - Signals that the result's exponent, before rounding, is - lower than the lowest exponent allowed, and the result was rounded - to a different mathematical value, but as close as possible to the - original. - - - A basic arithmetic context, 9 digits precision, rounding - mode half-up, unlimited exponent range. The default rounding mode - is HalfUp. - - - An arithmetic context for Java's BigDecimal format. The - default rounding mode is HalfUp. - - - An arithmetic context for the IEEE-754-2008 binary128 - format, 113 bits precision. The default rounding mode is - HalfEven. - - - An arithmetic context for the IEEE-754-2008 binary16 - format, 11 bits precision. The default rounding mode is - HalfEven. - - - An arithmetic context for the IEEE-754-2008 binary32 - format, 24 bits precision. The default rounding mode is - HalfEven. - - - An arithmetic context for the IEEE-754-2008 binary64 - format, 53 bits precision. The default rounding mode is - HalfEven. - - - An arithmetic context for the.NET Framework decimal format - (see - "Forms of numbers" ), 96 - bits precision, and a valid exponent range of -28 to 0. The default - rounding mode is HalfEven. (The "Cli" stands for "Common - Language Infrastructure", which defined this format as the .NET - Framework decimal format in version 1, but leaves it unspecified in - later versions.). - - - An arithmetic context for the IEEE-754-2008 decimal128 - format. The default rounding mode is HalfEven. - - - An arithmetic context for the IEEE-754-2008 decimal32 - format. The default rounding mode is HalfEven. - - - An arithmetic context for the IEEE-754-2008 decimal64 - format. The default rounding mode is HalfEven. - - - No specific (theoretical) limit on precision. Rounding - mode HalfUp. - - - No specific (theoretical) limit on precision. Rounding - mode HalfEven. - - - Initializes a new instance of the - class. - The value of the Precision - property. - The value of the Rounding property. - The value of the EMin - property. - The value of the EMax - property. - The value of the - ClampNormalExponents property. - - - Initializes a new instance of the - class,. - The value of the Precision - property. - The value of the Rounding property. - The value of the EMin property. - The value of the EMax property. - The value of the - ClampNormalExponents property. - - - Gets a value indicating whether the EMax and EMin - properties refer to the number's Exponent property adjusted to the - number's precision, or just the number's Exponent property. The - default value is true, meaning that EMax and EMin refer to the - adjusted exponent. Setting this value to false (using - WithAdjustExponent) is useful for modeling floating point - representations with an integer significand and an integer - exponent, such as Java's BigDecimal. - true if the EMax and EMin properties refer to the - number's Exponent property adjusted to the number's precision, or - false if they refer to just the number's Exponent property. - - - Gets a value indicating whether a converted number's - Exponent property will not be higher than EMax + 1 - Precision. If - a number's exponent is higher than that value, but not high enough - to cause overflow, the exponent is clamped to that value and enough - zeros are added to the number's significand to account for the - adjustment. If HasExponentRange is false, this value is always - false. - If true, a converted number's Exponent property will not be - higher than EMax + 1 - Precision. - - - Gets the highest exponent possible when a converted number - is expressed in scientific notation with one nonzero digit before - the radix point. For example, with a precision of 3 and an EMax of - 100, the maximum value possible is 9.99E + 100. (This is not the - same as the highest possible Exponent property.) If - HasExponentRange is false, this value will be 0. - The highest exponent possible when a converted number is - expressed in scientific notation with one nonzero digit before the - radix point. For example, with a precision of 3 and an EMax of 100, - the maximum value possible is 9.99E + 100. (This is not the same as - the highest possible Exponent property.) If HasExponentRange is - false, this value will be 0. - - - Gets the lowest exponent possible when a converted number - is expressed in scientific notation with one nonzero digit before - the radix point. For example, with a precision of 3 and an EMin of - -100, the next value that comes after 0 is 0.001E-100. (If - AdjustExponent is false, this property specifies the lowest - possible Exponent property instead.) If HasExponentRange is false, - this value will be 0. - The lowest exponent possible when a converted number is - expressed in scientific notation with one nonzero digit before the - radix point. For example, with a precision of 3 and an EMin of - -100, the next value that comes after 0 is 0.001E-100. (If - AdjustExponent is false, this property specifies the lowest - possible Exponent property instead.) If HasExponentRange is false, - this value will be 0. - - - Gets or sets the flags that are set from converting - numbers according to this arithmetic context. If HasFlags is - false, this value will be 0. This value is a combination of bit - fields. To retrieve a particular flag, use the AND operation on the - return value of this method. For example: (this.Flags - &EContext.FlagInexact) != 0 returns true if the - Inexact flag is set. - The flags that are set from converting numbers according to - this arithmetic context. If HasFlags is false, this value - will be 0. This value is a combination of bit fields. To retrieve a - particular flag, use the AND operation on the return value of this - method. For example: (this.Flags &EContext.FlagInexact) - !=0 returns true if the Inexact flag is set. - - - Gets a value indicating whether this context defines a - minimum and maximum exponent. If false, converted exponents can - have any exponent and operations can't cause overflow or - underflow. - true if this context defines a minimum and maximum - exponent; otherwise, false.. If false, converted exponents - can have any exponent and operations can't cause overflow or - underflow. true if this context defines a minimum and - maximum exponent; otherwise, false. - - - Gets a value indicating whether this context has a mutable - Flags field. - true if this context has a mutable Flags field; - otherwise, false. - - - Gets a value indicating whether this context defines a - maximum precision. This is the same as whether this context's - Precision property is zero. - true if this context defines a maximum precision; - otherwise, false. - - - Gets a value indicating whether this context's Precision - property is in bits, rather than digits. The default is - false. - true if this context's Precision property is in bits, - rather than digits; otherwise, false.. The default is - false. true if this context's Precision property is in bits, - rather than digits; otherwise, false. The default is - false. - - - Gets a value indicating whether to use a "simplified" - arithmetic. In the simplified arithmetic, infinity, not-a-number, - and subnormal numbers are not allowed, and negative zero is treated - the same as positive zero. For further details, see - http://speleotrove.com/decimal/dax3274.html - . - true if to use a "simplified" arithmetic; otherwise, - false In the simplified arithmetic, infinity, not-a-number, - and subnormal numbers are not allowed, and negative zero is treated - the same as positive zero. For further details, see - http://speleotrove.com/decimal/dax3274.html - . true if a "simplified" arithmetic will be used; otherwise, - false. - - - Gets the maximum length of a converted number in digits, - ignoring the radix point and exponent. For example, if precision is - 3, a converted number's significand can range from 0 to 999 (up to - three digits long). If 0, converted numbers can have any precision. - Not-a-number (NaN) values can carry an optional number, its - payload, that serves as its "diagnostic information", In general, - if an operation requires copying an NaN's payload, only up to as - many digits of that payload as the precision given in this context, - namely the least significant digits, are copied. - The maximum length of a converted number in digits, ignoring - the radix point and exponent. For example, if precision is 3, a - converted number's significand can range from 0 to 999 (up to three - digits long). If 0, converted numbers can have any - precision. - - - Gets the desired rounding mode when converting numbers - that can't be represented in the given precision and exponent - range. - The desired rounding mode when converting numbers that can't - be represented in the given precision and exponent range. - - - Gets the traps that are set for each flag in the context. - Whenever a flag is signaled, even if HasFlags is false, and - the flag's trap is enabled, the operation will throw a - TrapException. - For example, if Traps equals FlagInexact and - FlagSubnormal, a TrapException will be thrown if an operation's - return value is not the same as the exact result (FlagInexact) or - if the return value's exponent is lower than the lowest allowed - (FlagSubnormal). - The traps that are set for each flag in the context. - Whenever a flag is signaled, even if HasFlags is false, and - the flag's trap is enabled, the operation will throw a - TrapException. - For example, if Traps equals FlagInexact and - FlagSubnormal, a TrapException will be thrown if an operation's - return value is not the same as the exact result (FlagInexact) or - if the return value's exponent is lower than the lowest allowed - (FlagSubnormal).. - - - Creates a new arithmetic context using the given maximum - number of digits, an unlimited exponent range, and the HalfUp - rounding mode. - Maximum number of digits - (precision). - A context object for arbitrary-precision arithmetic - settings. - - - Creates a new EContext object initialized with an - unlimited exponent range, and the given rounding mode and maximum - precision. - Maximum number of digits - (precision). - The parameter is - an ERounding object. - A context object for arbitrary-precision arithmetic - settings. - - - Creates a new EContext object initialized with an - unlimited precision, an unlimited exponent range, and the given - rounding mode. - The rounding mode for the new precision - context. - A context object for arbitrary-precision arithmetic - settings. - - - Initializes a new EContext that is a copy of another - EContext. - A context object for arbitrary-precision arithmetic - settings. - - - Determines whether a number can have the given Exponent - property under this arithmetic context. - An arbitrary-precision integer indicating - the desired exponent. - true if a number can have the given Exponent - property under this arithmetic context; otherwise, false. - If this context allows unlimited precision, returns true for the - exponent EMax and any exponent less than EMax. - The parameter is null. - - - Returns this object in a text form intended to be read by - humans. The value returned by this method is not intended to be - parsed by computer programs, and the exact text of the value may - change at any time between versions of this library. - A string representation of this object. - - - Gets a value indicating whether this context has a mutable - Flags field, one or more trap enablers, or both. - true if this context has a mutable Flags field, one - or more trap enablers, or both; otherwise, false. - - - Copies this EContext and sets the copy's "AdjustExponent" - property to the given value. - The new value of the "AdjustExponent" - property for the copy. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this arithmetic context and sets the copy's - exponent range. - Desired minimum exponent (EMin). - Desired maximum exponent (EMax). - A context object for arbitrary-precision arithmetic - settings. - The parameter is null. - ExponentMin greater than - exponentMax". - - - Copies this EContext with HasFlags set to false, a - Traps value of 0, and a Flags value of 0. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext and gives it a particular precision - value. - Desired precision. 0 means unlimited - precision. - A context object for arbitrary-precision arithmetic - settings. - The parameter is null. - - - Copies this EContext with HasFlags set to true and - a Flags value of 0. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this arithmetic context and sets the copy's - "ClampNormalExponents" flag to the given value. - The desired value of the "ClampNormalExponents" - flag. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this arithmetic context and sets the copy's - exponent range. - Desired minimum exponent - (EMin). - Desired maximum exponent - (EMax). - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext with HasFlags set to false and - a Flags value of 0. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext and gives it a particular precision - value. - Desired precision. 0 means unlimited - precision. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext and sets the copy's - "IsPrecisionInBits" property to the given value. - The new value of the - "IsPrecisionInBits" property for the copy. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext with the specified rounding - mode. - Desired value of the Rounding - property. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext and sets the copy's "IsSimplified" - property to the given value. - Desired value of the IsSimplified - property. - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext with Traps set to the given value. - (Also sets HasFlags on the copy to True, but this may - change in version 2.0 of this library.). - Flags representing the traps to enable. See the - property "Traps". - A context object for arbitrary-precision arithmetic - settings. - - - Copies this EContext with an unlimited exponent - range. - A context object for arbitrary-precision arithmetic - settings. - - - Returns this context if it doesn't set traps, or a context - without traps and with blank flags if it does, so that the - resulting context does not cause trap exceptions to occur. This is - not a general-purpose method; it is intended to support custom - implementations of arithmetic operations. - This context if it doesn't set traps, or a context without - traps and with blank flags if it does. - - - Throws trap exceptions if the given context has flags set - that also have traps enabled for them in this context, and adds the - given context's flags to this context if HasFlags for this context - is true. This is not a general-purpose method; it is intended to - support custom implementations of arithmetic operations. - The result of the operation. - An arithmetic context, usually a - context returned by the GetNontrapping method. Can be null. - Data type for the result of the - operation. - The parameter if no trap - exceptions were thrown. - - - - Represents an arbitrary-precision decimal - floating-point number. (The "E" stands for "extended", - meaning that instances of this class can be values - other than numbers proper, such as infinity and - not-a-number.) - About decimal arithmetic - - Decimal (base-10) arithmetic, such as that provided by this - class, is appropriate for calculations involving such real-world - data as prices and other sums of money, tax rates, and - measurements. These calculations often involve multiplying or - dividing one decimal with another decimal, or performing other - operations on decimal numbers. Many of these calculations also rely - on rounding behavior in which the result after rounding is an - arbitrary-precision decimal number (for example, multiplying a - price by a premium rate, then rounding, should result in a decimal - amount of money). - On the other hand, most implementations of float - and - double - , including in C# and Java, store numbers in a binary - (base-2) floating-point format and use binary floating-point - arithmetic. Many decimal numbers can't be represented exactly in - binary floating-point format (regardless of its length). Applying - binary arithmetic to numbers intended to be decimals can sometimes - lead to unintuitive results, as is shown in the description for the - FromDouble() method of this class. - About EDecimal instances - - Each instance of this class consists of an integer - significand and an integer exponent, both arbitrary-precision. The - value of the number equals significand * 10^exponent. - The significand is the value of the digits that make up a - number, ignoring the decimal point and exponent. For example, in - the number 2356.78, the significand is 235678. The exponent is - where the "floating" decimal point of the number is located. A - positive exponent means "move it to the right", and a negative - exponent means "move it to the left." In the example 2, 356.78, the - exponent is -2, since it has 2 decimal places and the decimal point - is "moved to the left by 2." Therefore, in the arbitrary-precision - decimal representation, this number would be stored as 235678 * - 10^-2. - The significand and exponent format preserves trailing zeros - in the number's value. This may give rise to multiple ways to store - the same value. For example, 1.00 and 1 would be stored - differently, even though they have the same value. In the first - case, 100 * 10^-2 (100 with decimal point moved left by 2), and in - the second case, 1 * 10^0 (1 with decimal point moved 0). - This class also supports values for negative zero, - not-a-number (NaN) values, and infinity. Negative zero - is - generally used when a negative number is rounded to 0; it has the - same mathematical value as positive zero. Infinity - is - generally used when a non-zero number is divided by zero, or when a - very high or very low number can't be represented in a given - exponent range. Not-a-number - is generally used to signal - errors. - This class implements the General Decimal Arithmetic - Specification version 1.70 except part of chapter 6( - http://speleotrove.com/decimal/decarith.html - ). - Errors and Exceptions - - Passing a signaling NaN to any arithmetic operation shown - here will signal the flag FlagInvalid and return a quiet NaN, even - if another operand to that operation is a quiet NaN, unless the - operation's documentation expressly states that another result - happens when a signaling NaN is passed to that operation. - Passing a quiet NaN to any arithmetic operation shown here - will return a quiet NaN, unless the operation's documentation - expressly states that another result happens when a quiet NaN is - passed to that operation. Invalid operations will also return a - quiet NaN, as stated in the individual methods. - Unless noted otherwise, passing a null arbitrary-precision - decimal argument to any method here will throw an exception. - When an arithmetic operation signals the flag FlagInvalid, - FlagOverflow, or FlagDivideByZero, it will not throw an exception - too, unless the flag's trap is enabled in the arithmetic context - (see EContext's Traps property). - If an operation requires creating an intermediate value that - might be too big to fit in memory (or might require more than 2 - gigabytes of memory to store -- due to the current use of a 32-bit - integer internally as a length), the operation may signal an - invalid-operation flag and return not-a-number (NaN). In certain - rare cases, the CompareTo method may throw OutOfMemoryException - (called OutOfMemoryError in Java) in the same circumstances. - Serialization - - An arbitrary-precision decimal value can be serialized - (converted to a stable format) in one of the following ways: - By calling the toString() method, which will always - return distinct strings for distinct arbitrary-precision decimal - values. - By calling the UnsignedMantissa, Exponent, and - IsNegative properties, and calling the IsInfinity, IsQuietNaN, and - IsSignalingNaN methods. The return values combined will uniquely - identify a particular arbitrary-precision decimal value. - - Thread safety - - Instances of this class are immutable, so they are inherently - safe for use by multiple threads. Multiple instances of this object - with the same properties are interchangeable, so they should not be - compared using the "==" operator (which might only check if each - side of the operator is the same instance). - Comparison considerations - - This class's natural ordering (under the CompareTo method) is - not consistent with the Equals method. This means that two values - that compare as equal under the CompareTo method might not be equal - under the Equals method. The CompareTo method compares the - mathematical values of the two instances passed to it (and - considers two different NaN values as equal), while two instances - with the same mathematical value, but different exponents, will be - considered unequal under the Equals method. - Security note - - It is not recommended to implement security-sensitive - algorithms using the methods in this class, for several - reasons: - EDecimal - objects are immutable, so they can't be - modified, and the memory they occupy is not guaranteed to be - cleared in a timely fashion due to garbage collection. This is - relevant for applications that use many-digit-long numbers as - secret parameters. - The methods in this class - (especially those that involve arithmetic) are not guaranteed to be - "constant-time" (non-data-dependent) for all relevant inputs. - Certain attacks that involve encrypted communications have - exploited the timing and other aspects of such communications to - derive keying material or cleartext indirectly. - - Applications should instead use dedicated security libraries - to handle big numbers in security-sensitive algorithms. - Reproducibility note - - Some applications, such as simulations, care about results - that are reproducible, bit for bit, across computers and across - runs of the application. Bruce Dawson, in "Floating-Point - Determinism" ( https://randomascii.wordpress.com/ - 2013/07/16/floating-point-determinism/ - ), identified many - reproducibility issues with floating-point numbers, and here is how - they relate to the EDecimal and EFloat classes of this - library: - Runtime floating-point settings: All the settings that - change how EDecimal and EFloat behave are given as parameters to - the appropriate methods, especially via EContext objects, which - specify the precision, rounding, and exponent range of numbers, - among other things. The EDecimal and EFloat classes avoid the use - of "native" floating-point data types (except for methods that - convert to or from float - , double - , or - System.Decimal - ). Such "native" types are often subject to - runtime settings that change how floating-point math behaves with - them, and these settings are often not accessible to .NET or Java - code. - Non-associativity and intermediate precisions: - In general, EDecimal and EFloat use "unlimited" precision in their - calculations unless specified otherwise by an EContext object. - However, by limiting the precision of EDecimal, EFloat, and other - floating-point numbers in this way, operations such as addition and - multiplication on three or more numbers can be - non-associative - , meaning the result can change depending on - the order in which those numbers are added or multiplied. This - property means that if an algorithm does not ensure such numbers - are added or multiplied in the same order every time, its results - may not be reproducible across computers or across runs of the - application. This non-associativity problem can happen, for - example, if an application splits a calculation across several - threads and combines their results in the end. The problems with an - unspecified order of operations (in the same line of code) and - intermediate precisions (problems present in C and C++, for - example) don't exist with method calls to EDecimal and EFloat - methods, especially since they require limited-precision support to - be declared explicitly via EContext. - fmadd - instruction: EDecimal and EFloat include a MultiplyAndAdd method - with the same semantics as in the General Decimal Arithmetic - Specification, which requires delivering correctly rounded results - for this method. - Square root estimate: Not applicable - since EDecimal and EFloat don't include any estimates to square - root. - Transcendental functions: This includes - logarithms, exponentials, and the Pi method. For these functions, - results are not guaranteed to always be correctly rounded. When - using transcendentals, an application that cares about - reproducibility should choose one version of this library and stick - to it; this at least has the advantage that the implementation will - be the same across computers, unlike with "native" floating-point - types where the choice of implementation is often not within the - application's control. - Conversions: Conversions - between EDecimal or EFloat and text strings have the same - implementation across computers for the same version of this - library (see also the advice for transcendentals above). But as for - the ToDouble, ToSingle, FromDouble, and FromSingle methods, note - that some implementations of Java and.NET may or may not support - preserving the value of subnormal numbers (numbers other than zero - with the lowest possible exponent) or the payloads held in a - not-a-number (NaN) value of float or double; thus these methods - should not be considered reproducible across computers. - Compiler differences: Not applicable where these classes - don't use "native" floating-point types. - Uninitialized - data; per-processor code: Not applicable. - - Forms of numbers - - There are several other types of numbers that are mentioned - in this class and elsewhere in this documentation. For reference, - they are specified here. - Unsigned integer - : An integer that's always 0 or - greater, with the following maximum values: - 8-bit unsigned integer, or byte - : 255. - 16-bit unsigned integer: 65535. - 32-bit unsigned - integer: (2 32 - -1). - 64-bit unsigned - integer: (2 64 - -1). - - Signed integer - : An integer in two's-complement - form - , with the following ranges: - 8-bit signed integer: -128 to 127. - 16-bit - signed integer: -32768 to 32767. - 32-bit signed - integer: -2 31 - to (2 31 - - 1). - 64-bit signed integer: -2 63 - to (2 63 - - - 1). - - Two's complement form - : In two's-complement - form - , nonnegative numbers have the highest (most significant) - bit set to zero, and negative numbers have that bit (and all bits - beyond) set to one, and a negative number is stored in such form by - decreasing its absolute value by 1 and swapping the bits of the - resulting number. - 64-bit floating-point number - : A 64-bit binary - floating-point number, in the form significand - * 2 - exponent - - . The significand is 53 bits long - (Precision) and the exponent ranges from -1074 (EMin) to 971 - (EMax). The number is stored in the following format (commonly - called the IEEE 754 format): - |C|BBB...BBB|AAAAAA...AAAAAA| - A. Low 52 bits (Precision minus 1 bits): Lowest bits of - the significand. - B. Next 11 bits: Exponent area: - If all bits are ones, the final stored value is - infinity (positive or negative depending on the C bit) if all bits - in area A are zeros, or not-a-number (NaN) otherwise. - If all bits are zeros, the final stored value is a subnormal - number, the exponent is EMin, and the highest bit of the - significand is zero. - If any other number, the exponent - is this value reduced by 1, then raised by EMin, and the highest - bit of the significand is one. - - - C. - Highest bit: If one, this is a negative number. - - The elements described above are in the same order as the - order of each bit of each element, that is, either most significant - first or least significant first. - 32-bit binary floating-point number - : A 32-bit binary - number which is stored similarly to a 64-bit floating-point - number - , except that: - Precision is 24 bits. - EMin is -149. - EMax is 104. - A. The low 23 bits (Precision minus - 1 bits) are the lowest bits of the significand. - B. The - next 8 bits are the exponent area. - C. If the highest - bit is one, this is a negative number. - - .NET Framework decimal - : A 128-bit decimal - floating-point number, in the form significand - * 10 - - scale - - , where the scale ranges from 0 to 28. The - number is stored in the following format: - Low 96 bits are the significand, as a 96-bit unsigned - integer (all 96-bit values are allowed, up to (2 96 - -1)). - Next 16 bits are unused. - Next 8 - bits are the scale, stored as an 8-bit unsigned integer. - Next 7 bits are unused. - If the highest bit is - one, it's a negative number. - - The elements described above are in the same order as the - order of each bit of each element, that is, either most significant - first or least significant first. - - - - A not-a-number value. - - - Negative infinity, less than any other number. - - - Represents the number negative zero. - - - Represents the number 1. - - - Positive infinity, greater than any other - number. - - - A not-a-number value that signals an invalid operation - flag when it's passed as an argument to any arithmetic operation in - arbitrary-precision decimal. - - - Represents the number 10. - - - Represents the number 0. - - - Creates a copy of this arbitrary-precision binary - number. - An arbitrary-precision decimal floating-point - number. - - - Gets this object's exponent. This object's value will be - an integer if the exponent is positive or zero. - This object's exponent. This object's value will be an - integer if the exponent is positive or zero. - - - Gets a value indicating whether this object is finite (not - infinity or NaN). - true if this object is finite (not infinity or NaN); - otherwise, false. - - - Gets a value indicating whether this object is negative, - including negative zero. - true if this object is negative, including negative - zero; otherwise, false. - - - Gets a value indicating whether this object's value equals - 0. - true if this object's value equals 0; otherwise, - false. true if this object's value equals 0; - otherwise, false. - - - Returns whether this object's value is an - integer. - true if this object's value is an integer; - otherwise, false. - - - Gets this object's unscaled value, or significand, and - makes it negative if this object is negative. If this value is - not-a-number (NaN), that value's absolute value is the NaN's - "payload" (diagnostic information). - This object's unscaled value. Will be negative if this - object's value is negative (including a negative NaN). - - - Gets this value's sign: -1 if negative; 1 if positive; 0 - if zero. - This value's sign: -1 if negative; 1 if positive; 0 if - zero. - - - Gets the absolute value of this object's unscaled value, - or significand. If this value is not-a-number (NaN), that value is - the NaN's "payload" (diagnostic information). - The absolute value of this object's unscaled value. - - - Returns a number with the value - exponent*10^significand. - Desired value for the - significand. - Desired value for the exponent. - An arbitrary-precision decimal number. - - - Creates a number with the value - exponent*10^significand. - Desired value for the significand. - Desired value for the exponent. - An arbitrary-precision decimal number. - The parameter is null. - - - Creates a number with the value - exponent*10^significand. - Desired value for the significand. - Desired value for the exponent. - An arbitrary-precision decimal number. - The parameter is null. - - - Creates a number with the value - exponent*10^significand. - Desired value for the significand. - Desired value for the exponent. - An arbitrary-precision decimal number. - The parameter or is - null. - - - Creates a number with the value - exponent*10^significand. - Desired value for the - significand. - Desired value for the exponent. - An arbitrary-precision decimal number. - - - Creates a number with the value - exponent*10^significand. - Desired value for the - significand. - Desired value for the exponent. - An arbitrary-precision decimal number. - - - Creates a not-a-number arbitrary-precision decimal - number. - An integer, 0 or greater, to use as diagnostic - information associated with this object. If none is needed, should - be zero. To get the diagnostic information from another - arbitrary-precision decimal floating-point number, use that - object's UnsignedMantissa property. - A quiet not-a-number. - - - Creates a not-a-number arbitrary-precision decimal - number. - An integer, 0 or greater, to use as diagnostic - information associated with this object. If none is needed, should - be zero. To get the diagnostic information from another - arbitrary-precision decimal floating-point number, use that - object's UnsignedMantissa property. - Whether the return value will be signaling - (true) or quiet (false). - Whether the return value is - negative. - An arithmetic context to control the precision - (in decimal digits) of the diagnostic information. The rounding and - exponent range of this context will be ignored. Can be null. The - only flag that can be signaled in this context is FlagInvalid, - which happens if diagnostic information needs to be truncated and - too much memory is required to do so. - An arbitrary-precision decimal number. - The parameter is null or is less than 0. - - - Creates an arbitrary-precision decimal number from a - 64-bit binary floating-point number. This method computes the exact - value of the floating point number, not an approximation, as is - often the case by converting the floating point number to a string - first. Remember, though, that the exact value of a 64-bit binary - floating-point number is not always the value that results when - passing a literal decimal number (for example, calling - EDecimal.FromDouble(0.1) ), since not all decimal numbers - can be converted to exact binary numbers (in the example given, the - resulting arbitrary-precision decimal will be the value of the - closest "double" to 0.1, not 0.1 exactly). To create an - arbitrary-precision decimal number from a decimal value, use - FromString instead in most cases (for example: - EDecimal.FromString("0.1") ). - The parameter is a 64-bit - floating-point number. - An arbitrary-precision decimal number with the same value - as . - - - Creates an arbitrary-precision decimal number from a - 64-bit binary floating-point number, encoded in the IEEE 754 - binary64 format. This method computes the exact value of the - floating point number, not an approximation, as is often the case - by converting the floating point number to a string first. - Remember, though, that the exact value of a 64-bit binary - floating-point number is not always the value that results when - passing a literal decimal number, since not all decimal numbers can - be converted to exact binary numbers (in the example given, the - resulting arbitrary-precision decimal will be the value of the - closest "double" to 0.1, not 0.1 exactly). To create an - arbitrary-precision decimal number from a decimal value, use - FromString instead in most cases. - The parameter is a - 64-bit signed integer. - An arbitrary-precision decimal number with the same value - as . - - - Converts an arbitrary-precision integer to an arbitrary - precision decimal. - An arbitrary-precision integer. - An arbitrary-precision decimal number with the exponent - set to 0. - - - Converts an arbitrary-precision binary floating-point - number to an arbitrary precision decimal. - An arbitrary-precision binary floating-point - number. - An arbitrary-precision decimal number. - - - Creates an arbitrary-precision decimal number from an - arbitrary-precision binary floating-point number. - An arbitrary-precision binary floating-point - number. - An arbitrary-precision decimal number. - The parameter is null. - - - Converts a boolean value (true or false) to an - arbitrary-precision decimal number. - Either true or false. - The number 1 if is true; - otherwise, 0. - - - Creates an arbitrary-precision decimal number from a - 32-bit signed integer. - The parameter is a 32-bit signed integer. - An arbitrary-precision decimal number with the exponent - set to 0. - - - Converts an unsigned integer expressed as a 64-bit signed - integer to an arbitrary-precision decimal number. - A 64-bit signed integer. If this value is - 0 or greater, the return value will represent it. If this value is - less than 0, the return value will store 2^64 plus this value - instead. - An arbitrary-precision decimal number with the exponent - set to 0. If is 0 or greater, the - return value will represent it. If - is less than 0, the return value will store 2^64 plus this value - instead. - - - Creates an arbitrary-precision decimal number from a - 64-bit signed integer. - The parameter is a 64-bit signed integer. - This number's value as an arbitrary-precision decimal - number with the exponent set to 0. - - - Creates an arbitrary-precision decimal number from a - 32-bit binary floating-point number. This method computes the exact - value of the floating point number, not an approximation, as is - often the case by converting the floating point number to a string - first. Remember, though, that the exact value of a 32-bit binary - floating-point number is not always the value that results when - passing a literal decimal number (for example, calling - EDecimal.FromSingle(0.1f) ), since not all decimal numbers - can be converted to exact binary numbers (in the example given, the - resulting arbitrary-precision decimal will be the the value of the - closest "float" to 0.1, not 0.1 exactly). To create an - arbitrary-precision decimal number from a decimal value, use - FromString instead in most cases (for example: - EDecimal.FromString("0.1") ). - The parameter is a 32-bit - binary floating-point number. - An arbitrary-precision decimal number with the same value - as . - - - Creates an arbitrary-precision decimal number from a - 32-bit binary floating-point number encoded in the IEEE 754 - binary32 format. This method computes the exact value of the - floating point number, not an approximation, as is often the case - by converting the floating point number to a string first. - Remember, though, that the exact value of a 32-bit binary - floating-point number is not always the value that results when - passing a literal decimal number, since not all decimal numbers can - be converted to exact binary numbers (in the example given, the - resulting arbitrary-precision decimal will be the the value of the - closest "float" to 0.1, not 0.1 exactly). To create an - arbitrary-precision decimal number from a decimal value, use - FromString instead in most cases. - A 32-bit binary floating-point number encoded - in the IEEE 754 binary32 format. - An arbitrary-precision decimal number with the same value - as . - - - Creates an arbitrary-precision decimal number from a - sequence of char s that represents a number. See - FromString(String, int, int, EContext) for more information. - Note that calling the overload that takes an EContext is often much - faster than creating the EDecimal then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - A sequence that represents a number. - An arbitrary-precision decimal number with the same value - as the given sequence of char s. - The parameter is not a correctly formatted number - sequence. - - - Creates an arbitrary-precision decimal number from a - sequence of char s that represents a number. See - FromString(String, int, int, EContext) for more - information. - A sequence of char s that represents a - number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. Note that providing a context is often much faster - than creating the EDecimal without a context then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - An arbitrary-precision decimal number with the same value - as the given sequence of char s. - The parameter is null. - - - Creates an arbitrary-precision decimal number from a - sequence of char s that represents a number. See - FromString(String, int, int, EContext) for more information. - Note that calling the overload that takes an EContext is often much - faster than creating the EDecimal then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - A sequence that represents a number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision decimal number with the same value - as the given sequence of char s. - The parameter is not a correctly formatted number - sequence. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - - Creates an arbitrary-precision decimal number from a sequence - of char s that represents a number. - The format of the sequence generally consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if the minus sign, the value is negative.) - One or more digits, with a single optional decimal point - (".", U+002E) before or after those digits or between two of them. - These digits may begin with any number of zeros. - Optionally, "E"/"e" followed by an optional (positive - exponent) or "-" (negative exponent) and followed by one or more - digits specifying the exponent (these digits may begin with any - number of zeros). - The sequence can also be "-INF", "-Infinity", "Infinity", - "INF", quiet NaN ("NaN" /"-NaN") followed by any number of digits - (these digits may begin with any number of zeros), or signaling NaN - ("sNaN" /"-sNaN") followed by any number of digits (these digits - may begin with any number of zeros), all where the letters can be - any combination of basic upper-case and/or basic lower-case - letters. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The sequence is not - allowed to contain white space characters, including - spaces. - A sequence of char s, a portion of which - represents a number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. Note that providing a context is often much faster - than creating the EDecimal without a context then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - An arbitrary-precision decimal number with the same value - as the given sequence of char s. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Creates an arbitrary-precision decimal number from a - sequence of bytes (interpreted as text) that represents a number. - See FromString(String, int, int, EContext) for more - information. Note that calling the overload that takes an EContext - is often much faster than creating the EDecimal then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - A sequence that represents a number. - An arbitrary-precision decimal number with the same value - as the given sequence of bytes (interpreted as text). - The parameter is not a correctly formatted number - sequence. - - - Creates an arbitrary-precision decimal number from a - sequence of bytes (interpreted as text) that represents a number. - See FromString(String, int, int, EContext) for more - information. - A sequence of bytes (interpreted as text) that - represents a number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. Note that providing a context is often much faster - than creating the EDecimal without a context then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - An arbitrary-precision decimal number with the same value - as the given sequence of bytes (interpreted as text). - The parameter is null. - - - Creates an arbitrary-precision decimal number from a - sequence of bytes (interpreted as text) that represents a number. - See FromString(String, int, int, EContext) for more - information. Note that calling the overload that takes an EContext - is often much faster than creating the EDecimal then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - A sequence that represents a number. - An index starting at 0 showing where the - desired portion of begins. - The length, in bytes, of the desired portion - of (but not more than 's length). - An arbitrary-precision decimal number with the same value - as the given sequence of bytes (interpreted as text). - The parameter is not a correctly formatted number - sequence. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - - Creates an arbitrary-precision decimal number from a sequence - of bytes (interpreted as text) that represents a number. Each byte - in the sequence has to be a code point in the Basic Latin range - (0x00 to 0x7f or U+0000 to U+007F) of the Unicode Standard. - The format of the sequence generally consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if the minus sign, the value is negative.) - One or more digits, with a single optional decimal point - (".", U+002E) before or after those digits or between two of them. - These digits may begin with any number of zeros. - Optionally, "E"/"e" followed by an optional (positive - exponent) or "-" (negative exponent) and followed by one or more - digits specifying the exponent (these digits may begin with any - number of zeros). - The sequence can also be "-INF", "-Infinity", "Infinity", - "INF", quiet NaN ("NaN" /"-NaN") followed by any number of digits - (these digits may begin with any number of zeros), or signaling NaN - ("sNaN" /"-sNaN") followed by any number of digits (these digits - may begin with any number of zeros), all where the letters can be - any combination of basic upper-case and/or basic lower-case - letters. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The sequence is not - allowed to contain white space characters, including - spaces. - A sequence of bytes (interpreted as text), a - portion of which represents a number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. Note that providing a context is often much faster - than creating the EDecimal without a context then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - An arbitrary-precision decimal number with the same value - as the given sequence of bytes (interpreted as text). - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Creates an arbitrary-precision decimal number from a text - string that represents a number. See FromString(String, int, - int, EContext) for more information. Note that calling the - overload that takes an EContext is often much faster than creating - the EDecimal then calling RoundToPrecision on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - A string that represents a number. - An arbitrary-precision decimal number with the same value - as the given string. - The parameter is not a correctly formatted number - string. - - - Creates an arbitrary-precision decimal number from a text - string that represents a number. See FromString(String, int, - int, EContext) for more information. - A string that represents a number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. Note that providing a context is often much faster - than creating the EDecimal without a context then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - An arbitrary-precision decimal number with the same value - as the given string. - The parameter is null. - - - Creates an arbitrary-precision decimal number from a text - string that represents a number. See FromString(String, int, - int, EContext) for more information. Note that calling the - overload that takes an EContext is often much faster than creating - the EDecimal then calling RoundToPrecision on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - A string that represents a number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision decimal number with the same value - as the given string. - The parameter is not a correctly formatted number - string. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - - - - Creates an arbitrary-precision decimal number from a text - string that represents a number. - The format of the string generally consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if the minus sign, the value is negative.) - One or more digits, with a single optional decimal point - (".", U+002E) before or after those digits or between two of them. - These digits may begin with any number of zeros. - Optionally, "E"/"e" followed by an optional (positive - exponent) or "-" (negative exponent) and followed by one or more - digits specifying the exponent (these digits may begin with any - number of zeros). - The string can also be "-INF", "-Infinity", "Infinity", - "INF", quiet NaN ("NaN" /"-NaN") followed by any number of digits - (these digits may begin with any number of zeros), or signaling NaN - ("sNaN" /"-sNaN") followed by any number of digits (these digits - may begin with any number of zeros), all where the letters can be - any combination of basic upper-case and/or basic lower-case - letters. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The string is not - allowed to contain white space characters, including - spaces. - A text string, a portion of which represents a - number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. Note that providing a context is often much faster - than creating the EDecimal without a context then calling - RoundToPrecision on that EDecimal, especially if the context - specifies a precision limit and exponent range. - An arbitrary-precision decimal number with the same value - as the given string. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - - - Gets the greater value between two decimal - numbers. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The larger value of the two numbers. If one is positive - zero and the other is negative zero, returns the positive zero. If - the two numbers are positive and have the same value, returns the - one with the larger exponent. If the two numbers are negative and - have the same value, returns the one with the smaller - exponent. - The parameter or is null. - - - Gets the greater value between two decimal - numbers. - An arbitrary-precision decimal number. - Another arbitrary-precision decimal - number. - The larger value of the two numbers. If one is positive - zero and the other is negative zero, returns the positive zero. If - the two numbers are positive and have the same value, returns the - one with the larger exponent. If the two numbers are negative and - have the same value, returns the one with the smaller - exponent. - The parameter or is null. - - - Gets the greater value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Max. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The larger value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Gets the greater value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Max. - The first value to compare. - The second value to compare. - The larger value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Gets the lesser value between two decimal - numbers. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The smaller value of the two numbers. If one is positive - zero and the other is negative zero, returns the negative zero. If - the two numbers are positive and have the same value, returns the - one with the smaller exponent. If the two numbers are negative and - have the same value, returns the one with the larger - exponent. - The parameter or is null. - - - Gets the lesser value between two decimal - numbers. - The first value to compare. - The second value to compare. - The smaller value of the two numbers. If one is positive - zero and the other is negative zero, returns the negative zero. If - the two numbers are positive and have the same value, returns the - one with the smaller exponent. If the two numbers are negative and - have the same value, returns the one with the larger - exponent. - The parameter or is null. - - - Gets the lesser value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Min. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The smaller value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Gets the lesser value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Min. - The first value to compare. - The second value to compare. - The smaller value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Finds the constant π, the circumference of a circle - divided by its diameter. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as π can never be represented - exactly.. - The constant π rounded to the given precision. Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Finds the absolute value of this object (if it's negative, - it becomes positive). - An arbitrary-precision decimal number. Returns signaling - NaN if this value is signaling NaN. (In this sense, this method is - similar to the "copy-abs" operation in the General Decimal - Arithmetic Specification, except this method does not necessarily - return a copy of this object.). - - - Returns a number with the same value as this one, but - copying the sign (positive or negative) of another number. (This - method is similar to the "copy-sign" operation in the General - Decimal Arithmetic Specification, except this method does not - necessarily return a copy of this object.). - A number whose sign will be copied. - An arbitrary-precision decimal number. - The parameter is null. - - - Finds the absolute value of this object (if it's negative, - it becomes positive). - An arithmetic context to control the - precision, rounding, and exponent range of the result. If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the precision is - unlimited and no rounding is needed. - The absolute value of this object. Signals FlagInvalid and - returns quiet NaN if this value is signaling NaN. - - - Adds this arbitrary-precision decimal floating-point - number and another arbitrary-precision decimal floating-point - number and returns the result. The exponent for the result is the - lower of this arbitrary-precision decimal floating-point number's - exponent and the other arbitrary-precision decimal floating-point - number's exponent. - An arbitrary-precision decimal - number. - The sum of the two numbers, that is, this - arbitrary-precision decimal floating-point number plus another - arbitrary-precision decimal floating-point number. If this - arbitrary-precision decimal floating-point number is not-a-number - (NaN), returns NaN. - - - Adds this arbitrary-precision decimal floating-point - number and another arbitrary-precision decimal floating-point - number and returns the result. - The number to add to. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The sum of the two numbers, that is, this - arbitrary-precision decimal floating-point number plus another - arbitrary-precision decimal floating-point number. If this - arbitrary-precision decimal floating-point number is not-a-number - (NaN), returns NaN. - - - Compares the mathematical values of this object and - another object, accepting NaN values. This method currently uses - the rules given in the CompareToValue method, so that it it is not - consistent with the Equals method, but it may change in a future - version to use the rules for the CompareToTotal method - instead. - An arbitrary-precision decimal number. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value or if is null, or 0 if both - values are equal. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the mathematical values of this object and - another object, accepting NaN values. This method currently uses - the rules given in the CompareToValue method, so that it it is not - consistent with the Equals method, but it may change in a future - version to use the rules for the CompareToTotal method - instead. - The parameter is - a 32-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. - This method is not consistent with the Equals method because - two different numbers with the same mathematical value, but - different exponents, will compare as equal. - In this method, negative zero and positive zero are - considered equal. - If this object is a quiet NaN or signaling NaN, this method - will not trigger an error. Instead, NaN will compare greater than - any other number, including infinity. - The parameter is - a 32-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. This method currently uses - the rules given in the CompareToValue method, so that it it is not - consistent with the Equals method, but it may change in a future - version to use the rules for the CompareToTotal method - instead. - The parameter is - a 64-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. - This method is not consistent with the Equals method because - two different numbers with the same mathematical value, but - different exponents, will compare as equal. - In this method, negative zero and positive zero are - considered equal. - If this object is a quiet NaN or signaling NaN, this method - will not trigger an error. Instead, NaN will compare greater than - any other number, including infinity. - The parameter is - a 64-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. - This method is not consistent with the Equals method because - two different numbers with the same mathematical value, but - different exponents, will compare as equal. - In this method, negative zero and positive zero are - considered equal. - If this object or the other object is a quiet NaN or - signaling NaN, this method will not trigger an error. Instead, NaN - will compare greater than any other number, including infinity. Two - different NaN values will be considered equal. - An arbitrary-precision decimal number. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value or if is null, or 0 if both - values are equal. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares an arbitrary-precision binary floating-point - number with this instance. - The other object to compare. Can be - null. - Zero if the values are equal; a negative number if this - instance is less; or a positive number if this instance is greater. - Returns 0 if both values are NaN (even signaling NaN) and 1 if this - value is NaN (even signaling NaN) and the other isn't, or if the - other value is null. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the mathematical values of this object and - another object, treating quiet NaN as signaling. - In this method, negative zero and positive zero are - considered equal. - If this object or the other object is a quiet NaN or - signaling NaN, this method will return a quiet NaN and will signal - a FlagInvalid flag. - An arbitrary-precision decimal number. - An arithmetic context. The precision, rounding, - and exponent range are ignored. If HasFlags of the context - is true, will store the flags resulting from the operation (the - flags are in addition to the pre-existing flags). Can be - null. - Quiet NaN if this object or the other object is NaN, or 0 - if both objects have the same value, or -1 if this object is less - than the other value, or a 1 if this object is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the absolute values of this object and another - object, imposing a total ordering on all possible values (ignoring - their signs). In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero and positive zero are considered equal. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - An arbitrary-precision decimal number to - compare with this one. - The number 0 if both objects have the same value (ignoring - their signs), or -1 if this object is less than the other value - (ignoring their signs), or 1 if this object is greater (ignoring - their signs). - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the values of this object and another object, - imposing a total ordering on all possible values. In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - An arbitrary-precision decimal number to - compare with this one. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects have the same value, or -1 if - this object is less than the other value, or 1 if this object is - greater. Does not signal flags if either value is signaling NaN. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the values of this object and another object, - imposing a total ordering on all possible values (ignoring their - signs). In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - An arbitrary-precision decimal number to - compare with this one. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects have the same value (ignoring - their signs), or -1 if this object is less than the other value - (ignoring their signs), or 1 if this object is greater (ignoring - their signs). Does not signal flags if either value is signaling - NaN. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the values of this object and another object, - imposing a total ordering on all possible values. In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - An arbitrary-precision decimal number to - compare with this one. - The number 0 if both objects have the same value, or -1 if - this object is less than the other value, or 1 if this object is - greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the mathematical values of this object and - another object. - In this method, negative zero and positive zero are - considered equal. - If this object or the other object is a quiet NaN or - signaling NaN, this method returns a quiet NaN, and will signal a - FlagInvalid flag if either is a signaling NaN. - An arbitrary-precision decimal number. - An arithmetic context. The precision, rounding, - and exponent range are ignored. If HasFlags of the context - is true, will store the flags resulting from the operation (the - flags are in addition to the pre-existing flags). Can be - null. - Quiet NaN if this object or the other object is NaN, or 0 - if both objects have the same value, or -1 if this object is less - than the other value, or 1 if this object is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Divides this arbitrary-precision decimal floating-point - number by another arbitrary-precision decimal floating-point number - and returns the result; returns NaN instead if the result would - have a nonterminating decimal expansion (including 1/3, 1/12, 1/7, - 2/3, and so on); if this is not desired, use DivideToExponent, or - use the Divide overload that takes an EContext. - The number to divide by. - The result of dividing this arbitrary-precision decimal - floating-point number by another arbitrary-precision decimal - floating-point number. Returns infinity if the divisor (this - arbitrary-precision decimal floating-point number) is 0 and the - dividend (the other arbitrary-precision decimal floating-point - number) is nonzero. Returns not-a-number (NaN) if the divisor and - the dividend are 0. Returns NaN if the result can't be exact - because it would have a nonterminating binary expansion (examples - include 1 divided by any multiple of 3, such as 1/3 or 1/12). If - this is not desired, use DivideToExponent instead, or use the - Divide overload that takes an EContext (such as - EContext.Decimal128 ) instead. - - - Divides this arbitrary-precision decimal floating-point - number by another arbitrary-precision decimal floating-point number - and returns the result. - The number to divide by. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The result of dividing this arbitrary-precision decimal - floating-point number by another arbitrary-precision decimal - floating-point number. Signals FlagDivideByZero and returns - infinity if the divisor (this arbitrary-precision decimal - floating-point number) is 0 and the dividend (the other - arbitrary-precision decimal floating-point number) is nonzero. - Signals FlagInvalid and returns not-a-number (NaN) if the divisor - and the dividend are 0; or, either is null - or 's precision is 0, and the result would - have a nonterminating decimal expansion (examples include 1 divided - by any multiple of 3, such as 1/3 or 1/12); or, the rounding mode - is ERounding.None and the result is not exact. - - - Calculates the quotient and remainder using the - DivideToIntegerNaturalScale and the formula in - RemainderNaturalScale. - The number to divide by. - A 2 element array consisting of the quotient and remainder - in that order. - - - Calculates the quotient and remainder using the - DivideToIntegerNaturalScale and the formula in - RemainderNaturalScale. - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only in the division portion of the remainder - calculation; as a result, it's possible for the remainder to have a - higher precision than given in this context. Flags will be set on - the given context only if the context's HasFlags is true and - the integer part of the division result doesn't fit the precision - and exponent range without rounding. Can be null, in which the - precision is unlimited and no additional rounding, other than the - rounding down to an integer after division, is needed. - A 2 element array consisting of the quotient and remainder - in that order. - - - Divides this arbitrary-precision decimal floating-point - number by another arbitrary-precision decimal floating-point number - and returns a two-item array containing the result of the division - and the remainder, in that order. The result of division is - calculated as though by DivideToIntegerNaturalScale, and - the remainder is calculated as though by - RemainderNaturalScale. - The number to divide by. - An array of two items: the first is the result of the - division as an arbitrary-precision decimal floating-point number, - and the second is the remainder as an arbitrary-precision decimal - floating-point number. The result of division is the result of the - method on the two operands, and the remainder is the result of the - Remainder method on the two operands. - - - Divides this arbitrary-precision decimal floating-point - number by another arbitrary-precision decimal floating-point number - and returns a two-item array containing the result of the division - and the remainder, in that order. The result of division is - calculated as though by DivideToIntegerNaturalScale, and - the remainder is calculated as though by - RemainderNaturalScale. - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only in the division portion of the remainder - calculation; as a result, it's possible for the remainder to have a - higher precision than given in this context. Flags will be set on - the given context only if the context's HasFlags is true and - the integer part of the division result doesn't fit the precision - and exponent range without rounding. Can be null, in which the - precision is unlimited and no additional rounding, other than the - rounding down to an integer after division, is needed. - An array of two items: the first is the result of the - division as an arbitrary-precision decimal floating-point number, - and the second is the remainder as an arbitrary-precision decimal - floating-point number. The result of division is the result of the - method on the two operands, and the remainder is the result of the - Remainder method on the two operands. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent to the result. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual decimal - point (so a negative number means the number of decimal places to - round to). A positive number places the cutoff point to the left of - the usual decimal point. - An arithmetic context object to control the - rounding mode to use if the result must be scaled down to have the - same exponent as this value. If the precision given in the context - is other than 0, calls the Quantize method with both arguments - equal to the result of the operation (and can signal FlagInvalid - and return NaN if the result doesn't fit the given precision). If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the default - rounding mode is HalfEven. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the context defines an exponent range and the - desired exponent is outside that range. Signals FlagInvalid and - returns not-a-number (NaN) if the rounding mode is ERounding.None - and the result is not exact. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent (expressed as a 32-bit signed integer) to the - result, using the half-even rounding mode. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual decimal - point (so a negative number means the number of decimal places to - round to). A positive number places the cutoff point to the left of - the usual decimal point. - An arithmetic context object to control the - rounding mode to use if the result must be scaled down to have the - same exponent as this value. If the precision given in the context - is other than 0, calls the Quantize method with both arguments - equal to the result of the operation (and can signal FlagInvalid - and return NaN if the result doesn't fit the given precision). If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the default - rounding mode is HalfEven. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the context defines an exponent range and the - desired exponent is outside that range. Signals FlagInvalid and - returns not-a-number (NaN) if the rounding mode is ERounding.None - and the result is not exact. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent to the result. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual decimal - point (so a negative number means the number of decimal places to - round to). A positive number places the cutoff point to the left of - the usual decimal point. - The rounding mode to use if the result must - be scaled down to have the same exponent as this value. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the rounding mode is ERounding.None and the - result is not exact. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent (expressed as a 32-bit signed integer) to the - result, using the half-even rounding mode. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual decimal - point (so a negative number means the number of decimal places to - round to). A positive number places the cutoff point to the left of - the usual decimal point. - The rounding mode to use if the result must - be scaled down to have the same exponent as this value. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the rounding mode is ERounding.None and the - result is not exact. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent to the result. - The number to divide by. - The desired exponent. A negative number - places the cutoff point to the right of the usual decimal point (so - a negative number means the number of decimal places to round to). - A positive number places the cutoff point to the left of the usual - decimal point. - An arithmetic context object to control the - rounding mode to use if the result must be scaled down to have the - same exponent as this value. If the precision given in the context - is other than 0, calls the Quantize method with both arguments - equal to the result of the operation (and can signal FlagInvalid - and return NaN if the result doesn't fit the given precision). If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the default - rounding mode is HalfEven. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the context defines an exponent range and the - desired exponent is outside that range. Signals FlagInvalid and - returns not-a-number (NaN) if the rounding mode is ERounding.None - and the result is not exact. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent to the result, using the half-even rounding - mode. - The number to divide by. - The desired exponent. A negative number - places the cutoff point to the right of the usual decimal point (so - a negative number means the number of decimal places to round to). - A positive number places the cutoff point to the left of the usual - decimal point. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent (expressed as a 64-bit signed integer) to the - result, using the half-even rounding mode. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual decimal - point (so a negative number means the number of decimal places to - round to). A positive number places the cutoff point to the left of - the usual decimal point. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent (expressed as a 32-bit signed integer) to the - result, using the half-even rounding mode. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual decimal - point (so a negative number means the number of decimal places to - round to). A positive number places the cutoff point to the left of - the usual decimal point. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. - - - Divides two arbitrary-precision decimal numbers, and gives - a particular exponent to the result. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual decimal - point (so a negative number means the number of decimal places to - round to). A positive number places the cutoff point to the left of - the usual decimal point. - The rounding mode to use if the result must - be scaled down to have the same exponent as this value. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Returns not-a-number (NaN) if the divisor and the dividend - are 0. Returns NaN if the rounding mode is ERounding.None and the - result is not exact. - - - Divides two arbitrary-precision decimal numbers, and - returns the integer part of the result, rounded down, with the - preferred exponent set to this value's exponent minus the divisor's - exponent. - The number to divide by. - The integer part of the quotient of the two objects. - Signals FlagDivideByZero and returns infinity if the divisor is 0 - and the dividend is nonzero. Signals FlagInvalid and returns - not-a-number (NaN) if the divisor and the dividend are 0. - - - Divides this object by another object, and returns the - integer part of the result (which is initially rounded down), with - the preferred exponent set to this value's exponent minus the - divisor's exponent. - The parameter is - an arbitrary-precision decimal floating-point number. - The parameter is an - EContext object. - The integer part of the quotient of the two objects. - Signals FlagInvalid and returns not-a-number (NaN) if the return - value would overflow the exponent range. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the rounding mode is ERounding.None and the - result is not exact. - - - Divides this object by another object, and returns the - integer part of the result, with the exponent set to 0. - The number to divide by. - An arithmetic context object to control the - precision. The rounding and exponent range settings of this context - are ignored. If HasFlags of the context is true, will also - store the flags resulting from the operation (the flags are in - addition to the pre-existing flags). Can be null, in which case the - precision is unlimited. - The integer part of the quotient of the two objects. The - exponent will be set to 0. Signals FlagDivideByZero and returns - infinity if the divisor is 0 and the dividend is nonzero. Signals - FlagInvalid and returns not-a-number (NaN) if the divisor and the - dividend are 0, or if the result doesn't fit the given - precision. - - - Divides this object by another decimal number and returns - a result with the same exponent as this object (the - dividend). - The number to divide by. - The rounding mode to use if the result must - be scaled down to have the same exponent as this value. - The quotient of the two numbers. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the rounding mode is ERounding.None and the - result is not exact. - - - Determines whether this object's significand, exponent, - and properties are equal to those of another object. Not-a-number - values are considered equal if the rest of their properties are - equal. - An arbitrary-precision decimal number. - true if this object's significand and exponent are - equal to those of another object; otherwise, false. - - - Determines whether this object's significand, exponent, - and properties are equal to those of another object and that other - object is an arbitrary-precision decimal number. Not-a-number - values are considered equal if the rest of their properties are - equal. - The parameter is an - arbitrary object. - true if the objects are equal; otherwise, - false. In this method, two objects are not equal if they - don't have the same type or if one is null and the other - isn't. - - - Finds e (the base of natural logarithms) raised to the - power of this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the exponential function's - results are generally not exact. (Unlike in the General Decimal - Arithmetic Specification, any rounding mode is allowed.). - Exponential of this object. If this object's value is 1, - returns an approximation to " e" within the given precision. - Signals FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Finds e (the base of natural logarithms) raised to the - power of this object's value, and subtracts the result by 1 and - returns the final result, in a way that avoids loss of precision if - the true result is very close to 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the exponential function's - results are generally not exact. (Unlike in the General Binary - Arithmetic Specification, any rounding mode is allowed.). - Exponential of this object, minus 1. Signals FlagInvalid - and returns not-a-number (NaN) if the parameter is null or the precision is unlimited (the context's - Precision property is 0). - - - Calculates this object's hash code. No application or - process IDs are used in the hash code calculation. - A 32-bit signed integer. - - - Gets a value indicating whether this object is positive or - negative infinity. - true if this object is positive or negative - infinity; otherwise, false. - - - Gets a value indicating whether this object is not a - number (NaN). - true if this object is not a number (NaN); - otherwise, false. - - - Returns whether this object is negative - infinity. - true if this object is negative infinity; - otherwise, false. - - - Returns whether this object is positive - infinity. - true if this object is positive infinity; - otherwise, false. - - - Gets a value indicating whether this object is a quiet - not-a-number value. - true if this object is a quiet not-a-number value; - otherwise, false. - - - Gets a value indicating whether this object is a signaling - not-a-number value. - true if this object is a signaling not-a-number - value; otherwise, false. - - - Finds the natural logarithm of this object, that is, the - power (exponent) that e (the base of natural logarithms) must be - raised to in order to equal this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the ln function's results are - generally not exact. (Unlike in the General Decimal Arithmetic - Specification, any rounding mode is allowed.). - Ln(this object). Signals the flag FlagInvalid and returns - NaN if this object is less than 0 (the result would be a complex - number with a real part equal to Ln of this object's absolute value - and an imaginary part equal to pi, but the return value is still - NaN.). Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null or the precision is - unlimited (the context's Precision property is 0). Signals no flags - and returns negative infinity if this object's value is - 0. - - - Finds the base-10 logarithm of this object, that is, the - power (exponent) that the number 10 must be raised to in order to - equal this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the ln function's results are - generally not exact. (Unlike in the General Decimal Arithmetic - Specification, any rounding mode is allowed.). - Ln(this object)/Ln(10). Signals the flag FlagInvalid and - returns not-a-number (NaN) if this object is less than 0. Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Adds 1 to this object's value and finds the natural - logarithm of the result, in a way that avoids loss of precision - when this object's value is between 0 and 1. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the ln function's results are - generally not exact. (Unlike in the General Binary Arithmetic - Specification, any rounding mode is allowed.). - Ln(1+(this object)). Signals the flag FlagInvalid and - returns NaN if this object is less than -1 (the result would be a - complex number with a real part equal to Ln of 1 plus this object's - absolute value and an imaginary part equal to pi, but the return - value is still NaN.). Signals FlagInvalid and returns not-a-number - (NaN) if the parameter is null or the - precision is unlimited (the context's Precision property is 0). - Signals no flags and returns negative infinity if this object's - value is 0. - - - Finds the base-N logarithm of this object, that is, the - power (exponent) that the number N must be raised to in order to - equal this object's value. - The parameter - is a Numbers.EDecimal object. - The parameter is a - Numbers.EContext object. - Ln(this object)/Ln(baseValue). Signals the flag - FlagInvalid and returns not-a-number (NaN) if this object is less - than 0. Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null or the precision is - unlimited (the context's Precision property is 0). - The parameter is null. - - - Returns a number similar to this number but with the - decimal point moved to the left. - The number of decimal places to move the - decimal point to the left. If this number is negative, instead - moves the decimal point to the right by this number's absolute - value. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the - decimal point moved to the left. - The number of decimal places to move the - decimal point to the left. If this number is negative, instead - moves the decimal point to the right by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the - decimal point moved to the left. - The number of decimal places to move the - decimal point to the left. If this number is negative, instead - moves the decimal point to the right by this number's absolute - value. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the - decimal point moved to the left. - The number of decimal places to move the - decimal point to the left. If this number is negative, instead - moves the decimal point to the right by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the - decimal point moved to the right. - The number of decimal places to move the - decimal point to the right. If this number is negative, instead - moves the decimal point to the left by this number's absolute - value. - A number whose exponent is increased by , but not to more than 0. - - - Returns a number similar to this number but with the - decimal point moved to the right. - The number of decimal places to move the - decimal point to the right. If this number is negative, instead - moves the decimal point to the left by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is increased by , but not to more than 0. - - - Returns a number similar to this number but with the - decimal point moved to the right. - The number of decimal places to move the - decimal point to the right. If this number is negative, instead - moves the decimal point to the left by this number's absolute - value. - A number whose exponent is increased by , but not to more than 0. - - - Returns a number similar to this number but with the - decimal point moved to the right. - The number of decimal places to move the - decimal point to the right. If this number is negative, instead - moves the decimal point to the left by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is increased by , but not to more than 0. - - - Multiplies this arbitrary-precision decimal floating-point - number by another arbitrary-precision decimal floating-point number - and returns the result. The exponent for the result is this - arbitrary-precision decimal floating-point number's exponent plus - the other arbitrary-precision decimal floating-point number's - exponent. - Another decimal number. - The product of the two numbers, that is, this - arbitrary-precision decimal floating-point number times another - arbitrary-precision decimal floating-point number. - The parameter is null. - - - Multiplies this arbitrary-precision decimal floating-point - number by another arbitrary-precision decimal floating-point number - and returns the result. - Another decimal number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The product of the two numbers, that is, this - arbitrary-precision decimal floating-point number times another - arbitrary-precision decimal floating-point number. - - - Adds this arbitrary-precision decimal floating-point - number and a 64-bit signed integer and returns the result. The - exponent for the result is the lower of this arbitrary-precision - decimal floating-point number's exponent and the other 64-bit - signed integer's exponent. - The parameter - is a 64-bit signed integer. - The sum of the two numbers, that is, this - arbitrary-precision decimal floating-point number plus a 64-bit - signed integer. If this arbitrary-precision decimal floating-point - number is not-a-number (NaN), returns NaN. - - - Subtracts a 64-bit signed integer from this - arbitrary-precision decimal floating-point number and returns the - result. The exponent for the result is the lower of this - arbitrary-precision decimal floating-point number's exponent and - the other 64-bit signed integer's exponent. - The parameter - is a 64-bit signed integer. - The difference between the two numbers, that is, this - arbitrary-precision decimal floating-point number minus a 64-bit - signed integer. If this arbitrary-precision decimal floating-point - number is not-a-number (NaN), returns NaN. - - - Multiplies this arbitrary-precision decimal floating-point - number by a 64-bit signed integer and returns the result. The - exponent for the result is this arbitrary-precision decimal - floating-point number's exponent plus the other 64-bit signed - integer's exponent. - The parameter - is a 64-bit signed integer. - The product of the two numbers, that is, this - arbitrary-precision decimal floating-point number times a 64-bit - signed integer. - - - Divides this arbitrary-precision decimal floating-point - number by a 64-bit signed integer and returns the result; returns - NaN instead if the result would have a nonterminating decimal - expansion (including 1/3, 1/12, 1/7, 2/3, and so on); if this is - not desired, use DivideToExponent, or use the Divide overload that - takes an EContext. - The parameter - is a 64-bit signed integer. - The result of dividing this arbitrary-precision decimal - floating-point number by a 64-bit signed integer. Returns infinity - if the divisor (this arbitrary-precision decimal floating-point - number) is 0 and the dividend (the other 64-bit signed integer) is - nonzero. Returns not-a-number (NaN) if the divisor and the dividend - are 0. Returns NaN if the result can't be exact because it would - have a nonterminating binary expansion (examples include 1 divided - by any multiple of 3, such as 1/3 or 1/12). If this is not desired, - use DivideToExponent instead, or use the Divide overload that takes - an EContext (such as EContext.Decimal128 ) - instead. - - - Adds this arbitrary-precision decimal floating-point - number and a 32-bit signed integer and returns the result. The - exponent for the result is the lower of this arbitrary-precision - decimal floating-point number's exponent and the other 32-bit - signed integer's exponent. - A 32-bit signed integer to add to this - object. - The sum of the two numbers, that is, this - arbitrary-precision decimal floating-point number plus a 32-bit - signed integer. If this arbitrary-precision decimal floating-point - number is not-a-number (NaN), returns NaN. - - - Subtracts a 32-bit signed integer from this - arbitrary-precision decimal floating-point number and returns the - result. The exponent for the result is the lower of this - arbitrary-precision decimal floating-point number's exponent and - the other 32-bit signed integer's exponent. - A 32-bit signed integer to subtract from - this object. - The difference between the two numbers, that is, this - arbitrary-precision decimal floating-point number minus a 32-bit - signed integer. If this arbitrary-precision decimal floating-point - number is not-a-number (NaN), returns NaN. - - - Multiplies this arbitrary-precision decimal floating-point - number by a 32-bit signed integer and returns the result. The - exponent for the result is this arbitrary-precision decimal - floating-point number's exponent plus the other 32-bit signed - integer's exponent. - A 32-bit signed integer to multiply this - object by. - The product of the two numbers, that is, this - arbitrary-precision decimal floating-point number times a 32-bit - signed integer. - - - Divides this arbitrary-precision decimal floating-point - number by a 32-bit signed integer and returns the result; returns - NaN instead if the result would have a nonterminating decimal - expansion (including 1/3, 1/12, 1/7, 2/3, and so on); if this is - not desired, use DivideToExponent, or use the Divide overload that - takes an EContext. - A 32-bit signed integer, the divisor, to - divide this object by. - The result of dividing this arbitrary-precision decimal - floating-point number by a 32-bit signed integer. Returns infinity - if the divisor (this arbitrary-precision decimal floating-point - number) is 0 and the dividend (the other 32-bit signed integer) is - nonzero. Returns not-a-number (NaN) if the divisor and the dividend - are 0. Returns NaN if the result can't be exact because it would - have a nonterminating binary expansion (examples include 1 divided - by any multiple of 3, such as 1/3 or 1/12). If this is not desired, - use DivideToExponent instead, or use the Divide overload that takes - an EContext (such as EContext.Decimal128 ) - instead. - - - Multiplies by one decimal number, and then adds another - decimal number. - The value to multiply. - The value to add. - An arbitrary-precision decimal floating-point - number. - - - Multiplies by one value, and then adds another - value. - The value to multiply. - The value to add. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. If the precision doesn't indicate a simplified - arithmetic, rounding and precision/exponent adjustment is done only - once, namely, after multiplying and adding. - The result thisValue * multiplicand + augend. - - - Multiplies by one value, and then subtracts another - value. - The value to multiply. - The value to subtract. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. If the precision doesn't indicate a simplified - arithmetic, rounding and precision/exponent adjustment is done only - once, namely, after multiplying and subtracting. - The result thisValue * multiplicand - - subtrahend. - The parameter or is null. - - - Gets an object with the same value as this one, but with - the sign reversed. - An arbitrary-precision decimal number. If this value is - positive zero, returns negative zero. Returns signaling NaN if this - value is signaling NaN. (In this sense, this method is similar to - the "copy-negate" operation in the General Decimal Arithmetic - Specification, except this method does not necessarily return a - copy of this object.). - - - Returns an arbitrary-precision decimal number with the - same value as this object but with the sign reversed. - An arithmetic context to control the - precision, rounding, and exponent range of the result. If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the precision is - unlimited and rounding isn't needed. - An arbitrary-precision decimal number. If this value is - positive zero, returns positive zero. Signals FlagInvalid and - returns quiet NaN if this value is signaling NaN. - - - Finds the largest value that's smaller than the given - value. - An arithmetic context object to control the - precision and exponent range of the result. The rounding mode from - this context is ignored. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). - Returns the largest value that's less than the given - value. Returns negative infinity if the result is negative - infinity. Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null, the precision is 0, or - has an unlimited exponent range. - - - Finds the smallest value that's greater than the given - value. - An arithmetic context object to control the - precision and exponent range of the result. The rounding mode from - this context is ignored. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). - Returns the smallest value that's greater than the given - value.Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null, the precision is 0, or - has an unlimited exponent range. - - - Finds the next value that is closer to the other object's - value than this object's value. Returns a copy of this value with - the same sign as the other value if both values are - equal. - An arbitrary-precision decimal number that - the return value will approach. - An arithmetic context object to control the - precision and exponent range of the result. The rounding mode from - this context is ignored. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). - Returns the next value that is closer to the other object' - s value than this object's value. Signals FlagInvalid and returns - NaN if the parameter is null, the precision - is 0, or has an unlimited exponent - range. - - - Rounds this object's value to a given precision, using the - given rounding mode and range of exponent, and also converts - negative zero to positive zero. The idiom - EDecimal.SignalingNaN.Plus(ctx) is useful for triggering an - invalid operation and returning not-a-number (NaN) for custom - arithmetic operations. - A context for controlling the precision, rounding - mode, and exponent range. Can be null, in which case the precision - is unlimited and rounding isn't needed. - The closest value to this object's value, rounded to the - specified precision. If is null or the - precision and exponent range are unlimited, returns the same value - as this object (or a quiet NaN if this object is a signaling - NaN). - - - Raises this object's value to the given - exponent. - An arbitrary-precision decimal number - expressing the exponent to raise this object's value to. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - This^exponent. Signals the flag FlagInvalid and returns - NaN if this object and exponent are both 0; or if this value is - less than 0 and the exponent either has a fractional part or is - infinity. Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null or the precision is - unlimited (the context's Precision property is 0), and the exponent - has a fractional part. - - - Raises this object's value to the given exponent, using - unlimited precision. - An arbitrary-precision decimal number - expressing the exponent to raise this object's value to. - This^exponent. Returns not-a-number (NaN) if the exponent - has a fractional part. - - - Raises this object's value to the given - exponent. - The exponent to raise this object's - value to. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - This^exponent. Signals the flag FlagInvalid and returns - NaN if this object and exponent are both 0. - - - Raises this object's value to the given - exponent. - The exponent to raise this object's - value to. - This^exponent. Returns not-a-number (NaN) if this object - and exponent are both 0. - - - Finds the number of digits in this number's significand. - Returns 1 if this value is 0, and 0 if this value is infinity or - not-a-number (NaN). - An arbitrary-precision integer. - - - - Returns an arbitrary-precision decimal number with the - same value but a new exponent. - Note that this is not always the same as rounding to a given - number of decimal places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - decimal places is desired, it's better to use the RoundToExponent - and RoundToIntegral methods instead. - Remark: - This method can be used to implement - fixed-point decimal arithmetic, in which each decimal number has a - fixed number of digits after the decimal point. The following code - example returns a fixed-point number with up to 20 digits before - and exactly 5 digits after the decimal point: - /* After performing arithmetic operations, adjust - /* the number to 5*/*/ - /**/ - digits after the decimal point number = number.Quantize( - EInteger.FromInt32(-5), /* five digits after the decimal - point*/ - EContext.ForPrecision(25) /* 25-digit - precision);*/ - A fixed-point decimal arithmetic in which no digits come - after the decimal point (a desired exponent of 0) is considered an - "integer arithmetic". - - The desired exponent for the result. - The exponent is the number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control precision and - rounding of the result. If HasFlags - of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). Can be null, in which - case the default rounding mode is HalfEven. - An arbitrary-precision decimal number with the same value - as this object but with the exponent changed. Signals FlagInvalid - and returns not-a-number (NaN) if this object is infinity, if the - rounded result can't fit the given precision, or if the context - defines an exponent range and the given exponent is outside that - range. - - - Returns an arbitrary-precision decimal number with the - same value as this one but a new exponent. - Remark: This method can be used to implement - fixed-point decimal arithmetic, in which a fixed number of digits - come after the decimal point. A fixed-point decimal arithmetic in - which no digits come after the decimal point (a desired exponent of - 0) is considered an "integer arithmetic" . - The desired exponent for the - result. The exponent is the number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - A rounding mode to use in case the result - needs to be rounded to fit the given exponent. - An arbitrary-precision decimal number with the same value - as this object but with the exponent changed. Returns not-a-number - (NaN) if this object is infinity, or if the rounding mode is - ERounding.None and the result is not exact. - - - - Returns an arbitrary-precision decimal number with the - same value but a new exponent. - Note that this is not always the same as rounding to a given - number of decimal places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - decimal places is desired, it's better to use the RoundToExponent - and RoundToIntegral methods instead. - Remark: - This method can be used to implement - fixed-point decimal arithmetic, in which each decimal number has a - fixed number of digits after the decimal point. The following code - example returns a fixed-point number with up to 20 digits before - and exactly 5 digits after the decimal point: - /* After performing arithmetic operations, adjust the number to 5 - digits - after the decimal point */ number = number.Quantize(-5, /* five digits - after the decimal point */EContext.ForPrecision(25) /* 25-digit - precision*/); - A fixed-point decimal arithmetic in which no digits come - after the decimal point (a desired exponent of 0) is considered an - "integer arithmetic". - - The desired exponent for the - result. The exponent is the number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control precision and - rounding of the result. If HasFlags - of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). Can be null, in which - case the default rounding mode is HalfEven. - An arbitrary-precision decimal number with the same value - as this object but with the exponent changed. Signals FlagInvalid - and returns not-a-number (NaN) if this object is infinity, if the - rounded result can't fit the given precision, or if the context - defines an exponent range and the given exponent is outside that - range. - - - Returns an arbitrary-precision decimal number with the - same value as this object but with the same exponent as another - decimal number. - Note that this is not always the same as rounding to a given - number of decimal places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - decimal places is desired, it's better to use the RoundToExponent - and RoundToIntegral methods instead. - Remark: This method can be used to implement - fixed-point decimal arithmetic, in which a fixed number of digits - come after the decimal point. A fixed-point decimal arithmetic in - which no digits come after the decimal point (a desired exponent of - 0) is considered an "integer arithmetic" . - An arbitrary-precision decimal number - containing the desired exponent of the result. The significand is - ignored. The exponent is the number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousands-place (10^3, 1000). A value of 0 rounds the number to - an integer. The following examples for this parameter express a - desired exponent of 3: 10e3, 8888e3, 4.56e5. - An arithmetic context to control precision and - rounding of the result. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). Can be null, in which - case the default rounding mode is HalfEven. - An arbitrary-precision decimal number with the same value - as this object but with the exponent changed. Signals FlagInvalid - and returns not-a-number (NaN) if the result can't fit the given - precision without rounding, or if the arithmetic context defines an - exponent range and the given exponent is outside that - range. - - - Returns an object with the same numerical value as this - one but with trailing zeros removed from its significand. For - example, 1.00 becomes 1. - If this object's value is 0, changes the exponent to - 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - This value with trailing zeros removed. Note that if the - result has a very high exponent and the context says to clamp high - exponents, there may still be some trailing zeros in the - significand. - - - Returns the remainder that would result when this - arbitrary-precision decimal floating-point number is divided by - another arbitrary-precision decimal floating-point number. The - remainder is the number that remains when the absolute value of - this arbitrary-precision decimal floating-point number is divided - (as though by DivideToIntegerZeroScale) by the absolute value of - the other arbitrary-precision decimal floating-point number; the - remainder has the same sign (positive or negative) as this - arbitrary-precision decimal floating-point number. - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result, and of the - intermediate integer division. If HasFlags of the context is - true, will also store the flags resulting from the operation (the - flags are in addition to the pre-existing flags). Can be null, in - which the precision is unlimited. - The remainder that would result when this - arbitrary-precision decimal floating-point number is divided by - another arbitrary-precision decimal floating-point number. Signals - FlagDivideByZero and returns infinity if the divisor (this - arbitrary-precision decimal floating-point number) is 0 and the - dividend (the other arbitrary-precision decimal floating-point - number) is nonzero. Signals FlagInvalid and returns not-a-number - (NaN) if the divisor and the dividend are 0, or if the result of - the division doesn't fit the given precision. - - - Finds the remainder that results when dividing two - arbitrary-precision decimal numbers, except the intermediate - division is not adjusted to fit the precision of the given - arithmetic context. The value of this object is divided by the - absolute value of the other object; the remainder has the same sign - (positive or negative) as this object's value. - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result, but not also - of the intermediate integer division. If HasFlags of the - context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which the precision is unlimited. - The remainder of the two numbers. Signals FlagInvalid and - returns not-a-number (NaN) if the divisor is 0, or if the result - doesn't fit the given precision. - - - Calculates the remainder of a number by the formula - "this" - (("this" / "divisor") * "divisor"). - The number to divide by. - An arbitrary-precision decimal number. - - - Calculates the remainder of a number by the formula "this" - - (("this" / "divisor") * "divisor"). - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only in the division portion of the remainder - calculation; as a result, it's possible for the return value to - have a higher precision than given in this context. Flags will be - set on the given context only if the context's HasFlags is - true and the integer part of the division result doesn't fit the - precision and exponent range without rounding. Can be null, in - which the precision is unlimited and no additional rounding, other - than the rounding down to an integer after division, is - needed. - An arbitrary-precision decimal number. - - - Finds the distance to the closest multiple of the given - divisor, based on the result of dividing this object's value by - another object's value. - - If this and the other object divide evenly, the result is - 0. - If the remainder's absolute value is less than half of the - divisor's absolute value, the result has the same sign as this - object and will be the distance to the closest multiple. - If the remainder's absolute value is more than half of the - divisor's absolute value, the result has the opposite sign of this - object and will be the distance to the closest multiple. - If the remainder's absolute value is exactly half of the - divisor's absolute value, the result has the opposite sign of this - object if the quotient, rounded down, is odd, and has the same sign - as this object if the quotient, rounded down, is even, and the - result's absolute value is half of the divisor's absolute - value. This function is also known as the "IEEE - Remainder" function. - The number to divide by. - An arithmetic context object to control the - precision. The rounding and exponent range settings of this context - are ignored (the rounding mode is always treated as HalfEven). If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which the precision is - unlimited. - The distance of the closest multiple. Signals FlagInvalid - and returns not-a-number (NaN) if the divisor is 0, or either the - result of integer division (the quotient) or the remainder wouldn't - fit the given precision. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to a new exponent if - necessary. The resulting number's Exponent property will not - necessarily be the given exponent; use the Quantize method instead - to give the result a particular exponent. - The minimum exponent the result can have. - This is the maximum number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - An arbitrary-precision decimal number rounded to the - closest value representable in the given precision. If the result - can't fit the precision, additional digits are discarded to make it - fit. Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to the given exponent when rounding, and the given - exponent is outside of the valid range of the arithmetic - context. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to a new exponent if - necessary, using the HalfEven rounding mode. The resulting number's - Exponent property will not necessarily be the given exponent; use - the Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can have. - This is the maximum number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arbitrary-precision decimal number rounded to the - closest value representable for the given exponent. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to a new exponent if - necessary, using the given rounding mode. The resulting number's - Exponent property will not necessarily be the given exponent; use - the Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can have. - This is the maximum number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - Desired mode for rounding this number's - value. - An arbitrary-precision decimal number rounded to the - closest value representable for the given exponent. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to a new exponent if - necessary, using the HalfEven rounding mode. The resulting number's - Exponent property will not necessarily be the given exponent; use - the Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can - have. This is the maximum number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arbitrary-precision decimal number rounded to the - closest value representable for the given exponent. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to a new exponent if - necessary. The resulting number's Exponent property will not - necessarily be the given exponent; use the Quantize method instead - to give the result a particular exponent. - The minimum exponent the result can - have. This is the maximum number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - An arbitrary-precision decimal number rounded to the - closest value representable in the given precision. If the result - can't fit the precision, additional digits are discarded to make it - fit. Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to the given exponent when rounding, and the given - exponent is outside of the valid range of the arithmetic - context. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to a new exponent if - necessary. The resulting number's Exponent property will not - necessarily be the given exponent; use the Quantize method instead - to give the result a particular exponent. - The minimum exponent the result can - have. This is the maximum number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - The desired mode to use to round the given - number to the given exponent. - An arbitrary-precision decimal number rounded to the given - negative number of decimal places. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to the given exponent - represented as an arbitrary-precision integer, and signals an - inexact flag if the result would be inexact. The resulting number's - Exponent property will not necessarily be the given exponent; use - the Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can have. - This is the maximum number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - An arbitrary-precision decimal number rounded to the - closest value representable in the given precision. Signals - FlagInvalid and returns not-a-number (NaN) if the result can't fit - the given precision without rounding. Signals FlagInvalid and - returns not-a-number (NaN) if the arithmetic context defines an - exponent range, the new exponent must be changed to the given - exponent when rounding, and the given exponent is outside of the - valid range of the arithmetic context. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to the given exponent - represented as a 32-bit signed integer, and signals an inexact flag - if the result would be inexact. The resulting number's Exponent - property will not necessarily be the given exponent; use the - Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can - have. This is the maximum number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - An arbitrary-precision decimal number rounded to the - closest value representable in the given precision. Signals - FlagInvalid and returns not-a-number (NaN) if the result can't fit - the given precision without rounding. Signals FlagInvalid and - returns not-a-number (NaN) if the arithmetic context defines an - exponent range, the new exponent must be changed to the given - exponent when rounding, and the given exponent is outside of the - valid range of the arithmetic context. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to the given exponent - represented as a 32-bit signed integer, and signals an inexact flag - if the result would be inexact. The resulting number's Exponent - property will not necessarily be the given exponent; use the - Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can - have. This is the maximum number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - Desired mode for rounding this object's - value. - An arbitrary-precision decimal number rounded to the - closest value representable using the given exponent. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to an integer, and signals an - inexact flag if the result would be inexact. The resulting number's - Exponent property will not necessarily be 0; use the Quantize - method instead to give the result an exponent of 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - An arbitrary-precision decimal number rounded to the - closest integer representable in the given precision. Signals - FlagInvalid and returns not-a-number (NaN) if the result can't fit - the given precision without rounding. Signals FlagInvalid and - returns not-a-number (NaN) if the arithmetic context defines an - exponent range, the new exponent must be changed to 0 when - rounding, and 0 is outside of the valid range of the arithmetic - context. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to an integer, without adding - the FlagInexact or FlagRounded flags. The resulting - number's Exponent property will not necessarily be 0; use the - Quantize method instead to give the result an exponent of - 0. - An arithmetic context to control precision and - rounding of the result. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags), except that this - function will never add the FlagRounded and - FlagInexact flags (the only difference between this and - RoundToExponentExact). Can be null, in which case the default - rounding mode is HalfEven. - An arbitrary-precision decimal number rounded to the - closest integer representable in the given precision. If the result - can't fit the precision, additional digits are discarded to make it - fit. Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to 0 when rounding, and 0 is outside of the valid range - of the arithmetic context. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to an integer, and signals an - inexact flag if the result would be inexact. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - An arbitrary-precision decimal number rounded to the - closest integer representable in the given precision. Signals - FlagInvalid and returns not-a-number (NaN) if the result can't fit - the given precision without rounding. Signals FlagInvalid and - returns not-a-number (NaN) if the arithmetic context defines an - exponent range, the new exponent must be changed to 0 when - rounding, and 0 is outside of the valid range of the arithmetic - context. - - - Returns an arbitrary-precision decimal number with the - same value as this object but rounded to an integer, without adding - the FlagInexact or FlagRounded flags. - An arithmetic context to control precision and - rounding of the result. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags), except that this - function will never add the FlagRounded and - FlagInexact flags (the only difference between this and - RoundToExponentExact). Can be null, in which case the default - rounding mode is HalfEven. - An arbitrary-precision decimal number rounded to the - closest integer representable in the given precision. If the result - can't fit the precision, additional digits are discarded to make it - fit. Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to 0 when rounding, and 0 is outside of the valid range - of the arithmetic context. - - - Rounds this object's value to a given precision, using the - given rounding mode and range of exponent. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The closest value to this object's value, rounded to the - specified precision. Returns the same value as this object if - is null or the precision and exponent range - are unlimited. - - - Returns a number in which the value of this object is - rounded to fit the maximum precision allowed if it has more - significant digits than the maximum precision. The maximum - precision allowed is given in an arithmetic context. This method is - designed for preparing operands to a custom arithmetic operation in - accordance with the "simplified" arithmetic given in Appendix A of - the General Decimal Arithmetic Specification. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Signals the - flag LostDigits if the input number has greater precision than - allowed and was rounded to a different numerical value in order to - fit the precision. - This object rounded to the given precision. Returns this - object and signals no flags if is null or - specifies an unlimited precision, if this object is infinity or - not-a-number (including signaling NaN), or if the number's value - has no more significant digits than the maximum precision given in - . - - - Returns a number similar to this number but with the scale - adjusted. - The power of 10 to scale by. - A number whose exponent is increased by . For example, if is 5, - "78E-2" becomes "78E+3" and has a bigger value. - - - Returns a number similar to this number but with the scale - adjusted. - The power of 10 to scale by. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - A number whose exponent is generally increased by - . For example, in general, if is 5, "78E-2" becomes "78E+3" and has a bigger - value. - - - Returns a number similar to this number but with the scale - adjusted. - The power of 10 to scale by. - A number whose exponent is increased by . For example, if - is 5, "78E-2" becomes "78E+3" and has a bigger value. - - - Returns a number similar to this number but with its scale - adjusted. - The power of 10 to scale by. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - A number whose exponent is generally increased by - . For example, in general, if - is 5, "78E-2" becomes "78E+3" and has - a bigger value. - The parameter is null. - - - Finds the square root of this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the square root function's - results are generally not exact for many inputs. (Unlike in the - General Decimal Arithmetic Specification, any rounding mode is - allowed.). - The square root. Signals the flag FlagInvalid and returns - NaN if this object is less than 0 (the square root would be a - complex number, but the return value is still NaN). Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Finds the square root of this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the square root function's - results are generally not exact for many inputs. (Unlike in the - General Decimal Arithmetic Specification, any rounding mode is - allowed.). - The square root. Signals the flag FlagInvalid and returns - NaN if this object is less than 0 (the square root would be a - complex number, but the return value is still NaN). Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Subtracts an arbitrary-precision decimal floating-point - number from this arbitrary-precision decimal floating-point number - and returns the result. The exponent for the result is the lower of - this arbitrary-precision decimal floating-point number's exponent - and the other arbitrary-precision decimal floating-point number's - exponent. - The number to subtract from this - instance's value. - The difference between the two numbers, that is, this - arbitrary-precision decimal floating-point number minus another - arbitrary-precision decimal floating-point number. If this - arbitrary-precision decimal floating-point number is not-a-number - (NaN), returns NaN. - - - Subtracts an arbitrary-precision decimal floating-point - number from this arbitrary-precision decimal floating-point number - and returns the result. - The number to subtract from this - instance's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The difference between the two numbers, that is, this - arbitrary-precision decimal floating-point number minus another - arbitrary-precision decimal floating-point number. If this - arbitrary-precision decimal floating-point number is not-a-number - (NaN), returns NaN. - The parameter is null. - - - Converts this value to its closest equivalent as a 64-bit - floating-point number encoded in the IEEE 754 binary64 format, - using the half-even rounding mode. - If this value is a NaN, sets the high bit of the binary64 - value's significand area for a quiet NaN, and clears it for a - signaling NaN. Then the other bits of the significand area are set - to the lowest bits of this object's unsigned significand, and the - next-highest bit of the significand area is set if those bits are - all zeros and this is a signaling NaN. - The closest 64-bit floating-point number to this value, - encoded in the IEEE 754 binary64 format. The return value can be - positive infinity or negative infinity, encoded in the IEEE 754 - binary64 format, if this value exceeds the range of a 64-bit - floating point number. - - - Converts this value to its closest equivalent as a 64-bit - floating-point number, using the half-even rounding mode. - If this value is a NaN, sets the high bit of the 64-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. Unfortunately, in the.NET implementation, the return value of - this method may be a quiet NaN even if a signaling NaN would - otherwise be generated. - The closest 64-bit floating-point number to this value. - The return value can be positive infinity or negative infinity if - this value exceeds the range of a 64-bit floating point - number. - - - Converts this value to an arbitrary-precision integer, - discarding the fractional part in this value. Note that depending - on the value, especially the exponent, generating the - arbitrary-precision integer may require a huge amount of memory. - Use the ToSizedEInteger method to convert a number to an EInteger - only if the integer fits in a bounded bit range; that method will - throw an exception on overflow. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - There is not enough memory - to store the value as an EInteger. - - - Converts this value to an arbitrary-precision integer, - checking whether the fractional part of the value would be lost. - Note that depending on the value, especially the exponent, - generating the arbitrary-precision integer may require a huge - amount of memory. Use the ToSizedEIntegerIfExact method to convert - a number to an EInteger only if the integer fits in a bounded bit - range; that method will throw an exception on overflow. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - This object's value is not an - exact integer. - - - Converts this value to an arbitrary-precision integer, - checking whether the fractional part of the value would be lost. - Note that depending on the value, especially the exponent, - generating the arbitrary-precision integer may require a huge - amount of memory. Use the ToSizedEIntegerIfExact method to convert - a number to an EInteger only if the integer fits in a bounded bit - range; that method will throw an exception on overflow. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - This object's value is not an - exact integer. - - - Same as ToString(), except that when an exponent is used - it will be a multiple of 3. - A text string. - - - Creates a binary floating-point number from this object's - value. Note that if the binary floating-point number contains a - negative exponent, the resulting value might not be exact, in which - case the resulting binary floating-point number will be an - approximation of this decimal number's value, using the half-even - rounding mode. - An arbitrary-precision binary floating-point - number. - - - Creates a binary floating-point number from this object's - value. Note that if the binary floating-point number contains a - negative exponent, the resulting value might not be exact, in which - case the resulting binary floating-point number will be an - approximation of this decimal number's value, using the half-even - rounding mode. - An arbitrary-precision binary floating-point - number. - - - Converts this value to a string as though with the - ToString method, but without using exponential notation. - A text string. - - - Converts this value to its closest equivalent as a 32-bit - floating-point number encoded in the IEEE 754 binary32 format, - using the half-even rounding mode. - If this value is a NaN, sets the high bit of the 32-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. - The closest 32-bit binary floating-point number to this - value, encoded in the IEEE 754 binary32 format. The return value - can be positive infinity or negative infinity if this value exceeds - the range of a 32-bit floating point number. - - - Converts this value to its closest equivalent as a 32-bit - floating-point number, using the half-even rounding mode. - If this value is a NaN, sets the high bit of the 32-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. Unfortunately, in the.NET implementation, the return value of - this method may be a quiet NaN even if a signaling NaN would - otherwise be generated. - The closest 32-bit binary floating-point number to this - value. The return value can be positive infinity or negative - infinity if this value exceeds the range of a 32-bit floating point - number. - - - Converts this value to a text string. Returns a value - compatible with this class's FromString method. - A string representation of this object. The text string - will be in exponential notation (expressed as a number 1 or - greater, but less than 10, times a power of 10) if this object's - Exponent property is greater than 0 or if the number's first - nonzero decimal digit is more than five digits after the decimal - point. - - - Returns the unit in the last place. The significand will - be 1 and the exponent will be this number's exponent. Returns 1 - with an exponent of 0 if this number is infinity or not-a-number - (NaN). - An arbitrary-precision decimal number. - - - Converts this value to an arbitrary-precision integer by - discarding its fractional part and checking whether the resulting - integer overflows the given signed bit count. - The maximum number of signed bits the - integer can have. The integer's value may not be less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN), or this number's value, once converted to an - integer by discarding its fractional part, is less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - - - Converts this value to an arbitrary-precision integer, - only if this number's value is an exact integer and that integer - does not overflow the given signed bit count. - The maximum number of signed bits the - integer can have. The integer's value may not be less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN), or this number's value, once converted to an - integer by discarding its fractional part, is less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - This object's value is not an - exact integer. - - - Creates a binary floating-point number from this object's - value. Note that if the binary floating-point number contains a - negative exponent, the resulting value might not be exact, in which - case the resulting binary floating-point number will be an - approximation of this decimal number's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. The precision is in - bits, and an example of this parameter is EContext.Binary64. Can be null. - An arbitrary-precision float floating-point - number. - - - This is an internal method. - A 32-bit signed integer. - - - This is an internal method. - An arbitrary-precision decimal number. - A 32-bit signed integer. - - - This is an internal method. - An arbitrary-precision decimal number. - An arbitrary-precision integer. - - - This is an internal method. - An arbitrary-precision decimal number. - An arbitrary-precision integer. - - - This is an internal method. - An arbitrary-precision decimal number. - A 32-bit signed integer. - - - This is an internal method. - The parameter is - a Numbers.EInteger object. - The parameter is - an internal parameter. - The parameter is an - internal parameter. - An arbitrary-precision decimal number. - - - This is an internal method. - A 32-bit signed integer. - - - This is an internal method. - The parameter is a 32-bit - signed integer. - An arbitrary-precision decimal number. - - - Returns one added to this arbitrary-precision decimal - number. - The given arbitrary-precision decimal number plus - one. - - - Returns one subtracted from this arbitrary-precision - decimal number. - The given arbitrary-precision decimal number minus - one. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a byte (from 0 to - 255). - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 255. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a byte (from 0 to 255). - This number, converted to a byte (from 0 to 255). Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) without rounding to a - different numerical value. - This number's value as a byte (from 0 to 255). - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 255. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - decimal number. - The number to convert as a byte (from 0 to - 255). - This number's value as an arbitrary-precision decimal - number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 16-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -32768 or greater than - 32767. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit signed integer. - This number, converted to a 16-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer without rounding to a - different numerical value. - This number's value as a 16-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -32768 or - greater than 32767. - - - Converts a 16-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as a 16-bit signed - integer. - This number's value as an arbitrary-precision decimal - number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -2147483648 or greater - than 2147483647. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -2147483648 - or greater than 2147483647. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 64-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -9223372036854775808 - or greater than 9223372036854775807. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit signed integer. - This number, converted to a 64-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer without rounding to a - different numerical value. - This number's value as a 64-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than - -9223372036854775808 or greater than - 9223372036854775807. - - - Converts this value to a decimal under the Common - Language Infrastructure (see - "Forms of numbers" ), - using the half-even rounding mode. - A decimal under the Common Language Infrastructure - (usually a.NET Framework decimal). - - - Converts a decimal under the Common Language - Infrastructure (see - "Forms of numbers" ) to - an arbitrary-precision decimal. - A decimal under the Common Language - Infrastructure (usually a.NET Framework decimal). - An arbitrary-precision decimal floating-point - number. - - - Converts a boolean value (true or false) to an arbitrary - precision decimal. - Either true or false. - The number 1 if is true; - otherwise, 0. - - - Converts an arbitrary-precision decimal number to a - decimal under the Common Language Infrastructure (see - "Forms of numbers" ), - using the half-even rounding mode. - The number to convert as an arbitrary-precision - decimal floating-point number. - A decimal under the Common Language Infrastructure - (usually a.NET Framework decimal). - - - Converts an arbitrary-precision decimal's value to a - decimal under the Common Language Infrastructure (see - "Forms of numbers" ), - using the half-even rounding mode. - The parameter is - an arbitrary-precision decimal floating-point number. - A decimal under the Common Language Infrastructure - (usually a.NET Framework decimal). - The parameter is null. - - - Converts an arbitrary-precision integer to an arbitrary - precision decimal. - An arbitrary-precision integer. - An arbitrary-precision decimal number with the exponent - set to 0. - - - Adds an arbitrary-precision decimal floating-point number - and another arbitrary-precision decimal floating-point number and - returns the result. - The first arbitrary-precision decimal - floating-point number. - The second decimal binary floating-point - number. - The sum of the two numbers, that is, an - arbitrary-precision decimal floating-point number plus another - arbitrary-precision decimal floating-point number. - The parameter or is - null. - - - Subtracts one arbitrary-precision decimal number from - another and returns the result. - The first operand. - The second operand. - The difference of the two decimal numbers. - The parameter or is - null. - - - Adds one to an arbitrary-precision decimal - number. - An arbitrary-precision decimal number. - The given arbitrary-precision decimal number plus - one. - The parameter is null. - - - Subtracts one from an arbitrary-precision decimal - number. - An arbitrary-precision decimal number. - The given arbitrary-precision decimal number minus - one. - The parameter is null. - - - Multiplies an arbitrary-precision decimal floating-point - number by another arbitrary-precision decimal floating-point number - and returns the result. - The first operand. - The second operand. - The product of the two numbers, that is, an - arbitrary-precision decimal floating-point number times another - arbitrary-precision decimal floating-point number. - The parameter or is - null. - - - Divides this object by another decimal number and returns - the result. When possible, the result will be exact. - The number that will be divided by the - divisor. - The number to divide by. - The quotient of the two numbers. Returns infinity if the - divisor is 0 and the dividend is nonzero. Returns not-a-number - (NaN) if the divisor and the dividend are 0. Returns NaN if the - result can't be exact because it would have a nonterminating - decimal expansion; examples include 1 divided by any multiple of 3, - such as 1/3 or 1/12. If this is not desired, use DivideToExponent - instead, or use the Divide overload that takes an EContext - instead. - The parameter is null. - - - Returns the remainder that would result when an - arbitrary-precision decimal floating-point number is divided by - another arbitrary-precision decimal floating-point number. The - remainder is the number that remains when the absolute value of an - arbitrary-precision decimal floating-point number is divided (as - though by DivideToIntegerZeroScale) by the absolute value of the - other arbitrary-precision decimal floating-point number; the - remainder has the same sign (positive or negative) as this - arbitrary-precision decimal floating-point number. - The number that will be divided by the - divisor. - The number to divide by. - The remainder that would result when an - arbitrary-precision decimal floating-point number is divided by - another arbitrary-precision decimal floating-point - number. - The parameter is null. - - - Gets an arbitrary-precision decimal number with the same - value as the given one, but with the sign reversed. - An arbitrary-precision decimal number to - negate. - An arbitrary-precision decimal number. If this value is - positive zero, returns negative zero. Returns signaling NaN if this - value is signaling NaN. - The parameter is null. - - - Converts an arbitrary-precision decimal floating-point - number to an arbitrary-precision integer. Any fractional part in - this value will be discarded when converting to an - arbitrary-precision integer. - The number to convert as an - arbitrary-precision decimal. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - The parameter is null. - - - Converts this value to its closest equivalent as a 64-bit - floating-point number. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 64-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. Unfortunately, in the.NET implementation, the return value of - this method may be a quiet NaN even if a signaling NaN would - otherwise be generated. - The value to convert to a 64-bit - floating-point number. - The closest 64-bit floating-point number to this value. - The return value can be positive infinity or negative infinity if - this value exceeds the range of a 64-bit floating point - number. - The parameter is null. - - - Converts this value to its closest equivalent as a 32-bit - floating-point number. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 32-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. Unfortunately, in the.NET implementation, the return value of - this method may be a quiet NaN even if a signaling NaN would - otherwise be generated. - The number to convert as an - arbitrary-precision decimal number. - The closest 32-bit binary floating-point number to this - value. The return value can be positive infinity or negative - infinity if this value exceeds the range of a 32-bit floating point - number. - The parameter is null. - - - Converts an arbitrary-precision decimal number to a byte - (from 0 to 255) if it can fit in a byte (from 0 to 255) after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to a - byte (from 0 to 255). - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 255. - The parameter is null. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - decimal number. - The number to convert as a byte (from 0 to - 255). - The value of as an - arbitrary-precision decimal number. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to an 8-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -128 or greater than - 127. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as an 8-bit signed integer. - This number, converted to an 8-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer without rounding to a - different numerical value. - This number's value as an 8-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -128 or - greater than 127. - - - Converts an 8-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as an 8-bit signed - integer. - This number's value as an arbitrary-precision decimal - number. - - - Converts an arbitrary-precision decimal number to an 8-bit - signed integer if it can fit in an 8-bit signed integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to an - 8-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -128 or greater than 127. - The parameter is null. - - - Converts an 8-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as an 8-bit signed - integer. - The value of as an - arbitrary-precision decimal number. - - - Converts an arbitrary-precision decimal number to a 16-bit - signed integer if it can fit in a 16-bit signed integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to a - 16-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -32768 or greater than 32767. - The parameter is null. - - - Converts a 16-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as a 16-bit signed - integer. - The value of as an - arbitrary-precision decimal number. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 16-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 65535. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit unsigned integer. - This number, converted to a 16-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 16-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 65535. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision decimal number. - The number to convert as a 16-bit - unsigned integer. - This number's value as an arbitrary-precision decimal - number. - - - Converts an arbitrary-precision decimal number to a 16-bit - unsigned integer if it can fit in a 16-bit unsigned integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to a - 16-bit unsigned integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 65535. - The parameter is null. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision decimal number. - The number to convert as a 16-bit - unsigned integer. - The value of as an - arbitrary-precision decimal number. - - - Converts an arbitrary-precision decimal number to a 32-bit - signed integer if it can fit in a 32-bit signed integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to a - 32-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -2147483648 or greater than 2147483647. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision decimal number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 4294967295. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 4294967295. - - - Converts a 32-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as a 32-bit signed - integer. - This number's value as an arbitrary-precision decimal - number. - - - Converts an arbitrary-precision decimal number to a 32-bit - signed integer if it can fit in a 32-bit signed integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to a - 32-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 4294967295. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision decimal number. - - - Converts an arbitrary-precision decimal number to a 64-bit - signed integer if it can fit in a 64-bit signed integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to a - 64-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -9223372036854775808 or greater than - 9223372036854775807. - The parameter is null. - - - Converts a 64-bit signed integer to an arbitrary-precision - decimal number. - The number to convert as a 64-bit signed - integer. - The value of as an - arbitrary-precision decimal number. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 64-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 18446744073709551615. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit unsigned integer. - This number, converted to a 64-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 64-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 18446744073709551615. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision decimal number. - The number to convert as a 64-bit - unsigned integer. - This number's value as an arbitrary-precision decimal - number. - - - Converts an arbitrary-precision decimal number to a 64-bit - unsigned integer if it can fit in a 64-bit unsigned integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - decimal number. - The value of , truncated to a - 64-bit unsigned integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 18446744073709551615. - The parameter is null. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision decimal number. - The number to convert as a 64-bit - unsigned integer. - The value of as an - arbitrary-precision decimal number. - - - A class that implements additional operations on - arbitrary-precision decimal numbers. Many of them are listed as - miscellaneous operations in the General Decimal Arithmetic - Specification version 1.70. - - - Returns the number 10, the decimal radix. - Specifies an arithmetic context for rounding the - number 10. Can be null. - The number 10, or the closest representable number to 10 - in the arithmetic context. - - - Creates an arbitrary-precision decimal number from a - 32-bit signed integer. - The parameter is a 32-bit - signed integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - An arbitrary-precision decimal number with the closest - representable value to the given integer. - - - Converts a boolean value (either true or false) to an - arbitrary-precision decimal number. - Either true or false. - A context used for rounding the result. Can be - null. - Either 1 if is true, or 0 if - is false.. The result will be rounded as - specified by the given context, if any. - - - Returns whether the given arbitrary-precision number - object is in a canonical form. For the current version of EDecimal, - all EDecimal objects are in a canonical form. - An arbitrary-precision number object. - Always true. - - - Returns whether the given arbitrary-precision number - object is neither null nor infinity nor not-a-number - (NaN). - An arbitrary-precision number object. - Either true if the given arbitrary-precision number - object is neither null nor infinity nor not-a-number (NaN), or - false otherwise. - - - Returns whether the given arbitrary-precision number - object is positive or negative infinity. - An arbitrary-precision number object. - Either true if the given arbitrary-precision number - object is positive or negative infinity, or false - otherwise. - - - Returns whether the given arbitrary-precision number - object is a not-a-number (NaN). - An arbitrary-precision number object. - Either true or false. - - - Returns whether the given number is a - normal number. A - subnormal number is a nonzero finite number whose Exponent - property (or the number's exponent when that number is expressed in - scientific notation with one digit before the radix point) is less - than the minimum possible exponent for that number. A - normal number is nonzero and finite, but not - subnormal. - An arbitrary-precision number object. - A context specifying the exponent range of - arbitrary-precision numbers. Can be null. If AdjustExponent of the - given context is true, a nonzero number is normal if the - number's exponent (when that number is expressed in scientific - notation with one nonzero digit before the radix point) is at least - the given context's EMax property (e.g., if EMax is -100, 2.3456 * - 10 - -99 is normal, but 2.3456 * 10 - -102 is not). If AdjustExponent of the given context is - false, a nonzero number is subnormal if the number's - Exponent property is at least given context's EMax property (e.g., - if EMax is -100, 23456 * 10 - -99 is normal, but 23456 * 10 - -102 is not). - Either true if the given number is subnormal, or - false otherwise. Returns true if the given context is - null or HasExponentRange of the given context is false. - - - Returns whether the given arbitrary-precision number - object is a quiet not-a-number (NaN). - An arbitrary-precision number object. - Either true or false. - - - Returns whether the given arbitrary-precision number - object is negative (including negative infinity, negative - not-a-number [NaN], or negative zero). - An arbitrary-precision number object. - Either true or false. - - - Returns whether the given arbitrary-precision number - object is a signaling not-a-number (NaN). - An arbitrary-precision number object. - Either true or false. - - - Converts a number class identifier (ranging from 0 through - 9) to a text string. An arbitrary-precision number object can - belong in one of ten number classes. - An integer identifying a number class. - A text string identifying the given number class as - follows: 0 = "+Normal"; 1 = "-Normal", 2 = "+Subnormal", 3 = - "-Subnormal", 4 = "+Zero", 5 = "-Zero", 6 = "+Infinity", 7 = - "-Infinity", 8 = "NaN", 9 = "sNaN". - The parameter is less than 0 or greater than 9. - - - Finds the number class for an arbitrary-precision decimal - number object. - An arbitrary-precision decimal number - object. - A context object that specifies the precision and - exponent range of arbitrary-precision numbers. This is used only to - distinguish between normal and subnormal numbers. Can be - null. - A 32-bit signed integer identifying the given number - object, number class as follows: 0 = positive normal; 1 = negative - normal, 2 = positive subnormal, 3 = negative subnormal, 4 = - positive zero, 5 = negative zero, 6 = positive infinity, 7 = - negative infinity, 8 = quiet not-a-number (NaN), 9 = signaling - NaN. - The parameter is null. - - - Returns whether the given number is a - subnormal number. A - subnormal number is a nonzero finite number whose Exponent - property (or the number's exponent when that number is expressed in - scientific notation with one digit before the radix point) is less - than the minimum possible exponent for that number. - An arbitrary-precision number object. - A context specifying the exponent range of - arbitrary-precision numbers. Can be null. If AdjustExponent of the - given context is true, a nonzero number is subnormal if the - number's exponent (when that number is expressed in scientific - notation with one nonzero digit before the radix point) is less - than the given context's EMax property (e.g., if EMax is -100, - 2.3456 * 10 - -102 is subnormal, but 2.3456 * 10 - -99 is not). If AdjustExponent of the given context is - false, a nonzero number is subnormal if the number's - Exponent property is less than the given context's EMax property - (e.g., if EMax is -100, 23456 * 10 - -102 is subnormal, but 23456 * 10 - -99 is not). - Either true if the given number is subnormal, or - false otherwise. Returns false if the given context - is null or HasExponentRange of the given context is false. - The parameter is null. - - - Returns whether the given arbitrary-precision number - object is zero (positive zero or negative zero). - An arbitrary-precision number object. - true if the given number has a value of zero - (positive zero or negative zero); otherwise, false. - - - Returns the base-10 exponent of an arbitrary-precision - decimal number (when that number is expressed in scientific - notation with one digit before the radix point). For example, - returns 3 for the numbers 6.66E + 3 and 666E + 1. - An arbitrary-precision decimal number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - The base-10 exponent of the given number (when that number - is expressed in scientific notation with one nonzero digit before - the radix point). Signals DivideByZero and returns negative - infinity if is zero. Returns positive - infinity if is positive infinity or negative - infinity. - The parameter is null. - - - Finds an arbitrary-precision decimal number whose decimal - point is moved a given number of places. - An arbitrary-precision decimal number. - The number of decimal places to move the decimal - point of "ed". This must be an integer with an exponent of - 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - The given arbitrary-precision decimal number whose decimal - point is moved the given number of places. Signals an invalid - operation and returns not-a-number (NaN) if - is infinity or NaN, has an Exponent property other than 0. Signals - an invalid operation and returns not-a-number (NaN) if defines a limited precision and exponent range and if - 's absolute value is greater than twice the - sum of the context's EMax property and its Precision - property. - The parameter or is null. - - - Shifts the digits of an arbitrary-precision decimal - number's significand. - An arbitrary-precision number containing the - significand to shift. - An arbitrary-precision number indicating the - number of digits to shift the first operand's significand. Must be - an integer with an exponent of 0. If this parameter is positive, - the significand is shifted to the left by the given number of - digits. If this parameter is negative, the significand is shifted - to the right by the given number of digits. - An arithmetic context to control the precision of - arbitrary-precision numbers. Can be null. - An arbitrary-precision decimal number whose significand is - shifted the given number of digits. Signals an invalid operation - and returns NaN (not-a-number) if is a - signaling NaN or if is not an integer, is - negative, has an exponent other than 0, or has an absolute value - that exceeds the maximum precision specified in the - context. - The parameter or is null. - - - Rotates the digits of an arbitrary-precision decimal - number's significand. - An arbitrary-precision number containing the - significand to rotate. If this significand contains more digits - than the precision, the most-significant digits are chopped off the - significand before the rotation begins. - An arbitrary-precision number indicating the - number of digits to rotate the first operand's significand. Must be - an integer with an exponent of 0. If this parameter is positive, - the significand is shifted to the left by the given number of - digits and the most-significant digits shifted out of the - significand become the least-significant digits instead. If this - parameter is negative, the significand is shifted to the right by - the given number of digits and the least-significant digits shifted - out of the significand become the most-significant digits - instead. - An arithmetic context to control the precision of - arbitrary-precision numbers. If this parameter is null or specifies - an unlimited precision, this method has the same behavior as - Shift. - An arbitrary-precision decimal number whose significand is - rotated the given number of digits. Signals an invalid operation - and returns NaN (not-a-number) if is a - signaling NaN or if is not an integer, is - negative, has an exponent other than 0, or has an absolute value - that exceeds the maximum precision specified in the - context. - The parameter or is null. - - - Compares the values of one arbitrary-precision number - object and another object, imposing a total ordering on all - possible values. In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - The first arbitrary-precision number to - compare. - The second arbitrary-precision number to - compare. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects are null or equal, or -1 if - the first object is null or less than the other object, or 1 if the - first object is greater or the other object is null. Does not - signal flags if either value is signaling NaN. - - - Compares the absolute values of two arbitrary-precision - number objects, imposing a total ordering on all possible values - (ignoring their signs). In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero and positive zero are considered equal. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - The first arbitrary-precision number to - compare. - The second arbitrary-precision number to - compare. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects are null or equal (ignoring - their signs), or -1 if the first object is null or less than the - other value (ignoring their signs), or 1 if the first object is - greater (ignoring their signs) or the other object is null. Does - not signal flags if either value is signaling NaN. - - - Creates a copy of the given arbitrary-precision number - object. - An arbitrary-precision number object to - copy. - A copy of the given arbitrary-precision number - object. - The parameter is null. - - - Returns a canonical version of the given - arbitrary-precision number object. In this method, this method - behaves like the Copy method. - An arbitrary-precision number object. - A copy of the parameter . - - - Returns an arbitrary-precision number object with the same - value as the given number object but with a nonnegative sign (that - is, the given number object's absolute value). - An arbitrary-precision number object. - An arbitrary-precision number object with the same value - as the given number object but with a nonnegative sign. - The parameter is null. - - - Returns an arbitrary-precision number object with the sign - reversed from the given number object. - An arbitrary-precision number object. - An arbitrary-precision number object with the sign - reversed from the given number object. - The parameter is null. - - - Returns an arbitrary-precision number object with the same - value as the first given number object but with a the same sign - (positive or negative) as the second given number object. - An arbitrary-precision number object with the - value the result will have. - The parameter is an - arbitrary-precision decimal floating-point number. - An arbitrary-precision number object with the same value - as the first given number object but with a the same sign (positive - or negative) as the second given number object. - The parameter or is null. - - - Returns whether two arbitrary-precision numbers have the - same exponent, they both are not-a-number (NaN), or they both are - infinity (positive and/or negative). - The first arbitrary-precision number. - The second arbitrary-precision number. - Either true if the given arbitrary-precision - numbers have the same exponent, they both are not-a-number (NaN), - or they both are infinity (positive and/or negative); otherwise, - false. - - - Returns an arbitrary-precision number with the same value - as this one but with certain trailing zeros removed from its - significand. If the number's exponent is 0, it is returned - unchanged (but may be rounded depending on the arithmetic context); - if that exponent is greater 0, its trailing zeros are removed from - the significand (then rounded if necessary); if that exponent is - less than 0, its trailing zeros are removed from the significand - until the exponent reaches 0 (then the number is rounded if - necessary). - An arbitrary-precision number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - An arbitrary-precision number with the same value as this - one but with certain trailing zeros removed from its significand. - If is not-a-number (NaN) or infinity, it is - generally returned unchanged. - - - Returns an arbitrary-precision decimal number with the - same value as this object but with the given exponent, expressed as - an arbitrary-precision decimal number. - Note that this is not always the same as rounding to a given - number of decimal places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - decimal places is desired, it's better to use the RoundToExponent - and RoundToIntegral methods instead. - Remark: This method can be used to implement - fixed-point decimal arithmetic, in which a fixed number of digits - come after the decimal point. A fixed-point decimal arithmetic in - which no digits come after the decimal point (a desired exponent of - 0) is considered an "integer arithmetic" . - An arbitrary-precision decimal number whose - exponent is to be changed. - The desired exponent of the result, expressed - as an arbitrary-precision decimal number. The exponent is the - number of fractional digits in the result, expressed as a negative - number. Can also be positive, which eliminates lower-order places - from the number. For example, -3 means round to the thousandth - (10^-3, 0.0001), and 3 means round to the thousands-place (10^3, - 1000). A value of 0 rounds the number to an integer. - The parameter is an EContext - object. - An arbitrary-precision decimal number with the same value - as this object but with the exponent changed. Signals FlagInvalid - and returns not-a-number (NaN) if the result can't fit the given - precision without rounding, or if the arithmetic context defines an - exponent range and the given exponent is outside that - range. - - - Performs a logical AND operation on two decimal numbers in - the form of - logical operands. A logical operand is a - non-negative base-10 number with an Exponent property of 0 and no - other base-10 digits than 0 or 1 (examples include 01001 and - 111001, but not 02001 or 99999 ). The logical - AND operation sets each digit of the result to 1 if the - corresponding digits of each logical operand are both 1, and to 0 - otherwise. For example, 01001 AND 111010=01000. - The first logical operand to the logical AND - operation. - The second logical operand to the logical AND - operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more digits than the maximum precision - specified in this context, the operand's most significant digits - that exceed that precision are discarded. This parameter can be - null. - The result of the logical AND operation as a logical - operand. Signals an invalid operation and returns not-a-number - (NaN) if , , or both - are not logical operands. - - - Performs a logical NOT operation on an arbitrary-precision - decimal number in the form of a - logical operand. A logical operand is a non-negative - base-10 number with an Exponent property of 0 and no other base-10 - digits than 0 or 1 (examples include 01001 and 111001 - , but not 02001 or 99999 ). The logical NOT operation - sets each digit of the result to 1 if the corresponding digit is 0, - and to 0 otherwise; it can set no more digits than the maximum - precision, however. For example, if the maximum precision is 8 - digits, then NOT 111010=11000101. - The logical operand to the logical NOT - operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more digits than the maximum precision - specified in this context, the operand's most significant digits - that exceed that precision are discarded. This parameter cannot be - null and must specify a maximum precision (unlimited precision - contexts are not allowed). - The result of the logical NOT operation as a logical - operand. Signals an invalid operation and returns not-a-number - (NaN) if is not a logical operand. - - - Performs a logical exclusive-OR (XOR) operation on two - decimal numbers in the form of - logical operands. A logical operand is a - non-negative base-10 number with an exponent of 0 and no other - base-10 digits than 0 or 1 (examples include 01001 and - 111001, but not 02001 or 99999 ). The logical - exclusive-OR operation sets each digit of the result to 1 if either - corresponding digit of the logical operands, but not both, is 1, - and to 0 otherwise. For example, 01001 XOR 111010=101010. - The first logical operand to the logical - exclusive-OR operation. - The second logical operand to the logical - exclusive-OR operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more digits than the maximum precision - specified in this context, the operand's most significant digits - that exceed that precision are discarded. This parameter can be - null. - An arbitrary-precision decimal floating-point - number. - - - Performs a logical OR operation on two decimal numbers in - the form of - logical operands. A logical operand is a - non-negative base-10 number with an Exponent property of 0 and no - other base-10 digits than 0 or 1 (examples include 01001 and - 111001, but not 02001 or 99999 ). The logical - OR operation sets each digit of the result to 1 if either or both - of the corresponding digits of the logical operands are 1, and to 0 - otherwise. For example, 01001 OR 111010=111011. - The first logical operand to the logical OR - operation. - The second logical operand to the logical OR - operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more digits than the maximum precision - specified in this context, the operand's most significant digits - that exceed that precision are discarded. This parameter can be - null. - The result of the logical OR operation as a logical - operand. Signals an invalid operation and returns not-a-number - (NaN) if , , or both - are not logical operands. - - - Represents an arbitrary-precision binary floating-point - number. (The "E" stands for "extended", meaning that instances of - this class can be values other than numbers proper, such as - infinity and not-a-number.) Each number consists of an integer - significand and an integer exponent, both arbitrary-precision. The - value of the number equals significand * 2^exponent. This class - also supports values for negative zero, not-a-number (NaN) values, - and infinity. - Passing a signaling NaN to any arithmetic operation shown - here will signal the flag FlagInvalid and return a quiet NaN, even - if another operand to that operation is a quiet NaN, unless the - operation's documentation expressly states that another result - happens when a signaling NaN is passed to that operation. - Passing a quiet NaN to any arithmetic operation shown here - will return a quiet NaN, unless the operation's documentation - expressly states that another result happens when a quiet NaN is - passed to that operation. - Unless noted otherwise, passing a null arbitrary-precision - binary floating-point number argument to any method here will throw - an exception. - When an arithmetic operation signals the flag FlagInvalid, - FlagOverflow, or FlagDivideByZero, it will not throw an exception - too, unless the operation's trap is enabled in the arithmetic - context (see EContext's Traps property). - An arbitrary-precision binary floating-point number value can - be serialized in one of the following ways: - - By calling the toString() method. However, not all strings - can be converted back to an arbitrary-precision binary - floating-point number without loss, especially if the string has a - fractional part. - By calling the UnsignedMantissa, Exponent, and IsNegative - properties, and calling the IsInfinity, IsQuietNaN, and - IsSignalingNaN methods. The return values combined will uniquely - identify a particular arbitrary-precision binary floating-point - number value. - If an operation requires creating an intermediate value that - might be too big to fit in memory (or might require more than 2 - gigabytes of memory to store -- due to the current use of a 32-bit - integer internally as a length), the operation may signal an - invalid-operation flag and return not-a-number (NaN). In certain - rare cases, the CompareTo method may throw OutOfMemoryException - (called OutOfMemoryError in Java) in the same circumstances. - Thread safety - Instances of this class are immutable, so they are inherently - safe for use by multiple threads. Multiple instances of this object - with the same properties are interchangeable, so they should not be - compared using the "==" operator (which might only check if each - side of the operator is the same instance). - Comparison considerations - This class's natural ordering (under the CompareTo method) is - not consistent with the Equals method. This means that two values - that compare as equal under the CompareTo method might not be equal - under the Equals method. The CompareTo method compares the - mathematical values of the two instances passed to it (and - considers two different NaN values as equal), while two instances - with the same mathematical value, but different exponents, will be - considered unequal under the Equals method. - Security note - It is not recommended to implement security-sensitive - algorithms using the methods in this class, for several - reasons: - - EFloat objects are immutable, so they can't be - modified, and the memory they occupy is not guaranteed to be - cleared in a timely fashion due to garbage collection. This is - relevant for applications that use many-bit-long numbers as secret - parameters. - The methods in this class (especially those that involve - arithmetic) are not guaranteed to be "constant-time" - (non-data-dependent) for all relevant inputs. Certain attacks that - involve encrypted communications have exploited the timing and - other aspects of such communications to derive keying material or - cleartext indirectly. - Applications should instead use dedicated security libraries - to handle big numbers in security-sensitive algorithms. - Reproducibility note - See the reproducibility note in the EDecimal class's - documentation. - - - A not-a-number value. - - - Negative infinity, less than any other number. - - - Represents the number negative zero. - - - Represents the number 1. - - - Positive infinity, greater than any other - number. - - - A not-a-number value that signals an invalid operation - flag when it's passed as an argument to any arithmetic operation in - arbitrary-precision binary floating-point number. - - - Represents the number 10. - - - Represents the number 0. - - - Gets this object's exponent. This object's value will be - an integer if the exponent is positive or zero. - This object's exponent. This object's value will be an - integer if the exponent is positive or zero. - - - Gets a value indicating whether this object is finite (not - infinity or not-a-number, NaN). - true if this object is finite (not infinity or - not-a-number, NaN); otherwise, false. - - - Gets a value indicating whether this object is negative, - including negative zero. - true if this object is negative, including negative - zero; otherwise, false. - - - Gets a value indicating whether this object's value equals - 0. - true if this object's value equals 0; otherwise, - false. true if this object's value equals 0; - otherwise, false. - - - Gets this object's unscaled value, or significand, and - makes it negative if this object is negative. If this value is - not-a-number (NaN), that value's absolute value is the NaN's - "payload" (diagnostic information). - This object's unscaled value. Will be negative if this - object's value is negative (including a negative NaN). - - - Gets this value's sign: -1 if negative; 1 if positive; 0 - if zero. - This value's sign: -1 if negative; 1 if positive; 0 if - zero. - - - Gets the absolute value of this object's unscaled value, - or significand. If this value is not-a-number (NaN), that value is - the NaN's "payload" (diagnostic information). - The absolute value of this object's unscaled value. - - - Creates a copy of this arbitrary-precision binary - number. - An arbitrary-precision binary floating-point - number. - - - Returns an arbitrary-precision number with the value - exponent*2^significand. - Desired value for the - significand. - Desired value for the exponent. - An arbitrary-precision binary number. - - - Returns an arbitrary-precision number with the value - exponent*2^significand. - Desired value for the significand. - Desired value for the exponent. - An arbitrary-precision binary number. - The parameter is null. - - - Returns an arbitrary-precision number with the value - exponent*2^significand. - Desired value for the significand. - Desired value for the exponent. - An arbitrary-precision binary number. - The parameter is null. - - - Returns an arbitrary-precision number with the value - exponent*2^significand. - Desired value for the significand. - Desired value for the exponent. - An arbitrary-precision binary number. - The parameter or is - null. - - - Returns an arbitrary-precision number with the value - exponent*2^significand. - Desired value for the - significand. - Desired value for the exponent. - An arbitrary-precision binary number. - - - Returns an arbitrary-precision number with the value - exponent*2^significand. - Desired value for the - significand. - Desired value for the exponent. - An arbitrary-precision binary number. - - - Creates a not-a-number arbitrary-precision binary - number. - An integer, 0 or greater, to use as diagnostic - information associated with this object. If none is needed, should - be zero. To get the diagnostic information from another - arbitrary-precision binary floating-point number, use that object's - UnsignedMantissa property. - A quiet not-a-number. - - - Creates a not-a-number arbitrary-precision binary - number. - An integer, 0 or greater, to use as diagnostic - information associated with this object. If none is needed, should - be zero. To get the diagnostic information from another - arbitrary-precision binary floating-point number, use that object's - UnsignedMantissa property. - Whether the return value will be signaling - (true) or quiet (false). - Whether the return value is - negative. - An arithmetic context to control the precision - (in binary digits) of the diagnostic information. The rounding and - exponent range of this context will be ignored. Can be null. The - only flag that can be signaled in this context is FlagInvalid, - which happens if diagnostic information needs to be truncated and - too much memory is required to do so. - An arbitrary-precision binary number. - The parameter is null or is less than 0. - - - Creates a binary floating-point number from a 64-bit - floating-point number encoded in the IEEE 754 binary64 format. This - method computes the exact value of the floating point number, not - an approximation, as is often the case by converting the floating - point number to a string first. - The parameter is a - 64-bit signed integer. - A binary floating-point number with the same value as the - floating-point number encoded in . - - - Creates a binary floating-point number from a 32-bit - floating-point number. This method computes the exact value of the - floating point number, not an approximation, as is often the case - by converting the floating point number to a string - first. - The parameter is a 64-bit - floating-point number. - A binary floating-point number with the same value as - . - - - Creates a binary floating-point number from a 64-bit - floating-point number. This method computes the exact value of the - floating point number, not an approximation, as is often the case - by converting the floating point number to a string - first. - The parameter is a 64-bit - floating-point number. - A binary floating-point number with the same value as - . - - - Converts an arbitrary-precision integer to the same value - as a binary floating-point number. - An arbitrary-precision integer. - An arbitrary-precision binary floating-point - number. - - - Creates a binary floating-point number from a 32-bit - floating-point number encoded in the IEEE 754 binary32 format. This - method computes the exact value of the floating point number, not - an approximation, as is often the case by converting the floating - point number to a string first. - A 32-bit binary floating-point number encoded - in the IEEE 754 binary32 format. - A binary floating-point number with the same - floating-point value as . - - - Creates a binary floating-point number from a text string - that represents a number. Note that if the string contains a - negative exponent, the resulting value might not be exact, in which - case the resulting binary floating-point number will be an - approximation of this decimal number's value. - The format of the string generally consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if '-' , the value is negative.) - One or more digits, with a single optional decimal point - (".", U+002E) before or after those digits or between two of them. - These digits may begin with any number of zeros. - Optionally, "E+"/"e+" (positive exponent) or "E-"/"e-" - (negative exponent) plus one or more digits specifying the exponent - (these digits may begin with any number of zeros). - The string can also be "-INF", "-Infinity", "Infinity", - "INF", quiet NaN ("NaN") followed by any number of digits (these - digits may begin with any number of zeros), or signaling NaN - ("sNaN") followed by any number of digits (these digits may begin - with any number of zeros), all where the letters can be any - combination of basic upper-case and/or basic lower-case - letters. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The string is not - allowed to contain white space characters, including - spaces. - The parameter is a text - string. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of the - context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Note that - providing a context is often much faster than creating an EDecimal - without a context then calling ToEFloat on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - The portion given of is not a correctly formatted number string; or either - or is less than - 0 or greater than 's length, or 's length minus is less than - . - - - Creates a binary floating-point number from a text string - that represents a number, using an unlimited precision context. For - more information, see the FromString(String, int, int, - EContext) method. - A text string to convert to a binary - floating-point number. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - The portion given of is not a correctly formatted number - string. - - - Creates a binary floating-point number from a text string - that represents a number. For more information, see the - FromString(String, int, int, EContext) method. - A text string to convert to a binary - floating-point number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of the - context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Note that - providing a context is often much faster than creating an EDecimal - without a context then calling ToEFloat on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - - - Creates a binary floating-point number from a text string - that represents a number. For more information, see the - FromString(String, int, int, EContext) method. - The parameter is a text - string. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision binary floating-point - number. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - - - Creates a binary floating-point number from a sequence of - char s that represents a number. Note that if the sequence - contains a negative exponent, the resulting value might not be - exact, in which case the resulting binary floating-point number - will be an approximation of this decimal number's value. - The format of the sequence generally consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if '-' , the value is negative.) - One or more digits, with a single optional decimal point - (".", U+002E) before or after those digits or between two of them. - These digits may begin with any number of zeros. - Optionally, "E+"/"e+" (positive exponent) or "E-"/"e-" - (negative exponent) plus one or more digits specifying the exponent - (these digits may begin with any number of zeros). - The sequence can also be "-INF", "-Infinity", "Infinity", - "INF", quiet NaN ("NaN") followed by any number of digits (these - digits may begin with any number of zeros), or signaling NaN - ("sNaN") followed by any number of digits (these digits may begin - with any number of zeros), all where the letters can be any - combination of basic upper-case and/or basic lower-case - letters. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The sequence is not - allowed to contain white space characters, including - spaces. - A sequence of char s to convert to a - binary floating-point number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of the - context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Note that - providing a context is often much faster than creating an EDecimal - without a context then calling ToEFloat on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - The portion given of is not a correctly formatted number sequence; or - either or is - less than 0 or greater than 's length, or - 's length minus - is less than . - - - Creates a binary floating-point number from a sequence of - char s that represents a number, using an unlimited - precision context. For more information, see the - FromString(String, int, int, EContext) method. - A sequence of char s to convert to a - binary floating-point number. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - The portion given of is not a correctly formatted number - sequence. - - - Creates a binary floating-point number from a sequence of - char s that represents a number. For more information, see - the FromString(String, int, int, EContext) method. - A sequence of char s to convert to a - binary floating-point number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of the - context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Note that - providing a context is often much faster than creating an EDecimal - without a context then calling ToEFloat on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - - - Creates a binary floating-point number from a sequence of - char s that represents a number. For more information, see - the FromString(String, int, int, EContext) method. - A sequence of char s to convert to a - binary floating-point number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision binary floating-point - number. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Creates a binary floating-point number from a sequence of - bytes that represents a number. Note that if the sequence contains - a negative exponent, the resulting value might not be exact, in - which case the resulting binary floating-point number will be an - approximation of this decimal number's value. - The format of the sequence generally consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if '-' , the value is negative.) - One or more digits, with a single optional decimal point - (".", U+002E) before or after those digits or between two of them. - These digits may begin with any number of zeros. - Optionally, "E+"/"e+" (positive exponent) or "E-"/"e-" - (negative exponent) plus one or more digits specifying the exponent - (these digits may begin with any number of zeros). - The sequence can also be "-INF", "-Infinity", "Infinity", - "INF", quiet NaN ("NaN") followed by any number of digits (these - digits may begin with any number of zeros), or signaling NaN - ("sNaN") followed by any number of digits (these digits may begin - with any number of zeros), all where the letters can be any - combination of basic upper-case and/or basic lower-case - letters. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The sequence is not - allowed to contain white space characters, including - spaces. - A sequence of bytes to convert to a binary - floating-point number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of the - context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Note that - providing a context is often much faster than creating an EDecimal - without a context then calling ToEFloat on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - The portion given of is not a correctly formatted number sequence; or - either or is - less than 0 or greater than 's length, or - 's length minus - is less than . - - - Creates a binary floating-point number from a sequence of - bytes that represents a number, using an unlimited precision - context. For more information, see the FromString(String, int, - int, EContext) method. - A sequence of bytes to convert to a binary - floating-point number. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - The portion given of is not a correctly formatted number - sequence. - - - Creates a binary floating-point number from a sequence of - bytes that represents a number. For more information, see the - FromString(String, int, int, EContext) method. - A sequence of bytes to convert to a binary - floating-point number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of the - context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Note that - providing a context is often much faster than creating an EDecimal - without a context then calling ToEFloat on that EDecimal, - especially if the context specifies a precision limit and exponent - range. - The parsed number, converted to arbitrary-precision binary - floating-point number. - The parameter is null. - - - Creates a binary floating-point number from a sequence of - bytes that represents a number. For more information, see the - FromString(String, int, int, EContext) method. - A sequence of bytes to convert to a binary - floating-point number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision binary floating-point - number. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Gets the greater value between two binary floating-point - numbers. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The larger value of the two numbers. If one is positive - zero and the other is negative zero, returns the positive zero. If - the two numbers are positive and have the same value, returns the - one with the larger exponent. If the two numbers are negative and - have the same value, returns the one with the smaller - exponent. - The parameter or is null. - - - Gets the greater value between two binary floating-point - numbers. - The first value to compare. - The second value to compare. - The larger value of the two numbers. If one is positive - zero and the other is negative zero, returns the positive zero. If - the two numbers are positive and have the same value, returns the - one with the larger exponent. If the two numbers are negative and - have the same value, returns the one with the smaller - exponent. - The parameter or is null. - - - Gets the greater value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Max. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The larger value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Gets the greater value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Max. - The first value to compare. - The second value to compare. - The larger value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Gets the lesser value between two binary floating-point - numbers. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The smaller value of the two numbers. If one is positive - zero and the other is negative zero, returns the negative zero. If - the two numbers are positive and have the same value, returns the - one with the smaller exponent. If the two numbers are negative and - have the same value, returns the one with the larger - exponent. - The parameter or is null. - - - Gets the lesser value between two binary floating-point - numbers. - The first value to compare. - The second value to compare. - The smaller value of the two numbers. If one is positive - zero and the other is negative zero, returns the negative zero. If - the two numbers are positive and have the same value, returns the - one with the smaller exponent. If the two numbers are negative and - have the same value, returns the one with the larger - exponent. - The parameter or is null. - - - Gets the lesser value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Min. - The first value to compare. - The second value to compare. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The smaller value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Gets the lesser value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Min. - The first value to compare. - The second value to compare. - The smaller value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Finds the constant π, the circumference of a circle - divided by its diameter. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as π can never be represented - exactly.. - The constant π rounded to the given precision. Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Finds the absolute value of this object (if it's negative, - it becomes positive). - An arbitrary-precision binary floating-point number. - Returns signaling NaN if this value is signaling NaN. (In this - sense, this method is similar to the "copy-abs" operation in the - General Decimal Arithmetic Specification, except this method does - not necessarily return a copy of this object.). - - - Finds the absolute value of this object (if it's negative, - it becomes positive). - An arithmetic context to control the - precision, rounding, and exponent range of the result. If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the precision is - unlimited and no rounding is needed. - The absolute value of this object. Signals FlagInvalid and - returns quiet NaN if this value is signaling NaN. - - - Adds this arbitrary-precision binary floating-point number - and a 32-bit signed integer and returns the result. The exponent - for the result is the lower of this arbitrary-precision binary - floating-point number's exponent and the other 32-bit signed - integer's exponent. - The parameter is - a 32-bit signed integer. - The sum of the two numbers, that is, this - arbitrary-precision binary floating-point number plus a 32-bit - signed integer. If this arbitrary-precision binary floating-point - number is not-a-number (NaN), returns NaN. - - - Subtracts a 32-bit signed integer from this - arbitrary-precision binary floating-point number and returns the - result. The exponent for the result is the lower of this - arbitrary-precision binary floating-point number's exponent and the - other 32-bit signed integer's exponent. - The parameter is - a 32-bit signed integer. - The difference between the two numbers, that is, this - arbitrary-precision binary floating-point number minus a 32-bit - signed integer. If this arbitrary-precision binary floating-point - number is not-a-number (NaN), returns NaN. - - - Multiplies this arbitrary-precision binary floating-point - number by a 32-bit signed integer and returns the result. The - exponent for the result is this arbitrary-precision binary - floating-point number's exponent plus the other 32-bit signed - integer's exponent. - The parameter is - a 32-bit signed integer. - The product of the two numbers, that is, this - arbitrary-precision binary floating-point number times a 32-bit - signed integer. - - EInteger result = EInteger.FromString("5").Multiply(200); - . - - - - Divides this arbitrary-precision binary floating-point - number by a 32-bit signed integer and returns the result; returns - NaN instead if the result would have a nonterminating binary - expansion (including 1/3, 1/12, 1/7, 2/3, and so on); if this is - not desired, use DivideToExponent, or use the Divide overload that - takes an EContext. - The divisor. - The result of dividing this arbitrary-precision binary - floating-point number by a 32-bit signed integer. Returns infinity - if the divisor (this arbitrary-precision binary floating-point - number) is 0 and the dividend (the other 32-bit signed integer) is - nonzero. Returns not-a-number (NaN) if the divisor and the dividend - are 0. Returns NaN if the result can't be exact because it would - have a nonterminating binary expansion (examples include 1 divided - by any multiple of 3, such as 1/3 or 1/12). If this is not desired, - use DivideToExponent instead, or use the Divide overload that takes - an EContext (such as EContext.Binary64 ) - instead. - Attempted to divide by - zero. - - - Adds this arbitrary-precision binary floating-point number - and a 64-bit signed integer and returns the result. The exponent - for the result is the lower of this arbitrary-precision binary - floating-point number's exponent and the other 64-bit signed - integer's exponent. - The parameter - is a 64-bit signed integer. - The sum of the two numbers, that is, this - arbitrary-precision binary floating-point number plus a 64-bit - signed integer. If this arbitrary-precision binary floating-point - number is not-a-number (NaN), returns NaN. - - - Subtracts a 64-bit signed integer from this - arbitrary-precision binary floating-point number and returns the - result. The exponent for the result is the lower of this - arbitrary-precision binary floating-point number's exponent and the - other 64-bit signed integer's exponent. - The parameter - is a 64-bit signed integer. - The difference between the two numbers, that is, this - arbitrary-precision binary floating-point number minus a 64-bit - signed integer. If this arbitrary-precision binary floating-point - number is not-a-number (NaN), returns NaN. - - - Multiplies this arbitrary-precision binary floating-point - number by a 64-bit signed integer and returns the result. The - exponent for the result is this arbitrary-precision binary - floating-point number's exponent plus the other 64-bit signed - integer's exponent. - The parameter - is a 64-bit signed integer. - The product of the two numbers, that is, this - arbitrary-precision binary floating-point number times a 64-bit - signed integer. - - EInteger result = EInteger.FromString("5").Multiply(200L); - . - - - - Divides this arbitrary-precision binary floating-point - number by a 64-bit signed integer and returns the result; returns - NaN instead if the result would have a nonterminating binary - expansion (including 1/3, 1/12, 1/7, 2/3, and so on); if this is - not desired, use DivideToExponent, or use the Divide overload that - takes an EContext. - The parameter - is a 64-bit signed integer. - The result of dividing this arbitrary-precision binary - floating-point number by a 64-bit signed integer. Returns infinity - if the divisor (this arbitrary-precision binary floating-point - number) is 0 and the dividend (the other 64-bit signed integer) is - nonzero. Returns not-a-number (NaN) if the divisor and the dividend - are 0. Returns NaN if the result can't be exact because it would - have a nonterminating binary expansion (examples include 1 divided - by any multiple of 3, such as 1/3 or 1/12). If this is not desired, - use DivideToExponent instead, or use the Divide overload that takes - an EContext (such as EContext.Binary64 ) - instead. - Attempted to divide by - zero. - - - Adds this arbitrary-precision binary floating-point number - and another arbitrary-precision binary floating-point number and - returns the result. The exponent for the result is the lower of - this arbitrary-precision binary floating-point number's exponent - and the other arbitrary-precision binary floating-point number's - exponent. - An arbitrary-precision binary - floating-point number. - The sum of the two numbers, that is, this - arbitrary-precision binary floating-point number plus another - arbitrary-precision binary floating-point number. If this - arbitrary-precision binary floating-point number is not-a-number - (NaN), returns NaN. - - - Adds this arbitrary-precision binary floating-point number - and another arbitrary-precision binary floating-point number and - returns the result. - The number to add to. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The sum of the two numbers, that is, this - arbitrary-precision binary floating-point number plus another - arbitrary-precision binary floating-point number. If this - arbitrary-precision binary floating-point number is not-a-number - (NaN), returns NaN. - - - Compares the mathematical values of this object and - another object, accepting NaN values. This method currently uses - the rules given in the CompareToValue method, so that it it is not - consistent with the Equals method, but it may change in a future - version to use the rules for the CompareToTotal method - instead. - An arbitrary-precision binary floating-point - number. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value or if is null, or 0 if both - values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. - This method is not consistent with the Equals method because - two different numbers with the same mathematical value, but - different exponents, will compare as equal. - In this method, negative zero and positive zero are - considered equal. - If this object or the other object is a quiet NaN or - signaling NaN, this method will not trigger an error. Instead, NaN - will compare greater than any other number, including infinity. Two - different NaN values will be considered equal. - An arbitrary-precision binary floating-point - number. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value or if is null, or 0 if both - values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. This method currently uses - the rules given in the CompareToValue method, so that it it is not - consistent with the Equals method, but it may change in a future - version to use the rules for the CompareToTotal method - instead. - The parameter is - a 32-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. - This method is not consistent with the Equals method because - two different numbers with the same mathematical value, but - different exponents, will compare as equal. - In this method, negative zero and positive zero are - considered equal. - If this object is a quiet NaN or signaling NaN, this method - will not trigger an error. Instead, NaN will compare greater than - any other number. - The parameter is - a 32-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. - This method is not consistent with the Equals method because - two different numbers with the same mathematical value, but - different exponents, will compare as equal. - In this method, negative zero and positive zero are - considered equal. - If this object is a quiet NaN or signaling NaN, this method - will not trigger an error. Instead, NaN will compare greater than - any other number, including infinity. - The parameter is - a 64-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. This method currently uses - the rules given in the CompareToValue method, so that it it is not - consistent with the Equals method, but it may change in a future - version to use the rules for the CompareToTotal method - instead. - The parameter is - a 64-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, treating quiet NaN as signaling. - In this method, negative zero and positive zero are - considered equal. - If this object or the other object is a quiet NaN or - signaling NaN, this method will return a quiet NaN and will signal - a FlagInvalid flag. - An arbitrary-precision binary floating-point - number. - An arithmetic context. The precision, rounding, - and exponent range are ignored. If HasFlags of the context - is true, will store the flags resulting from the operation (the - flags are in addition to the pre-existing flags). Can be - null. - Quiet NaN if this object or the other object is NaN, or 0 - if both objects have the same value, or -1 if this object is less - than the other value, or 1 if this object is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the values of this object and another object, - imposing a total ordering on all possible values. In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - An arbitrary-precision binary floating-point - number to compare with this one. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects have the same value, or -1 if - this object is less than the other value, or 1 if this object is - greater. Does not signal flags if either value is signaling NaN. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the values of this object and another object, - imposing a total ordering on all possible values (ignoring their - signs). In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - An arbitrary-precision binary floating-point - number to compare with this one. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects have the same value (ignoring - their signs), or -1 if this object is less than the other value - (ignoring their signs), or 1 if this object is greater (ignoring - their signs). Does not signal flags if either value is signaling - NaN. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the values of this object and another object, - imposing a total ordering on all possible values. In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - An arbitrary-precision binary floating-point - number to compare with this one. - The number 0 if both objects have the same value, or -1 if - this object is less than the other value, or 1 if this object is - greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the absolute values of this object and another - object, imposing a total ordering on all possible values (ignoring - their signs). In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero and positive zero are considered equal. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - An arbitrary-precision binary floating-point - number to compare with this one. - The number 0 if both objects have the same value, or -1 if - this object is less than the other value, or 1 if this object is - greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the mathematical values of this object and - another object. - In this method, negative zero and positive zero are - considered equal. - If this object or the other object is a quiet NaN or - signaling NaN, this method returns a quiet NaN, and will signal a - FlagInvalid flag if either is a signaling NaN. - An arbitrary-precision binary floating-point - number. - An arithmetic context. The precision, rounding, - and exponent range are ignored. If HasFlags of the context - is true, will store the flags resulting from the operation (the - flags are in addition to the pre-existing flags). Can be - null. - Quiet NaN if this object or the other object is NaN, or 0 - if both objects have the same value, or -1 if this object is less - than the other value, or 1 if this object is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Returns a number with the same value as this one, but - copying the sign (positive or negative) of another number. (This - method is similar to the "copy-sign" operation in the General - Decimal Arithmetic Specification, except this method does not - necessarily return a copy of this object.). - A number whose sign will be copied. - An arbitrary-precision binary floating-point - number. - The parameter is null. - - - Divides this arbitrary-precision binary floating-point - number by another arbitrary-precision binary floating-point number - and returns the result; returns NaN instead if the result would - have a nonterminating binary expansion (including 1/3, 1/12, 1/7, - 2/3, and so on); if this is not desired, use DivideToExponent, or - use the Divide overload that takes an EContext. - The number to divide by. - The result of dividing this arbitrary-precision binary - floating-point number by another arbitrary-precision binary - floating-point number. Returns infinity if the divisor (this - arbitrary-precision binary floating-point number) is 0 and the - dividend (the other arbitrary-precision binary floating-point - number) is nonzero. Returns not-a-number (NaN) if the divisor and - the dividend are 0. Returns NaN if the result can't be exact - because it would have a nonterminating binary expansion (examples - include 1 divided by any multiple of 3, such as 1/3 or 1/12). If - this is not desired, use DivideToExponent instead, or use the - Divide overload that takes an EContext (such as - EContext.Binary64 ) instead. - - - Divides this arbitrary-precision binary floating-point - number by another arbitrary-precision binary floating-point number - and returns the result. - The number to divide by. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The result of dividing this arbitrary-precision binary - floating-point number by another arbitrary-precision binary - floating-point number. Signals FlagDivideByZero and returns - infinity if the divisor (this arbitrary-precision binary - floating-point number) is 0 and the dividend (the other - arbitrary-precision binary floating-point number) is nonzero. - Signals FlagInvalid and returns not-a-number (NaN) if the divisor - and the dividend are 0; or, either is null - or 's precision is 0, and the result would - have a nonterminating decimal expansion (examples include 1 divided - by any multiple of 3, such as 1/3 or 1/12); or, the rounding mode - is ERounding.None and the result is not exact. - - - Calculates the quotient and remainder using the - DivideToIntegerNaturalScale and the formula in - RemainderNaturalScale. - The number to divide by. - A 2 element array consisting of the quotient and remainder - in that order. - - - Calculates the quotient and remainder using the - DivideToIntegerNaturalScale and the formula in - RemainderNaturalScale. - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only in the division portion of the remainder - calculation; as a result, it's possible for the remainder to have a - higher precision than given in this context. Flags will be set on - the given context only if the context's HasFlags is true and - the integer part of the division result doesn't fit the precision - and exponent range without rounding. Can be null, in which the - precision is unlimited and no additional rounding, other than the - rounding down to an integer after division, is needed. - A 2 element array consisting of the quotient and remainder - in that order. - - - Divides two arbitrary-precision binary floating-point - numbers, and gives a particular exponent to the result. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual radix - point (so a negative number means the number of binary digit places - to round to). A positive number places the cutoff point to the left - of the usual radix point. - An arithmetic context object to control the - rounding mode to use if the result must be scaled down to have the - same exponent as this value. If the precision given in the context - is other than 0, calls the Quantize method with both arguments - equal to the result of the operation (and can signal FlagInvalid - and return NaN if the result doesn't fit the given precision). If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the default - rounding mode is HalfEven. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the context defines an exponent range and the - desired exponent is outside that range. Signals FlagInvalid and - returns not-a-number (NaN) if the rounding mode is ERounding.None - and the result is not exact. - - - Divides two arbitrary-precision binary floating-point - numbers, and gives a particular exponent to the result. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual radix - point (so a negative number means the number of binary digit places - to round to). A positive number places the cutoff point to the left - of the usual radix point. - The rounding mode to use if the result must - be scaled down to have the same exponent as this value. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the rounding mode is ERounding.None and the - result is not exact. - - - Divides two arbitrary-precision binary floating-point - numbers, and gives a particular exponent to the result. - The number to divide by. - The desired exponent. A negative number - places the cutoff point to the right of the usual radix point (so a - negative number means the number of binary digit places to round - to). A positive number places the cutoff point to the left of the - usual radix point. - An arithmetic context object to control the - rounding mode to use if the result must be scaled down to have the - same exponent as this value. If the precision given in the context - is other than 0, calls the Quantize method with both arguments - equal to the result of the operation (and can signal FlagInvalid - and return NaN if the result doesn't fit the given precision). If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the default - rounding mode is HalfEven. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the context defines an exponent range and the - desired exponent is outside that range. Signals FlagInvalid and - returns not-a-number (NaN) if the rounding mode is ERounding.None - and the result is not exact. - - - Divides two arbitrary-precision binary floating-point - numbers, and gives a particular exponent to the result. - The number to divide by. - The desired exponent. A negative - number places the cutoff point to the right of the usual radix - point (so a negative number means the number of binary digit places - to round to). A positive number places the cutoff point to the left - of the usual radix point. - The rounding mode to use if the result must - be scaled down to have the same exponent as this value. - The quotient of the two objects. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Returns not-a-number (NaN) if the divisor and the dividend - are 0. Returns NaN if the rounding mode is ERounding.None and the - result is not exact. - - - Divides two arbitrary-precision binary floating-point - numbers, and returns the integer part of the result, rounded down, - with the preferred exponent set to this value's exponent minus the - divisor's exponent. - The number to divide by. - The integer part of the quotient of the two objects. - Signals FlagDivideByZero and returns infinity if the divisor is 0 - and the dividend is nonzero. Signals FlagInvalid and returns - not-a-number (NaN) if the divisor and the dividend are 0. - - - Divides this object by another object, and returns the - integer part of the result (which is initially rounded down), with - the preferred exponent set to this value's exponent minus the - divisor's exponent. - An arbitrary-precision binary floating-point - number. - The parameter is an - EContext object. - The integer part of the quotient of the two objects. - Signals FlagInvalid and returns not-a-number (NaN) if the return - value would overflow the exponent range. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the rounding mode is ERounding.None and the - result is not exact. - - - Divides this object by another object, and returns the - integer part of the result, with the exponent set to 0. - The number to divide by. - An arithmetic context object to control the - precision. The rounding and exponent range settings of this context - are ignored. If HasFlags of the context is true, will also - store the flags resulting from the operation (the flags are in - addition to the pre-existing flags). Can be null, in which case the - precision is unlimited. - The integer part of the quotient of the two objects. The - exponent will be set to 0. Signals FlagDivideByZero and returns - infinity if the divisor is 0 and the dividend is nonzero. Signals - FlagInvalid and returns not-a-number (NaN) if the divisor and the - dividend are 0, or if the result doesn't fit the given - precision. - - - Divides this object by another binary floating-point - number and returns a result with the same exponent as this object - (the dividend). - The number to divide by. - The rounding mode to use if the result must - be scaled down to have the same exponent as this value. - The quotient of the two numbers. Signals FlagDivideByZero - and returns infinity if the divisor is 0 and the dividend is - nonzero. Signals FlagInvalid and returns not-a-number (NaN) if the - divisor and the dividend are 0. Signals FlagInvalid and returns - not-a-number (NaN) if the rounding mode is ERounding.None and the - result is not exact. - - - Divides this arbitrary-precision binary floating-point - number by another arbitrary-precision binary floating-point number - and returns a two-item array containing the result of the division - and the remainder, in that order. The result of division is - calculated as though by DivideToIntegerNaturalScale, and - the remainder is calculated as though by - RemainderNaturalScale. - The number to divide by. - An array of two items: the first is the result of the - division as an arbitrary-precision binary floating-point number, - and the second is the remainder as an arbitrary-precision binary - floating-point number. The result of division is the result of the - method on the two operands, and the remainder is the result of the - Remainder method on the two operands. - - - Divides this arbitrary-precision binary floating-point - number by another arbitrary-precision binary floating-point number - and returns a two-item array containing the result of the division - and the remainder, in that order. The result of division is - calculated as though by DivideToIntegerNaturalScale, and - the remainder is calculated as though by - RemainderNaturalScale. - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only in the division portion of the remainder - calculation; as a result, it's possible for the remainder to have a - higher precision than given in this context. Flags will be set on - the given context only if the context's HasFlags is true and - the integer part of the division result doesn't fit the precision - and exponent range without rounding. Can be null, in which the - precision is unlimited and no additional rounding, other than the - rounding down to an integer after division, is needed. - An array of two items: the first is the result of the - division as an arbitrary-precision binary floating-point number, - and the second is the remainder as an arbitrary-precision binary - floating-point number. The result of division is the result of the - method on the two operands, and the remainder is the result of the - Remainder method on the two operands. - - - Determines whether this object's significand, exponent, - and properties are equal to those of another object. Not-a-number - values are considered equal if the rest of their properties are - equal. - An arbitrary-precision binary floating-point - number. - true if this object's significand and exponent are - equal to those of another object; otherwise, false. - - - Determines whether this object's significand, exponent, - and properties are equal to those of another object and that other - object is an arbitrary-precision binary floating-point number. - Not-a-number values are considered equal if the rest of their - properties are equal. - The parameter is an - arbitrary object. - true if the objects are equal; otherwise, - false. In this method, two objects are not equal if they - don't have the same type or if one is null and the other - isn't. - - - Determines whether this object's significand and exponent - are equal to those of another object. - An arbitrary-precision binary - floating-point number. - true if this object's significand and exponent are - equal to those of another object; otherwise, false. - - - Finds e (the base of natural logarithms) raised to the - power of this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the exponential function's - results are generally not exact. (Unlike in the General Binary - Arithmetic Specification, any rounding mode is allowed.). - Exponential of this object. If this object's value is 1, - returns an approximation to " e" within the given precision. - Signals FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Finds e (the base of natural logarithms) raised to the - power of this object's value, and subtracts the result by 1 and - returns the final result, in a way that avoids loss of precision if - the true result is very close to 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the exponential function's - results are generally not exact. (Unlike in the General Binary - Arithmetic Specification, any rounding mode is allowed.). - Exponential of this object, minus 1. Signals FlagInvalid - and returns not-a-number (NaN) if the parameter is null or the precision is unlimited (the context's - Precision property is 0). - - - Calculates this object's hash code. No application or - process IDs are used in the hash code calculation. - A 32-bit signed integer. - - - Gets a value indicating whether this object is positive or - negative infinity. - true if this object is positive or negative - infinity; otherwise, false. - - - Gets a value indicating whether this object is not a - number (NaN). - true if this object is not a number (NaN); - otherwise, false. - - - Returns whether this object is negative - infinity. - true if this object is negative infinity; - otherwise, false. - - - Returns whether this object is positive - infinity. - true if this object is positive infinity; - otherwise, false. - - - Gets a value indicating whether this object is a quiet - not-a-number value. - true if this object is a quiet not-a-number value; - otherwise, false. - - - Gets a value indicating whether this object is a signaling - not-a-number value. - true if this object is a signaling not-a-number - value; otherwise, false. - - - Finds the natural logarithm of this object, that is, the - power (exponent) that e (the base of natural logarithms) must be - raised to in order to equal this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the ln function's results are - generally not exact. (Unlike in the General Binary Arithmetic - Specification, any rounding mode is allowed.). - Ln(this object). Signals the flag FlagInvalid and returns - NaN if this object is less than 0 (the result would be a complex - number with a real part equal to Ln of this object's absolute value - and an imaginary part equal to pi, but the return value is still - NaN.). Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null or the precision is - unlimited (the context's Precision property is 0). Signals no flags - and returns negative infinity if this object's value is - 0. - - - Finds the base-10 logarithm of this object, that is, the - power (exponent) that the number 10 must be raised to in order to - equal this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the ln function's results are - generally not exact. (Unlike in the General Binary Arithmetic - Specification, any rounding mode is allowed.). - Ln(this object)/Ln(10). Signals the flag FlagInvalid and - returns not-a-number (NaN) if this object is less than 0. Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Adds 1 to this object's value and finds the natural - logarithm of the result, in a way that avoids loss of precision - when this object's value is between 0 and 1. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the ln function's results are - generally not exact. (Unlike in the General Binary Arithmetic - Specification, any rounding mode is allowed.). - Ln(1+(this object)). Signals the flag FlagInvalid and - returns NaN if this object is less than -1 (the result would be a - complex number with a real part equal to Ln of 1 plus this object's - absolute value and an imaginary part equal to pi, but the return - value is still NaN.). Signals FlagInvalid and returns not-a-number - (NaN) if the parameter is null or the - precision is unlimited (the context's Precision property is 0). - Signals no flags and returns negative infinity if this object's - value is 0. - - - Finds the base-N logarithm of this object, that is, the - power (exponent) that the number N must be raised to in order to - equal this object's value. - The parameter - is a Numbers.EFloat object. - The parameter is a - Numbers.EContext object. - Ln(this object)/Ln(baseValue). Signals the flag - FlagInvalid and returns not-a-number (NaN) if this object is less - than 0. Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null or the precision is - unlimited (the context's Precision property is 0). - The parameter is null. - - - Returns a number similar to this number but with the radix - point moved to the left. - The number of binary digit places to move the - radix point to the left. If this number is negative, instead moves - the radix point to the right by this number's absolute - value. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the radix - point moved to the left. - The number of binary digit places to move the - radix point to the left. If this number is negative, instead moves - the radix point to the right by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the radix - point moved to the left. - The number of binary digit places to move - the radix point to the left. If this number is negative, instead - moves the radix point to the right by this number's absolute - value. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the radix - point moved to the left. - The number of binary digit places to move - the radix point to the left. If this number is negative, instead - moves the radix point to the right by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is decreased by , but not to more than 0. - - - Returns a number similar to this number but with the radix - point moved to the right. - The number of binary digit places to move the - radix point to the right. If this number is negative, instead moves - the radix point to the left by this number's absolute - value. - A number whose exponent is increased by , but not to more than 0. - - - Returns a number similar to this number but with the radix - point moved to the right. - The number of binary digit places to move the - radix point to the right. If this number is negative, instead moves - the radix point to the left by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is increased by , but not to more than 0. - - - Returns a number similar to this number but with the radix - point moved to the right. - The number of binary digit places to move - the radix point to the right. If this number is negative, instead - moves the radix point to the left by this number's absolute - value. - A number whose exponent is increased by , but not to more than 0. - - - Returns a number similar to this number but with the radix - point moved to the right. - The number of binary digit places to move - the radix point to the right. If this number is negative, instead - moves the radix point to the left by this number's absolute - value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - A number whose exponent is increased by , but not to more than 0. - - - Multiplies this arbitrary-precision binary floating-point - number by another arbitrary-precision binary floating-point number - and returns the result. The exponent for the result is this - arbitrary-precision binary floating-point number's exponent plus - the other arbitrary-precision binary floating-point number's - exponent. - Another binary floating-point - number. - The product of the two numbers, that is, this - arbitrary-precision binary floating-point number times another - arbitrary-precision binary floating-point number. - The parameter is null. - - - Multiplies this arbitrary-precision binary floating-point - number by another arbitrary-precision binary floating-point number - and returns the result. - Another binary floating-point number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - The product of the two numbers, that is, this - arbitrary-precision binary floating-point number times another - arbitrary-precision binary floating-point number. - - - Multiplies by one binary floating-point number, and then - adds another binary floating-point number. - The value to multiply. - The value to add. - An arbitrary-precision binary floating-point - number. - - - Multiplies by one value, and then adds another - value. - The value to multiply. - The value to add. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. If the precision doesn't indicate a simplified - arithmetic, rounding and precision/exponent adjustment is done only - once, namely, after multiplying and adding. - The result thisValue * multiplicand + augend. - - - Multiplies by one value, and then subtracts another - value. - The value to multiply. - The value to subtract. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. If the precision doesn't indicate a simplified - arithmetic, rounding and precision/exponent adjustment is done only - once, namely, after multiplying and subtracting. - The result thisValue * multiplicand - - subtrahend. - The parameter or is null. - - - Gets an object with the same value as this one, but with - the sign reversed. - An arbitrary-precision binary floating-point number. If - this value is positive zero, returns negative zero. Returns - signaling NaN if this value is signaling NaN. (In this sense, this - method is similar to the "copy-negate" operation in the General - Decimal Arithmetic Specification, except this method does not - necessarily return a copy of this object.). - - - Returns a binary floating-point number with the same value - as this object but with the sign reversed. - An arithmetic context to control the - precision, rounding, and exponent range of the result. If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which case the precision is - unlimited and rounding isn't needed. - An arbitrary-precision binary floating-point number. If - this value is positive zero, returns positive zero. Signals - FlagInvalid and returns quiet NaN if this value is signaling - NaN. - - - Finds the largest value that's smaller than the given - value. - An arithmetic context object to control the - precision and exponent range of the result. The rounding mode from - this context is ignored. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). - Returns the largest value that's less than the given - value. Returns negative infinity if the result is negative - infinity. Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null, the precision is 0, or - has an unlimited exponent range. - - - Finds the smallest value that's greater than the given - value. - An arithmetic context object to control the - precision and exponent range of the result. The rounding mode from - this context is ignored. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). - Returns the smallest value that's greater than the given - value.Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null, the precision is 0, or - has an unlimited exponent range. - - - Finds the next value that is closer to the other object's - value than this object's value. Returns a copy of this value with - the same sign as the other value if both values are - equal. - An arbitrary-precision binary - floating-point number that the return value will approach. - An arithmetic context object to control the - precision and exponent range of the result. The rounding mode from - this context is ignored. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). - Returns the next value that is closer to the other object' - s value than this object's value. Signals FlagInvalid and returns - NaN if the parameter is null, the precision - is 0, or has an unlimited exponent - range. - - - Rounds this object's value to a given precision, using the - given rounding mode and range of exponent, and also converts - negative zero to positive zero. The idiom - EDecimal.SignalingNaN.Plus(ctx) is useful for triggering an - invalid operation and returning not-a-number (NaN) for custom - arithmetic operations. - A context for controlling the precision, rounding - mode, and exponent range. Can be null, in which case the precision - is unlimited and rounding isn't needed. - The closest value to this object's value, rounded to the - specified precision. If is null or the - precision and exponent range are unlimited, returns the same value - as this object (or a quiet NaN if this object is a signaling - NaN). - - - Raises this object's value to the given exponent, using - unlimited precision. - An arbitrary-precision binary floating-point - number expressing the exponent to raise this object's value - to. - This^exponent. Returns not-a-number (NaN) if the exponent - has a fractional part. - - - Raises this object's value to the given - exponent. - An arbitrary-precision binary floating-point - number expressing the exponent to raise this object's value - to. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - This^exponent. Signals the flag FlagInvalid and returns - NaN if this object and exponent are both 0; or if this value is - less than 0 and the exponent either has a fractional part or is - infinity. Signals FlagInvalid and returns not-a-number (NaN) if the - parameter is null or the precision is - unlimited (the context's Precision property is 0), and the exponent - has a fractional part. - - - Raises this object's value to the given - exponent. - The exponent to raise this object's - value to. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - This^exponent. Signals the flag FlagInvalid and returns - NaN if this object and exponent are both 0. - - - Raises this object's value to the given - exponent. - The exponent to raise this object's - value to. - This^exponent. Returns not-a-number (NaN) if this object - and exponent are both 0. - - - Finds the number of digits in this number's significand. - Returns 1 if this value is 0, and 0 if this value is infinity or - not-a-number (NaN). - An arbitrary-precision integer. - - - Returns whether this object's value is an - integer. - true if this object's value is an integer; - otherwise, false. - - - - Returns a binary floating-point number with the same - value but a new exponent. - Note that this is not always the same as rounding to a given - number of binary digit places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - binary digit places is desired, it's better to use the - RoundToExponent and RoundToIntegral methods instead. - Remark: - This method can be used to implement - fixed-point binary arithmetic, in which each binary floating-point - number has a fixed number of digits after the radix point. The - following code example returns a fixed-point number with up to 20 - digits before and exactly 5 digits after the radix point: - /* After performing arithmetic operations, adjust - /* the number to 5 /* - */*/*/ - digits after the radix point number = number.Quantize( - EInteger.FromInt32(-5), /* five digits after the radix - point*/ - EContext.ForPrecision(25) /* 25-digit - precision);*/ - A fixed-point binary arithmetic in which no digits come after - the radix point (a desired exponent of 0) is considered an "integer - arithmetic". - - The desired exponent for the result. - The exponent is the number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control precision and - rounding of the result. If HasFlags - of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). Can be null, in which - case the default rounding mode is HalfEven. - A binary floating-point number with the same value as this - object but with the exponent changed. Signals FlagInvalid and - returns not-a-number (NaN) if this object is infinity, if the - rounded result can't fit the given precision, or if the context - defines an exponent range and the given exponent is outside that - range. - - - - Returns a binary floating-point number with the same - value but a new exponent. - Note that this is not always the same as rounding to a given - number of binary digit places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - binary digit places is desired, it's better to use the - RoundToExponent and RoundToIntegral methods instead. - Remark: - This method can be used to implement - fixed-point binary arithmetic, in which each binary floating-point - number has a fixed number of digits after the radix point. The - following code example returns a fixed-point number with up to 20 - digits before and exactly 5 digits after the radix point: - /* After performing arithmetic operations, adjust - /* the number to 5*/*/ - digits after the radix point number = number.Quantize(-5, /* five - digits*/ - after the radix point EContext.ForPrecision(25) /* 25-digit - precision);*/ - A fixed-point binary arithmetic in which no digits come after - the radix point (a desired exponent of 0) is considered an "integer - arithmetic". - - The desired exponent for the - result. The exponent is the number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control precision and - rounding of the result. If HasFlags - of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). Can be null, in which - case the default rounding mode is HalfEven. - A binary floating-point number with the same value as this - object but with the exponent changed. Signals FlagInvalid and - returns not-a-number (NaN) if this object is infinity, if the - rounded result can't fit the given precision, or if the context - defines an exponent range and the given exponent is outside that - range. - - - Returns a binary floating-point number with the same value - as this object but with the same exponent as another binary - floating-point number. - Note that this is not always the same as rounding to a given - number of binary digit places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - binary digit places is desired, it's better to use the - RoundToExponent and RoundToIntegral methods instead. - Remark: This method can be used to implement - fixed-point binary arithmetic, in which a fixed number of digits - come after the radix point. A fixed-point binary arithmetic in - which no digits come after the radix point (a desired exponent of - 0) is considered an "integer arithmetic" . - A binary floating-point number containing - the desired exponent of the result. The significand is ignored. The - exponent is the number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the sixteenth (10b^-3, 0.0001b), and 3 means round - to the sixteen-place (10b^3, 1000b). A value of 0 rounds the number - to an integer. - An arithmetic context to control precision and - rounding of the result. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). Can be null, in which - case the default rounding mode is HalfEven. - A binary floating-point number with the same value as this - object but with the exponent changed. Signals FlagInvalid and - returns not-a-number (NaN) if the result can't fit the given - precision without rounding, or if the arithmetic context defines an - exponent range and the given exponent is outside that - range. - - - Returns an object with the same numerical value as this - one but with trailing zeros removed from its significand. For - example, 1.00 becomes 1. - If this object's value is 0, changes the exponent to - 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and rounding - isn't needed. - This value with trailing zeros removed. Note that if the - result has a very high exponent and the context says to clamp high - exponents, there may still be some trailing zeros in the - significand. - - - Returns the remainder that would result when this - arbitrary-precision binary floating-point number is divided by - another arbitrary-precision binary floating-point number. The - remainder is the number that remains when the absolute value of - this arbitrary-precision binary floating-point number is divided - (as though by DivideToIntegerZeroScale) by the absolute value of - the other arbitrary-precision binary floating-point number; the - remainder has the same sign (positive or negative) as this - arbitrary-precision binary floating-point number. - An arbitrary-precision binary floating-point - number. - The parameter is an - EContext object. - The remainder that would result when this - arbitrary-precision binary floating-point number is divided by - another arbitrary-precision binary floating-point number. Signals - FlagDivideByZero and returns infinity if the divisor (this - arbitrary-precision binary floating-point number) is 0 and the - dividend (the other arbitrary-precision binary floating-point - number) is nonzero. Signals FlagInvalid and returns not-a-number - (NaN) if the divisor and the dividend are 0, or if the result of - the division doesn't fit the given precision. - - - Finds the remainder that results when dividing two - arbitrary-precision binary floating-point numbers. The remainder is - the value that remains when the absolute value of this object is - divided by the absolute value of the other object; the remainder - has the same sign (positive or negative) as this object's - value. - An arbitrary-precision binary floating-point - number. - The parameter is an - EContext object. - The remainder of the two numbers. Signals FlagInvalid and - returns not-a-number (NaN) if the divisor is 0, or if the result - doesn't fit the given precision. - - - Calculates the remainder of a number by the formula - "this" - (("this" / "divisor") * "divisor"). - The number to divide by. - An arbitrary-precision binary floating-point - number. - - - Calculates the remainder of a number by the formula "this" - - (("this" / "divisor") * "divisor"). - The number to divide by. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only in the division portion of the remainder - calculation; as a result, it's possible for the return value to - have a higher precision than given in this context. Flags will be - set on the given context only if the context's HasFlags is - true and the integer part of the division result doesn't fit the - precision and exponent range without rounding. Can be null, in - which the precision is unlimited and no additional rounding, other - than the rounding down to an integer after division, is - needed. - An arbitrary-precision binary floating-point - number. - - - Finds the distance to the closest multiple of the given - divisor, based on the result of dividing this object's value by - another object's value. - - If this and the other object divide evenly, the result is - 0. - If the remainder's absolute value is less than half of the - divisor's absolute value, the result has the same sign as this - object and will be the distance to the closest multiple. - If the remainder's absolute value is more than half of the - divisor's absolute value, the result has the opposite sign of this - object and will be the distance to the closest multiple. - If the remainder's absolute value is exactly half of the - divisor's absolute value, the result has the opposite sign of this - object if the quotient, rounded down, is odd, and has the same sign - as this object if the quotient, rounded down, is even, and the - result's absolute value is half of the divisor's absolute - value. This function is also known as the "IEEE - Remainder" function. - The number to divide by. - An arithmetic context object to control the - precision. The rounding and exponent range settings of this context - are ignored (the rounding mode is always treated as HalfEven). If - HasFlags of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null, in which the precision is - unlimited. - The distance of the closest multiple. Signals FlagInvalid - and returns not-a-number (NaN) if the divisor is 0, or either the - result of integer division (the quotient) or the remainder wouldn't - fit the given precision. - - - Returns a binary floating-point number with the same value - as this object but rounded to a new exponent if necessary. The - resulting number's Exponent property will not necessarily be the - given exponent; use the Quantize method instead to give the result - a particular exponent. - The minimum exponent the result can have. - This is the maximum number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - A binary floating-point number rounded to the closest - value representable in the given precision. If the result can't fit - the precision, additional digits are discarded to make it fit. - Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to the given exponent when rounding, and the given - exponent is outside of the valid range of the arithmetic - context. - - - Returns a binary floating-point number with the same value - as this object but rounded to a new exponent if necessary. The - resulting number's Exponent property will not necessarily be the - given exponent; use the Quantize method instead to give the result - a particular exponent. - The minimum exponent the result can - have. This is the maximum number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - A binary floating-point number rounded to the closest - value representable in the given precision. If the result can't fit - the precision, additional digits are discarded to make it fit. - Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to the given exponent when rounding, and the given - exponent is outside of the valid range of the arithmetic - context. - - - Returns a binary floating-point number with the same value - as this object but rounded to the given exponent, and signals an - inexact flag if the result would be inexact. The resulting number's - Exponent property will not necessarily be the given exponent; use - the Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can have. - This is the maximum number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - A binary floating-point number rounded to the closest - value representable in the given precision. Signals FlagInvalid and - returns not-a-number (NaN) if the result can't fit the given - precision without rounding. Signals FlagInvalid and returns - not-a-number (NaN) if the arithmetic context defines an exponent - range, the new exponent must be changed to the given exponent when - rounding, and the given exponent is outside of the valid range of - the arithmetic context. - - - Returns a binary number with the same value as this object - but rounded to the given exponent. The resulting number's Exponent - property will not necessarily be the given exponent; use the - Quantize method instead to give the result a particular - exponent. - The minimum exponent the result can have. - This is the maximum number of fractional digits in the result, - expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the eighth (10^-1, 1/8), and 3 means round to the - eight (2^3, 8). A value of 0 rounds the number to an - integer. - Desired mode for rounding this object's - value. - A binary number rounded to the closest value representable - in the given precision. - - - Returns a binary floating-point number with the same value - as this object but rounded to the given exponent represented as a - 32-bit signed integer, and signals an inexact flag if the result - would be inexact. The resulting number's Exponent property will not - necessarily be the given exponent; use the Quantize method instead - to give the result a particular exponent. - The minimum exponent the result can - have. This is the maximum number of fractional digits in the - result, expressed as a negative number. Can also be positive, which - eliminates lower-order places from the number. For example, -3 - means round to the thousandth (10^-3, 0.0001), and 3 means round to - the thousand (10^3, 1000). A value of 0 rounds the number to an - integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - A binary floating-point number rounded to the closest - value representable in the given precision. Signals FlagInvalid and - returns not-a-number (NaN) if the result can't fit the given - precision without rounding. Signals FlagInvalid and returns - not-a-number (NaN) if the arithmetic context defines an exponent - range, the new exponent must be changed to the given exponent when - rounding, and the given exponent is outside of the valid range of - the arithmetic context. - - - Returns a binary floating-point number with the same value - as this object but rounded to an integer, and signals an inexact - flag if the result would be inexact. The resulting number's - Exponent property will not necessarily be 0; use the Quantize - method instead to give the result an exponent of 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - A binary floating-point number rounded to the closest - integer representable in the given precision. Signals FlagInvalid - and returns not-a-number (NaN) if the result can't fit the given - precision without rounding. Signals FlagInvalid and returns - not-a-number (NaN) if the arithmetic context defines an exponent - range, the new exponent must be changed to 0 when rounding, and 0 - is outside of the valid range of the arithmetic context. - - - Returns a binary floating-point number with the same value - as this object but rounded to an integer, without adding the - FlagInexact or FlagRounded flags. The resulting - number's Exponent property will not necessarily be 0; use the - Quantize method instead to give the result an exponent of - 0. - An arithmetic context to control precision and - rounding of the result. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags), except that this - function will never add the FlagRounded and - FlagInexact flags (the only difference between this and - RoundToExponentExact). Can be null, in which case the default - rounding mode is HalfEven. - A binary floating-point number rounded to the closest - integer representable in the given precision. If the result can't - fit the precision, additional digits are discarded to make it fit. - Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to 0 when rounding, and 0 is outside of the valid range - of the arithmetic context. - - - Returns a binary floating-point number with the same value - as this object but rounded to an integer, and signals an inexact - flag if the result would be inexact. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the default rounding mode is - HalfEven. - A binary floating-point number rounded to the closest - integer representable in the given precision. Signals FlagInvalid - and returns not-a-number (NaN) if the result can't fit the given - precision without rounding. Signals FlagInvalid and returns - not-a-number (NaN) if the arithmetic context defines an exponent - range, the new exponent must be changed to 0 when rounding, and 0 - is outside of the valid range of the arithmetic context. - - - Returns a binary floating-point number with the same value - as this object but rounded to an integer, without adding the - FlagInexact or FlagRounded flags. - An arithmetic context to control precision and - rounding of the result. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags), except that this - function will never add the FlagRounded and - FlagInexact flags (the only difference between this and - RoundToExponentExact). Can be null, in which case the default - rounding mode is HalfEven. - A binary floating-point number rounded to the closest - integer representable in the given precision. If the result can't - fit the precision, additional digits are discarded to make it fit. - Signals FlagInvalid and returns not-a-number (NaN) if the - arithmetic context defines an exponent range, the new exponent must - be changed to 0 when rounding, and 0 is outside of the valid range - of the arithmetic context. - - - Rounds this object's value to a given precision, using the - given rounding mode and range of exponent. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The closest value to this object's value, rounded to the - specified precision. Returns the same value as this object if - is null or the precision and exponent range - are unlimited. - - - Returns a number in which the value of this object is - rounded to fit the maximum precision allowed if it has more - significant digits than the maximum precision. The maximum - precision allowed is given in an arithmetic context. This method is - designed for preparing operands to a custom arithmetic operation in - accordance with the "simplified" arithmetic given in Appendix A of - the General Decimal Arithmetic Specification. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited. Signals the - flag LostDigits if the input number has greater precision than - allowed and was rounded to a different numerical value in order to - fit the precision. - This object rounded to the given precision. Returns this - object and signals no flags if is null or - specifies an unlimited precision, if this object is infinity or - not-a-number (including signaling NaN), or if the number's value - has no more significant digits than the maximum precision given in - . - - - Returns a number similar to this number but with the scale - adjusted. - The parameter is a - 32-bit signed integer. - An arbitrary-precision binary floating-point - number. - - - Returns a number similar to this number but with the scale - adjusted. - The parameter is a - 32-bit signed integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null. - An arbitrary-precision binary floating-point - number. - - - Returns a number similar to this number but with the scale - adjusted. - An arbitrary-precision integer. - A number whose exponent is increased by . - - - Returns a number similar to this number but with its scale - adjusted. - An arbitrary-precision integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null. - An arbitrary-precision binary floating-point - number. - The parameter is null. - - - Finds the square root of this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the square root function's - results are generally not exact for many inputs. (Unlike in the - General Binary Arithmetic Specification, any rounding mode is - allowed.). - The square root. Signals the flag FlagInvalid and returns - NaN if this object is less than 0 (the square root would be a - complex number, but the return value is still NaN). Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Finds the square root of this object's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - This parameter can't be null, as the square root function's - results are generally not exact for many inputs. (Unlike in the - General Binary Arithmetic Specification, any rounding mode is - allowed.). - The square root. Signals the flag FlagInvalid and returns - NaN if this object is less than 0 (the square root would be a - complex number, but the return value is still NaN). Signals - FlagInvalid and returns not-a-number (NaN) if the parameter - is null or the precision is unlimited (the - context's Precision property is 0). - - - Subtracts an arbitrary-precision binary floating-point - number from this arbitrary-precision binary floating-point number - and returns the result. The exponent for the result is the lower of - this arbitrary-precision binary floating-point number's exponent - and the other arbitrary-precision binary floating-point number's - exponent. - The number to subtract from this - instance's value. - The difference between the two numbers, that is, this - arbitrary-precision binary floating-point number minus another - arbitrary-precision binary floating-point number. If this - arbitrary-precision binary floating-point number is not-a-number - (NaN), returns NaN. - - - Subtracts an arbitrary-precision binary floating-point - number from this arbitrary-precision binary floating-point number - and returns the result. - The number to subtract from this - instance's value. - An arithmetic context to control the precision, - rounding, and exponent range of the result. If HasFlags of - the context is true, will also store the flags resulting from the - operation (the flags are in addition to the pre-existing flags). - Can be null, in which case the precision is unlimited and no - rounding is needed. - The difference between the two numbers, that is, this - arbitrary-precision binary floating-point number minus another - arbitrary-precision binary floating-point number. If this - arbitrary-precision binary floating-point number is not-a-number - (NaN), returns NaN. - The parameter is null. - - - Converts this value to a 64-bit floating-point number - encoded in the IEEE 754 binary64 format. - This number, converted to a 64-bit floating-point number - encoded in the IEEE 754 binary64 format. The return value can be - positive infinity or negative infinity if this value exceeds the - range of a 64-bit floating point number. - - - Converts this value to its closest equivalent as 32-bit - floating-point number, expressed as an integer in the IEEE 754 - binary32 format. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 32-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. - The closest 32-bit binary floating-point number to this - value, expressed as an integer in the IEEE 754 binary32 format. The - return value can be positive infinity or negative infinity if this - value exceeds the range of a 32-bit floating point - number. - - - Converts this value to its closest equivalent as a 64-bit - floating-point number, expressed as an integer in the IEEE 754 - binary64 format. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 64-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. - The closest 64-bit binary floating-point number to this - value, expressed as an integer in the IEEE 754 binary64 format. The - return value can be positive infinity or negative infinity if this - value exceeds the range of a 64-bit floating point - number. - - - Converts this value to an arbitrary-precision decimal - number. - This number, converted to an arbitrary-precision decimal - number. - - - Converts this value to an arbitrary-precision integer. Any - fractional part of this value will be discarded when converting to - an arbitrary-precision integer. Note that depending on the value, - especially the exponent, generating the arbitrary-precision integer - may require a huge amount of memory. Use the ToSizedEInteger method - to convert a number to an EInteger only if the integer fits in a - bounded bit range; that method will throw an exception on - overflow. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - - - Converts this value to an arbitrary-precision integer, - checking whether the value contains a fractional part. Note that - depending on the value, especially the exponent, generating the - arbitrary-precision integer may require a huge amount of memory. - Use the ToSizedEIntegerIfExact method to convert a number to an - EInteger only if the integer fits in a bounded bit range; that - method will throw an exception on overflow. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - This object's value is not an - exact integer. - - - Converts this value to an arbitrary-precision integer, - checking whether the value contains a fractional part. Note that - depending on the value, especially the exponent, generating the - arbitrary-precision integer may require a huge amount of memory. - Use the ToSizedEIntegerIfExact method to convert a number to an - EInteger only if the integer fits in a bounded bit range; that - method will throw an exception on overflow. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - This object's value is not an - exact integer. - - - Converts this value to an arbitrary-precision decimal - number, then returns the value of that decimal's - ToEngineeringString method. - A text string. - - - Converts this value to an arbitrary-precision decimal - number. - An arbitrary-precision decimal number. - - - Converts this value to a string, but without exponential - notation. - A text string. - - - Returns a string representation of this number's value - after rounding that value to the given precision (using the given - arithmetic context, such as EContext.Binary64 - ). If the - number after rounding is neither infinity nor not-a-number (NaN), - returns the shortest decimal form of this number's value (in terms - of decimal digits starting with the first nonzero digit and ending - with the last nonzero digit) that results in the rounded number - after the decimal form is converted to binary floating-point format - (using the given arithmetic context). - An arithmetic context to control precision (in - bits), rounding, and exponent range of the rounded number. If - HasFlags - of the context is true, will also store the flags - resulting from the operation (the flags are in addition to the - pre-existing flags). Can be null. If this parameter is null or - defines no maximum precision, returns the same value as the - ToString() method. - Shortest decimal form of this number's value for the given - arithmetic context. The text string will be in exponential notation - (expressed as a number 1 or greater, but less than 10, times a - power of 10) if the number's first nonzero decimal digit is more - than five digits after the decimal point, or if the number's - exponent is greater than 0 and its value is 10, 000, 000 or - greater. - - The following example converts an EFloat number to its - shortest round-tripping decimal form using the same precision as - the double - type in Java and.NET: - String str = efloat.ToShortestString(EContext.Binary64); - - - - Converts this value to its closest equivalent as a 32-bit - floating-point number. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 32-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. Unfortunately, in the.NET implementation, the return value of - this method may be a quiet NaN even if a signaling NaN would - otherwise be generated. - The closest 32-bit binary floating-point number to this - value. The return value can be positive infinity or negative - infinity if this value exceeds the range of a 32-bit floating point - number. - - - Converts this number's value to a text string. - A string representation of this object. The value is - converted to a decimal number (using the EDecimal.FromEFloat - method) and the decimal form of this number's value is returned. - The text string will be in exponential notation (expressed as a - number 1 or greater, but less than 10, times a power of 10) if the - converted decimal number's exponent (EDecimal's Exponent property) - is greater than 0 or if the number's first nonzero decimal digit is - more than five digits after the decimal point. - - - Returns the unit in the last place. The significand will - be 1 and the exponent will be this number's exponent. Returns 1 - with an exponent of 0 if this number is infinity or not-a-number - (NaN). - An arbitrary-precision binary floating-point - number. - - - Converts this value to an arbitrary-precision integer by - discarding its fractional part and checking whether the resulting - integer overflows the given signed bit count. - The maximum number of signed bits the - integer can have. The integer's value may not be less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN), or this number's value, once converted to an - integer by discarding its fractional part, is less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - - - Converts this value to an arbitrary-precision integer, - only if this number's value is an exact integer and that integer - does not overflow the given signed bit count. - The maximum number of signed bits the - integer can have. The integer's value may not be less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN), or this number's value, once converted to an - integer by discarding its fractional part, is less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - This object's value is not an - exact integer. - - - This is an internal method. - A 32-bit signed integer. - - - This is an internal method. - An arbitrary-precision binary floating-point - number. - A 32-bit signed integer. - - - This is an internal method. - An arbitrary-precision binary floating-point - number. - An arbitrary-precision integer. - - - This is an internal method. - An arbitrary-precision binary floating-point - number. - An arbitrary-precision integer. - - - This is an internal method. - An arbitrary-precision integer. - The parameter - is a 32-bit signed integer. - The parameter is a 32-bit signed integer. - An IShiftAccumulator object. - - - This is an internal method. - An arbitrary-precision integer. - Another arbitrary-precision integer. - A FastInteger object. - - - This is an internal method. - Another arbitrary-precision integer. - A fast integer. - An arbitrary-precision integer. - - - This is an internal method. - An arbitrary-precision binary floating-point - number. - A 32-bit signed integer. - - - This is an internal method. - The parameter is - a Numbers.EInteger object. - The parameter is - an internal parameter. - The parameter is an - internal parameter. - An arbitrary-precision binary floating-point - number. - - - This is an internal method. - A 32-bit signed integer. - - - This is an internal method. - The parameter is a 32-bit - signed integer. - An arbitrary-precision binary floating-point - number. - - - Returns one added to this arbitrary-precision binary - floating-point number. - The given arbitrary-precision binary floating-point number - plus one. - - - Returns one subtracted from this arbitrary-precision - binary floating-point number. - The given arbitrary-precision binary floating-point number - minus one. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a byte (from 0 to - 255). - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 255. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a byte (from 0 to 255). - This number, converted to a byte (from 0 to 255). Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) without rounding to a - different numerical value. - This number's value as a byte (from 0 to 255). - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 255. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - binary floating-point number. - The number to convert as a byte (from 0 to - 255). - This number's value as an arbitrary-precision binary - floating-point number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 16-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -32768 or greater than - 32767. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit signed integer. - This number, converted to a 16-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer without rounding to a - different numerical value. - This number's value as a 16-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -32768 or - greater than 32767. - - - Converts a 16-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 16-bit signed - integer. - This number's value as an arbitrary-precision binary - floating-point number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -2147483648 or greater - than 2147483647. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -2147483648 - or greater than 2147483647. - - - Converts a boolean value (either true or false) to an - arbitrary-precision binary floating-point number. - Either true or false. - The number 1 if is true, - otherwise, 0. - - - Converts a 32-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 32-bit signed - integer. - This number's value as an arbitrary-precision binary - floating-point number. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 64-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -9223372036854775808 - or greater than 9223372036854775807. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit signed integer. - This number, converted to a 64-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer without rounding to a - different numerical value. - This number's value as a 64-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than - -9223372036854775808 or greater than - 9223372036854775807. - - - Converts an unsigned integer expressed as a 64-bit signed - integer to an arbitrary-precision binary number. - A 64-bit signed integer. If this value is - 0 or greater, the return value will represent it. If this value is - less than 0, the return value will store 2^64 plus this value - instead. - An arbitrary-precision binary number with the exponent set - to 0. If is 0 or greater, the return - value will represent it. If is less - than 0, the return value will store 2^64 plus this value - instead. - - - Converts a 64-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 64-bit signed - integer. - This number's value as an arbitrary-precision binary - floating-point number with the exponent set to 0. - - - Converts a boolean value (true or false) to an - arbitrary-precision binary floating-point number. - Either true or false. - The number 1 if is true; - otherwise, 0. - - - Creates a binary floating-point number from a 32-bit - floating-point number. This method computes the exact value of the - floating point number, not an approximation, as is often the case - by converting the floating point number to a string - first. - The parameter is a 32-bit - binary floating-point number. - A binary floating-point number with the same value as - . - - - Creates a binary floating-point number from a 64-bit - floating-point number. This method computes the exact value of the - floating point number, not an approximation, as is often the case - by converting the floating point number to a string - first. - The parameter is a 64-bit - floating-point number. - A binary floating-point number with the same value as - . - - - Converts an arbitrary-precision integer to an arbitrary - precision binary. - An arbitrary-precision integer. - An arbitrary-precision binary floating-point number with - the exponent set to 0. - - - Adds an arbitrary-precision binary floating-point number - and another arbitrary-precision binary floating-point number and - returns the result. - The first arbitrary-precision binary - floating-point number. - The second arbitrary-precision binary - floating-point number. - The sum of the two numbers, that is, an - arbitrary-precision binary floating-point number plus another - arbitrary-precision binary floating-point number. - The parameter or is - null. - - - Subtracts one arbitrary-precision binary floating-point - number from another. - The first operand. - The second operand. - The difference of the two objects. - The parameter is null. - - - Adds one to an arbitrary-precision binary floating-point - number. - An arbitrary-precision binary floating-point - number. - The number given in plus - one. - The parameter is null. - - - Subtracts one from an arbitrary-precision binary - floating-point number. - An arbitrary-precision binary floating-point - number. - The number given in minus - one. - The parameter is null. - - - Multiplies an arbitrary-precision binary floating-point - number by another arbitrary-precision binary floating-point number - and returns the result. - The first operand. - The second operand. - The product of the two numbers, that is, an - arbitrary-precision binary floating-point number times another - arbitrary-precision binary floating-point number. - The parameter is null. - - - Divides one binary floating-point number by another and - returns the result. When possible, the result will be - exact. - The number that will be divided by the - divisor. - The number to divide by. - The quotient of the two numbers. Returns infinity if the - divisor is 0 and the dividend is nonzero. Returns not-a-number - (NaN) if the divisor and the dividend are 0. Returns NaN if the - result can't be exact because it would have a nonterminating binary - expansion. If this is not desired, use DivideToExponent instead, or - use the Divide overload that takes an EContext instead. - The parameter is null. - - - Returns the remainder that would result when an - arbitrary-precision binary floating-point number is divided by - another arbitrary-precision binary floating-point number. The - remainder is the number that remains when the absolute value of an - arbitrary-precision binary floating-point number is divided (as - though by DivideToIntegerZeroScale) by the absolute value of the - other arbitrary-precision binary floating-point number; the - remainder has the same sign (positive or negative) as this - arbitrary-precision binary floating-point number. - The number that will be divided by the - divisor. - The number to divide by. - The remainder that would result when an - arbitrary-precision binary floating-point number is divided by - another arbitrary-precision binary floating-point number. - The parameter is null. - - - Gets an object with the same value as this one, but with - the sign reversed. - An arbitrary-precision binary floating-point - number. - The negated form of the given number. If the given number - is positive zero, returns negative zero. Returns signaling NaN if - this value is signaling NaN. - The parameter is null. - - - Converts an arbitrary-precision binary floating-point - number to a value to an arbitrary-precision integer. Any fractional - part in this value will be discarded when converting to an - arbitrary-precision integer. - The number to convert as an - arbitrary-precision binary floating-point number. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - The parameter is null. - - - Converts this value to its closest equivalent as a 64-bit - floating-point number. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 64-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. Unfortunately, in the.NET implementation, the return value of - this method may be a quiet NaN even if a signaling NaN would - otherwise be generated. - The value to convert to a 64-bit - floating-point number. - The closest 64-bit floating-point number to this value. - The return value can be positive infinity or negative infinity if - this value exceeds the range of a 64-bit floating point - number. - The parameter is null. - - - Converts an arbitrary-precision binary floating-point - number to its closest equivalent as a 32-bit floating-point number. - The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 32-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. Unfortunately, in the.NET implementation, the return value of - this method may be a quiet NaN even if a signaling NaN would - otherwise be generated. - The number to convert as an - arbitrary-precision binary floating-point number. - The closest 32-bit binary floating-point number to this - value. The return value can be positive infinity or negative - infinity if this value exceeds the range of a 32-bit floating point - number. - The parameter is null. - - - Converts an arbitrary-precision binary floating-point - number to a byte (from 0 to 255) if it can fit in a byte (from 0 to - 255) after converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to a - byte (from 0 to 255). - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 255. - The parameter is null. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - binary floating-point number. - The number to convert as a byte (from 0 to - 255). - The value of as an - arbitrary-precision binary floating-point number. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to an 8-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -128 or greater than - 127. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as an 8-bit signed integer. - This number, converted to an 8-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer without rounding to a - different numerical value. - This number's value as an 8-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -128 or - greater than 127. - - - Converts an 8-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as an 8-bit signed - integer. - This number's value as an arbitrary-precision binary - floating-point number. - - - Converts an arbitrary-precision binary floating-point - number to an 8-bit signed integer if it can fit in an 8-bit signed - integer after converting it to an integer by discarding its - fractional part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to an - 8-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -128 or greater than 127. - The parameter is null. - - - Converts an 8-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as an 8-bit signed - integer. - The value of as an - arbitrary-precision binary floating-point number. - - - Converts an arbitrary-precision binary floating-point - number to a 16-bit signed integer if it can fit in a 16-bit signed - integer after converting it to an integer by discarding its - fractional part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to a - 16-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -32768 or greater than 32767. - The parameter is null. - - - Converts a 16-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 16-bit signed - integer. - The value of as an - arbitrary-precision binary floating-point number. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 16-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 65535. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit unsigned integer. - This number, converted to a 16-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 16-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 65535. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision binary floating-point number. - The number to convert as a 16-bit - unsigned integer. - This number's value as an arbitrary-precision binary - floating-point number. - - - Converts an arbitrary-precision binary floating-point - number to a 16-bit unsigned integer if it can fit in a 16-bit - unsigned integer after converting it to an integer by discarding - its fractional part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to a - 16-bit unsigned integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 65535. - The parameter is null. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision binary floating-point number. - The number to convert as a 16-bit - unsigned integer. - The value of as an - arbitrary-precision binary floating-point number. - - - Converts an arbitrary-precision binary floating-point - number to a 32-bit signed integer if it can fit in a 32-bit signed - integer after converting it to an integer by discarding its - fractional part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to a - 32-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -2147483648 or greater than 2147483647. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision binary floating-point number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 4294967295. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 4294967295. - - - Converts a 32-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 32-bit signed - integer. - This number's value as an arbitrary-precision binary - floating-point number. - - - Converts an arbitrary-precision binary floating-point - number to a 32-bit signed integer if it can fit in a 32-bit signed - integer after converting it to an integer by discarding its - fractional part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to a - 32-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 4294967295. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision binary floating-point number. - - - Converts an arbitrary-precision binary floating-point - number to a 64-bit signed integer if it can fit in a 64-bit signed - integer after converting it to an integer by discarding its - fractional part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to a - 64-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -9223372036854775808 or greater than - 9223372036854775807. - The parameter is null. - - - Converts a 64-bit signed integer to an arbitrary-precision - binary floating-point number. - The number to convert as a 64-bit signed - integer. - The value of as an - arbitrary-precision binary floating-point number. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 64-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 18446744073709551615. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit unsigned integer. - This number, converted to a 64-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 64-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 18446744073709551615. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision binary floating-point number. - The number to convert as a 64-bit - unsigned integer. - This number's value as an arbitrary-precision binary - floating-point number. - - - Converts an arbitrary-precision binary floating-point - number to a 64-bit unsigned integer if it can fit in a 64-bit - unsigned integer after converting it to an integer by discarding - its fractional part. - The number to convert as an arbitrary-precision - binary floating-point number. - The value of , truncated to a - 64-bit unsigned integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 18446744073709551615. - The parameter is null. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision binary floating-point number. - The number to convert as a 64-bit - unsigned integer. - The value of as an - arbitrary-precision binary floating-point number. - - - A class that implements additional operations on - arbitrary-precision binary floating-point numbers. - - - Returns the number 2, the binary radix. - Specifies an arithmetic context for rounding the - number 2. Can be null. - The number 2, or the closest representable number to 2 in - the arithmetic context. - - - Creates a binary floating-point number from a 32-bit - signed integer. - The parameter is a 32-bit - signed integer. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - An arbitrary-precision binary floating-point number with - the closest representable value to the given integer. - - - Converts a boolean value (either true or false) to an - arbitrary-precision binary floating-point number. - Either true or false. - A context used for rounding the result. Can be - null. - Either 1 if is true, or 0 if - is false.. The result will be rounded as - specified by the given context, if any. - - - Returns whether the given arbitrary-precision number - object is in a canonical form. For the current version of EFloat, - all EFloat objects are in a canonical form. - An arbitrary-precision number object. - Always true. - - - Returns whether the given arbitrary-precision number - object is neither null nor infinity nor not-a-number - (NaN). - An arbitrary-precision number object. - Either true if the given arbitrary-precision number - object is neither null nor infinity nor not-a-number (NaN), or - false otherwise. - - - Returns whether the given arbitrary-precision number - object is positive or negative infinity. - An arbitrary-precision number object. - Either true if the given arbitrary-precision number - object is positive or negative infinity, or false - otherwise. - - - Returns whether the given arbitrary-precision number - object is a not-a-number (NaN). - An arbitrary-precision number object. - Either true or false. - - - Returns whether the given number is a - normal number. A - subnormal number is a nonzero finite number whose Exponent - property (or the number's exponent when that number is expressed in - scientific notation with one digit before the radix point) is less - than the minimum possible exponent for that number. A - normal number is nonzero and finite, but not - subnormal. - An arbitrary-precision number object. - A context specifying the exponent range of - arbitrary-precision numbers. Can be null. If AdjustExponent of the - given context is true, a nonzero number is normal if the - number's exponent (when that number is expressed in scientific - notation with one nonzero digit before the radix point) is at least - the given context's EMax property (e.g., if EMax is -100, 2.3456 * - 10 - -99 is normal, but 2.3456 * 10 - -102 is not). If AdjustExponent of the given context is - false, a nonzero number is subnormal if the number's - Exponent property is at least given context's EMax property (e.g., - if EMax is -100, 23456 * 10 - -99 is normal, but 23456 * 10 - -102 is not). - Either true if the given number is subnormal, or - false otherwise. Returns true if the given context is - null or HasExponentRange of the given context is false. - - - Returns whether the given arbitrary-precision number - object is a quiet not-a-number (NaN). - An arbitrary-precision number object. - Either true or false. - - - Returns whether the given arbitrary-precision number - object is negative (including negative infinity, negative - not-a-number [NaN], or negative zero). - An arbitrary-precision number object. - Either true or false. - - - Returns whether the given arbitrary-precision number - object is a signaling not-a-number (NaN). - An arbitrary-precision number object. - Either true or false. - - - Converts a number class identifier (ranging from 0 through - 9) to a text string. An arbitrary-precision number object can - belong in one of ten number classes. - An integer identifying a number class. - A text string identifying the given number class as - follows: 0 = "+Normal"; 1 = "-Normal", 2 = "+Subnormal", 3 = - "-Subnormal", 4 = "+Zero", 5 = "-Zero", 6 = "+Infinity", 7 = - "-Infinity", 8 = "NaN", 9 = "sNaN". - The parameter is less than 0 or greater than 9. - - - Finds the number class for an arbitrary-precision binary - number object. - An arbitrary-precision binary number - object. - A context object that specifies the precision and - exponent range of arbitrary-precision numbers. This is used only to - distinguish between normal and subnormal numbers. Can be - null. - A 32-bit signed integer identifying the given number - object, number class as follows: 0 = positive normal; 1 = negative - normal, 2 = positive subnormal, 3 = negative subnormal, 4 = - positive zero, 5 = negative zero, 6 = positive infinity, 7 = - negative infinity, 8 = quiet not-a-number (NaN), 9 = signaling - NaN. - The parameter is null. - - - Returns whether the given number is a - subnormal number. A - subnormal number is a nonzero finite number whose Exponent - property (or the number's exponent when that number is expressed in - scientific notation with one digit before the radix point) is less - than the minimum possible exponent for that number. - An arbitrary-precision number object. - A context specifying the exponent range of - arbitrary-precision numbers. Can be null. If AdjustExponent of the - given context is true, a nonzero number is subnormal if the - number's exponent (when that number is expressed in scientific - notation with one nonzero digit before the radix point) is less - than the given context's EMax property (e.g., if EMax is -100, - 2.3456 * 10 - -102 is subnormal, but 2.3456 * 10 - -99 is not). If AdjustExponent of the given context is - false, a nonzero number is subnormal if the number's - Exponent property is less than the given context's EMax property - (e.g., if EMax is -100, 23456 * 10 - -102 is subnormal, but 23456 * 10 - -99 is not). - Either true if the given number is subnormal, or - false otherwise. Returns false if the given context - is null or HasExponentRange of the given context is false. - The parameter is null. - - - Returns whether the given arbitrary-precision number - object is zero (positive zero or negative zero). - An arbitrary-precision number object. - true if the given number has a value of zero - (positive zero or negative zero); otherwise, false. - - - Returns the base-2 exponent of an arbitrary-precision - binary number (when that number is expressed in scientific notation - with one nonzero digit before the radix point). For example, - returns 3 for the numbers 1.11b * 2^3 and 111 * 2^1. - An arbitrary-precision binary number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - The base-2 exponent of the given number (when that number - is expressed in scientific notation with one nonzero digit before - the radix point). Signals DivideByZero and returns negative - infinity if is zero. Returns positive - infinity if is positive infinity or negative - infinity. - The parameter is null. - - - Finds an arbitrary-precision binary number whose binary - point is moved a given number of places. - An arbitrary-precision binary number. - The number of binary places to move the binary - point of "ed". This must be an integer with an exponent of - 0. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - The given arbitrary-precision binary number whose binary - point is moved the given number of places. Signals an invalid - operation and returns not-a-number (NaN) if - is infinity or NaN, has an Exponent property other than 0. Signals - an invalid operation and returns not-a-number (NaN) if defines a limited precision and exponent range and if - 's absolute value is greater than twice the - sum of the context's EMax property and its Precision - property. - The parameter or is null. - - - Shifts the bits of an arbitrary-precision binary floating - point number's significand. - An arbitrary-precision binary floating point - number containing the significand to shift. - An arbitrary-precision number indicating the - number of bits to shift the first operand's significand. Must be an - integer with an exponent of 0. If this parameter is positive, the - significand is shifted to the left by the given number of bits. If - this parameter is negative, the significand is shifted to the right - by the given number of bits. - An arithmetic context to control the precision of - arbitrary-precision numbers. Can be null. - An arbitrary-precision binary number whose significand is - shifted the given number of bits. Signals an invalid operation and - returns NaN (not-a-number) if is a signaling - NaN or if is not an integer, is negative, - has an exponent other than 0, or has an absolute value that exceeds - the maximum precision specified in the context. - The parameter or is null. - - - Rotates the bits of an arbitrary-precision binary number's - significand. - An arbitrary-precision number containing the - significand to rotate. If this significand contains more bits than - the precision, the most-significant bits are chopped off the - significand. - An arbitrary-precision number indicating the - number of bits to rotate the first operand's significand. Must be - an integer with an exponent of 0. If this parameter is positive, - the significand is shifted to the left by the given number of bits - and the most-significant bits shifted out of the significand become - the least-significant bits instead. If this parameter is negative, - the number is shifted by the given number of bits and the - least-significant bits shifted out of the significand become the - most-significant bits instead. - An arithmetic context to control the precision of - arbitrary-precision numbers. If this parameter is null or specifies - an unlimited precision, this method has the same behavior as - Shift. - An arbitrary-precision binary number whose significand is - rotated the given number of bits. Signals an invalid operation and - returns NaN (not-a-number) if is a signaling - NaN or if is not an integer, is negative, - has an exponent other than 0, or has an absolute value that exceeds - the maximum precision specified in the context. - The parameter or is null. - - - Compares the values of one arbitrary-precision number - object and another object, imposing a total ordering on all - possible values. In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - The first arbitrary-precision number to - compare. - The second arbitrary-precision number to - compare. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects are null or equal, or -1 if - the first object is null or less than the other object, or 1 if the - first object is greater or the other object is null. Does not - signal flags if either value is signaling NaN. - - - Compares the absolute values of two arbitrary-precision - number objects, imposing a total ordering on all possible values - (ignoring their signs). In this method: - - For objects with the same value, the one with the higher - exponent has a greater "absolute value". - Negative zero and positive zero are considered equal. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - The first arbitrary-precision number to - compare. - The second arbitrary-precision number to - compare. - An arithmetic context. Flags will be set in this - context only if HasFlags and IsSimplified of the - context are true and only if an operand needed to be rounded before - carrying out the operation. Can be null. - The number 0 if both objects are null or equal (ignoring - their signs), or -1 if the first object is null or less than the - other object (ignoring their signs), or 1 if the first object is - greater (ignoring their signs) or the other object is null. Does - not signal flags if either value is signaling NaN. - - - Creates a copy of the given arbitrary-precision number - object. - An arbitrary-precision number object to - copy. - A copy of the given arbitrary-precision number - object. - The parameter is null. - - - Returns a canonical version of the given - arbitrary-precision number object. In this method, this method - behaves like the Copy method. - An arbitrary-precision number object. - A copy of the parameter . - - - Returns an arbitrary-precision number object with the same - value as the given number object but with a nonnegative sign (that - is, the given number object's absolute value). - An arbitrary-precision number object. - An arbitrary-precision number object with the same value - as the given number object but with a nonnegative sign. - The parameter is null. - - - Returns an arbitrary-precision number object with the sign - reversed from the given number object. - An arbitrary-precision number object. - An arbitrary-precision number object with the sign - reversed from the given number object. - The parameter is null. - - - Returns an arbitrary-precision number object with the same - value as the first given number object but with a the same sign - (positive or negative) as the second given number object. - An arbitrary-precision number object with the - value the result will have. - The parameter is an - arbitrary-precision binary floating-point number. - An arbitrary-precision number object with the same value - as the first given number object but with a the same sign (positive - or negative) as the second given number object. - The parameter or is null. - - - Returns whether two arbitrary-precision numbers have the - same exponent, they both are not-a-number (NaN), or they both are - infinity (positive and/or negative). - The first arbitrary-precision number. - The second arbitrary-precision number. - Either true if the given arbitrary-precision - numbers have the same exponent, they both are not-a-number (NaN), - or they both are infinity (positive and/or negative); otherwise, - false. - - - Returns an arbitrary-precision number with the same value - as this one but with certain trailing zeros removed from its - significand. If the number's exponent is 0, it is returned - unchanged (but may be rounded depending on the arithmetic context); - if that exponent is greater 0, its trailing zeros are removed from - the significand (then rounded if necessary); if that exponent is - less than 0, its trailing zeros are removed from the significand - until the exponent reaches 0 (then the number is rounded if - necessary). - An arbitrary-precision number. - An arithmetic context to control the precision, - rounding, and exponent range of the result. Can be null. - An arbitrary-precision number with the same value as this - one but with certain trailing zeros removed from its significand. - If is not-a-number (NaN) or infinity, it is - generally returned unchanged. - - - Returns an arbitrary-precision binary number with the same - value as this object but with the given exponent, expressed as an - arbitrary-precision binary number. - Note that this is not always the same as rounding to a given - number of binary places, since it can fail if the difference - between this value's exponent and the desired exponent is too big, - depending on the maximum precision. If rounding to a number of - binary places is desired, it's better to use the RoundToExponent - and RoundToIntegral methods instead. - Remark: This method can be used to implement - fixed-point binary arithmetic, in which a fixed number of digits - come after the binary point. A fixed-point binary arithmetic in - which no digits come after the binary point (a desired exponent of - 0) is considered an "integer arithmetic" . - An arbitrary-precision binary number whose - exponent is to be changed. - The desired exponent of the result, expressed - as an arbitrary-precision binary number. The exponent is the number - of fractional digits in the result, expressed as a negative number. - Can also be positive, which eliminates lower-order places from the - number. For example, -3 means round to the sixteenth (10b^-3, - 0.0001b), and 3 means round to the sixteens-place (10b^3, 1000b). A - value of 0 rounds the number to an integer. - An arithmetic context to control precision and - rounding of the result. If HasFlags of the context is true, - will also store the flags resulting from the operation (the flags - are in addition to the pre-existing flags). Can be null, in which - case the default rounding mode is HalfEven. - An arbitrary-precision binary number with the same value - as this object but with the exponent changed. Signals FlagInvalid - and returns not-a-number (NaN) if the result can't fit the given - precision without rounding, or if the arithmetic context defines an - exponent range and the given exponent is outside that - range. - - - Performs a logical AND operation on two binary numbers in - the form of - logical operands. A logical operand is a - non-negative base-2 number with an Exponent property of 0 (examples - include the base-2 numbers 01001 and 111001 ). The - logical AND operation sets each bit of the result to 1 if the - corresponding bits of each logical operand are both 1, and to 0 - otherwise. For example, 01001 AND 111010=01000. - The first logical operand to the logical AND - operation. - The second logical operand to the logical AND - operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more bits than the maximum precision - specified in this context, the operand's most significant bits that - exceed that precision are discarded. This parameter can be - null. - The result of the logical AND operation as a logical - operand. Signals an invalid operation and returns not-a-number - (NaN) if , , or both - are not logical operands. - - - Performs a logical NOT operation on a binary number in the - form of a - logical operand. A logical operand is a non-negative - base-2 number with an Exponent property of 0 (examples include - 01001 and 111001 ). The logical NOT operation sets - each bit of the result to 1 if the corresponding bit is 0, and to 0 - otherwise; it can set no more bits than the maximum precision, - however. For example, if the maximum precision is 8 bits, then - NOT 111010=11000101. - The operand to the logical NOT operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more bits than the maximum precision - specified in this context, the operand's most significant bits that - exceed that precision are discarded. This parameter cannot be null - and must specify a maximum precision (unlimited precision contexts - are not allowed). - The result of the logical NOT operation as a logical - operand. Signals an invalid operation and returns not-a-number - (NaN) if is not a logical operand. - - - Performs a logical exclusive-OR (XOR) operation on two - binary numbers in the form of - logical operands. A logical operand is a - non-negative base-2 number with an Exponent property of 0 (examples - include the base-2 numbers 01001 and 111001 ). The - logical exclusive-OR operation sets each digit of the result to 1 - if either corresponding digit of the logical operands, but not - both, is 1, and to 0 otherwise. For example, 01001 XOR 111010 = - 101010. - The first logical operand to the logical - exclusive-OR operation. - The second logical operand to the logical - exclusive-OR operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more bits than the maximum precision - specified in this context, the operand's most significant bits that - exceed that precision are discarded. This parameter can be - null. - The result of the logical exclusive-OR operation as a - logical operand. Signals an invalid operation and returns - not-a-number (NaN) if , , or both are not logical operands. - - - Performs a logical OR operation on two binary numbers in - the form of - logical operands. A logical operand is a - non-negative base-2 number with an Exponent property of 0 (examples - include the base-2 numbers 01001 and 111001 ). The - logical OR operation sets each bit of the result to 1 if either or - both of the corresponding bits of each logical operand are 1, and - to 0 otherwise. For example, 01001 OR 111010=111011. - The first logical operand to the logical OR - operation. - The second logical operand to the logical OR - operation. - An arithmetic context to control the maximum - precision of arbitrary-precision numbers. If a logical operand - passed to this method has more bits than the maximum precision - specified in this context, the operand's most significant bits that - exceed that precision are discarded. This parameter can be - null. - The result of the logical OR operation as a logical - operand. Signals an invalid operation and returns not-a-number - (NaN) if , , or both - are not logical operands. - - - Represents an arbitrary-precision integer. (The "E" stands - for "extended", and has this prefix to group it with the other - classes common to this library, particularly EDecimal, EFloat, and - ERational.) - Instances of this class are immutable, so they are inherently - safe for use by multiple threads. Multiple instances of this object - with the same value are interchangeable, but they should be - compared using the "Equals" method rather than the "==" - operator. - Security note - It is not recommended to implement security-sensitive - algorithms using the methods in this class, for several - reasons: - - EInteger objects are immutable, so they can't be - modified, and the memory they occupy is not guaranteed to be - cleared in a timely fashion due to garbage collection. This is - relevant for applications that use many-bit-long numbers as secret - parameters. - The methods in this class (especially those that involve - arithmetic) are not guaranteed to be "constant-time" - (non-data-dependent) for all relevant inputs. Certain attacks that - involve encrypted communications have exploited the timing and - other aspects of such communications to derive keying material or - cleartext indirectly. - Applications should instead use dedicated security libraries - to handle big numbers in security-sensitive - algorithms. - - - Gets the number 1 as an arbitrary-precision - integer. - The number 1 as an arbitrary-precision integer. - - - Gets the number 10 as an arbitrary-precision - integer. - The number 10 as an arbitrary-precision integer. - - - Gets the number zero as an arbitrary-precision - integer. - The number zero as an arbitrary-precision integer. - - - Gets a value indicating whether this value is - even. - true if this value is even; otherwise, false. - - - Gets a value indicating whether this object's value is a - power of two, and greater than 0. - true if this object's value is a power of two, and - greater than 0; otherwise, false. - - - Gets a value indicating whether this value is 0. - true if this value is 0; otherwise, false. - - - Gets the sign of this object's value. - The sign of this object's value. - - - Initializes an arbitrary-precision integer from an array - of bytes. - A byte array consisting of the two's-complement - form (see - "Forms of numbers" ) of - the arbitrary-precision integer to create. The byte array is - encoded using the rules given in the FromBytes(bytes, offset, - length, littleEndian) overload. - If true, the byte order is - little-endian, or least-significant-byte first. If false, the byte - order is big-endian, or most-significant-byte first. - An arbitrary-precision integer. Returns 0 if the byte - array's length is 0. - The parameter is null. - - - Initializes an arbitrary-precision integer from a portion - of an array of bytes. The portion of the byte array is encoded - using the following rules: - - Positive numbers have the first byte's highest bit cleared, - and negative numbers have the bit set. - The last byte contains the lowest 8-bits, the next-to-last - contains the next lowest 8 bits, and so on. For example, the number - 300 can be encoded as 0x01, 0x2C and 200 as 0x00, - 0xC8. (Note that the second example contains a set high bit in - 0xC8, so an additional 0 is added at the start to ensure - it's interpreted as positive.) - To encode negative numbers, take the absolute value of the - number, subtract by 1, encode the number into bytes, and toggle - each bit of each byte. Any further bits that appear beyond the most - significant bit of the number will be all ones. For example, the - number -450 can be encoded as 0xfe, 0x70 and -52869 as - 0xff, 0x31, 0x7B. (Note that the second example contains a - cleared high bit in 0x31, 0x7B, so an additional 0xff is - added at the start to ensure it's interpreted as - negative.) - For little-endian, the byte order is reversed from the byte - order just discussed. - A byte array consisting of the two's-complement - form (see - "Forms of numbers" ) of - the arbitrary-precision integer to create. The byte array is - encoded using the rules given in the FromBytes(bytes, offset, - length, littleEndian) overload. - An index starting at 0 showing where the - desired portion of begins. - The length, in bytes, of the desired portion - of (but not more than 's length). - If true, the byte order is - little-endian, or least-significant-byte first. If false, the byte - order is big-endian, or most-significant-byte first. - An arbitrary-precision integer. Returns 0 if the byte - array's length is 0. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Converts a boolean value (true or false) to an - arbitrary-precision integer. - Either true or false. - The number 1 if is true; - otherwise, 0. - - - Converts a 32-bit signed integer to an arbitrary-precision - integer. - The parameter is - a 32-bit signed integer. - An arbitrary-precision integer with the same value as the - 64-bit number. - - - Converts an unsigned integer expressed as a 64-bit signed - integer to an arbitrary-precision integer. - A 64-bit signed integer. If this value is - 0 or greater, the return value will represent it. If this value is - less than 0, the return value will store 2^64 plus this value - instead. - An arbitrary-precision integer. If is 0 or greater, the return value will - represent it. If is less than 0, the - return value will store 2^64 plus this value instead. - - - Converts a 64-bit signed integer to an arbitrary-precision - integer. - The parameter is a 64-bit signed integer. - An arbitrary-precision integer with the same value as the - 64-bit number. - - - Converts a string to an arbitrary-precision integer in a - given radix. - A string described by the FromRadixSubstring - method. - A base from 2 to 36. Depending on the radix, - the string can use the basic digits 0 to 9 (U+0030 to U+0039) and - then the basic upper-case letters A to Z (U+0041 to U+005A). For - example, 0-9 in radix 10, and 0-9, then A-F in radix 16. Where a - basic upper-case letter A to Z is allowed in the string, the - corresponding basic lower-case letter (U+0061 to U+007a) is allowed - instead. - An arbitrary-precision integer with the same value as the - given string. - The parameter is null. - The string is empty or in an - invalid format. - - - Converts a portion of a string to an arbitrary-precision - integer in a given radix. - A text string. The desired portion of the string - must contain only characters allowed by the given radix, except - that it may start with a minus sign ("-", U+002D) to indicate a - negative number. The desired portion is not allowed to contain - white space characters, including spaces. The desired portion may - start with any number of zeros. - A base from 2 to 36. Depending on the radix, - the string can use the basic digits 0 to 9 (U+0030 to U+0039) and - then the basic upper-case letters A to Z (U+0041 to U+005A). For - example, 0-9 in radix 10, and 0-9, then A-F in radix 16. Where a - basic upper-case letter A to Z is allowed in the string, the - corresponding basic lower-case letter (U+0061 to U+007a) is allowed - instead. - The index of the string that starts the string - portion. - The index of the string that ends the string - portion. The length will be index + endIndex - 1. - An arbitrary-precision integer with the same value as - given in the string portion. - The parameter is null. - The string portion is empty or in - an invalid format. - - - Converts a portion of a sequence of char s to an - arbitrary-precision integer. - A sequence of char s, the desired portion - of which describes an integer in base-10 (decimal) form. The - desired portion of the sequence of char s must contain only - basic digits 0 to 9 (U+0030 to U+0039), except that it may start - with a minus sign ("-", U+002D) to indicate a negative number. The - desired portion is not allowed to contain white space characters, - including spaces. The desired portion may start with any number of - zeros. - The index of the sequence of char s that - starts the desired portion. - The index of the sequence of char s - that ends the desired portion. The length will be index + endIndex - - 1. - An arbitrary-precision integer with the same value as - given in the sequence of char s portion. - The parameter is less than 0, is less - than 0, or either is greater than the sequence's length, or - is less than . - The parameter is null. - - - Converts a sequence of char s to an - arbitrary-precision integer. - A sequence of char s describing an integer - in base-10 (decimal) form. The sequence must contain only basic - digits 0 to 9 (U+0030 to U+0039), except that it may start with a - minus sign ("-", U+002D) to indicate a negative number. The - sequence is not allowed to contain white space characters, - including spaces. The sequence may start with any number of - zeros. - An arbitrary-precision integer with the same value as - given in the sequence of char s. - The parameter is in an invalid format. - The parameter is null. - - - Converts a sequence of char s to an - arbitrary-precision integer in a given radix. - A sequence of char s described by the - FromRadixSubstring method. - A base from 2 to 36. Depending on the radix, - the sequence of char s can use the basic digits 0 to 9 - (U+0030 to U+0039) and then the basic upper-case letters A to Z - (U+0041 to U+005A). For example, 0-9 in radix 10, and 0-9, then A-F - in radix 16. Where a basic upper-case letter A to Z is allowed in - the sequence of char s, the corresponding basic lower-case - letter (U+0061 to U+007a) is allowed instead. - An arbitrary-precision integer with the same value as the - given sequence of char s. - The parameter is null. - The sequence of char s is - empty or in an invalid format. - - - Converts a portion of a sequence of char s to an - arbitrary-precision integer in a given radix. - A text sequence of char s. The desired - portion of the sequence of char s must contain only - characters allowed by the given radix, except that it may start - with a minus sign ("-", U+002D) to indicate a negative number. The - desired portion is not allowed to contain white space characters, - including spaces. The desired portion may start with any number of - zeros. - A base from 2 to 36. Depending on the radix, - the sequence of char s can use the basic digits 0 to 9 - (U+0030 to U+0039) and then the basic upper-case letters A to Z - (U+0041 to U+005A). For example, 0-9 in radix 10, and 0-9, then A-F - in radix 16. Where a basic upper-case letter A to Z is allowed in - the sequence of char s, the corresponding basic lower-case - letter (U+0061 to U+007a) is allowed instead. - The index of the sequence of char s that - starts the desired portion. - The index of the sequence of char s - that ends the desired portion. The length will be index + endIndex - - 1. - An arbitrary-precision integer with the same value as - given in the sequence's portion. - The parameter is null. - The portion is empty or in an - invalid format. - - - Converts a portion of a sequence of bytes (interpreted as - text) to an arbitrary-precision integer. Each byte in the sequence - has to be a character in the Basic Latin range (0x00 to 0x7f or - U+0000 to U+007F) of the Unicode Standard. - A sequence of bytes (interpreted as text), the - desired portion of which describes an integer in base-10 (decimal) - form. The desired portion of the sequence of bytes (interpreted as - text) must contain only basic digits 0 to 9 (U+0030 to U+0039), - except that it may start with a minus sign ("-", U+002D) to - indicate a negative number. The desired portion is not allowed to - contain white space characters, including spaces. The desired - portion may start with any number of zeros. - The index of the sequence of bytes (interpreted - as text) that starts the desired portion. - The index of the sequence of bytes - (interpreted as text) that ends the desired portion. The length - will be index + endIndex - 1. - An arbitrary-precision integer with the same value as - given in the sequence of bytes (interpreted as text) - portion. - The parameter is less than 0, is less - than 0, or either is greater than the sequence's length, or - is less than . - The parameter is null. - - - Converts a sequence of bytes (interpreted as text) to an - arbitrary-precision integer. Each byte in the sequence has to be a - code point in the Basic Latin range (0x00 to 0x7f or U+0000 to - U+007F) of the Unicode Standard. - A sequence of bytes describing an integer in - base-10 (decimal) form. The sequence must contain only basic digits - 0 to 9 (U+0030 to U+0039), except that it may start with a minus - sign ("-", U+002D) to indicate a negative number. The sequence is - not allowed to contain white space characters, including spaces. - The sequence may start with any number of zeros. - An arbitrary-precision integer with the same value as - given in the sequence of bytes. - The parameter is in an invalid format. - The parameter is null. - - - Converts a sequence of bytes (interpreted as text) to an - arbitrary-precision integer in a given radix. Each byte in the - sequence has to be a character in the Basic Latin range (0x00 to - 0x7f or U+0000 to U+007F) of the Unicode Standard. - A sequence of bytes (interpreted as text) - described by the FromRadixSubstring method. - A base from 2 to 36. Depending on the radix, - the sequence of bytes can use the basic digits 0 to 9 (U+0030 to - U+0039) and then the basic upper-case letters A to Z (U+0041 to - U+005A). For example, 0-9 in radix 10, and 0-9, then A-F in radix - 16. Where a basic upper-case letter A to Z is allowed in the - sequence of bytes, the corresponding basic lower-case letter - (U+0061 to U+007a) is allowed instead. - An arbitrary-precision integer with the same value as the - given sequence of bytes. - The parameter is null. - The sequence of bytes - (interpreted as text) is empty or in an invalid format. - - - Converts a portion of a sequence of bytes (interpreted as - text) to an arbitrary-precision integer in a given radix. Each byte - in the sequence has to be a character in the Basic Latin range - (0x00 to 0x7f or U+0000 to U+007F) of the Unicode - Standard. - A sequence of bytes (interpreted as text). The - desired portion of the sequence of bytes (interpreted as text) must - contain only characters allowed by the given radix, except that it - may start with a minus sign ("-", U+002D) to indicate a negative - number. The desired portion is not allowed to contain white space - characters, including spaces. The desired portion may start with - any number of zeros. - A base from 2 to 36. Depending on the radix, - the sequence of bytes (interpreted as text) can use the basic - digits 0 to 9 (U+0030 to U+0039) and then the basic upper-case - letters A to Z (U+0041 to U+005A). For example, 0-9 in radix 10, - and 0-9, then A-F in radix 16. Where a basic upper-case letter A to - Z is allowed in the sequence of bytes (interpreted as text), the - corresponding basic lower-case letter (U+0061 to U+007a) is allowed - instead. - The index of the sequence of bytes (interpreted - as text) that starts the desired portion. - The index of the sequence of bytes - (interpreted as text) that ends the desired portion. The length - will be index + endIndex - 1. - An arbitrary-precision integer with the same value as - given in the sequence's portion. - The parameter is null. - The portion is empty or in an - invalid format. - - - Converts a string to an arbitrary-precision - integer. - A text string describing an integer in base-10 - (decimal) form. The string must contain only basic digits 0 to 9 - (U+0030 to U+0039), except that it may start with a minus sign - ("-", U+002D) to indicate a negative number. The string is not - allowed to contain white space characters, including spaces. The - string may start with any number of zeros. - An arbitrary-precision integer with the same value as - given in the string. - The parameter is in an invalid format. - The parameter is null. - - - Converts a portion of a string to an arbitrary-precision - integer. - A text string, the desired portion of which - describes an integer in base-10 (decimal) form. The desired portion - of the string must contain only basic digits 0 to 9 (U+0030 to - U+0039), except that it may start with a minus sign ("-", U+002D) - to indicate a negative number. The desired portion is not allowed - to contain white space characters, including spaces. The desired - portion may start with any number of zeros. - The index of the string that starts the string - portion. - The index of the string that ends the string - portion. The length will be index + endIndex - 1. - An arbitrary-precision integer with the same value as - given in the string portion. - The parameter is less than 0, is less - than 0, or either is greater than the string's length, or is less than . - The parameter is null. - - - Returns the absolute value of this object's - value. - This object's value with the sign removed. - - - Adds this arbitrary-precision integer and another - arbitrary-precision integer and returns the result. - Another arbitrary-precision - integer. - The sum of the two numbers, that is, this - arbitrary-precision integer plus another arbitrary-precision - integer. - The parameter is null. - - - Converts this object's value to a 32-bit signed integer, - throwing an exception if it can't fit. - A 32-bit signed integer. - This object's value - is too big to fit a 32-bit signed integer. - - - Converts this object's value to a 32-bit signed integer. - If the value can't fit in a 32-bit integer, returns the lower 32 - bits of this object's two's-complement form (see - "Forms of numbers" ) (in - which case the return value might have a different sign than this - object's value). - A 32-bit signed integer. - - - Converts this object's value to a 64-bit signed integer, - throwing an exception if it can't fit. - A 64-bit signed integer. - This object's value - is too big to fit a 64-bit signed integer. - - - Converts this object's value to a 64-bit signed integer. - If the value can't fit in a 64-bit integer, returns the lower 64 - bits of this object's two's-complement form (see - "Forms of numbers" ) (in - which case the return value might have a different sign than this - object's value). - A 64-bit signed integer. - - - Returns whether this object's value can fit in a 32-bit - signed integer. - true if this object's value is from -2147483648 - through 2147483647; otherwise, false. - - - Returns whether this object's value can fit in a 64-bit - signed integer. - true if this object's value is from - -9223372036854775808 through 9223372036854775807; otherwise, - false. - - - Compares an arbitrary-precision integer with this - instance. - The integer to compare to this value. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.CompareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Returns the greater of two arbitrary-precision - integers. - The first integer to compare. - The second integer to compare. - The greater of the two integers. - The parameter or is null. - - - Returns the smaller of two arbitrary-precision - integers. - The first integer to compare. - The second integer to compare. - The smaller of the two integers. - The parameter or is null. - - - Of two arbitrary-precision integers, returns the one with - the greater absolute value. If both integers have the same absolute - value, this method has the same effect as Max. - The first integer to compare. - The second integer to compare. - The integer with the greater absolute value. - The parameter or is null. - - - Of two arbitrary-precision integers, returns the one with - the smaller absolute value. If both integers have the same absolute - value, this method has the same effect as Min. - The first integer to compare. - The second integer to compare. - The integer with the smaller absolute value. - The parameter or is null. - - - Adds this arbitrary-precision integer and a 32-bit signed - integer and returns the result. - The parameter is - a 32-bit signed integer. - The sum of the two numbers, that is, this - arbitrary-precision integer plus a 32-bit signed integer. - - - Subtracts a 32-bit signed integer from this - arbitrary-precision integer and returns the result. - The parameter is - a 32-bit signed integer. - The difference between the two numbers, that is, this - arbitrary-precision integer minus a 32-bit signed - integer. - - - Multiplies this arbitrary-precision integer by a 32-bit - signed integer and returns the result. - The parameter is - a 32-bit signed integer. - The product of the two numbers, that is, this - arbitrary-precision integer times a 32-bit signed - integer. - - EInteger result = EInteger.FromString("5").Multiply(200); - . - - - - Divides this arbitrary-precision integer by a 32-bit - signed integer and returns the result. The result of the division - is rounded down (the fractional part is discarded). Except if the - result of the division is 0, it will be negative if this - arbitrary-precision integer is positive and the other 32-bit signed - integer is negative, or vice versa, and will be positive if both - are positive or both are negative. - The divisor. - The result of dividing this arbitrary-precision integer by - a 32-bit signed integer. The result of the division is rounded down - (the fractional part is discarded). Except if the result of the - division is 0, it will be negative if this arbitrary-precision - integer is positive and the other 32-bit signed integer is - negative, or vice versa, and will be positive if both are positive - or both are negative. - Attempted to divide by - zero. - - - Returns the remainder that would result when this - arbitrary-precision integer is divided by a 32-bit signed integer. - The remainder is the number that remains when the absolute value of - this arbitrary-precision integer is divided by the absolute value - of the other 32-bit signed integer; the remainder has the same sign - (positive or negative) as this arbitrary-precision - integer. - The parameter is - a 32-bit signed integer. - The remainder that would result when this - arbitrary-precision integer is divided by a 32-bit signed - integer. - Attempted to divide by - zero. - The parameter is null. - - - Compares an arbitrary-precision integer with this - instance. - The parameter is - a 32-bit signed integer. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is - greater. - - - Divides this arbitrary-precision integer by another - arbitrary-precision integer and returns the result. The result of - the division is rounded down (the fractional part is discarded). - Except if the result of the division is 0, it will be negative if - this arbitrary-precision integer is positive and the other - arbitrary-precision integer is negative, or vice versa, and will be - positive if both are positive or both are negative. - The divisor. - The result of dividing this arbitrary-precision integer by - another arbitrary-precision integer. The result of the division is - rounded down (the fractional part is discarded). Except if the - result of the division is 0, it will be negative if this - arbitrary-precision integer is positive and the other - arbitrary-precision integer is negative, or vice versa, and will be - positive if both are positive or both are negative. - The parameter is null. - Attempted to divide by - zero. - - - Divides this arbitrary-precision integer by a 32-bit - signed integer and returns a two-item array containing the result - of the division and the remainder, in that order. The result of the - division is rounded down (the fractional part is discarded). Except - if the result of the division is 0, it will be negative if this - arbitrary-precision integer is positive and the other 32-bit signed - integer is negative, or vice versa, and will be positive if both - are positive or both are negative. The remainder is the number that - remains when the absolute value of this arbitrary-precision integer - is divided by the absolute value of the other 32-bit signed - integer; the remainder has the same sign (positive or negative) as - this arbitrary-precision integer. - The number to divide by. - An array of two items: the first is the result of the - division as an arbitrary-precision integer, and the second is the - remainder as an arbitrary-precision integer. The result of division - is the result of the Divide method on the two operands, and the - remainder is the result of the Remainder method on the two - operands. - The parameter is 0. - - - Adds this arbitrary-precision integer and a 64-bit signed - integer and returns the result. - The parameter - is a 64-bit signed integer. - The sum of the two numbers, that is, this - arbitrary-precision integer plus a 64-bit signed integer. - - - Subtracts a 64-bit signed integer from this - arbitrary-precision integer and returns the result. - The parameter - is a 64-bit signed integer. - The difference between the two numbers, that is, this - arbitrary-precision integer minus a 64-bit signed - integer. - - - Multiplies this arbitrary-precision integer by a 64-bit - signed integer and returns the result. - The parameter - is a 64-bit signed integer. - The product of the two numbers, that is, this - arbitrary-precision integer times a 64-bit signed - integer. - - - Divides this arbitrary-precision integer by a 64-bit - signed integer and returns the result. The result of the division - is rounded down (the fractional part is discarded). Except if the - result of the division is 0, it will be negative if this - arbitrary-precision integer is positive and the other 64-bit signed - integer is negative, or vice versa, and will be positive if both - are positive or both are negative. - The parameter - is a 64-bit signed integer. - The result of dividing this arbitrary-precision integer by - a 64-bit signed integer. The result of the division is rounded down - (the fractional part is discarded). Except if the result of the - division is 0, it will be negative if this arbitrary-precision - integer is positive and the other 64-bit signed integer is - negative, or vice versa, and will be positive if both are positive - or both are negative. - - - Returns the remainder that would result when this - arbitrary-precision integer is divided by a 64-bit signed integer. - The remainder is the number that remains when the absolute value of - this arbitrary-precision integer is divided by the absolute value - of the other 64-bit signed integer; the remainder has the same sign - (positive or negative) as this arbitrary-precision - integer. - The parameter - is a 64-bit signed integer. - The remainder that would result when this - arbitrary-precision integer is divided by a 64-bit signed - integer. - - - Compares an arbitrary-precision integer with this - instance. - The parameter - is a 64-bit signed integer. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is - greater. - - - Divides this arbitrary-precision integer by a 64-bit - signed integer and returns a two-item array containing the result - of the division and the remainder, in that order. The result of the - division is rounded down (the fractional part is discarded). Except - if the result of the division is 0, it will be negative if this - arbitrary-precision integer is positive and the other 64-bit signed - integer is negative, or vice versa, and will be positive if both - are positive or both are negative. The remainder is the number that - remains when the absolute value of this arbitrary-precision integer - is divided by the absolute value of the other 64-bit signed - integer; the remainder has the same sign (positive or negative) as - this arbitrary-precision integer. - The parameter is a 64-bit signed integer. - An array of two items: the first is the result of the - division as an arbitrary-precision integer, and the second is the - remainder as an arbitrary-precision integer. The result of division - is the result of the Divide method on the two operands, and the - remainder is the result of the Remainder method on the two - operands. - - - Divides this arbitrary-precision integer by another - arbitrary-precision integer and returns a two-item array containing - the result of the division and the remainder, in that order. The - result of the division is rounded down (the fractional part is - discarded). Except if the result of the division is 0, it will be - negative if this arbitrary-precision integer is positive and the - other arbitrary-precision integer is negative, or vice versa, and - will be positive if both are positive or both are negative. The - remainder is the number that remains when the absolute value of - this arbitrary-precision integer is divided by the absolute value - of the other arbitrary-precision integer; the remainder has the - same sign (positive or negative) as this arbitrary-precision - integer. - The number to divide by. - An array of two items: the first is the result of the - division as an arbitrary-precision integer, and the second is the - remainder as an arbitrary-precision integer. The result of division - is the result of the Divide method on the two operands, and the - remainder is the result of the Remainder method on the two - operands. - The parameter is 0. - The parameter is null. - - - Determines whether this object and another object are - equal and have the same type. - The parameter is an - arbitrary object. - true if this object and another object are equal; - otherwise, false. - - - Returns the greatest common divisor of this integer and - the given integer. The greatest common divisor (GCD) is also known - as the greatest common factor (GCF). This method works even if - either or both integers are negative. - Another arbitrary-precision integer. Can - be negative. - The greatest common divisor of this integer and the given - integer. - The parameter is null. - Attempted to divide by - zero. - BigPower is - negative. - - - Returns the number of decimal digits used by this integer, - in the form of an arbitrary-precision integer. - The number of digits in the decimal form of this integer. - Returns 1 if this number is 0. - - - Returns the number of decimal digits used by this - integer. - The number of digits in the decimal form of this integer. - Returns 1 if this number is 0. - The return value would exceed - the range of a 32-bit signed integer. - - - Returns the number of decimal digits used by this integer, - in the form of a 64-bit signed integer. - The number of digits in the decimal form of this integer. - Returns 1 if this number is 0. Returns 2^63 - 1( - Int64.MaxValue in.NET or Long.MAX_VALUE in Java) if - the number of decimal digits is 2^63 - 1 or greater. (Use - GetDigitCountAsEInteger instead if the application relies on - the exact number of decimal digits.). - - - Returns the hash code for this instance. No application or - process IDs are used in the hash code calculation. - A 32-bit signed integer. - - - Gets the bit position of the lowest set bit in this - number's absolute value. (This will also be the position of the - lowest set bit in the number's two's-complement form (see - "Forms of numbers" - ).). - The bit position of the lowest bit set in the number's - absolute value, starting at 0. Returns -1 if this value is - 0. - - - Gets the bit position of the lowest set bit in this - number's absolute value, in the form of a 64-bit signed integer. - (This will also be the position of the lowest set bit in the - number's two's-complement form (see - "Forms of numbers" - ).). - The bit position of the lowest bit set in the number's - absolute value, starting at 0. Returns -1 if this value is 0 or - odd. Returns 2^63 - 1 ( Int64.MaxValue in.NET or - Long.MAX_VALUE in Java) if this number is other than zero - but the lowest set bit is at 2^63 - 1 or greater. (Use - GetLowBitAsEInteger instead if the application relies on the - exact value of the lowest set bit position.). - - - Gets the bit position of the lowest set bit in this - number's absolute value, in the form of an arbitrary-precision - integer. (This will also be the position of the lowest set bit in - the number's two's-complement form (see - "Forms of numbers" - ).). - The bit position of the lowest bit set in the number's - absolute value, starting at 0. Returns -1 if this value is 0 or - odd. - - - Returns whether a bit is set in the two's-complement form - (see - "Forms of numbers" ) of - this object's value. - The index, starting at zero, of the bit to - test, where 0 is the least significant bit, 1 is the next least - significant bit, and so on. - true if the given bit is set in the two' - s-complement form (see - "Forms of numbers" ) of - this object's value; otherwise, false. - The parameter is null. - - - Returns whether a bit is set in the two's-complement form - (see - "Forms of numbers" ) of - this object's value. - The index, starting at 0, of the bit to test, - where 0 is the least significant bit, 1 is the next least - significant bit, and so on. - true if the given bit is set in the two' - s-complement form (see - "Forms of numbers" ) of - this object's value; otherwise, false. - - - Finds the minimum number of bits needed to represent this - object's value, except for its sign, and returns that number of - bits as an arbitrary-precision integer. If the value is negative, - finds the number of bits in the value equal to this object's - absolute value minus 1. For example, all integers in the interval - [-(2^63), (2^63) - 1], which is the same as the range of integers - in Java's and.NET's long type, have a signed bit length of - 63 or less, and all other integers have a signed bit length of - greater than 63. - The number of bits in this object's value, except for its - sign. Returns 0 if this object's value is 0 or negative - 1. - - - Finds the minimum number of bits needed to represent this - object's value, except for its sign, and returns that number of - bits as a 64-bit signed integer. If the value is negative, finds - the number of bits in the value equal to this object's absolute - value minus 1. For example, all integers in the interval [-(2^63), - (2^63) - 1], which is the same as the range of integers in Java's - and.NET's long type, have a signed bit length of 63 or less, - and all other integers have a signed bit length of greater than - 63. - The number of bits in this object's value, except for its - sign. Returns 0 if this object's value is 0 or negative 1. If the - return value would be greater than 2^63 - 1 ( Int64.MaxValue - in.NET or Long.MAX_VALUE in Java), returns 2^63 - 1 instead. - (Use GetSignedBitLengthAsEInteger instead of this method if - the application relies on the exact number of bits.). - - - Finds the minimum number of bits needed to represent this - object's value, except for its sign. If the value is negative, - finds the number of bits in the value equal to this object's - absolute value minus 1. For example, all integers in the interval - [-(2^63), (2^63) - 1], which is the same as the range of integers - in Java's and.NET's long type, have a signed bit length of - 63 or less, and all other integers have a signed bit length of - greater than 63. - The number of bits in this object's value, except for its - sign. Returns 0 if this object's value is 0 or negative - 1. - The return value would exceed - the range of a 32-bit signed integer. - - - Returns whether a bit is set in this number's absolute - value. - The index, starting at zero, of the bit to - test, where 0 is the least significant bit, 1 is the next least - significant bit, and so on. - true if the given bit is set in this number's - absolute value. - The parameter is null. - - - Returns whether a bit is set in this number's absolute - value. - The index, starting at 0, of the bit to test, - where 0 is the least significant bit, 1 is the next least - significant bit, and so on. - true if the given bit is set in this number's - absolute value. - - - Finds the minimum number of bits needed to represent this - number's absolute value, and returns that number of bits as an - arbitrary-precision integer. For example, all integers in the - interval [-((2^63) - 1), (2^63) - 1] have an unsigned bit length of - 63 or less, and all other integers have an unsigned bit length of - greater than 63. This interval is not the same as the range of - integers in Java's and.NET's long type. - The number of bits in this object's absolute value. - Returns 0 if this object's value is 0, and returns 1 if the value - is negative 1. - - - Finds the minimum number of bits needed to represent this - number's absolute value, and returns that number of bits as a - 64-bit signed integer. For example, all integers in the interval - [-((2^63) - 1), (2^63) - 1] have an unsigned bit length of 63 or - less, and all other integers have an unsigned bit length of greater - than 63. This interval is not the same as the range of integers in - Java's and.NET's long type. - The number of bits in this object's absolute value. - Returns 0 if this object's value is 0, and returns 1 if the value - is negative 1. If the return value would be greater than 2^63 - 1( - Int64.MaxValue in.NET or Long.MAX_VALUE in Java), - returns 2^63 - 1 instead. (Use - GetUnsignedBitLengthAsEInteger instead of this method if the - application relies on the exact number of bits.). - - - Finds the minimum number of bits needed to represent this - number's absolute value. For example, all integers in the interval - [-((2^63) - 1), (2^63) - 1] have an unsigned bit length of 63 or - less, and all other integers have an unsigned bit length of greater - than 63. This interval is not the same as the range of integers in - Java's and.NET's long type. - The number of bits in this object's absolute value. - Returns 0 if this object's value is 0, and returns 1 if the value - is negative 1. - The return value would exceed - the range of a 32-bit signed integer. - - - Finds the modulus remainder that results when this - instance is divided by the value of an arbitrary-precision integer. - The modulus remainder is the same as the normal remainder if the - normal remainder is positive, and equals divisor plus normal - remainder if the normal remainder is negative. - The number to divide by. - An arbitrary-precision integer. - The parameter is less than 0. - The parameter is null. - - - Finds the modulus remainder that results when this - instance is divided by the value of another integer. The modulus - remainder is the same as the normal remainder if the normal - remainder is positive, and equals divisor plus normal remainder if - the normal remainder is negative. - The divisor of the modulus. - The modulus remainder. - The parameter is less than 0. - - - Calculates the remainder when this arbitrary-precision - integer raised to a certain power is divided by another - arbitrary-precision integer. - The power to raise this integer by. - The integer to divide the raised number - by. - An arbitrary-precision integer. - The parameter or is null. - - - Multiplies this arbitrary-precision integer by another - arbitrary-precision integer and returns the result. - Another arbitrary-precision - integer. - The product of the two numbers, that is, this - arbitrary-precision integer times another arbitrary-precision - integer. - The parameter is null. - - - Gets the value of this object with the sign - reversed. - This object's value with the sign reversed. - - - Raises an arbitrary-precision integer to a - power. - The exponent to raise this integer - to. - The result. Returns 1 if is - 0. - BigPower is - negative. - - - Raises an arbitrary-precision integer to a - power. - The exponent to raise this integer - to. - The result. Returns 1 if is - 0. - The parameter is null. - BigPower is - negative. - - - Raises an arbitrary-precision integer to a - power. - The exponent to raise this integer - to. - The result. Returns 1 if is - 0. - - - Raises an arbitrary-precision integer to a power, which is - given as another arbitrary-precision integer. - The exponent to raise to. - The result. Returns 1 if is - 0. - The parameter is less than 0. - The parameter is null. - - - Returns the remainder that would result when this - arbitrary-precision integer is divided by another - arbitrary-precision integer. The remainder is the number that - remains when the absolute value of this arbitrary-precision integer - is divided by the absolute value of the other arbitrary-precision - integer; the remainder has the same sign (positive or negative) as - this arbitrary-precision integer. - The number to divide by. - The remainder that would result when this - arbitrary-precision integer is divided by another - arbitrary-precision integer. - Attempted to divide by - zero. - The parameter is null. - - - Returns an arbitrary-precision integer with the bits - shifted to the right. For this operation, the arbitrary-precision - integer is treated as a two's-complement form (see - "Forms of numbers" ). - Thus, for negative values, the arbitrary-precision integer is - sign-extended. - The number of bits to shift. Can be negative, - in which case this is the same as ShiftLeft with the absolute value - of this parameter. - An arbitrary-precision integer. - The parameter is null. - - - Returns an arbitrary-precision integer with the bits - shifted to the left by a number of bits given as an - arbitrary-precision integer. A value of 1 doubles this value, a - value of 2 multiplies it by 4, a value of 3 by 8, a value of 4 by - 16, and so on. - The number of bits to shift. Can be negative, - in which case this is the same as ShiftRight with the absolute - value of this parameter. - An arbitrary-precision integer. - The parameter is null. - - - Returns an arbitrary-precision integer with the bits - shifted to the left by a number of bits. A value of 1 doubles this - value, a value of 2 multiplies it by 4, a value of 3 by 8, a value - of 4 by 16, and so on. - The number of bits to shift. Can be - negative, in which case this is the same as shiftRight with the - absolute value of this parameter. - An arbitrary-precision integer. - - - Returns an arbitrary-precision integer with every bit - flipped from this one (also called an inversion or NOT - operation). - An arbitrary-precision integer in which each bit in its - two's complement representation is set if the corresponding bit of - this integer is clear, and vice versa. Returns -1 if this integer - is 0. If this integer is positive, the return value is negative, - and vice versa. This method uses the two's complement form of - negative integers (see - "Forms of numbers" ). For - example, in binary, NOT 10100 = ...11101011 (or in decimal, NOT 20 - = -21). In binary, NOT ...11100110 = 11001 (or in decimal, NOT -26 - = 25). - - - Extracts the lowest bits of this integer. This is - equivalent to And(2^longBitCount - 1), but is more - efficient when this integer is non-negative and longBitCount's - value is large. - The number of bits to extract from the - lowest part of this integer. - A value equivalent to And(2^longBitCount - 1). - - - Extracts the lowest bits of this integer. This is - equivalent to And(2^bitCount - 1), but is more efficient - when this integer is non-negative and bitCount's value is - large. - The number of bits to extract from the - lowest part of this integer. - A value equivalent to And(2^bitCount - 1). - - - Extracts the lowest bits of this integer. This is - equivalent to And(2^bigBitCount - 1), but is more efficient - when this integer is non-negative and bigBitCount's value is - large. - The number of bits to extract from the - lowest part of this integer. - A value equivalent to And(2^bigBitCount - 1). - The parameter is null. - - - Does an AND operation between this arbitrary-precision - integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bits of this integer and the other integer (in - their two's-complement representation) are both set. For example, - in binary, 10110 AND 01100 = 00100 (or in decimal, 22 AND 12 = 4). - This method uses the two's complement form of negative integers - (see - "Forms of numbers" ). For - example, in binary, ...11100111 AND 01100 = 00100 (or in decimal, - -25 AND 12 = 4). - The parameter is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an OR operation between this arbitrary-precision - integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bit of this integer is set, the other integer's - corresponding bit is set, or both. For example, in binary, 10110 OR - 11010 = 11110 (or in decimal, 22 OR 26 = 30). This method uses the - two's complement form of negative integers (see - "Forms of numbers" ). For - example, in binary, ...11101110 OR 01011 = ...11101111 (or in - decimal, -18 OR 11 = -17). - The parameter is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an AND NOT operation between this arbitrary-precision - integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bit of this integer is set, and the other - integer's corresponding bit is - not set. For example, in binary, 10110 AND NOT 11010 = 00100 - (or in decimal, 22 AND NOT 26 = 4). This method uses the two's - complement form of negative integers (see - "Forms of numbers" ). For - example, in binary, ...11101110 AND NOT 01011 = 00100 (or in - decimal, -18 OR 11 = 4). - The parameter is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an OR NOT operation between this arbitrary-precision - integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bit of this integer is set, the other integer's - corresponding bit is - not set, or both. For example, in binary, 10110 OR NOT 11010 - = 00100 (or in decimal, 22 OR NOT 26 = 23). This method uses the - two's complement form of negative integers (see - "Forms of numbers" ). For - example, in binary, ...11101110 OR NOT 01011 = ...11111110 (or in - decimal, -18 OR 11 = -2). - The parameter is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an OR NOT operation between this arbitrary-precision - integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bit of this integer is set, the other integer's - corresponding bit is - not set, or both. For example, in binary, 10110 OR NOT 11010 - = 00100 (or in decimal, 22 OR NOT 26 = 23). This method uses the - two's complement form of negative integers (see - "Forms of numbers" ). For - example, in binary, ...11101110 OR NOT 01011 = ...11111110 (or in - decimal, -18 OR 11 = -2). - The parameter is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an XOR NOT operation (or equivalence operation, EQV - operation, or exclusive-OR NOT operation) between this - arbitrary-precision integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bit of this integer is set or the other integer's - corresponding bit is - not set, but not both. For example, in binary, 10110 XOR NOT - 11010 = 10011 (or in decimal, 22 XOR NOT 26 = 19). This method uses - the two's complement form of negative integers (see - "Forms of numbers" ). For - example, in binary, ...11101110 XOR NOT 01011 = ...11111010 (or in - decimal, -18 OR 11 = -6). - The parameter is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an XOR NOT operation (or equivalence operation, EQV - operation, or exclusive-OR NOT operation) between this - arbitrary-precision integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bit of this integer is set or the other integer's - corresponding bit is - not set, but not both. For example, in binary, 10110 XOR NOT - 11010 = 10011 (or in decimal, 22 XOR NOT 26 = 19). This method uses - the two's complement form of negative integers (see - "Forms of numbers" ). For - example, in binary, ...11101110 XOR NOT 01011 = ...11111010 (or in - decimal, -18 OR 11 = -6). - The parameter is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an exclusive OR (XOR) operation between this - arbitrary-precision integer and another one. - Another arbitrary-precision integer that - participates in the operation. - An arbitrary-precision integer in which each bit is set if - the corresponding bit is set in one input integer but not in the - other. For example, in binary, 11010 XOR 01001 = 10011 (or in - decimal, 26 XOR 9 = 19). This method uses the two's complement form - of negative integers (see - "Forms of numbers" ). For - example, in binary, ...11101101 XOR 00011 = ...11101110 (or in - decimal, -19 XOR 3 = -18). - The parameter is null. - - - Returns an arbitrary-precision integer with the bits - shifted to the right. For this operation, the arbitrary-precision - integer is treated as a two's-complement form (see - "Forms of numbers" ). - Thus, for negative values, the arbitrary-precision integer is - sign-extended. - The number of bits to shift. Can be - negative, in which case this is the same as shiftLeft with the - absolute value of this parameter. - An arbitrary-precision integer. - - - Finds the square root of this instance's value, rounded - down. - The square root of this object's value. Returns 0 if this - value is 0 or less. - - - Calculates the square root and the remainder. - An array of two arbitrary-precision integers: the first - integer is the square root, and the second is the difference - between this value and the square of the first integer. Returns two - zeros if this value is 0 or less, or one and zero if this value - equals 1. - - - Finds the nth root of this instance's value, rounded - down. - The root to find; must be 1 or greater. If this - value is 2, this method finds the square root; if 3, the cube root, - and so on. - The square root of this object's value. Returns 0 if this - value is 0 or less. - The parameter is null. - - - Calculates the nth root and the remainder. - The root to find; must be 1 or greater. If this - value is 2, this method finds the square root; if 3, the cube root, - and so on. - An array of two arbitrary-precision integers: the first - integer is the nth root, and the second is the difference between - this value and the nth power of the first integer. Returns two - zeros if this value is 0 or less, or one and zero if this value - equals 1. - The parameter is null. - - - Finds the nth root of this instance's value, rounded - down. - The root to find; must be 1 or greater. If this - value is 2, this method finds the square root; if 3, the cube root, - and so on. - The square root of this object's value. Returns 0 if this - value is 0 or less. - - - Calculates the nth root and the remainder. - The root to find; must be 1 or greater. If this - value is 2, this method finds the square root; if 3, the cube root, - and so on. - An array of two arbitrary-precision integers: the first - integer is the nth root, and the second is the difference between - this value and the nth power of the first integer. Returns two - zeros if this value is 0 or less, or one and zero if this value - equals 1. - - - Subtracts an arbitrary-precision integer from this - arbitrary-precision integer and returns the result. - Another arbitrary-precision - integer. - The difference between the two numbers, that is, this - arbitrary-precision integer minus another arbitrary-precision - integer. - The parameter is null. - - - Returns a byte array of this integer's value. The byte - array will take the number's two's-complement form (see - "Forms of numbers" ), - using the fewest bytes necessary to store its value unambiguously. - If this value is negative, the bits that appear beyond the most - significant bit of the number will be all ones. The resulting byte - array can be passed to the FromBytes() method (with the same - byte order) to reconstruct this integer's value. - See the 'littleEndian' parameter of the - FromBytes() method. - A byte array. If this value is 0, returns a byte array - with the single element 0. - - - Converts this object's value to a 32-bit signed integer, - throwing an exception if it can't fit. - A 32-bit signed integer. - This object's value - is too big to fit a 32-bit signed integer. - - - Converts this object's value to a 32-bit signed integer. - If the value can't fit in a 32-bit integer, returns the lower 32 - bits of this object's two's-complement form (see - "Forms of numbers" ) (in - which case the return value might have a different sign than this - object's value). - A 32-bit signed integer. - - - Converts this object's value to a 64-bit signed integer, - throwing an exception if it can't fit. - A 64-bit signed integer. - This object's value - is too big to fit a 64-bit signed integer. - - - Converts this object's value to a 64-bit signed integer. - If the value can't fit in a 64-bit integer, returns the lower 64 - bits of this object's two's-complement form (see - "Forms of numbers" ) (in - which case the return value might have a different sign than this - object's value). - A 64-bit signed integer. - - - Generates a string representing the value of this object, - in the given radix. - A radix from 2 through 36. For example, to - generate a hexadecimal (base-16) string, specify 16. To generate a - decimal (base-10) string, specify 10. - A string representing the value of this object. If this - value is 0, returns "0". If negative, the string will begin with a - minus sign ("-", U+002D). Depending on the radix, the string will - use the basic digits 0 to 9 (U+0030 to U+0039) and then the basic - upper-case letters A to Z (U+0041 to U+005A). For example, 0-9 in - radix 10, and 0-9, then A-F in radix 16. - - - Converts this object to a text string in base - 10. - A string representation of this object. If this value is - 0, returns "0". If negative, the string will begin with a minus - sign ("-", U+002D). The string will use the basic digits 0 to 9 - (U+0030 to U+0039). - - - Returns one added to this arbitrary-precision - integer. - The given arbitrary-precision integer plus one. - - - Returns one subtracted from this arbitrary-precision - integer. - The given arbitrary-precision integer minus one. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255). - This number's value as a byte (from 0 to 255). - This value is less than 0 or - greater than 255. - - - Converts this number to a byte (from 0 to 255), returning - the least-significant bits of this number's two's-complement - form. - This number, converted to a byte (from 0 to - 255). - - - Converts a byte (from 0 to 255) to an arbitrary-precision - integer. - The number to convert as a byte (from 0 to - 255). - This number's value as an arbitrary-precision - integer. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer. - This number's value as a 16-bit signed integer. - This value is less than -32768 - or greater than 32767. - - - Converts this number to a 16-bit signed integer, returning - the least-significant bits of this number's two's-complement - form. - This number, converted to a 16-bit signed - integer. - - - Converts a 16-bit signed integer to an arbitrary-precision - integer. - The number to convert as a 16-bit signed - integer. - This number's value as an arbitrary-precision - integer. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision integer. - The number to convert as a 64-bit unsigned - integer. - The value of as an - arbitrary-precision integer. - - - Adds an arbitrary-precision integer and another - arbitrary-precision integer and returns the result. - The first operand. - The second operand. - The sum of the two numbers, that is, an - arbitrary-precision integer plus another arbitrary-precision - integer. - The parameter is null. - - - Subtracts two arbitrary-precision integer - values. - An arbitrary-precision integer. - Another arbitrary-precision - integer. - The difference of the two objects. - The parameter is null. - - - Adds one to an arbitrary-precision integer. - An arbitrary-precision integer. - The given arbitrary-precision integer plus one. - The parameter is null. - - - Subtracts one from an arbitrary-precision - integer. - An arbitrary-precision integer. - The given arbitrary-precision integer minus one. - The parameter is null. - - - Multiplies an arbitrary-precision integer by another - arbitrary-precision integer and returns the result. - The first operand. - The second operand. - The product of the two numbers, that is, an - arbitrary-precision integer times another arbitrary-precision - integer. - The parameter is null. - - - Divides an arbitrary-precision integer by the value of an - arbitrary-precision integer object. - The number that will be divided by the - divisor. - The number to divide by. - The quotient of the two objects. - The parameter is null. - - - Returns the remainder that would result when an - arbitrary-precision integer is divided by another - arbitrary-precision integer. The remainder is the number that - remains when the absolute value of an arbitrary-precision integer - is divided by the absolute value of the other arbitrary-precision - integer; the remainder has the same sign (positive or negative) as - this arbitrary-precision integer. - The first operand. - The number to divide by. - The remainder that would result when an - arbitrary-precision integer is divided by another - arbitrary-precision integer. - The parameter is null. - - - Returns an arbitrary-precision integer with the bits - shifted to the left by a number of bits. A value of 1 doubles this - value, a value of 2 multiplies it by 4, a value of 3 by 8, a value - of 4 by 16, and so on. - The arbitrary-precision integer to shift - left. - The number of bits to shift. Can be - negative, in which case this is the same as shiftRight with the - absolute value of this parameter. - An arbitrary-precision integer. - The parameter is null. - - - Calculates the remainder when an arbitrary-precision - integer raised to a certain power is divided by another - arbitrary-precision integer. - The starting operand. - The power to raise this integer by. - The integer to divide the raised number - by. - The value ( ^ )% . - The parameter is null. - - - Shifts the bits of an arbitrary-precision integer to the - right. - Another arbitrary-precision integer. - The parameter is a 32-bit signed integer. - An arbitrary-precision integer. - The parameter is null. - For this operation, the arbitrary-precision integer is - treated as a two's-complement form (see - "Forms of numbers" ). - Thus, for negative values, the arbitrary-precision integer is - sign-extended. - - - Negates an arbitrary-precision integer. - An arbitrary-precision integer to - negate. - An arbitrary-precision integer. - The parameter is null. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer. - This number's value as a 64-bit signed integer. - This value is outside the range - of a 64-bit signed integer. - - - Converts this number to a 64-bit signed integer, returning - the least-significant bits of this number's two's-complement - form. - This number, converted to a 64-bit signed - integer. - - - Determines whether an arbitrary-precision integer is less - than another arbitrary-precision integer. - The first arbitrary-precision - integer. - The second arbitrary-precision - integer. - true if is less than - ; otherwise, false. - - - Determines whether an arbitrary-precision integer is up to - another arbitrary-precision integer. - The first arbitrary-precision - integer. - The second arbitrary-precision - integer. - true if is up to - ; otherwise, false. - - - Determines whether an arbitrary-precision integer is - greater than another arbitrary-precision integer. - The first arbitrary-precision - integer. - The second arbitrary-precision - integer. - true if is greater - than ; otherwise, false. - - - Determines whether an arbitrary-precision integer value is - greater than another arbitrary-precision integer. - The first arbitrary-precision - integer. - The second arbitrary-precision - integer. - true if is at least - ; otherwise, false. - - - Returns an arbitrary-precision integer with every bit - flipped. - The operand as an arbitrary-precision - integer. - An arbitrary-precision integer. - The parameter is null. - - - Does an AND operation between two arbitrary-precision - integer values. For each bit of the result, that bit is 1 if the - corresponding bits of the two operands are both 1, or is 0 - otherwise. - The first operand. - The second operand. - The result of the operation. - The parameter "a" or "b" is - null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an OR operation between two arbitrary-precision - integer instances. For each bit of the result, that bit is 1 if - either or both of the corresponding bits of the two operands are 1, - or is 0 otherwise. - An arbitrary-precision integer. - Another arbitrary-precision - integer. - The result of the operation. - The parameter "first" or - "second" is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Finds the exclusive "or" of two arbitrary-precision - integer objects. For each bit of the result, that bit is 1 if - either of the corresponding bits of the two operands, but not both, - is 1, or is 0 otherwise. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - The first arbitrary-precision integer. - The second arbitrary-precision integer. - An arbitrary-precision integer in which each bit is set if - it's set in one input integer but not the other. - The parameter or is null. - - - Retrieves bits from this integer's two's-complement - form. - Zero-based index of the first bit to retrieve, - where 0 is the least-significant bit of the number. - The number of bits to retrieve, starting - with the first. Must be from 0 through 64. - A 64-bit signed integer containing the bits from this - integer's two's-complement form. The least significant bit is the - first bit, and any unused bits are set to 0. - - - Divides this arbitrary-precision integer by another - arbitrary-precision integer and returns a two-item array containing - the result of the division and the remainder, in that order. The - result of the division is rounded down (the fractional part is - discarded). Except if the result of the division is 0, it will be - negative if this arbitrary-precision integer is positive and the - other arbitrary-precision integer is negative, or vice versa, and - will be positive if both are positive or both are negative. The - remainder is the number that remains when the absolute value of - this arbitrary-precision integer is divided by the absolute value - of the other arbitrary-precision integer; the remainder has the - same sign (positive or negative) as this arbitrary-precision - integer. - The arbitrary-precision integer to be - divided. - The arbitrary-precision integer to divide - by. - An arbitrary-precision integer. - An array of two items: the first is the result of the - division as an arbitrary-precision integer, and the second is the - remainder as an arbitrary-precision integer. The result of division - is the result of the Divide method on the two operands, and the - remainder is the result of the Remainder method on the two - operands. - The parameter or is - null. - - - Determines whether this object and another object are - equal. - Another arbitrary-precision integer. - true if this object and another object are equal; - otherwise, false. - - - Returns an arbitrary-precision integer with every bit - flipped. - The operand as an arbitrary-precision - integer. - An arbitrary-precision integer. - The parameter is null. - - - Does an AND operation between two arbitrary-precision - integer values. - The first arbitrary-precision integer. - The second arbitrary-precision integer. - An arbitrary-precision integer in which each bit is set if - the corresponding bits of the two integers are both set. - The parameter or is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Does an OR operation between two arbitrary-precision - integer instances. - The first operand. - The second operand. - An arbitrary-precision integer. - The parameter or is null. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - - - Finds the exclusive "or" of two arbitrary-precision - integer objects. - Each arbitrary-precision integer is treated as a - two's-complement form (see - "Forms of numbers" ) for - the purposes of this operator. - The first arbitrary-precision integer. - The second arbitrary-precision integer. - An arbitrary-precision integer in which each bit is set if - the corresponding bit is set in one input integer but not in the - other. - The parameter or is null. - - - Converts an arbitrary-precision integer to a byte (from 0 - to 255) if it can fit in a byte (from 0 to 255). - The number to convert as an arbitrary-precision - integer. - The value of as a byte (from 0 to - 255). - The parameter is less than 0 or greater than 255. - The parameter is null. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - integer. - Either true or false. - The value of as an - arbitrary-precision integer. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - integer. - The number to convert as a byte (from 0 to - 255). - The value of as an - arbitrary-precision integer. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer. - This number's value as an 8-bit signed integer. - This value is less than -128 or - greater than 127. - - - Converts this number to an 8-bit signed integer, returning - the least-significant bits of this number's two's-complement - form. - This number, converted to an 8-bit signed - integer. - - - Converts an 8-bit signed integer to an arbitrary-precision - integer. - The number to convert as an 8-bit signed - integer. - This number's value as an arbitrary-precision - integer. - - - Converts an arbitrary-precision integer to an 8-bit signed - integer if it can fit in an 8-bit signed integer. - The number to convert as an arbitrary-precision - integer. - The value of as an 8-bit signed - integer. - The parameter is less than -128 or greater than 127. - The parameter is null. - - - Converts an 8-bit signed integer to an arbitrary-precision - integer. - The number to convert as an 8-bit signed - integer. - The value of as an - arbitrary-precision integer. - - - Converts an arbitrary-precision integer to a 16-bit signed - integer if it can fit in a 16-bit signed integer. - The number to convert as an arbitrary-precision - integer. - The value of as a 16-bit signed - integer. - The parameter is less than -32768 or greater than - 32767. - The parameter is null. - - - Converts a 16-bit signed integer to an arbitrary-precision - integer. - The number to convert as a 16-bit signed - integer. - The value of as an - arbitrary-precision integer. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer. - This number's value as a 16-bit unsigned - integer. - This value is less than 0 or - greater than 65535. - - - Converts this number to a 16-bit unsigned integer, - returning the least-significant bits of this number's - two's-complement form. - This number, converted to a 16-bit unsigned - integer. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision integer. - The number to convert as a 16-bit - unsigned integer. - This number's value as an arbitrary-precision - integer. - - - Converts an arbitrary-precision integer to a 16-bit - unsigned integer if it can fit in a 16-bit unsigned - integer. - The number to convert as an arbitrary-precision - integer. - The value of as a 16-bit unsigned - integer. - The parameter is less than 0 or greater than 65535. - The parameter is null. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision integer. - The number to convert as a 16-bit - unsigned integer. - The value of as an - arbitrary-precision integer. - - - Converts an arbitrary-precision integer to a 32-bit signed - integer if it can fit in a 32-bit signed integer. - The number to convert as an arbitrary-precision - integer. - The value of as a 32-bit signed - integer. - The parameter is less than -2147483648 or greater than - 2147483647. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - integer. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision integer. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer. - This number's value as a 32-bit signed integer. - This value is less than 0 or - greater than 4294967295. - - - Converts this number to a 32-bit signed integer, returning - the least-significant bits of this number's two's-complement - form. - This number, converted to a 32-bit signed - integer. - - - Converts a 32-bit signed integer to an arbitrary-precision - integer. - The number to convert as a 32-bit signed - integer. - This number's value as an arbitrary-precision - integer. - - - Converts an arbitrary-precision integer to a 32-bit signed - integer if it can fit in a 32-bit signed integer. - The number to convert as an arbitrary-precision - integer. - The value of as a 32-bit signed - integer. - The parameter is less than 0 or greater than - 4294967295. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - integer. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision integer. - - - Converts an arbitrary-precision integer to a 64-bit signed - integer if it can fit in a 64-bit signed integer. - The number to convert as an arbitrary-precision - integer. - The value of as a 64-bit signed - integer. - The parameter is less than -9223372036854775808 or greater than - 9223372036854775807. - The parameter is null. - - - Converts a 64-bit signed integer to an arbitrary-precision - integer. - The number to convert as a 64-bit signed - integer. - The value of as an - arbitrary-precision integer. - - - Converts an arbitrary-precision integer to a 64-bit - unsigned integer if it can fit in a 64-bit unsigned - integer. - The number to convert as an arbitrary-precision - integer. - The value of as a 64-bit unsigned - integer. - The parameter is less than 0 or greater than - 18446744073709551615. - The parameter is null. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision integer. - The number to convert as a 64-bit - unsigned integer. - The value of as an - arbitrary-precision integer. - - - Represents an arbitrary-precision rational number. This - class can't be inherited. (The "E" stands for "extended", meaning - that instances of this class can be values other than numbers - proper, such as infinity and not-a-number.) In this class, a - rational number consists of a numerator and denominator, each an - arbitrary-precision integer (EInteger), and this class does not - automatically convert rational numbers to lowest terms. - Thread safety: Instances of this class are immutable, - so they are inherently safe for use by multiple threads. Multiple - instances of this object with the same properties are - interchangeable, so they should not be compared using the "==" - operator (which might only check if each side of the operator is - the same instance). - - - A not-a-number value. - - - Negative infinity, less than any other number. - - - A rational number for negative zero. - - - The rational number one. - - - Positive infinity, greater than any other - number. - - - A signaling not-a-number value. - - - The rational number ten. - - - A rational number for zero. - - - Initializes a new instance of the - class. - An arbitrary-precision integer serving as - the numerator. - An arbitrary-precision integer serving as - the denominator. - The parameter or is - null. - Denominator is - zero. - - - Creates a copy of this arbitrary-precision rational - number. - An arbitrary-precision rational number. - - - Gets this object's denominator. - This object's denominator. - - - Gets a value indicating whether this object is finite (not - infinity or NaN). - true if this object is finite (not infinity or NaN); - otherwise, false. - - - Gets a value indicating whether this object's value is - negative (including negative zero). - true if this object's value is negative (including - negative zero); otherwise, false. true if this - object's value is negative; otherwise, false. - - - Gets a value indicating whether this object's value equals - 0. - true if this object's value equals 0; otherwise, - false. true if this object's value equals 0; - otherwise, false. - - - Returns whether this object's value is an - integer. - true if this object's value is an integer; - otherwise, false. - - - Gets this object's numerator. - This object's numerator. If this object is a not-a-number - value, returns the diagnostic information (which will be negative - if this object is negative). - - - Gets the sign of this rational number. - The sign of this rational number. - - - Gets this object's numerator with the sign - removed. - This object's numerator. If this object is a not-a-number - value, returns the diagnostic information. - - - Creates a rational number with the given numerator and - denominator. - The numerator. - The denominator. - An arbitrary-precision rational number. - The denominator is - zero. - - - Creates a rational number with the given numerator and - denominator. - The numerator. - The denominator. - An arbitrary-precision rational number. - The denominator is - zero. - - - Creates a rational number with the given numerator and - denominator. - The numerator. - The denominator. - An arbitrary-precision rational number. - The denominator is - zero. - The parameter or is - null. - - - Creates a not-a-number arbitrary-precision rational - number. - An integer, 0 or greater, to use as diagnostic - information associated with this object. If none is needed, should - be zero. To get the diagnostic information from another - arbitrary-precision rational number, use that object's - UnsignedNumerator property. - An arbitrary-precision rational number. - The parameter is less than 0. - - - Creates a not-a-number arbitrary-precision rational - number. - An integer, 0 or greater, to use as diagnostic - information associated with this object. If none is needed, should - be zero. To get the diagnostic information from another - arbitrary-precision rational number, use that object's - UnsignedNumerator property. - Whether the return value will be signaling - (true) or quiet (false). - Whether the return value is - negative. - An arbitrary-precision rational number. - The parameter is less than 0. - The parameter is null. - - - Converts a 64-bit floating-point number to a rational - number. This method computes the exact value of the floating point - number, not an approximation, as is often the case by converting - the number to a string. - The input value can be a not-a-number (NaN) value (such as - Double.NaN ); however, NaN values have multiple forms that - are equivalent for many applications' purposes, and - Double.NaN is only one of these equivalent forms. In fact, - ERational.FromDouble(Double.NaN) could produce an object - that is represented differently between DotNet and Java, because - Double.NaN may have a different form in DotNet and Java (for - example, the NaN value's sign may be negative in DotNet, but - positive in Java). Use `IsNaN()` to determine whether an object - from this class stores a NaN value of any form. - The parameter is a 64-bit - floating-point number. - A rational number with the same value as . - - - Converts an arbitrary-precision decimal number to a - rational number. - The number to convert as an arbitrary-precision - decimal number. - An arbitrary-precision rational number. - - - Converts an arbitrary-precision binary floating-point - number to a rational number. - The number to convert as an arbitrary-precision - binary floating-point number. - An arbitrary-precision rational number. - - - Converts an arbitrary-precision decimal number to a - rational number. - The number to convert as an arbitrary-precision - decimal number. - An arbitrary-precision rational number. - The parameter is null. - doesn't satisfy den.Sign - &gt;= 0. - - - Converts an arbitrary-precision binary floating-point - number to a rational number. - The number to convert as an arbitrary-precision - binary floating-point number. - An arbitrary-precision rational number. - The parameter is null. - - - Converts an arbitrary-precision integer to a rational - number. - The number to convert as an - arbitrary-precision integer. - The exact value of the integer as a rational - number. - - - Converts a 32-bit binary floating-point number to a - rational number. This method computes the exact value of the - floating point number, not an approximation, as is often the case - by converting the number to a string. - The input value can be a not-a-number (NaN) value (such as - Single.NaN in DotNet or Float.NaN in Java); however, NaN - values have multiple forms that are equivalent for many - applications' purposes, and Single.NaN / Float.NaN is - only one of these equivalent forms. In fact, - ERational.FromSingle(Single.NaN) or - ERational.FromSingle(Float.NaN) could produce an object that - is represented differently between DotNet and Java, because - Single.NaN / Float.NaN may have a different form in - DotNet and Java (for example, the NaN value's sign may be negative - in DotNet, but positive in Java). Use `IsNaN()` to determine - whether an object from this class stores a NaN value of any - form. - The parameter is a 32-bit - binary floating-point number. - A rational number with the same value as . - - - Creates a binary rational number from a 32-bit - floating-point number encoded in the IEEE 754 binary32 format. This - method computes the exact value of the floating point number, not - an approximation, as is often the case by converting the number to - a string. - A 32-bit integer encoded in the IEEE 754 - binary32 format. - A rational number with the same floating-point value as - . - - - Creates a binary rational number from a 64-bit - floating-point number encoded in the IEEE 754 binary64 format. This - method computes the exact value of the floating point number, not - an approximation, as is often the case by converting the number to - a string. - A 64-bit integer encoded in the IEEE 754 - binary64 format. - A rational number with the same floating-point value as - . - - - Creates a rational number from a text string that - represents a number. See FromString(String, int, int) for - more information. - A string that represents a number. - An arbitrary-precision rational number with the same value - as the given string. - The parameter is not a correctly formatted number - string. - - - - Creates a rational number from a text string that represents - a number. - The format of the string generally consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if '-' , the value is negative.) - The numerator in the form of one or more digits (these digits - may begin with any number of zeros). - Optionally, "/" followed by the denominator in the form of - one or more digits (these digits may begin with any number of - zeros). If a denominator is not given, it's equal to - 1. - The string can also be "-INF", "-Infinity", "Infinity", - "INF", quiet NaN ("NaN" /"-NaN") followed by any number of digits, - or signaling NaN ("sNaN" /"-sNaN") followed by any number of - digits, all in any combination of upper and lower case. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The string is not - allowed to contain white space characters, including - spaces. - A text string, a portion of which represents a - number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision rational number. - The parameter is not a correctly formatted number - string. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less than - . - - - Creates a rational number from a sequence of char s - that represents a number. See FromString(String, int, int) - for more information. - A sequence of char s that represents a - number. - An arbitrary-precision rational number with the same value - as the given sequence of char s. - The parameter is not a correctly formatted sequence of char - s. - - - - Creates a rational number from a sequence of char s - that represents a number. - The format of the sequence of char s generally - consists of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if '-' , the value is negative.) - The numerator in the form of one or more digits (these digits - may begin with any number of zeros). - Optionally, "/" followed by the denominator in the form of - one or more digits (these digits may begin with any number of - zeros). If a denominator is not given, it's equal to - 1. - The sequence of char s can also be "-INF", - "-Infinity", "Infinity", "INF", quiet NaN ("NaN" /"-NaN") followed - by any number of digits, or signaling NaN ("sNaN" /"-sNaN") - followed by any number of digits, all in any combination of upper - and lower case. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The sequence of - char s is not allowed to contain white space characters, - including spaces. - A sequence of char s, a portion of which - represents a number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision rational number. - The parameter is not a correctly formatted sequence of char - s. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Creates a rational number from a sequence of bytes that - represents a number. See FromString(String, int, int) for - more information. - A sequence of bytes that represents a - number. - An arbitrary-precision rational number with the same value - as the given sequence of bytes. - The parameter is not a correctly formatted sequence of - bytes. - - - - Creates a rational number from a sequence of bytes that - represents a number. - The format of the sequence of bytes generally consists - of: - - An optional plus sign ("+" , U+002B) or minus sign ("-", - U+002D) (if '-' , the value is negative.) - The numerator in the form of one or more digits (these digits - may begin with any number of zeros). - Optionally, "/" followed by the denominator in the form of - one or more digits (these digits may begin with any number of - zeros). If a denominator is not given, it's equal to - 1. - The sequence of bytes can also be "-INF", "-Infinity", - "Infinity", "INF", quiet NaN ("NaN" /"-NaN") followed by any number - of digits, or signaling NaN ("sNaN" /"-sNaN") followed by any - number of digits, all in any combination of upper and lower - case. - All characters mentioned above are the corresponding - characters in the Basic Latin range. In particular, the digits must - be the basic digits 0 to 9 (U+0030 to U+0039). The sequence of - bytes is not allowed to contain white space characters, including - spaces. - A sequence of bytes, a portion of which - represents a number. - An index starting at 0 showing where the - desired portion of begins. - The length, in code units, of the desired - portion of (but not more than 's length). - An arbitrary-precision rational number. - The parameter is not a correctly formatted sequence of - bytes. - The parameter is null. - Either or is less than 0 or - greater than 's length, or 's length minus is less - than . - - - Compares the absolute values of this object and another - object, imposing a total ordering on all possible values (ignoring - their signs). In this method: - - For objects with the same value, the one with the higher - denominator has a greater "absolute value". - Negative zero and positive zero are considered equal. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - An arbitrary-precision rational number to - compare with this one. - The number 0 if both objects have the same value, or -1 if - this object is less than the other value, or 1 if this object is - greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the values of this object and another object, - imposing a total ordering on all possible values. In this method: - - For objects with the same value, the one with the higher - denominator has a greater "absolute value". - Negative zero is less than positive zero. - Quiet NaN has a higher "absolute value" than signaling NaN. - If both objects are quiet NaN or both are signaling NaN, the one - with the higher diagnostic information has a greater "absolute - value". - NaN has a higher "absolute value" than infinity. - Infinity has a higher "absolute value" than any finite - number. - Negative numbers are less than positive - numbers. - An arbitrary-precision rational number to - compare with this one. - The number 0 if both objects have the same value, or -1 if - this object is less than the other value, or 1 if this object is - greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Returns the absolute value of this rational number, that - is, a number with the same value as this one but as a nonnegative - number. - An arbitrary-precision rational number. - - - Adds this arbitrary-precision rational number and another - arbitrary-precision rational number and returns the - result. - Another arbitrary-precision rational - number. - The sum of the two numbers, that is, this - arbitrary-precision rational number plus another - arbitrary-precision rational number. - The parameter is null. - - - Compares the mathematical value of an arbitrary-precision - rational number with that of this instance. This method currently - uses the rules given in the CompareToValue method, so that it it is - not consistent with the Equals method, but it may change in a - future version to use the rules for the CompareToTotal method - instead. - An arbitrary-precision rational number. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares the mathematical value of an arbitrary-precision - rational number with that of this instance. In this method, NaN - values are greater than any other ERational value, and two NaN - values (even if their payloads differ) are treated as equal by this - method. This method is not consistent with the Equals - method. - An arbitrary-precision rational number. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Gets the greater value between two rational - numbers. - An arbitrary-precision rational number. - Another arbitrary-precision rational - number. - The larger value of the two numbers. If one is positive - zero and the other is negative zero, returns the positive zero. If - the two numbers are positive and have the same value, returns the - one with the larger denominator. If the two numbers are negative - and have the same value, returns the one with the smaller - denominator. - The parameter or is null. - - - Gets the greater value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Max. - The first value to compare. - The second value to compare. - The larger value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Gets the lesser value between two rational - numbers. - The first value to compare. - The second value to compare. - The smaller value of the two numbers. If one is positive - zero and the other is negative zero, returns the negative zero. If - the two numbers are positive and have the same value, returns the - one with the smaller denominator. If the two numbers are negative - and have the same value, returns the one with the larger - denominator. - The parameter or is null. - - - Gets the lesser value between two values, ignoring their - signs. If the absolute values are equal, has the same effect as - Min. - The first value to compare. - The second value to compare. - The smaller value of the two numbers, ignoring their - signs. - The parameter or is null. - - - Compares the mathematical value of an arbitrary-precision - rational number with that of this instance. This method currently - uses the rules given in the CompareToValue method, so that it it is - not consistent with the Equals method, but it may change in a - future version to use the rules for the CompareToTotal method - instead. - The parameter is - a 32-bit signed integer. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is - greater. - - - Compares the mathematical value of an arbitrary-precision - rational number with that of this instance. In this method, NaN - values are greater than any other ERational value, and two NaN - values (even if their payloads differ) are treated as equal by this - method. This method is not consistent with the Equals - method. - The parameter is - a 32-bit signed integer. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is - greater. - - - Compares the mathematical values of this object and - another object, accepting NaN values. - This method is not consistent with the Equals method because - two different numbers with the same mathematical value, but - different exponents, will compare as equal. - In this method, negative zero and positive zero are - considered equal. - If this object is a quiet NaN or signaling NaN, this method - will not trigger an error. Instead, NaN will compare greater than - any other number, including infinity. - The parameter is - a 64-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares the mathematical values of this object and - another object, accepting NaN values. This method currently uses - the rules given in the CompareToValue method, so that it it is not - consistent with the Equals method, but it may change in a future - version to use the rules for the CompareToTotal method - instead. - The parameter is - a 64-bit signed integer. - Less than 0 if this object's value is less than the other - value, or greater than 0 if this object's value is greater than the - other value, or 0 if both values are equal. - - - Compares an arbitrary-precision binary floating-point - number with this instance. In this method, NaN values are greater - than any other ERational or EFloat value, and two NaN values (even - if their payloads differ) are treated as equal by this - method. - An arbitrary-precision binary floating-point - number. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Compares an arbitrary-precision decimal number with this - instance. - An arbitrary-precision decimal number. - Zero if the values are equal; a negative number if this - instance is less, or a positive number if this instance is greater. - This implementation returns a positive number if is null, to conform to the.NET definition of - CompareTo. This is the case even in the Java version of this - library, for consistency's sake, even though implementations of - Comparable.compareTo() in Java ought to throw an exception - if they receive a null argument rather than treating null as less - or greater than any object.. - - - Returns a number with the same value as this one, but - copying the sign (positive or negative) of another - number. - A number whose sign will be copied. - An arbitrary-precision rational number. - The parameter is null. - - - Divides this arbitrary-precision rational number by - another arbitrary-precision rational number and returns the - result. - An arbitrary-precision rational - number. - The result of dividing this arbitrary-precision rational - number by another arbitrary-precision rational number. - The parameter is null. - - - Determines whether this object's numerator, denominator, - and properties are equal to those of another object and that other - object is an arbitrary-precision rational number. Not-a-number - values are considered equal if the rest of their properties are - equal. This is not the same as value equality. Notably, two - ERationals with the same value, but of which one is in lowest terms - and the other is not, are compared as unequal by this method - (example: 1/2 vs. 5/10). - The parameter is an - arbitrary object. - true if the objects are equal; otherwise, - false. In this method, two objects are not equal if they - don't have the same type or if one is null and the other - isn't. - - - Determines whether this object's numerator, denominator, - and properties are equal to those of another object. Not-a-number - values are considered equal if the rest of their properties are - equal. - An arbitrary-precision rational number to - compare to. - Either true or false. - - - Returns the hash code for this instance. No application or - process IDs are used in the hash code calculation. - A 32-bit signed integer. - - - Gets a value indicating whether this object's value is - infinity. - true if this object's value is infinity; otherwise, - false. - - - Returns whether this object is a not-a-number - value. - true if this object is a not-a-number value; - otherwise, false. - - - Returns whether this object is negative - infinity. - true if this object is negative infinity; - otherwise, false. - - - Returns whether this object is positive - infinity. - true if this object is positive infinity; - otherwise, false. - - - Returns whether this object is a quiet not-a-number - value. - true if this object is a quiet not-a-number value; - otherwise, false. - - - Returns whether this object is a signaling not-a-number - value (which causes an error if the value is passed to any - arithmetic operation in this class). - true if this object is a signaling not-a-number - value (which causes an error if the value is passed to any - arithmetic operation in this class); otherwise, false. - - - Multiplies this arbitrary-precision rational number by - another arbitrary-precision rational number and returns the - result. - An arbitrary-precision rational - number. - The product of the two numbers, that is, this - arbitrary-precision rational number times another - arbitrary-precision rational number. - The parameter is null. - - - Returns a rational number with the same value as this one - but with the sign reversed. - An arbitrary-precision rational number. - - - Returns the remainder that would result when this - arbitrary-precision rational number is divided by another - arbitrary-precision rational number. - An arbitrary-precision rational - number. - The remainder that would result when this - arbitrary-precision rational number is divided by another - arbitrary-precision rational number. - The parameter is null. - - - Subtracts an arbitrary-precision rational number from this - arbitrary-precision rational number and returns the - result. - An arbitrary-precision rational - number. - The difference between the two numbers, that is, this - arbitrary-precision rational number minus another - arbitrary-precision rational number. - The parameter is null. - - - Converts this value to a 64-bit floating-point number. The - half-even rounding mode is used. - The closest 64-bit floating-point number to this value. - The return value can be positive infinity or negative infinity if - this value exceeds the range of a 64-bit floating point - number. - - - Converts this value to its closest equivalent as a 64-bit - floating-point number, expressed as an integer in the IEEE 754 - binary64 format. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 64-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. - The closest 64-bit binary floating-point number to this - value, expressed as an integer in the IEEE 754 binary64 format. The - return value can be positive infinity or negative infinity if this - value exceeds the range of a 64-bit floating point - number. - - - Converts this value to its closest equivalent as 32-bit - floating-point number, expressed as an integer in the IEEE 754 - binary32 format. The half-even rounding mode is used. - If this value is a NaN, sets the high bit of the 32-bit - floating point number's significand area for a quiet NaN, and - clears it for a signaling NaN. Then the other bits of the - significand area are set to the lowest bits of this object's - unsigned significand, and the next-highest bit of the significand - area is set if those bits are all zeros and this is a signaling - NaN. - The closest 32-bit binary floating-point number to this - value, expressed as an integer in the IEEE 754 binary32 format. The - return value can be positive infinity or negative infinity if this - value exceeds the range of a 32-bit floating point - number. - - - Converts this value to its form in lowest terms. For - example, (8/4) becomes (4/1). - An arbitrary-precision rational with the same value as - this one but in lowest terms. Returns this object if it is infinity - or NaN. Returns ERational.NegativeZero if this object is a negative - zero. Returns ERational.Zero if this object is a positive - zero. - This object's value is infinity - or not-a-number (NaN). - - - Converts this value to an arbitrary-precision integer by - dividing the numerator by the denominator, discarding its - fractional part, and checking whether the resulting integer - overflows the given signed bit count. - The maximum number of signed bits the - integer can have. The integer's value may not be less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN), or this number's value, once converted to an - integer by dividing the numerator by the denominator and discarding - its fractional part, is less than -(2^maxBitLength) or greater than - (2^maxBitLength) - 1. - - - Converts this value to an arbitrary-precision integer, - only if this number's value is an exact integer and that integer - does not overflow the given signed bit count. - The maximum number of signed bits the - integer can have. The integer's value may not be less than - -(2^maxBitLength) or greater than (2^maxBitLength) - 1. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN), or this number's value as an integer is less - than -(2^maxBitLength) or greater than (2^maxBitLength) - - 1. - This object's value is not an - exact integer. - - - Converts this value to an arbitrary-precision integer by - dividing the numerator by the denominator and discarding the - fractional part of the result. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - - - Converts this value to an arbitrary-precision integer, - checking whether the value is an exact integer. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - - - Converts this value to an arbitrary-precision integer, - checking whether the value is an exact integer. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - - - Converts this rational number to an arbitrary-precision - decimal number. - The exact value of the rational number, or not-a-number - (NaN) if the result can't be exact because it has a nonterminating - decimal expansion. - - - Converts this rational number to an arbitrary-precision - decimal number and rounds the result to the given - precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. If HasFlags - of the context is true, will also store the flags resulting from - the operation (the flags are in addition to the pre-existing - flags). Can be null, in which case the precision is unlimited and - no rounding is needed. - The value of the rational number, rounded to the given - precision. Returns not-a-number (NaN) if the context is null and - the result can't be exact because it has a nonterminating decimal - expansion. - - - Converts this rational number to an arbitrary-precision - decimal number, but if the result would have a nonterminating - decimal expansion, rounds that result to the given - precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only if the exact result would have a nonterminating - decimal expansion. If HasFlags of the context is true, will also - store the flags resulting from the operation (the flags are in - addition to the pre-existing flags). Can be null, in which case the - precision is unlimited and no rounding is needed. - The exact value of the rational number if possible; - otherwise, the rounded version of the result if a context is given. - Returns not-a-number (NaN) if the context is null and the result - can't be exact because it has a nonterminating decimal - expansion. - - - Converts this rational number to an arbitrary-precision - decimal number. - The exact value of the rational number, or not-a-number - (NaN) if the result can't be exact because it has a nonterminating - decimal expansion. - - - Converts this rational number to an arbitrary-precision - decimal number and rounds the result to the given - precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. If HasFlags - of the context is true, will also store the flags resulting from - the operation (the flags are in addition to the pre-existing - flags). Can be null, in which case the precision is unlimited and - no rounding is needed. - The value of the rational number, rounded to the given - precision. Returns not-a-number (NaN) if the context is null and - the result can't be exact because it has a nonterminating decimal - expansion. - - - Converts this rational number to an arbitrary-precision - decimal number, but if the result would have a nonterminating - decimal expansion, rounds that result to the given - precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only if the exact result would have a nonterminating - decimal expansion. If HasFlags of the context is true, will also - store the flags resulting from the operation (the flags are in - addition to the pre-existing flags). Can be null, in which case the - precision is unlimited and no rounding is needed. - The exact value of the rational number if possible; - otherwise, the rounded version of the result if a context is given. - Returns not-a-number (NaN) if the context is null and the result - can't be exact because it has a nonterminating decimal - expansion. - - - Converts this rational number to a binary floating-point - number. - The exact value of the rational number, or not-a-number - (NaN) if the result can't be exact because it has a nonterminating - binary expansion. - - - Converts this rational number to a binary floating-point - number and rounds that result to the given precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. If HasFlags - of the context is true, will also store the flags resulting from - the operation (the flags are in addition to the pre-existing - flags). Can be null, in which case the precision is unlimited and - no rounding is needed. - The value of the rational number, rounded to the given - precision. Returns not-a-number (NaN) if the context is null and - the result can't be exact because it has a nonterminating binary - expansion. - - - Converts this rational number to a binary floating-point - number, but if the result would have a nonterminating binary - expansion, rounds that result to the given precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only if the exact result would have a nonterminating - binary expansion. If HasFlags of the context is true, will also - store the flags resulting from the operation (the flags are in - addition to the pre-existing flags). Can be null, in which case the - precision is unlimited and no rounding is needed. - The exact value of the rational number if possible; - otherwise, the rounded version of the result if a context is given. - Returns not-a-number (NaN) if the context is null and the result - can't be exact because it has a nonterminating binary - expansion. - - - Converts this rational number to a binary floating-point - number. - The exact value of the rational number, or not-a-number - (NaN) if the result can't be exact because it has a nonterminating - binary expansion. - - - Converts this rational number to a binary floating-point - number and rounds that result to the given precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. If HasFlags - of the context is true, will also store the flags resulting from - the operation (the flags are in addition to the pre-existing - flags). Can be null, in which case the precision is unlimited and - no rounding is needed. - The value of the rational number, rounded to the given - precision. Returns not-a-number (NaN) if the context is null and - the result can't be exact because it has a nonterminating binary - expansion. - - - Converts this rational number to a binary floating-point - number, but if the result would have a nonterminating binary - expansion, rounds that result to the given precision. - An arithmetic context object to control the - precision, rounding, and exponent range of the result. This context - will be used only if the exact result would have a nonterminating - binary expansion. If HasFlags of the context is true, will also - store the flags resulting from the operation (the flags are in - addition to the pre-existing flags). Can be null, in which case the - precision is unlimited and no rounding is needed. - The exact value of the rational number if possible; - otherwise, the rounded version of the result if a context is given. - Returns not-a-number (NaN) if the context is null and the result - can't be exact because it has a nonterminating binary - expansion. - - - Converts this value to a 32-bit binary floating-point - number. The half-even rounding mode is used. - The closest 32-bit binary floating-point number to this - value. The return value can be positive infinity or negative - infinity if this value exceeds the range of a 32-bit floating point - number. - - - Converts this object to a text string. - A string representation of this object. If this object's - value is infinity or not-a-number, the result is the analogous - return value of the EDecimal.ToString method. Otherwise, the - return value has the following form: - [-]numerator/denominator. - - - Adds one to an arbitrary-precision rational - number. - The given arbitrary-precision rational number plus - one. - - - Subtracts one from an arbitrary-precision rational - number. - The given arbitrary-precision rational number minus - one. - - - Adds this arbitrary-precision rational number and a 32-bit - signed integer and returns the result. - A 32-bit signed integer. - The sum of the two numbers, that is, this - arbitrary-precision rational number plus a 32-bit signed - integer. - - - Subtracts a 32-bit signed integer from this - arbitrary-precision rational number and returns the - result. - The parameter is a 32-bit - signed integer. - The difference between the two numbers, that is, this - arbitrary-precision rational number minus a 32-bit signed - integer. - - - Multiplies this arbitrary-precision rational number by a - 32-bit signed integer and returns the result. - The parameter is a 32-bit - signed integer. - The product of the two numbers, that is, this - arbitrary-precision rational number times a 32-bit signed - integer. - - - Divides this arbitrary-precision rational number by a - 32-bit signed integer and returns the result. - The parameter is a 32-bit - signed integer. - The result of dividing this arbitrary-precision rational - number by a 32-bit signed integer. - The parameter is zero. - - - Returns the remainder that would result when this - arbitrary-precision rational number is divided by a 32-bit signed - integer. - The divisor. - The remainder that would result when this - arbitrary-precision rational number is divided by a 32-bit signed - integer. - The parameter is zero. - - - Adds this arbitrary-precision rational number and a 64-bit - signed integer and returns the result. - A 64-bit signed integer. - The sum of the two numbers, that is, this - arbitrary-precision rational number plus a 64-bit signed - integer. - - - Subtracts a 64-bit signed integer from this - arbitrary-precision rational number and returns the - result. - The parameter is a 64-bit - signed integer. - The difference between the two numbers, that is, this - arbitrary-precision rational number minus a 64-bit signed - integer. - - - Multiplies this arbitrary-precision rational number by a - 64-bit signed integer and returns the result. - The parameter is a 64-bit - signed integer. - The product of the two numbers, that is, this - arbitrary-precision rational number times a 64-bit signed - integer. - - - Divides this arbitrary-precision rational number by a - 64-bit signed integer and returns the result. - The parameter is a 64-bit - signed integer. - The result of dividing this arbitrary-precision rational - number by a 64-bit signed integer. - The parameter is zero. - - - Returns the remainder that would result when this - arbitrary-precision rational number is divided by a 64-bit signed - integer. - The divisor. - The remainder that would result when this - arbitrary-precision rational number is divided by a 64-bit signed - integer. - The parameter is zero. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a byte (from 0 to - 255). - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 255. - - - Converts this number's value to an integer (using - ToEInteger), and returns the least-significant bits of that - integer's two's-complement form as a byte (from 0 to - 255). - This number, converted to a byte (from 0 to 255). Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a byte (from 0 to 255) if - it can fit in a byte (from 0 to 255) without rounding to a - different numerical value. - This number's value as a byte (from 0 to 255). - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 255. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - rational number. - The number to convert as a byte (from 0 to - 255). - This number's value as an arbitrary-precision rational - number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 16-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -32768 or greater than - 32767. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit signed integer. - This number, converted to a 16-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit signed integer if - it can fit in a 16-bit signed integer without rounding to a - different numerical value. - This number's value as a 16-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -32768 or - greater than 32767. - - - Converts a 16-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 16-bit signed - integer. - This number's value as an arbitrary-precision rational - number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -2147483648 or greater - than 2147483647. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -2147483648 - or greater than 2147483647. - - - Converts a boolean value (true or false) to an - arbitrary-precision rational number. - Either true or false. - The number 1 if is true; - otherwise, 0. - - - Converts a 32-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 32-bit signed - integer. - This number's value as an arbitrary-precision rational - number. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 64-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -9223372036854775808 - or greater than 9223372036854775807. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit signed integer. - This number, converted to a 64-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit signed integer if - it can fit in a 64-bit signed integer without rounding to a - different numerical value. - This number's value as a 64-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than - -9223372036854775808 or greater than - 9223372036854775807. - - - Converts an unsigned integer expressed as a 64-bit signed - integer to an arbitrary-precision rational number. - A 64-bit signed integer. If this value is - 0 or greater, the return value will represent it. If this value is - less than 0, the return value will store 2^64 plus this value - instead. - An arbitrary-precision rational number. If is 0 or greater, the return value will - represent it. If is less than 0, the - return value will store 2^64 plus this value instead. - - - Converts a 64-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 64-bit signed - integer. - This number's value as an arbitrary-precision rational - number. - - - Converts a boolean value (true or false) to an - arbitrary-precision rational number. - Either true or false. - 1 if is true; otherwise, - 0. - - - Converts an arbitrary-precision integer to an - arbitrary-precision rational number. - An arbitrary-precision integer. - An arbitrary-precision rational number. - - - Converts an arbitrary-precision decimal floating-point - number to an arbitrary-precision rational number. - The parameter is an - arbitrary-precision decimal floating-point number. - An arbitrary-precision rational number. - - - Converts an arbitrary-precision binary floating-point - number to an arbitrary-precision rational number. - An arbitrary-precision binary floating-point - number. - An arbitrary-precision rational number. - - - Converts a decimal under the Common Language - Infrastructure (usually a.NET Framework decimal) to a rational - number. - The number to convert as a decimal under - the Common Language Infrastructure (usually a.NET Framework - decimal). - An arbitrary-precision rational number. - - - Converts a decimal under the Common Language - Infrastructure (usually a.NET Framework decimal). to an - arbitrary-precision rational number. - A decimal under the Common Language - Infrastructure (usually a.NET Framework decimal). - An arbitrary-precision rational number. - - - Converts a 32-bit binary floating-point number to a - rational number. - The parameter is a - 32-bit binary floating-point number. - The value of as an - arbitrary-precision rational number. - - - Converts a 64-bit floating-point number to an - arbitrary-precision rational number. - The parameter is a - 64-bit floating-point number. - An arbitrary-precision rational number. - - - Adds an arbitrary-precision rational number and another - arbitrary-precision rational number and returns the - result. - The first operand. - The second operand. - The sum of the two numbers, that is, an - arbitrary-precision rational number plus another - arbitrary-precision rational number. - The parameter "otherValue" - is null. - - - Subtracts an arbitrary-precision rational number from this - instance. - The first operand. - The second operand. - The difference of the two objects. - The parameter "otherValue" - is null. - - - Adds one to an arbitrary-precision rational - number. - An arbitrary-precision rational number. - The number given in plus - one. - The parameter is null. - - - Subtracts one from an arbitrary-precision rational - number. - An arbitrary-precision rational number. - The number given in minus - one. - The parameter is null. - - - Multiplies an arbitrary-precision rational number by - another arbitrary-precision rational number and returns the - result. - The first operand. - The second operand. - The product of the two numbers, that is, an - arbitrary-precision rational number times another - arbitrary-precision rational number. - The parameter "otherValue" - is null. - - - Divides an arbitrary-precision rational number by the - value of another arbitrary-precision rational number - object. - An arbitrary-precision rational number - serving as the dividend. - An arbitrary-precision rational number - serving as the divisor. - The quotient of the two objects. - The parameter "otherValue" - is null. - - - Returns the remainder that would result when an - arbitrary-precision rational number is divided by another - arbitrary-precision rational number. - The dividend. - The divisor. - The remainder that would result when an - arbitrary-precision rational number is divided by another - arbitrary-precision rational number. - The parameter "otherValue" - is null. - - - Returns an arbitrary-precision rational number with the - same value as the given one but with its sign reversed. - An arbitrary-precision rational number to - negate. - An arbitrary-precision rational number. - The parameter is null. - - - Converts this value to a decimal under the Common - Language Infrastructure (usually a.NET Framework decimal). - Currently, converts this value to the precision and range of a.NET - Framework decimal. - A decimal under the Common Language Infrastructure - (usually a.NET Framework decimal). - - - Converts an arbitrary-precision rational number to a - decimal under the Common Language Infrastructure (see - "Forms of numbers" - ). - The number to convert as an - arbitrary-precision rational number. - A decimal under the Common Language Infrastructure - (usually a.NET Framework decimal). - The parameter is null. - - - Converts an arbitrary-precision rational number to an - arbitrary-precision integer. Any fractional part in the value will - be discarded when converting to an arbitrary-precision - integer. - An arbitrary-precision rational - number. - An arbitrary-precision integer. - This object's value is infinity - or not-a-number (NaN). - The parameter is null. - - - Converts an arbitrary-precision rational number to a - 64-bit floating-point number. The half-even rounding mode is - used. - The number to convert as an - arbitrary-precision rational number. - The closest 64-bit floating-point number to this value. - The return value can be positive infinity or negative infinity if - this value exceeds the range of a 64-bit floating point - number. - The parameter is null. - - - Converts an arbitrary-precision rational number to a - 32-bit binary floating-point number. The half-even rounding mode is - used. - The number to convert as an - arbitrary-precision rational number. - The closest 32-bit binary floating-point number to this - value. The return value can be positive infinity or negative - infinity if this value exceeds the range of a 32-bit floating point - number. - The parameter is null. - - - Converts an arbitrary-precision rational number to a byte - (from 0 to 255) if it can fit in a byte (from 0 to 255) after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to a - byte (from 0 to 255). - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 255. - The parameter is null. - - - Converts a byte (from 0 to 255) to an arbitrary-precision - rational number. - The number to convert as a byte (from 0 to - 255). - The value of as an - arbitrary-precision rational number. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to an 8-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than -128 or greater than - 127. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as an 8-bit signed integer. - This number, converted to an 8-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to an 8-bit signed integer if - it can fit in an 8-bit signed integer without rounding to a - different numerical value. - This number's value as an 8-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than -128 or - greater than 127. - - - Converts an 8-bit signed integer to an arbitrary-precision - rational number. - The number to convert as an 8-bit signed - integer. - This number's value as an arbitrary-precision rational - number. - - - Converts an arbitrary-precision rational number to an - 8-bit signed integer if it can fit in an 8-bit signed integer after - converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to an - 8-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -128 or greater than 127. - The parameter is null. - - - Converts an 8-bit signed integer to an arbitrary-precision - rational number. - The number to convert as an 8-bit signed - integer. - The value of as an - arbitrary-precision rational number. - - - Converts an arbitrary-precision rational number to a - 16-bit signed integer if it can fit in a 16-bit signed integer - after converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to a - 16-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -32768 or greater than 32767. - The parameter is null. - - - Converts a 16-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 16-bit signed - integer. - The value of as an - arbitrary-precision rational number. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 16-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 65535. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 16-bit unsigned integer. - This number, converted to a 16-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 16-bit unsigned integer - if it can fit in a 16-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 16-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 65535. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision rational number. - The number to convert as a 16-bit - unsigned integer. - This number's value as an arbitrary-precision rational - number. - - - Converts an arbitrary-precision rational number to a - 16-bit unsigned integer if it can fit in a 16-bit unsigned integer - after converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to a - 16-bit unsigned integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 65535. - The parameter is null. - - - Converts a 16-bit unsigned integer to an - arbitrary-precision rational number. - The number to convert as a 16-bit - unsigned integer. - The value of as an - arbitrary-precision rational number. - - - Converts an arbitrary-precision rational number to a - 32-bit signed integer if it can fit in a 32-bit signed integer - after converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to a - 32-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -2147483648 or greater than 2147483647. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision rational number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer after converting it to an - integer by discarding its fractional part. - This number's value, truncated to a 32-bit signed - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 4294967295. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 32-bit signed integer. - This number, converted to a 32-bit signed integer. Returns - 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 32-bit signed integer if - it can fit in a 32-bit signed integer without rounding to a - different numerical value. - This number's value as a 32-bit signed integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 4294967295. - - - Converts a 32-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 32-bit signed - integer. - This number's value as an arbitrary-precision rational - number. - - - Converts an arbitrary-precision rational number to a - 32-bit signed integer if it can fit in a 32-bit signed integer - after converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to a - 32-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 4294967295. - The parameter is null. - - - Converts a 32-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 32-bit signed - integer. - The value of as an - arbitrary-precision rational number. - - - Converts an arbitrary-precision rational number to a - 64-bit signed integer if it can fit in a 64-bit signed integer - after converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to a - 64-bit signed integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than -9223372036854775808 or greater than - 9223372036854775807. - The parameter is null. - - - Converts a 64-bit signed integer to an arbitrary-precision - rational number. - The number to convert as a 64-bit signed - integer. - The value of as an - arbitrary-precision rational number. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer after converting it to - an integer by discarding its fractional part. - This number's value, truncated to a 64-bit unsigned - integer. - This value is infinity or - not-a-number, or the number, once converted to an integer by - discarding its fractional part, is less than 0 or greater than - 18446744073709551615. - - - Converts this number's value to an integer by discarding - its fractional part, and returns the least-significant bits of its - two's-complement form as a 64-bit unsigned integer. - This number, converted to a 64-bit unsigned integer. - Returns 0 if this value is infinity or not-a-number. - - - Converts this number's value to a 64-bit unsigned integer - if it can fit in a 64-bit unsigned integer without rounding to a - different numerical value. - This number's value as a 64-bit unsigned - integer. - This value is infinity or - not-a-number, is not an exact integer, or is less than 0 or greater - than 18446744073709551615. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision rational number. - The number to convert as a 64-bit - unsigned integer. - This number's value as an arbitrary-precision rational - number. - - - Converts an arbitrary-precision rational number to a - 64-bit unsigned integer if it can fit in a 64-bit unsigned integer - after converting it to an integer by discarding its fractional - part. - The number to convert as an arbitrary-precision - rational number. - The value of , truncated to a - 64-bit unsigned integer. - The parameter is infinity or not-a-number, or the number, once - converted to an integer by discarding its fractional part, is less - than 0 or greater than 18446744073709551615. - The parameter is null. - - - Converts a 64-bit unsigned integer to an - arbitrary-precision rational number. - The number to convert as a 64-bit - unsigned integer. - The value of as an - arbitrary-precision rational number. - - - Specifies the mode to use when "shortening" numbers that - otherwise can't fit a given number of digits, so that the shortened - number has about the same value. This "shortening" is known as - rounding. (The "E" stands for "extended", and has this prefix to - group it with the other classes common to this library, - particularly EDecimal, EFloat, and ERational.). - - - Indicates that rounding will not be used. If rounding to - an inexact value is required, the rounding operation will report an - error. - - - If there is a fractional part, the number is rounded to - the closest representable number away from zero. - - - The fractional part is discarded (the number is - truncated). - - - Rounded to the nearest number; if the fractional part is - exactly half, the number is rounded to the closest representable - number away from zero. This is the most familiar rounding mode for - many people. - - - Rounded to the nearest number; if the fractional part is - exactly half, it is discarded. - - - Rounded to the nearest number; if the fractional part is - exactly half, the number is rounded to the closest representable - number that is even. This is sometimes also known as "banker's - rounding". - - - If there is a fractional part, the number is rounded to - the highest representable number that's closest to it. - - - If there is a fractional part, the number is rounded to - the lowest representable number that's closest to it. - - - If there is a fractional part and the whole number part is - even, the number is rounded to the closest representable odd number - away from zero. - - - If there is a fractional part and if the last digit before - rounding is 0 or half the radix, the number is rounded to the - closest representable number away from zero; otherwise the - fractional part is discarded. In overflow, the fractional part is - always discarded. - - - For binary floating point numbers, this is the same as - Odd. For other bases (including decimal numbers), this is the same - as ZeroFiveUp. This rounding mode is useful for rounding - intermediate results at a slightly higher precision (at least 2 - bits more for binary) than the final precision. - - - Exception thrown for arithmetic trap errors. (The "E" - stands for "extended", and has this prefix to group it with the - other classes common to this library, particularly EDecimal, - EFloat, and ERational.). - This library may throw exceptions of this type in certain - cases, notably when errors occur, and may supply messages to those - exceptions (the message can be accessed through the Message - property in.NET or the getMessage() method in Java). These - messages are intended to be read by humans to help diagnose the - error (or other cause of the exception); they are not intended to - be parsed by computer programs, and the exact text of the messages - may change at any time between versions of this - library. - - - Gets the arithmetic context used during the operation that - triggered the trap. May be null. - The arithmetic context used during the operation that - triggered the trap. May be null. - - - Initializes a new instance of the - class. - - - Initializes a new instance of the - class. - The parameter is a - text string. - - - Initializes a new instance of the - class. - The parameter is a - text string. - The parameter is an Exception object. - - - Gets the defined result of the operation that caused the - trap. - The defined result of the operation that caused the - trap. - - - Gets the flag that specifies the primary kind of error in - one or more operations (EContext.FlagXXX). This will only be one - flag, such as FlagInexact or FlagSubnormal. - The flag that specifies the primary kind of error in one or - more operations. - - - Gets the flags that were signaled as the result of one or - more operations. This includes the flag specified in the "flag" - parameter, but can include other flags. For instance, if "flag" is - EContext.FlagInexact, this parameter might be - EContext.FlagInexact | EContext.FlagRounded. - The flags that specify the errors in one or more - operations. - - - Returns whether this trap exception specifies all the - flags given. (Flags are signaled in a trap exception as the result - of one or more operations involving arbitrary-precision numbers, - such as multiplication of two EDecimals.). - A combination of one or more flags, such as - EContext.FlagInexact | EContext.FlagRounded. - True if this exception pertains to all of the flags given - in ; otherwise, false. - - - Initializes a new instance of the - class. - The flag that specifies the kind of error from - one or more operations (EContext.FlagXXX). This will only be one - flag, such as FlagInexact or FlagSubnormal. - The arithmetic context used during the operation - that triggered the trap. Can be null. - The defined result of the operation that - caused the trap. - - - Initializes a new instance of the - class. - Specifies the flags that were signaled as the - result of one or more operations. This includes the flag specified - in the "flag" parameter, but can include other flags. For instance, - if "flag" is EContext.FlagInexact, this parameter might be - EContext.FlagInexact | EContext.FlagRounded. - Specifies the flag that specifies the primary - kind of error from one or more operations (EContext.FlagXXX). This - will only be one flag, such as FlagInexact or - FlagSubnormal. - The arithmetic context used during the operation - that triggered the trap. Can be null. - The defined result of the operation that - caused the trap. - The parameter doesn't include all the flags in the parameter. - - - This is an internal API. - The parameter is an - internal value. - A FastInteger object. - - - This is an internal API. - A FastInteger object. - - - This is an internal API. - The parameter is an - internal value. - A FastInteger object. - - - This is an internal API. - The parameter is an - internal value. - A FastInteger object. - - - This is an internal API. - The parameter - is an internal value. - A FastInteger object. - - - This is an internal API. - The parameter - is an internal value. - A FastInteger object. - - - This is an internal API. - A text string. - - - Gets an internal value. - An internal value. - - - This is an internal API. - A text string. - - - Common interface for classes that shift a number of digits - and record information on whether a non-zero digit was discarded - this way. - - - diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/PubnubApiUnity.dll b/PubNubUnity/Assets/PubNub/Runtime/Plugins/PubnubApiUnity.dll index 598987e26e01d7a2da690889e0b4709b84b822cd..053918182efac87a93032240be7cd0dbaf8f6668 100644 GIT binary patch literal 835584 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

-I1P2O%&jCXujHYW+-YxAnQ}J*_zmy z(b1=4x;VNqGv^~^>7?#xBiFz+vrREPwn1NSG z&0`idPef|=N2u8!r6%`{TF;$xUpu&x@5AcxpYuXDeh7E5w+zG2fS>RSFad|*cqmEW z_hJ0kaGtTwCN7yrmSTN_Nf$R+FpM}IhOBxN4WPOxYeU=U!R@}7(M3_^@vNK3L%4R~ z4X~e*zCMBFnz0f>47smG)Y5=_yw4yjtZE1fQQ!M4!2YU+Pc^u7cnc>fzauZO-`eb=3;5dGhm1?RvS_omk0JN;=@Xw@4o96DMI$FIu z8IcQ$PAn+8y1XyKKY%U0^e$*k#IZHoj3d&PiBPn7Um^uwZ)7W5K%yYdB zr3}Um2eYBL1ed1D#xMal&dt092K6KGj6XN?opLps+p_R2-t z3zyR(`wQIP!7cp8L2VmYh|+ed1?^MDa3lI)5f*a#CQ=JB_%1sCfsG8vm?Cd)b3S`F z{$`_vp)(rHPXHNE5taDpMFyrW4jNM!e?R;%{_D~6^?b(oWRi;jGD^B5hbEHyBmwW;$fqh=D@lhf%t4tpLg)%UMs)vRG{m`!y7-|SCNMOw(3q?@H7U8 z@IdNy1Tb+D<-7A2gP)%i{x}%WFc(lFg@b`c@Yex`7*^&@KJ2@n(KHIzYTqCs6W+c2 zG)C(5?ju-FTQa9}&1Jwc|4tVfarRI4i`9T^X8BanO8IfzN0072DRBvhk%LtyoL zOo$sjOxS1;$4{sR@`k{0LJU#ZM@=zsS4RHj#g0;5Y>4I8{fgR$dn1Q+&(igMx_(dB z19bg?E|z}XpXg$7*5M|G@A@-c5c#LqJs-GU2tr?^>jw<|8(o{|g6>GH`Vd_&!PT?w z@A&PTx$YkXKTPmH>3W2&ErIK0x_(F)ZG0&gZe+x&KO&5ly;LD+)JwT&&#U?3y?dG+x>cuar$305}>T4gfkdKpX&MH9#BybZUS& z0O-;HaR89h0C512*8p(<(5(UD0H8+$!~sCB28aWIX&N97@}p^7qSz7VTX&Kitdw7G zmR^&C1^2-$vhQSJeJ6|QJ6S;A$)fpA7Rq8mMDNY0N7Cj!~sCR28e@ndqY6Cuaj;puwN&Z zOw)~p^1&>Q?_@!ICyU@anYr&|w!V`YhA1=uuTV%FDA^nh5C;GdeyJGZ0AME#5XUpx z0-jm<0XHl^{*K z{1~+bi0#|jGmG=g>f?-Hc~3B~Kkq%sZ*?<%C8jyb_@VTJ133PzEmTOH_ZHQa3Gq3Fiqh)+&f*-3^<_Aw!@UxadkkTBBC4=&~A43YBL8~__eokDk58*nI z$;{fx{8+V<`01*hz|UF+0oQSYi=GBtPZ8HyAzbG$nOQrRAFJl^(^Wg0pS27EuGa`I zdKz&3g1AUwISgxgQD%S*Y$6dkU8ah5O!rsLgW8@s$}H-}Rr9%A-c4dfK7sY($^5-L5aEch8->P{*NVS7?^e7yrv3jf{(bq$zw z36dtGNv}rIKy?AC2Blua!(u6rW@0r0#Tu5@m~nLh8|VH_*Tc%S`!=BGE-~gF59*_( zD8d`Q23&zsk&?<3ljClJSlTzs0>y=(aS4W<5G;dt+1sMqK|Jq)oXPp^9UdfQv<^;bJ(p*yo}nR1ar+tz*d8TcW|| z)q@%0o(L4)OB?|eQnwXtiRTn7??nJ(?qBemwf*`E5SY^UhBP?uII ziX4lUvApMz+N+d646mnl3rdMvHaYupYN^6_YE#q*6E_-gJ_FdfvUd+-0NYQY|8RpCaT{7 zM8zShXSF#R+R8XiD%%a6n{Kt9Hx0}t#xoo*EH91lmPFdFEaq(mOj7BgUG2)PsHgIj z?aCd2XT+|2HSp|iSH2l|_ADN3j&eYH71AyH%KpX(=03^k_rorH(hb4zr5aR9+m4G;$a zduf0;0N7gt!~wuQ8Xyh;_SFD!0I*C0!~wv58X%4@_+?|3W@n9f@nKwZEhB8{`UjXM zROmzT5YtTD5%2}ar{pDAj>RI0RnCrZ3zFp)XiFHo)KGl ziVA87i>yxU^4o|v zOAm(0Yj+5RYl|&!vzISF1|XQUo(Bk>*79QpgJ^TNE!xi877atxRx(vQuoUIzKePAh zTQObLR)S&7Zsk6O?!Kj0W6d(9b}BuEb%6eNRu}f@9{l-vFF8ZRZ+)kako!H}ss= zw`3(2j*`PQEOYjMJ7M)3-FSA`?$4 zYfluq?{8Rme1ertB;CJ)N6~`f&AB72Xfj>IL$y}SUatHY;+HPRnfsFEaU6()iHDxb zweWm8hxq`pd|YvRg~GvY(CGF6v2Ji;x>a=Z1ntzVAw6)Y2G-Bn z^4>ua8;9pqn@A=b@T4Lg`3-0nI=VMxl%r=uE9%Ea;#8KiVtq?pSW2{w4#?kOvn{t_ zM&ZH_pZQ~Vz5p#d0kduS4Skuyad&?EH$K!%+0Zub-q7b19zVCRqYs^uOyQ14&xXES z;g1h~_3J)Vq3s3QPfcC>d<5+@q8EKO<;o0_{)U zyKZ#^ZC{FbKlS3iS4QymrHS~C6JCBfg1E1RnD74aiEoQw?#lr6Z08+kMNzjB^*hgd zuP%n7L|+?GuixiQw?t7-CF)tp&m9;+o!>C6u&RIN3+{ptiBaoRVd-a=-s3}k#3)=_ z;mG4p9`M16#<>lBorT-J{e@?JsG{*S;615*=SL%WS?g5c=+1r3C}I??t#I)(ANolI zaW4^n=kJgFI)WGkomP0}fv09gF{9F{!lQ}Z?u}qZ`?nRYX#LS&BZy}b@gF*mUlv8& z3dHeefBCTpV(?X}@VA?v`$q&X7@)22nCZPPf)~vM#BV=j@ahQSX&ZVAdk??#vb!)u zVw9n!aPbT0UExFPByKOvKK1&ueXt@in>1g@l%M{m4^}kJ1M$AUz5Bxv#GqPB;bTA8 zd~gIY3fx{e<>0Tp5XFo3$QRDN>uYyM@b8O%ySRIkiyx>vJzh5M#LNDm--3rI$qz&jjAX$3E&s z@UqJ3!q1;6ZHXWTF{c(f_nC5Y1TPv1h(F{c4~rn~1>#G_j(#zU7(F*#SoG(SuSO7q zmQxE~dHBbJQN$Rrx(e4ma{2ER*qJ|L+9Jw70{{1{vbD?;zp ziRW%`;#kdLDs|L73{Hv9sQW6XV$S;$=M4)>p-en&wG?IB2yK)M46zZeeHDgz|p#F+;+)(hqEt%SX{^A{M-01!Efbom&ZL=XCgRb2JYtj;c7j= zhg|$shv^L?vb!g-HC92&$-9yeh8j>`3*EUXOcsk&8=nPtIePualRvM{Dt}W5_8;tdgrgYPU zN*^J6TrE_ws?GTYH*>1K5Z=|xZwfC-U$E3UazbwsLR@#8zpv=e$)4f^>$s2|957vO z%?nJ^nYKXIJfxLp0BNfvPDx^@n|47OjT7E9 z`to+2U4o2|K=BZ-vQx&3Ty5CD1VON+ILe0PRZmLg_ky1-8oKC|!D|8{9gv%6C!ih) zcR5HT%7`j;*iNo%qArHIC9HS>^64~U*{-CAqxdup3^`r+uQP(gR2kpcd`K2g^aM2H zMVGRs*;$~C(v*zQ%;^?Q$?>Gx((AzJE;eG*(V>ifqjkOk7ytcZ%D`;%kWTK=AUA<< zlCl%rDZPWEAkOpCFd$YOgf3X(TCWw}frP29uA;lN8FuAPa+@!K#Jq}E9(n%~^YHf} zo(;l$38b>ga&jO&uxhUd2cUtZCYBA?$&J5BzcELd%sYX-$FAVmBxIpD z*H;jeEiE|hK^GKJrJCa?pZIU4w@Pi6KIoCdvb-8)?`4(uMYp@i9A$w@I7#AH?BG(T z%*!|QZw)fC^F*?*hvD9d#|) z*B})JKc-_XzA#k{ORX5IC{)eHQq^`8S*8I9MmdLZ0+4B@uh=)_L18A{w{zc0aby#l zTQQR-QJ5J>Z9E}n_I$bNj>b-h8aQ~PEY}p>XRI+X2c;$F7D!r|W5#Mtsw}B5pHewu zd62b%ItJ7+joKbm@>pDFD=EC3gPDP94@-5=qC5>O{g?9QEkf_J!S(%S?M(EoeyesC zKe5^y@PU1dqM_u?wsDkY7}ywS8%yRW<0~80UA~7;OX{91J#Y8~Os*It8I^6PqR)3A z)RWXq;5%vD+8kxB)eoaQoz-(#s%%`DxQ>lMc}LyjhUO0LaYJb*U4^<1ScxI-$vnm> z;RmnGZxm}lttn1zXrAGZQA4eY{Z1N!?^HI4`|ss-fWZh{YGXF-8{OuF$hza|sTjQF zB-Eyj?DZoth8(%!afDwXsf><*)s8aq;EDBZnD`bOa6ZbZV)n^{P7&5ADwkFv za#{pm7z^a;Pi{onVZ>b-@ovG1@$+KePf<F+IAlg#2z4<( z5B=QE=F9hjFgWana#olxy5aTtf+2Ojpy5Ao#_60{F?W+UaCf70jL#V8H$5Iyy3*O{ z#V%*M2bHdLb_VW-;KHY0=IP$MQ23!=Y|c5;*Wes}3Ji+RL?4{#_dy#MNp&6iik&ce z)9v&HmFPnyVA;s&mRjJ7#n5Kd0?W`m76M!c@HX1U>XeO~`%U91bGBviI78N`s1=|= z->X8)EZu_MhqqDEnKD%3d10;_o>rs7a-or#UIU$;Y3y>WC`OFojfkY1E9UjnFemy( z3CBU}Y2GgG_YZ)umPI0RJ65X0M=~8&w%JrJn=bDLA07ZoZv^A&wpZPS>KWZ=;2lAu z+`Kj?6SaYe-ZcCd>4#S#0&D{yDodZ8T843PqhqQRAB>KR*FAtsYB`rJ_4^|PUrZjF zV5nhfc~AOqW})Jfm-Tql>7#h%@uo|SHx=;7xmlbo)JHiKjD(frFxAOB{N9=KduNA} zQ@s=F0UX{Uy)*Ck&RnQ>c87Z>7nJCo-COCMWLWgh?ydArT<{y$J3Au1vjdj&q<88H z)w^gGwiy)pwdH!Fi1(s2P$#%r`Y_uJHcrzcOVxF;sataEz;k*+N;tj^D=v5Tg+JSCB14u)6aZLYDBLEh+j7v@(V%T@MyEdMn@peO2JHP{->HmY&? zd-YXv|4?S2@?8*Gtxjuaqpc0IIum8Aox^rFM+tI0%wV#?f=~&o<(SvUZd*j93vfWr zl2lP}3qwYhUvI{8FoDXFzE4mVq~`Pkj2WlvGgix(hw_*l3(QewW_hE?1_qO635mF( z?1}_g-fV=Zdztzy){^v=nrfAZ3~K_lUhu=J9|2lFs39!hG%TiYRxgR9n_}>+R)tmH zqJx-M2jFULBGj_HwK|mRTNSQkV19T_hwqL0k-)ITH3k?6#d_iHh5?&(O4g)gGQVaU zLBB11k>&0HBDgmag`%77y$>GT@g?0vN|Ug>Hv^KRga^@OgppCs=n17S>JyA zWIuv5NPmHvs}OI)Tg-n|~6gat-tueFDLvl)rO)4hWl2p}XSj z1uCpxt)3TJjUp*x_%+XjDvq^UsHW#3osMcHQ;HZdR5l*1>_do$jZM9>aj$7*<9=mh zvOh7fLp*tXy{(#}2|fk?EAq(w^+a`cr-{8_1i;{c_iNex zP47DVdUL>bO7bAWxd^|9sN+AfE)<-}yZ)r0Q4++E4N$tnDy zJhC+OP`$^`uel=1krZ95hU1J6H*pCQ4@AoPFU8oV_4hVh^;Br#G$5(X;8iO zu;ga7G(XjA5bAjigUnY@GQaEbyiPav1WhE-Y+7JCW~NrZWjOvDvVq522hgc!uaN z1+$vv?#0d#V$+t&HK?Ock(Bo?az577p~33@ARL{^JqG#6THrsf9)0_V>hbRJ^*A92 zuh&EFiBvIH4&o%T55pw7T062Of4WQ(IK7(=YC||Z8L}f-s`rwe2E1G@nSnLo- zsZD)@^8ie(91<9oDW)yky@Q>qNNrlqK?U?>*rvtV4Q2XRa2M)AeLE!7$IS&1>ccX! z2=#FSBSL+O4n&r3ivS--F)^NKi0B?NtyF2Xp@v@Q7*?T)FE$Xpo9JN2S&je8vEBD2 z`Vi;k96QGVCBdiHkEQ_0I)LeX$v+0l&BvRgq?v!{0t|JuDWFN^0;Ir^QsI8`6p~L% z;wKkcm4}re6N7s#l!4HoEcbE!>PM@F5qq3L*JNB-?%0( z&n!S*IVM)*O}0){;MAZxZ`j{(maAf#DB+2(Rc`Rnh2*E%U@UO}@Fooq#~A@5TJA=) z6&TX}0Kd=;G>v^wCm2=XIa)9SZh;69FAk4g06aLRSl+ulzgz_`Zz<+O;GQ~|0!N;) zlXmUI7o3~Ncn)hglE?bhz4LQsuMEP1$6bY))Stw`L(n;_d@^k zN!RSlsB?Rm%jc}mWBP%FY;-aam0i)3SNqAdG1IN@Coc!iEOA!n5}_^B^mc|D>m&Dr zXkQPzA9$qdrptAcETdJNNNZzQ>0l}{z{4sTFEy#Vx2Cf#n^pdCz5x$XASK{z`+u+S6BgS7>;ca z?nd?`4QtLX1!M8JWw*31SZw^hq~!oTz*i<%kvo<15a*TlC91r^=HymX$NemRusO+1 zxHM`qE>wk81GwK)rva8XMko7^ujA6d zPxm6v3D&(6^V1Fo2Z`!~2*$7a;>W4H2XUhO#JvbqeaZ4ej`Y^L@^jC15+vHPPON-{XIt_T;3fj`yT@0CqjFUMDsmI z!ryaH0Y~%SZ5h2@U1i+XUf*+&_FWUx{@ciM0@^p@(*9)Q_JHlUF?6qTUp!5M!>Xv4v zcw$(2q_tSW1fBAgN4O{v)9}DGPJKiyiK|r$*mCGQ;}u9`#^(7o4x0?f`j9uKN9@gE z+WUO0h3dmkYq4y}#GV#KDy&#-twuEscaxC4e@;a$D*sR$T2$Hwms+>%WMme}bAy=2 zp%8^Uapa}-%T$i)_EVr>*0=&vcoIf_W_|s$EAZefg6q~VV5*&1gGH*O)L7Kvylj_b ztx6fUl2yB(Ck`I7>oVfd2xTNWRN>O14<{55CAf&tKe$(wHClo)HrJ(VsOmUfI^_7j zrca@DWK)zS_;gh?3F%pwP&xj8K+ht4UPK+3D?oP~WjV&ChcRQjKSsm5(347g3ot#y z<{}IYq^r2`4$+8*JM-#5F=M;0#r{RzBp-CkfGhXR%J0zO<-Ro^jZ_bZiPxjIRo!uZ z4slZQP;ToHxE=4m7l3U8w{!k2L!Mz=hqB?g4`*3Rl3Xc6oU&^S8W#_eX>sEnZreKz z1sUMID+&4zf^dfiP3Gam+}^nxV8>Oh8i~Ff*Gt@jow&ojGuVz&G-za zp#Z>nXbH;LhcZ^*3@s_x0ofC2Y8#*?1-lmS;m4}Io1d=QyZBklAn2H$2}&xDyA&yS zdvTO_t9WtT?(a)oH5(aMVHXpdEIEsq-$OP*JDYc1VRu(#h^CZ9MMTwAmbTbRI%xu=o2|?2W0iD%k&5w7YTJ`A)LRr$7Ura%AsZeUkG@Sa zlQ>XZO;2}Q=?MWuot`8vmy;tm0M&m2J%z2C(PfYAB=*+mxvDx9ETNmP1#X{XeY$=G ze7e&(y6zwF>6qrzkvoyXS_6FtlJ+O!fpA-q_8IXCrLi#>fx{^8fgjBUiaS-Ew~=%0 zGE{5=1S)BwK1wJik8+|44i5%dyUYVD6l0tC-7Z6siLrm#$nuJH?c%uz{A*)if6n_O znYSPNloC7OpXk#`wy#xf_7e0B=_UF}?x2?(=XV#(;~b-0>0WZjpXWV;zGGEiYtRBy5QS&7Ze8oS89MbzE@3!m}&}{3LN$a)Y`Lr&vW#|>Cpq^ z-vLo>_UF&DamST&h32~vHblUBYGCwP?+ytGSPzGjhzOMuv8g}u2k{CgLYZ*{aHG69 z#7Nu0iHY*dKw88lI5mbQ%D7y=%{-MTe_h3%fTt4W52^6+Y^6w=Up_H+C5o>@yZ#!K z)jeD|0Un|M(+KeSFj3q-K1`4gp%O2An8+qES|_=KP@^@+=9s~W3KxwU=DLDz%b{a* zLk_*hTBFA1p_7UiqU18QY)6yCic6$DUO)x0)}9Yk?BJ@)#kMy4#8@BPa*_JP^sO(o zZ@|qagOk$4Ym!b~;`)46OxLrPbwfZLbepSmw-E=|Bst_Ed*DhHy93j+(M4SBo7Dd0 zFtc(Ez%@oUU3M~=5wF&0#35_KMm*h(c)m_Nj1M(Rjc2{aBMy}B8VwK!0PoNMaR6|w z28cuL5gPLzSBJ-#HxuZcCJzDuJK2k>st0C6A}wJgdP0$|*OA15NJlafJ)uZ9=t$x~{x@oXIFM=$ zQ_&Mj^&uTe97uJO28aWx-p5q*gi_tCBZ&j4KCA)aK&r1W6+NL;AJLJ-fk;1KBzi)T zZqbp%fk;m?5i=q0CA`>kMe`L94ll3PD5{OFL0HT(7@oE@+1awVmZ#m zE~Mz<_`2xr&Ay1(`-EdFPm|dDN^BWckRQj|SC?<)Rpncc-I%W_?8`>q@meRv6ul0P+;P=|JB(vf%m)<9FGzDL8MY77^? z<|!~N!80RUNK4^q5%*dp8(WAeAfT5e3>0M6AV!TX=sVeVp+^2B+Z1hkJHI|{`A9Rj zu4eTBYyxYyF@$&8|$8gcVXD`CVDiwKLA0-N0+Sr89rZrmgFn(8eP&Gt$R}5+OVfa z5AU{{qf)<7R;~I1F!3;nqBtyK#~8_Kv#VPOM^u5wy*CS{>P3Kxj1KQ2Z@?9d+U}Is zDgMNLIb)uhLk~hUOWhYT-GkxLmxnCgSe<1jHbUWDN|D?I3F9;ojCu!(97Hav+Aufv zm=SA*>O*k=$Br9C<&*_>;^R`lF41ys^KheJ{v&ao9q=;Cp2$HO;+3?8O&Kwx4AqBiNv zCxTYer>ylu`bE|}Bon*oB(Ex4+>!F@TF*&V51&HOL^vZ3Y#sW*#}ok`1X8<4p;*3- zTwSi}9to)B9gGM;UsZC|`KoOt9CFn|5F?PQ^6vccsM7+*iSfnsc$?jps2&1j&@EF) zZSPQ(X7j>~5f}ccyogcQ*FqT0(0QQNlJ=CA^qQlzB$am$d1gbg4xR;H*a>fTm$Wg0 zzKeI~^coamLCRZpverOoM|sO$)*5te$XiBu3&dIjc^dbzT$`8wgdeOR$<}&9IkO78 zskV|RWn<+>RE#qK>raeI;}6*bYK)l&<_C}rKzX|Y&IeHA>da3!M;Xf;CAjb%AQKDh zRXkB;S1%4_R6HBykX(|ZHsaOi+-4(l|jQ8KkklNu#It2C)m zGIbRk_2`^E7!ZWI7ztre+Agajw!@QO#KL}a@$0=LE0g1-w zGf3^7h)CSyv&FC>J)T}&7R-gjbKzF;#7BP%Ji>#zU`~AWS(Yr+0TRXCfk`Os*dcC) zr_RpsH1KoNP3kJMibDV;a;TB7G=GD4|NnTw#`+hH7k5{$2sQoI`hU>PKa1wzxk}oY zfqss4SHrjs`J+E>uT(=d`Z)!8)|vs;&z}|#M*tD+Vz@^b&N5U#Ujc7fBurZw)$KB_ zER%8n-5uL5qntrT$q-v7LtLF~WNN$ow{7U4cus(01Aow-p}v|6cT&6j3583>7IfH|HOf|xKjhf5nU_X92zUWjd*&k@EzqAZvL*g-Lnw2_K0$y4Y&6} z{P^-@*i%7>#l$V5xzRfd3 zqD%?9t}%v>|3afE-iPPU^a!KF^H+LUPo2LH!{;vus@70^f5Dw7e@1n(3ad21`X)>@ ztW3x(Sed*59~{KQM_&X^?;QGcetoI%qCQbP62(4~8DK&2PZmyAQ1EP_M-|&1eVLv} zvF%Y@?rvDNG!c?x(88&_zy2Vv>Oo7!sQo~;Z5yL*3G?g&@RYg7-WnUm%0E*vgd_fk z*f6%;dlxC?HgjB40e-M|xx0ELThwQnt&K0iTI5S;8nqTV2Hm?nZXCf{1P5x|Lt-t$ zRSDK2H;3DV*Ll=#MAjlz@#1VtjU%_hTmC(Mw$@^H`3EY7ETR*kUX%!RqQv+yw?+~gNO7w zcx#7%r^&F~$dk1ckJyx|VIWhu zi~WqN1aZ9GtULsvj(7rzlvVo*DHE%GnQ=jvapz_3D2aH6J}<*6;2w=u9Fk@a(1&t0 zv+@UK!GKT}cf*T|8MN!#3qc*?<3yTrrzrpv9U;Mt_{hyxUUNCU*ttp4Nh z{*HJVJ%smRjYb^XR=(^pz{B{sE2qo%LyboqDBq7XKpf4=7i}NZ`#|Dl^bq|X)o8@g zw0z_6oJ~B8Z@OHb3;lkq@rYx;$_Ek0bU%t<>3&d;tK7k43=T2E<2so*$Y-|LNm2dc zA*ATN+JVfrKWDn105ZIsBo-=7nWEgoARET>N&kns?|_r5s{Vg@GxKJ)CU0kFHhpOm z9@$+8JpqK!I|N8V2kC;qgB=j%&5Z#80jbhN6eKi7x}r!g(yIk4gep}KQ4tZA|Mz?D z>r=7;e*cf`CziuI$Wxd9bVM-SpCVt=qme9^feH&i zY3^WZj1^1mwIDV5ka1-hTsP3^y?`i_g8FoCNtEX$rk||Omm@Ef=Pz(As!TM!SMedt zDOI}ppojU!=y?-PDV=->JLs1hmM9 z&=QwFdI0|iZ>Oh*JG&lx+gkr2%YX1#VlaD30kuFlY zjbcShw^3BYL>sM2T9~KlJQ}pohXF0}(YTGIY>75HfGIJC={y;vGzK=D)RBCkjyXL*#`=Ks4DyNiAgAV1 zeSmXvQ6HcopX>v&)qy$1C}@LI$|oPGKA6n^`9%I)cS_~Y<)F0n?W05hV+UcKF9ROInqg>kn^?~&|yLxVH-}x`N#oSaFjof#BD?v$tqha4UQP_8W z9Bd2i(EHAjR_qS{vR_9X+axxi6|+Wm^|Dyn7&J`#PXrnDM}m_2Jwc5q zWP$Y}WI;!xc1)d5n9cNmpwpkvcKkJyGSzPhGU_)3CG{(U8c|3e$E}b)9nLO^cHEF@ zeLqGkm;uvzilC&PAgIv~iJUBn(2;7#5-Y*kHK>ywT_;6?oa$xOgnfJ?=J%smey=hI zQ(+qjX@8BNq+TJY5ru3|k!M!ii?Qhz0=5rr(jC0WuDmc=yo z1>Kt>Ej-4!JMzc<|9b%7R-rusI;{oM!EN2W@Qs61xjvYYYx?&Db>$-*uM6V2XbI5E z3xxE|rQ9eYezZOHU5$q#Kg_j3<-~*IDAC|J4Kvuhus5>dRoyJ`;Bp!U{)0W%Q`nR< zMxWOEB0?fl>`217ug=AjBUI<&vD1vFsL@Ku&c(PeNAFJA1KAMG@Yh@8;fuG~uNN z*pCCSh;s%WeVLMhDZDSjW!(Mn>wEzD;O>tvB5^VXJmCPkc>T~s&;TYs2>^*7&9gAb zCgSth$zfNokM)~>vx}JOKLi=|K0!%g{}K8PQRp|=`i=2RhweA9jV3dBTF3GMk12tN z|KXo#1ZHZ0kq>zE2Oj=M6m*#YBOeHghmmzQ{znw_K$KSqkPiesDDdzte8A(#z(YRZ zF&ucv2Ry2QhkU@}sKCSj@Jos5R(&3d?VOP}bGAY|v_8s*eaV>O+E(LeE9NA`1QLOzBs2 z=zcXFue`XMqQ_2?{+cnC2VL99c<|N$$xnrw(lV!Yjln&(N24~dt%x%=I2`sBxD>+$ zN)PHw4z8}F_seD6)nq$O=v-Z#v9fO~b@qj1oo%S=jJ~KdoP5BrOx0OBp48bW;%z7S zt)I+qBb^_8k>A;k@=M2){FV@J9?Ho-vsy*575Cto)wTJ_y@Y02%_0znq1F)}IoGGw z6>oosnrz)ON30DIuX+sX+dVX>L-N#$&VsqrhdhiS7h{|1MD!@*8TL7S)*mf7*(fk7 zb(l2(w`X6vMfatzvQ@ha(wD{&WYk!KlIkL;5rw{l8Rvme2b#n9x5fG*?g3?AED>Z> zFF{H55Y&i5{Bxu)(xLmJ(6TLP!3}wK_2yVwV;Id;If9Hb39>3fkW*QLl0s>aG6N#z zb0uXubjn+qnWM4NIq3@ixW}S+)018vy^udLM*cFdfEx)>X)bg@JwJ)@E-ezCT@@C; z#5gsiY)n5RbM!c5J=6v%qu_%Ri`wT3db%%N$7`9hy8g+ib`P$LZcpQ?( zOoV>~7;#Y6eWZFo^+P zKi?JP>Yj)kaB~^1+zT=Y@5E>~2G@$xUv(7eyC*eDE#M99#>5qZdqA|D!InY0`c1?M z&flMmZ;Z!N2r}waf|B|cL5(Pkzzbvq(&3M7mYuZiyo9p5ry)*VN$Y7l-mIREkRwIK zRxzs_n~JR#bfAkDOu_gcvF-yOsh)wL)id$4a1#VEgyp(t!EH>RxPV@=b}pc9 z0ymdWTqobIw&17cq$q{jlF>-lc%-fC$vKJCnjRy$7a+P2up1r&bdJ{;rs3X;)cif$ zLx{UO$gBP`CcpYA5KOfUK}k&|sL>Cd^E>FA(-DWVZxcZN#c0}!B;pLiwgR(iJHnjW zh9Il9Ca8Xg#hMd+ZjVpgZIdy6i?p!!ilzx8WaJqL7!@6seglF}_`!yn^+RS_{Sr9L#_ z0j3r3&e|bJ4~1Jfh`A|l$M$3La>ue!NJMoHmGFEW;{_x!bOPQO$c&V6ekFLYpn%hk z*w>+tJZjxxrm^rA{VV|Q4a8nVV^8TC*##@0dMiVH(-tg`j}hx(j=X!3Ze<}c4w`tt z{UzM(1KU{c{rKQ(8LYXydm-u*Hzf6i9^ZvW#zg~xu?|cQysI0-1B;I0?_Pv3s71?# zyl)@6CULEiky}tnlJiJJ4lxlqT?0F|2|1{8(_^Ee`bdz}HeWaM{Sq`y3H=)qg`0Uv z)Rl`n+6MD&{^JGcbiBLGG=_{_PSiZsG;TNcnmDF|-GTk*b-=T zmo>a|9@hYAOo4I66^1WFV0p|$ZVze`-?o&mJhM{duqo-ckiw+O((i&?I6ZJQr%Bjd zc;<#L87_x9;P}VAiX5ZvM7}J83s9*s;KB#oW;!k;lL^2_Q|0~&$3BL-3d48_?+9_= zteD)7TEaVa(Dsi&=afojrPcbf(Hs?=*bEMj4}z zsvi!bIMo-N)?4+2dxt!F=?CHBcZKwTPFVbXuF+@zmr2j_Soo z0b75;76wz1({jh*TTC~VQPhL6P9fn1ReXAR@>q$A9{dnu64$&khF z!6?gVm?j<*g!pj>p2Kt(Awb}B)^6eGvxXmlBN(L8W_)dm4^Q>&3T*^0mEiwB(ejvA zFy4p9%rDSLwT7omWU`lq$?C?@g~U7!#ulEy!Ldm8@5%OLj>0MSlv&rX6IG8wSF7Oh zsv9t}+@s;Z-pI-BO>})FaQ&37V*=OD==y5lx`nQ<1+H7^I+m{DRMa}v0rzs&R{y}V zJ^juV{9MMsLssU%IC~k>qZWb3u;zj^+)~`{T!{cfzk{IdA1P0u@u%OlK@ifX?}Nv~ zOyt_WpU5J1>t*d_2X|$kizCTmH37?kfaNp+%NzFcLcsEA0+x#iSS~?;f!tUNAq67z zv|mWU3ib+`f;cjwpaKdinu2MDJxwUU@y=uwR3Zv0NeYaacfj;U`8WvUjk}_~A`ZB+ zaUI)XBxS%&K^6j1|<6dKYPb5p_`xurbpRNPh@X9?xuKwBrLyF zvi1whKWGoeTEIs}N~{HZ zWJJLXP%uMNu&QCNDio}mreH=y!HgsYxF>`IuD%6UvsbfR=*k1d)$P^U0&Cc7G-!b} zk^P!F`?U;vEy;c@Kl{~P?B!w$tQlp$W+Hogb-rkoY60yRmVa$~?N|%=$f*1?LBLE+ zz%0X_B?Qb$6EHI(U}k~<0~GYfDUcS>ejx?x*z3evz(+!m4J zH=s?+z!6J ztLVaGE84Yyt}zHGxUbWN*PONMDl(M}amCrbC|TcK$RIc;Vih;EHyrG=H;h>{#f|KZ zW{u~Fv^R{NxEr(s*EFaLAdy^b6MGXFBKGV!iti<$*zme<&^V%JV;9@I+l!mpo6foi zNuocB2;5lbzL~w*;ADHV;qBW41*RLWd4Y?0Y;JEp>mj&ux!+yMty-jQ+`N*grZwmsp)dXy3*xLyK+ocKEHX>l#1Oco&JU||eWf@7@FQj05 zd;8c(@{th*b3nlyO~DR^y@OD&Lz;p)5e0LS6c{tH3WQ7TMXeW2y11jg@E&G|f-YWY2Zy zqC+K{Mf-)7vWvY-tXX_yR4KcHfL%2KyBYRwLI7U#5D^;^uxmuXt_cDRP%uAEfi#Qu z3n|#$-aXbVJ~EFO5I-eUcOSdw_)$i zR{5g+#Rjdi4@lZaleDj4?<*wj>yxy%yAxU!gJqwHq132-sf}aDZVSAOswcCSd=Ffc+B$pll6PFYOmnaG-r)tW|tuM8QFz;2=%Gmkj$$ zLcy2P6dV*$a8Qy07$6%K@%)Uoe?k*w`tZBZ*zJSe<-s?HUtONxG?w%53hyV-ueia2 zK{Zd`@MSixVSF35DKuN-dcaixdtoHt)3^j${mOuk1H!DAKl(2N)t~;`0ml6o`TkF( z{Fep)WBBa>6XAXTr&9ha^Zl`VCgG16D@lJxzfwT9exYIc=(Ha z|A$llQxIrnuaU=ltzTgdNI@^tb1%C7$clWV8WkmcD z@Bn@SEifokM(sdLC98HM$f=zGFvrLGLG>D6lzHHcnoF#nMz6!oYk`~J0=G+un+`gh zb2u|T{YsLwGcl$onR=4ECkc6sl5x(LkU|IdPwfL5t50L14{JL=gx06Fz)T+M$>#uk7W3n@odjJ=tKK5ucst0Qw=a>%(A1FIqk}d zbWg{0f)L_+2$IA#I4_9F!r5vu7yhdVhv#a8Cio zqh0-Vtj$(N?r5{s2{LLGf~=ZBkW)B&gnGtVPQsEJBB(I}8uTJ*P&#yjN>`f0zKykv zyzx5PY=8D)x$3Dhyb=b3J0IiRs0<&3ffIbcj9L%A--*8cwmJoks$AKe0a! zwrPlKe}sh$%o^So>m1s1!AhV>mJ%F%j95>yF6N*cR2CBB;D%3qmzaZj6)YTtO~)3V zVC03oLjRiOav2FA|CbP#Y9B{M7?|xm6@kfQG^#-ij-W6GuTx@-DH4OI1~E9!xW$ez zZX%JTU}?oi^r4r6t!&;?&~JRV;rZt_dH&h`DcYOe6^}y?P7A$(#VoS6Ug~l+kjx}t zhi<^kQX%o?v{4;{4pkXm*F-D5$Hv8d((en*yB`pCwH2|a&F%o}^7n`AK4$LqV?+$x zWR?z52caZ&tZ!F(X4P&4Ikh_g;|IL&0QMVjqdkaD@xB1JXA9h3EpU6cz0qEiLT*X z6Q_f6;Yxv2I?C z)%RW`-Bf!Ml+>OCHTt2xzc2Mohpz7!+s7JY-q;4Z_Q4##!uQ+dw?lqA|cX; z*@6&HG|9vc7NF#=Ir>%aM&a;k-nPg@`1m&X7_t6D^6y2(R~8Z@D~ir+GIN*%1E>w% zVUaNFHb|H&R=mWHev)uUe!+Ihg#R2ROiU_at}}B4kYd6h;V!#N5~iOd+*w$#eKO%^ zqJ)V_CCtnF$c>mVVURG_yGSwpB;l^M1#^-KKN}@XOe$gM#*~KEf*q2v7BiL>gv6u- zVKFPQ@(WAm4SUHJRSg=zv*7H#;V$!iJiPg4XZZg&jQ7mH8vGUS`n(GoD zfw?r)C1l`6xIvvJTYAt zG#3W7ZCeMW(6@8-LAAf7&6(fJ3Beg2s4GbhCYSnd6tIA7KtMH1X)~oC`tyocmD^7rFH9^ipn8q#H`Q16u ztGK7^dGKxinbrF+Ph6?qixzet;FPid{Y32hq1g8$vG2$Dtqw!AnAKn6`%@)zIFl(U zmq4^~RgFH6;wKDX-f0GNLlcx&9iMR@r|&oowXeT(iyDv@(wlJ~_M;O<(I54r6UL%r z)&tR>4WpyD(sCYug%YgO!<6MUru2$+3ExKu<6=H7on$cSEkUpckuihO#z_W~juZqV z)eJ_%CK*inSP+cGU@)36$zam`(1raOl60N3L;dg7xpZ@nzo|N>SF+9}5IaM>&ZA&K zolCHEokzifI+tMSI*)<{buPiubshz4ROg&;I#l|3Mi1YV{Se@WQNpx67T}HyaSx#3 z|A`3-*{6b=tWUt$l&$c?Ywv{_vIF6CE<~kp>ghI7{R2JpFwju_D|7(NC;bwGNgWL( z0D3512%;W(6hV!C&_gd4J(LdT0R+{0{}CV}Ofze6kRHx7-;gv-RYh=6N4Aqx_(Pwh z!XJ6JRQPdt2q|iNK*kov>8>cNo=s|28!D`g@31zk>Vqf;b`gcc*?kBe4(65zTwLge zi4z~kt`fsNBDnsw+(+dj<31*^>^`m|xla(PVU*o;?y55w)@p7ryh(K|W-xG%;nnCX zF8fNZ`XtibA=?f%_!Pc629Cmp_g~?w)95jsU*m%pPvi49_!QndG|_iSE&Cg>tTxS5 zh1>KSZO)w_v6!`n@;0lKE3#xTSv*>fJw9{%6tH3Hw@4OCGh>{m@iFub2-z_sWh^lV zyJCVzUxImw9^<%k^z?Ml-;QA4_*<;M9g8|bf5YJe_P4JQ)aZx)c8T;iI&^KrZs{uUnJPX%q7OMP4h!~= z6R#iBi-o7xGU9bDy~s)FHCw!{rx*7P!nj;!AxMHR_6tIDXq(P`p?L$AgfXn??CpSg z9QH6CQMet|-QL>?Z{Zx2Xcj72dw1cjk63t-Mnk1oP+vY_7PVZYI<+#*Z%Lng&%)+l zNhnBNduFw#F)-GUPShp8#jJsMt%B(67S)j6AjunVJ)xtztqCncSU3+q4rY=gG251PX_SixNoQJh5v^5hwI1mK=wu|Zgugo zIS`v~!}ts7j3?pTa(7EW=_91O+oyCa&Xyu^d#r4rERN$N3GMbc7gj@i(e};J z7ZD>cJ70^weK`}Eot5FpKrQxY6BK(%DLHAK5V|WMVV~<^SE9B~1R>VRWLPJYwRJMZ zu!}uYlGe#odn&Dyz#r(yI$0}a&l*T5v`!{Bv`(&CC!F-PdjjjEsI8LU z7uy#NyMMYr|9fv{{`hQYr_2UJ;-7C4d=-VPw*!u*Z&rPUAg7KYXk-UaPr>bgGB+#< zrSy~lcPtYS+>4w>{u-U5R!JTZl_Xr_I*KylpIS!z4uVFVO{rk2ZxfW%Sp+ruK}P&Q zWCR_~9}raQB+T8>iSmw=cTt9;ndZB`PI4xKV<@o-k~&G~lhjEf?cfN zw9-G*{S%;p;}L%rSazQgXu8i5sxv^P={!`YJ-hp zPA?!Rsq+YG^h2FqDs@VSu2aghcIb7-upcaG07_jo9)M7$*o9JyOYAuui-fVU2+1vr zFXAmDF^k0)%)4*s$Sydy*DFpykAzXj?D(e;lN8+Z&Sb+OFqc*`E z7vf}g_z69tn7(Cfk9_10=`UosQ4UNz!HdvRCestbJZ6(|ew7@r*!yo+%`UMa7NhGb z^jY?;hY4`$3qg&3=v#}VZ_(jAkDz?$w@EgpM_Qx2a=dHOIF@;R^>%rTYbI z(goUrMvZ;j=NmW>77FgYP|tx7Ppm_8sJL++!l_(8r0$7v9#R=T841bkw(d#`ehg}4 z72|4rj94GC8s^AqG%=|u?*6VMd%)@&dpTJWVT>h-@gPh|5W3I6$ z1!;nuIsqWgn-tp*yhGxq_)mcQCZh^YI=~+z{*yH}@!1d4IEmp#&3`0Ek7;L|XC%qM zj>J{LcC}seoYyck)GKIN^xszrO6o5JHTt28UM^jf4(AO7oqjlZPL#Cik*F~JoRLGH z{W{afCN9j2nCfvvHT1TWA)?fhj@QFy<=RGv0#WVQSWHJ>7!2XIM`OAhKHw<*7BQn9rA#N|V0>X8QZPP`XI~ks`^vlMhUzW$ z2UERGfJ?UsYVhAPnEj5lKb z)rZK09>&i!JZcmLKVApNtQdkv{?$hq{81hJ%XPsqZHC~He?0hf8J}&RWPGw0HW{Dc zFl0M(7!o!ZhT{F{hT+QpN5jy!y**>@lS%#mEEJ`FNS;pLtU7}rr_Kb3%h(hBF)49V zGB&_{n^B|jilKx7hrYvc5tp%NGu)_0ujJ@4?TmxI8XLnWv48jJ{`~>Qk7{p|{@p=P zQf&k^`k`b0P&zgp&W8x9Wo(o*9_2*_Vfs1aAE5i2Ouyuh;{u|7<}%iFFcz&2tNIbi z&y!$}zx_k*2pNKQ#RTiek#EigK|zqRJ0^0Nu1QC16KEa@Hr*InPIHhzo}SF|PmI;? zSQ2Qe9)gS-N03!EK}mHJ)EEM_{UfPuI&^Kb4}3oONcofS5e}Uud<1g}>}7F#017;N zGnoou1EwP0pN^>v{U0$EeP_qX#@uI;Jmq|pq@JgoL*J}AmmsIk1BmmKQ+%ExaZ@}c zz+J$oO>h^6IMLTWi13AF&gNH(Qvhl20EM^g6cVihS``NX^ry2&JFa(Z!xcBd_LqLng5MB1q)^2 zQdEDpnJPOd3T8UEEG;#E(A}JKEt}?C zT8HHP!D+0sO00cWLGoyyH3%|l1_53tBFL%L2rz%JI$=qzOi*J4G~SP;@#xTvC-Us` z!OJj*Vw}z~wls4a9J0-M8An8lm$4&rpCSyCd3u*2-gSrHf@!ETndPY9W5nubW9eBA zVp6jl#cY0n-va=X z3~Zq@*nY5hE+IC>2Ls#>THr2ifx9??%NS3hZ{rve@*5qq#MUS3{g{!w7%k^-xbjG; zEaU0j-FL@OBvep(-_jc~6zLQcx)Bm=-zQ3NRErj40}49u?VVdzWSs^x5W~oaTe3YG?>iCY{8VW zYD)n0`EiI}>EFP$$>=JUM{l=B9A&rY!(M@=TOw4OBZ%pA)bYX%n)AYyIJ{yTGlWm+ z`}WQzZ9}ng&mn!L+K~Wf&In3sdx9EKC_cWBTSDSBE@M~{bU1#F*Xp)h=}*6)0#F&v7S-Ph>T(-M)QD0#@zRs z&W9{Qk-!5kBgm=C0b)Gh+ddDtir5qn2yj1af%{Pl+|?~`S0->716qA>9;ES@OmF7$ zNR^Cg%_ialop*L;-gi|23*tft368DmTx!tQRW zFB6p1!2~t>q4QrSou3Y8Jc8;q+gP%}U83hQ%^8v=4z3_LOs+D=Y#zt$R^@n{favZ- z{P4J4$cN5jyftIAxXj&DM-Y_M;RH4MftKrq7CJO7oQoXwIApJCJ`UNP8jeG@S~w2b zPN{Loe!+1_*kBxr_oo|&Us(EaIEtCc^fCovD{^jpKd@oQ@+=rm4O~P*SH5 z)aZwPiu-UOFz9fmaLjPdhjJ17813pzNyAj%WQ>eD832Q0D#BIzXSw}=l#BFsmk~$V zT~=V9yPQDNU7k>#gdnD~Or2bu)m$#l;yA3Ai{uH|acWn;5G&uAq|a1m5tP&!1U34h zd^bw@=+NckIK;h*#&_8l8tB&v!Ny+Id>pbH1>eTDxZT(d>vr)XDg8oZ*}a{P$}$fj757elV;5qmk4zh$k0BJ> zVcr&dVd`r1Tn8;};i!C@yCPYNmdiQb2Wng#r^x}fAx(ISJE(dYgB$vU_4$Mivz6pW zETZZ)Akn>*bQY~V?mk?J+2);}pu&pznXjT0cy>EXkrrxQidUmZ!~CgBu`Q3ip2-x? zLyA(PU2UVPJy_mt?tl=5?VXZVtUhO_>oe~TB5Y--Yg$kHNa;&h9ktsB+8w^~S$!9K zpH8Efynm)^Iw+~XCuynl7mn)Ye3QdC;F}3{%l7dRx@uD#mEDpYl`zIp13N;zKM(o~ z&eE&9QHFXo<`?wEldl9hbsIpSe^P(B#OH%|5}o3M0Z!6wg1f6lygL%OjByU~!>ufz za!!Gi#`s`tP61EfGRKGkBu$|H0QtzR+yP7!4 z?&>~VL!jxdNvM8=Af~fco!+y4bG>I1Coln_&o%?5{DU(8b6|wssp*RcLZAuU_@;~vmsrBnLspi|JMl+3= z+%NTvF?WWZM|{HUQ;(n=U;&R4)SaWehrU^LFF{V-2OxVNIQ}nZ+d&U{fVk8c4{#5+ zz)8MM;yv0To)Fq3-h(aTJ=6mCSPR_!30%fF{xji4q*VIa5cCd`CJt=R)bpLc3&b?f zp8k>)n4S>g(cx^OSx-0@a0SQWwt6hCg|V(4;pj8fqXZ@OFhPxe7>hrXu}FtA6G63( z)iCX>@iEGJCDY#8=Rpr58Z-^Ixu(8HJEEQB`qrcMv^v8<;cGN@cG%h%3J8DF3P`pW zI>RjTsF`OW$5HZOtGW)NRQlI-*JV^}hgnZx+5Lh*(_NoXJp`IfXR|cho6wx=ZIkAD z)MdFB28XNc>YP|TKZ&$a&%YwT-Y^1e3L~fyh3fvfR5u;Ex@8U&w>TR=zPfiEe z6r|yoN9Mo}2^jOSx)Oa-M8?cU*lU=d-X5&y;jauM=*_|zXGajB<=0ao4)RNyrgH%A zZwBj;K|TIHRW9lk0q$1`+-Ehv8P<=cbBq0!dWF!LuZ3?gzi}<}O7TI$>WFbeKPB*;_F$%i->lXK5cWZ1EwNkptp=Me^T0kaH9bx3e=4p9m3-RvD^HvmtN7wEE=v zjeviR)%?pII{V>6Y+gXKhf-gq__{(qg{KC#fi&md9wo zU+-*ZThxrZ9jm805tUvUmdVc!eA4t|+q;t9SSC7Fym6Mdq(2I7A3rF`+)jKA&u4w* zv>1zR?*rPukyB;~`jg#Sab@y1GZ)-;fFjYH2Nfiic^h2Nj zh4gtkfBnvQ{VNs+%kjGw1O0^hA@B7X%b20s&|&ED@)UB+`APbC zXHyQEc75I$FOSgGQLsD8cE=e9yF0Lt4R3S+-iPVbK{|Diu7cfFw!4BL!Of2AZ1nNR zAJ<*(s59RJsZ8{rq023*^og>%s4_mYs4^kH$iZ2Q_AbezO=poU;9dqh8)VTfEQv4i z%rT7atm%FQeYZHSV2>-?cus8wIm$hDi)>h@iRQt?}y|$)T6iCC_QHEIeUWwyhv|p?rwDBWtPP?ga4L(@y~> zYA;x2hWIz5=Y4YIKz`rwJQ9+Zli<$5AVf1xyvtY^#KbhDFy3Xfiak(ldZur<4LB|O z11n?VIg`nNy8zAr>_y%T--Z8KeAxJpE1czTsn(W+uf^5+#9j-k zLV;S}U~P$#ntCvy8#`xC#a{GaK}dK1#2c$V$=XsV>+9E+hzi%1s0eiv;#2eap zRCwbyp6J{jeV1(GQIV#NN5#0_#?v>{5!b-RqrMz)NHO%ds;DhEqCyLfSp=PW zcLA0edO&K6Yq;9nYO%?x?hGO;{o~zT0F6p_!QE9p%IaAp{Squ zx^o^0G(EbrFNjSp^3b+D3}yK_%W`0>UUxw1sMlQyGHOSHtlEhnr{)r1|2uYX0Or(u zftK1?U|!+&C^p6%f*KP-W85K)L5FS(m88O-OCQ9VX zp1<+4PWHS;->iC_AgA5{`25J8UvRvEZ%fHiG9?gvFx#`UqtSe{$6(<$_xsX zedVLzuwoaJzHWwy`q=iW!OKvA^hsWyaC?t-0su5(=(FC}uivTxu z5kQuFRbWniO`xTY6_{5ZVM$d9YD@@~dzVx$9lCOTS+dV)WeEpwLYD9zJ1uEKS;7Vq zF%huWgb)d_{k?TUL~t#nM~H6_mtC`=^dO>v^k64$AwAf;TSyOf`=EF!=|NNj`Zz?$ z@d=k8JtRmZJ?iU;1C41Bx{aiVAU>V+Nay+)NsnNU>2Jo&T``g$Z=)ZI?V_*EdJpA- z8S`%f?eiagYK!K-{H&8I|DbPH{gWW4{sr*AFIDt81==)s_;N)Go{|p%PRiW`CpFas z_dcs6#AS?ak>8!nkN0U~m1=z>v*0W+1UW!>CO$^2D*4j^;BJ+L#5i|@Ysgi&9i}Ka zc~NT=8^thX5*KL(>sA51A0+bC_l*R&4_n|y61aBbIHWzE``Q|A#?Ppa7=F}pOlsJZ zy7Z*hJgFZ~I+!OkdqSNjba+hN!ESn5Qo4*Y0q-K8{)*<)2cn+Td8j7v>GKIn>Rf^v z{lIeX5td7b^Cbj@JZqPI5=cgDsZT=@_rRTjWbP(CM+rT+9Fe(qx2bag(T)eR9s4J` zhX8UVgx>C##Zh(-_2FRxP4{p@bvA;S&Z%`GZDMngb~L+8V)H-y17^;Rdq~^YVs-Uh z(r2p62r}v-f~@);K~8<205a`jfjM=FKui5VU|wA+u%H$Zmehp=H71CPzE>)m4qeg6 zn>5hgzL))7I7y@T?l7Cr=kKs$v5xQRP!%K7er8-jsLwtj{ z97zp@FA)udFUMR9;mg4oN>{yMMVoM@jMD}LaNve9xN9Y{=7?$#gM*whlyC|1Sb{|I zxW4MhDwq~wLwPKSPbZJlxqim-xM1VSP$zOfMrk2(4I*=D48Z3> zP~_h1EOMn zDHTJ9t{9|AIq(InLB{uQH=U#7SZXc@!cIXsKu1CjgoYQ}8X~D^G@9>X7a)%!jPodN zoRkGfK?slf#9OlaQbMKGO_ocuCEK5Ky55+Z(R;GFCy4FFKmTs)Hk1oCLpy=C89Mo? zZH8`s)-f=PzFCzg$f*KApyN>|$6fcrA0*)v4+wCQZWEkP(gfGREJK{u$??)iLMQ(N zI+N(+zsJXjbrL)8SJCw=3yE>C^xa4&XQAtL@_=5vnH9@d^SS^xwgt{k;9@#?Gp>|c zylA4jk7Kf?CpGLzU3yY$p45*g4d@BYo>1or9Uh}Om!|pH!yLn>=rQ~?)RTG^)r2v; zn4qMdA*j(0!}S3fu5>sag4XHepN1mxyWgY#JVJW#$g|v2@h9dEo&3*${suve)bV7W z?1k<{;DY)cBxW7oH`99Iqs9)=Kh;%$WSmUjT_BFK`*j~K6ll7~5vo5Ti0R;YjEyB1A3s+49@#*yJbgut@^lbfPTN&l57gIg-%_>}V zPchXC@VU~nAER7@S}KJLWuBHj0j|WdHNlNf;BvvH2a8aq8O({5IC(+;7MMd zr0Oxg^J6VZ$kRBt^Ei3h*_x*v500tK4lp89We7@Y3_*>4U`sd|jkO9ooD&dK>%*y5AH>**)2ZV3|Og?x}=o1XP;NwRNJS*j#j+l@=Xhe^GaPlI1@)R?m45fO_sA z$fyEAR<#l2R69XQSp+o(MCCs$l~0GRe5AQlI=9qbQ<=cZ3}pfx37HV;-0V$Fb#8Vt z@+-nPzY2A3L3}!$yOU8c2^v$Y? z1UWSc;Pb%D$Qx)AJmvE;DR_!s1vtD=P{+#x+|&e4>;1oCnz6a~espNj`={b##JZ3J zNYBL+5;d8I!n&Q`A16o4#IRxC$>W$ON&L{ z_YuEwZ?sb|E3o{UZqt(v;Yrhb(h#0hxhIwD$-wcXGCfuso@GqRqhFIxeoymBS!-AU z-2i;DLQqo66V&JjmiUOUL^^`Ch7JRJ+4bKiB*^qwnt&?Ksp~a|-;l2F3SFkc8F0w2 zcC{QJ`m0`Zm=dlz&^xu}(8n{AB3lj@*|H3Rn9dz_vSmth*>VwwM%*kB*`iR|-;%aV zVs*9>>BE@^f{dC@kW~W&IfWw&B727f=G4jpEwzfkyqY1fpjH*wrdA^?DTkoOgi-O2 zO2yL=u02eeQ81Rz8phKc-@zGH_62{h@2tn!EY;Ic`l40F1tlkFH+BtGWW^zIW|a~7 z^c+IFn`8f!-p8bOG8Zu`6vyL=4xZYPW0}huc0pD*>Vx=uyKM_6Sk7P@;4P!RUAXA2 z!}2^(`v`6avfJ0$A4eE)qsm$E!LFwwAB-P|!vq^+yukZ(ZqUa}jC6A5j6+hhE|=n9 zYioNEPf>Oc>|<2FO$T0e<5<9k()_@Y(b*}Di?fJi2njn<-WOlqX!G~nh4}s{DM9bYO<0n64i5YE z@HDw>wv)JGN!G_D3-T>Vz8pCfk@RLeA{tndWLEMdV-X?iH`|emg-yv97nvY8-I>DR z8W2y8N8N}pZWr=(!y!bD?WU6;kzH6{81hY~MHtt!_==&-Z3;s4tcf^eJW(Gcnq;)~ zOiCUyo@`IXA>+Us*zmMaT?q^%6CN_2*yxb)@Qu;aVZr<2{`2CMeC+nEDOfk061?B{ zt<2o#GX8mE%Sh>4E1`V8zBR~Ct#1wS6L%>S)ahH(=$ln566BNv@Ojd=en;L3J5LIp z(oq83bQY}%ZXkiv`quB6W=!AO5=>k4tu62|VqH$5qUTwOahlAtvi|G!t$-$Jk|s1s zJ2kQA9hQh$oP6Z(_Z$ddY#Uc!p$ zPdIHzLQPNF)039-q>VhOF;D8olUnekhkH_LkLAlakBVXx*y(>jJ65mKGG69;w?lJ5 z#&1thQri;L=m+uqn22XOg8AO0Ui3-mF+CQ>Ckpi)%=`Y4bX_5InQCiN0ljD&z|_32 zRAe;oOA__1lZ(GfIaR6nA_M{U{38K&{De!%&Xl57S!$n+teO} zCAA|#jR~Uxp(|mcg^tAh?+R)Cid`zuubu#*asBEwX7W`3ly4qf@XrSVo~>F<4UttFGX&&`VaZ76zigd?CAby}R)}v9m#nOz zf<;6F1&d6tg@Q$H*hIl1ssRDyoK%Vkm!M!tkVwI*uL$yArbXCL!4kx$Q?Syxe%1<> zzLWU0%-rXj>Q`%_c)or$lb>3@n#IqOT8E%czgnHXS+xd1POS;>dD5@`OkD{2l@vUs zlLWZ6S+o$Rb*N_;FQ!8cgE5N^btFDUtm`Q^^qdtj&E~9F$Mrf?kgrsGn6K7_0-Ur( z6WqE9dXw?iYk^xofonHLATE|}&Wg3DxfABB=!i5Y+&NM|XT`pg)VV^RC?@BuBJYIG zrS+?%&Q&*Ol~G?{!8AdpC#~s8-Fi}sp468o{oRxL@mLcX=TCYXO6F9!F7hm8{!Lou z%RJOEXj;hpuM(8hR|snKgSdw1g}A08n1@R4d6oV)YFbQ>MF^ zpJN$rj@4<6Y*XfT1p zp_J4wctcP$ffM5UC)ep0f=lQZyk#evzzOjU;&Sl%`UUSci6(G}XrNzkm=}3dNaG0{ zj{i`<7-x@*P2dpKfB^Ce>I8&w{Q|RY=?NSO66qK96+w=}vL22>L&Z-sfm6l=PT9XN?izEh5$PA< zK3ctAwh@X~uR?4<->jNVkW(81d>&K?kqh16VK0z>K!=dRrDSq|+k|BcaarR}h_`gI zm8plam5xY4Hk7Tb)TC?;eWI9@t&w*F*}7|k^`H~!w;ilVUOT!m3uby!c8{gZI4`B- z=8NR7cn(FZ3QrTG59@XRq3DLejkuK0T|o8SR7^d5`m`s148v(piJj4b>gqZMWMe) zi9gOEYzDetCf#?$>g6)hjyvxOGU{@Ith$1rq!tm>7y`9~Q3dUS4qZ!n-G3_97>{9J zT+$qV)Z&dqK-AG70_aGHfN-s=8^9~Q-KfNOMq+t32O8M=lQj89y)?~8Iw8{dwbH9$DRiAb3T&j`c6o-17M)`+wZ> zVV%?Nd7Wi^C|2hWu$-oPk|3iVB*?0V2y*IS0@yu|2+XNR1zPGcfqC_~z=C>$u%zxM zs4+n_*l(o4=t#^P?*_Z)4UXNw?qT<#-2;9cU%1Yfi-pkc!4*yn2BRfm_i*zm?4Gvz z3FTPmgx$lJL;|~~fQ4(!M(d;ly9ag-?4EpR_t2sU7p}1hAXsiExApBFxsER{xAAo@ zNdQK}uF)JTJCfG4KouPc0T`cS?UF_8B6eVM+$D`58Zs;3Jfy#j9R}!MCMDMV$O$Wm z28~44>(~-m*0Jj&bFBMj5RIFDW~mpliD_U5ku4Ny;Pf(R{Yo|&Mra7pmXRd&QZ{i7 z3PA2cU4Srd3DJ64nYqN)vL#Gp3e^{gOp1vS#uN+L7J#ASBSf|69oP~Uj;IzTWYbeh z>K0|YJh)=y4|Jqlr1Le9kQhVP!5HdYk}=fgU!RQ|=|8}AT}HT^joS>1eXxf5rU!b) zUFQ5!Q+sGG%2=;T>_FeF+L0iqb^`c3s1l()^d|WVbO|Y3N;U_$`7B$A%NkcNwTxvY zC1q^rla#TMcLN!lv~To$V#2J@?-{lJc~E)C6{4(BoioqjkEz(k3g9`o~apgg4R@fOp6)R%`ZGc_C~0Z55MDQ6@O znds=n;pHHv(qD3~ppgR$i0QjmilgjaCD3$#NT^-{%5*-e6N9DZV(_uF7?i$38|ZD8 z?WtJZ{gvgzz1Rd9^%g-^y-iS3ZxYlP0yX)x)Fd6cCYRC%ih4yO5x~j|MF1TM5fIuy z>1?1qAeH$o)j}hx>c7DAUM2vGcI&Opg z%dF#i8z{(Esy)m%Nt3ii6WrbjdXw?K*aEk20{2PQf>?{;d=(uLS8h08#lDl|=b=v& zlk-)PcY>dfaxG{d7R>adjXh~iPwLi_TJ)s8Jn8SA)Q`uS$T+yoJ7F{ZoqX#Lns3Qk zP#c;Sd<&O$lT#H4YV-rA`kinpIvTG9EgdbU$07s-1#3Zg4$rRsPUta}#oS>tpXU=${0aeHzR6zYbdXkCX&Cks>{TY49_6A@H0B!37)C=K z1`{0#X;~R=uxP|Fm$a9Xi$)>7e^N>UnlfIK=SP!^MiN)7rTVxW-%G2iDm9(9-*w;D^M6vK#&zA}6RE_=Un^pT0%V3X)`J^yAti+x!-#8e??RtALRx(10=`pfRM zG=*R%(c8UF9A)=LEo|Yi=4TEsFFbI#<^Km-fGG==84TEq5k5URny|IxLiUt9s5FH6A z6mExP2a^jcxecKHR%G@(@>Ie&Pvzzg;i-ZUp4yIut#&>8)PWWEj^yMM^wKqUC z_XLSnb_!T<(vzZi*`+;Nh;Lug+*8w&6sAW`5{e@V#fg~xazDll)$sLLwABIpO!4Y@ zHzumOgL4-{W9A;$;BJ{=9^X+%B4PhhnJPcEEqD|^OX_HXItG0>eY46X$f+X$FeMhw z5q-eE1|BU5hrCbo?*KQopD>z1~EO(`3DgWvI8c zf_$Y|VZKS4q^wPFUrErLjCV{6+}9GgPqN;`x=!-*&?m{yBku%1ALV+}S4pVpNt=1n zI-b;(C$-{9`90|$o|M;P$uiE0Dck8o@~}5G50mw#xo9fzuz3U}wG%;&eqdMFCjnKR zj>hXvOGk_8u?PV{e9P$_^vRD%&+9^usdixQu$^`UOii#!X)tsUM(swBRl5`9)E)$og?kFjsl5bRYHxvg^+kaNwGUxQ?Ltsvf@sJ;OGDC; zSckd?HrK}-(}CP!xAKL`tPThzAW#v-JZhRK_a?f+_pp9KSDTJpNv}U)ktuzO0Y^F8 z+~Dv6H`A33yIrJ`@9&ExxW48eaUdU;PI+03$;1fb3I{jx$#Rz< zMByl7xvQ)djy^7H^(8e99vqeBF6|F=q;jP5HIPua+*MwZ%F%MUYXY>036$+)@aULn ztYX~%Pra|kG^S1Mfy`Z zLV#P)0{8V6xP>in$F;y6-valI7PymI;H2@w^5u;E(5~Z`;%*D5Z)3E^kvJK7BC|9- zsXb3<^MneI2xo1rL|-L&d(84 z+k&mL5nGUV*qO}d@4jwu3{!>t`zl~cH(=LwBi(?hk6t&p1yoh~d)!|D(x_zm?yce| zySE86-P;BBxpxq%uONu&%&JoXdYY>M@1|4$>9@2g@p7wOeJ@s*UuQW@^$miIT1b#p z#}VYz@dPEcfS|^JsNiR%g6Yr|j5KLe&cYqgcyBP0?d<&ZHYI(1QE7VY=W&~I%?_F^ z^bLcsyT@(HttAM3!yp_<48r@_Xm;)+LFgL>;lN-J+I5j-O5ZRD`OqjWQ)&KFFhNj% z(E$$au{VSgmX3sk4J}jld3l$&v1Q7^KtVwm7Zg-u#4;6x2#QWvrkz?)bioAeO3Ddp z7qm>ZH$WsNdQ!sLKr-PL@y;cQi58YAc}6H@sVk%{QwE4E({Yd~<3y&6qfDuenfsu& zP0z2F8s9`rNR5*Ta_STSM5J!NBKl#D{m+>P3s}ElD=)hB819`IMOZO{f9F6}Kf{VR z1!DklUK3un%uRVbvB?Wv`>Jo@#ZKpKzUhkI{x>?_!B0oNlh0L4yfsG`Z+QeWp6c0e z!`%`o_~QjQi}V`ip<%$?+tY+}_L!D)m(bs}xP6+j;BI_(EjHSM`hp}jZ~&nl360@6 z+!yKQnXU=yU&Pia6g+R04;jheU058KS`XRAGVDrcSj_e0+9XF_yjHXpm;6le*{-uM zT4*o}1aL0bFeVx^wlX@HKl$~t@F_6=-geUgGq*bO70;CQowrm`}#ROM6H@ zkm2npSM_5pckV$SR^O*kG1bKcCG|am8vW31`691&IQJpw^ozM~rg1i=M`FXgvc_^S zBRiPaN4^~YE>p(aa~A;`nW0Q}us1W`@o z$K_;NML&J1-&5x^wk3#swqv9S;Nq{Wk?R<}D)37bu99)@2QVsG_W^F5?jwZiLZD1%4yw2__Fi`Zk@==ySIjSb!h0mG5?~ye#ym87C+o}X=H0!H zw9O*cnW?TK$f(N*vg&ezoVtPldeN1HC3Pu5jS44p&Jfqe-6f~=r4Oif9aC3 zC!JU~{X|n7QTq?VYGxlFfM`xOe!K3WgV;99o{GLDhoA;#`ETUWbHN3u8JWO5A0H#u zf7v2)AY3X7iE-9N^~q)td2j}gta4B>MZ&ri>AB!L$rL|~QY0poVxz6HYkw)auxZQa z+b>>R%jv=m628Wh*VThbjO9SR9vQ1<^0@zr4*~{i(UH+zP`;`ZY@sdqBdZXLKVtIX za-I;OwlF*exuH9!R1{Nq3l$^sn7CrZMF+8<1tE%20Ty)liaIRlwxnjnoy=lEYybFT z>2>)AkDCv1!)T$QYP7D2lD|huR7qRVeBiOz0ioFu%)dW2X8v;e{fV2*J_WJXKuCO> zzFBn+K~9|uK$#!NiEinu8Fe1fDSjW|&ToOcpao9oX_Dr5!+0V?c8O$2K6Y2_sD+1+ z?+KxvWa|lG9<#|fyX({g88Vi9szdXsN5KZwz3AiMQ}+>+)I9_>`hgWaFRX|T=Wzs` z{xiyuR=Jtpg~&6=67`%l&PRQZW1el2r>X8@4&9cz8xTYH2_y{u{UkXu`1ex+`&V~= zB_Cz?*8(k%!QJ18!*qX3sP2T9>FkN}B{$Qo-rS^X2NCgEUELS<1dVv(-L7`W>g7Sw zX{yHwGU_3Mta_Lrryd~y|9(_pPCZ6gQV$T+7!j5Cf>a(Iy7G{R+%*dx*(3c5_rksfbLl!^+Mib*q!E58D^roRq zAGKanI@M5yVm@F&rgS<`&Lyvqa(2W8cO)q#5)OX7g})RuYj^&$)?yECv`OylY?^9{`d zg_DR9Pu<=!&W8?%c^uoviah=!=)M2=I~?L3b`@3Ixw>KL`nh!on6CpqHHbo0 z6;WcSM3f^NM4=2ulo%==1q~R;prY`CjJlYWpOO~=?vfU`AGE+pqc=(OvM`?XoCD)B zi1U+e+AdU!7|xR(;xR9|^b(3%<9luEEgLD9CnfMmk7atyI^!IiluNzjzbk0|`+KyW z`WN^F`0slJCG}5&8vVdpVUokPp~Lwjg2Fz^8|#EL*Ar`cO{g$E7B3(LZBj6>0A`ff zCQD`Jbo(45FjKpqA=UCgJ6pqjzLFvt60Ndn{8yOcY_7B zTMJ%5J&2Ha9v>rCk*xM!Oj=YH660W^dBB;?ADKC@T&}GEF(`(cBuEZB+sI0S9r*<> zCKK$95+o*-U`JjO?1II{PSTz2?{vZAEb>NjQxyIp7GADM4g9Q3 z*2#u$wL3@*7r(YO%EcZeo40#(vPI1v?V?T=>rp|nTulm-?Lo3Qnw1Zd#W|^=TcL_F zU0z+f8VV-7RO+CLH5;pl#ijnva_=%Tz=(U@m(T#k38p>4fn>3afnLm6720y$sIcx_ zx8-~}8h@rieWc9suwraH{1{Q=9}A<$Br)kBlo*T@HnaS}*jZTcN;0MKQA)(5QtHHXsC2=c z3^4UJg7`jQOdNCSZ}0*OnRz+t663(q;~+00G&bYweh*{Iw@oci((&FAQpQiStPyJ& z((wWsw^A%9B5=m_ML4I4lw3kWe~%@!Y&;<%f`l+VictqS8jd=!i*>fdrHAEWyC%PY zeF8jKTkH^VUYBc!n8udJGF#rev0Rsn=SoD7t4Qo6B=nD1Ld(Y!A|gl#+ay3f?Bhbf zG{BdH{NetCjU&1+^yRtGp{Y6X5N0+AuBKg>1!@Pc=bRdMO0*fdE@S3eU?qNN;-k=H zgp>?isAxC3vk2QBg(bE=EY=ieq0bxokyG5aJ#JtQI>b0#qd1(5(WYNCmCXQshG@~l z#TnSH0d;*75YS}|lzs0C%G5^xO~oIJ5hy*lZ`gR)C@}PcaP$-UOnCMb zbHVE)zRskC8uD`qGS|5f5oFVgY{0d{N(MI`x>zT&3Mg%JHWGT;isPX;j~BfwZ&;|C zi5S!V`>s{!4(%OgMoL_EFqMo6L2+cYt1CXovTCs{G2;Rmz^W$$=rr;LcVi?r%^3K4 zJkE@9$vBL_agGRWL4@t%5ms#wfhy%nSOAb3+7k6W@pLX2RLYq}mA=BF%J}S}%7nH> z?n@koM&2ESnZms>lEI_hkksiSy{ zrfEBSaS=IX!XOMo!az4+XWbNO&@WI>UX}6EH*JAdP$qE5Xl6)EiiNdn1*OaASs}HOp26)?o*OO^YVp`hh zCZ^tW%?{>lvELLw$cb=0P_INVxdRSu%J~>7`N)F z`iWI92(jvWVAc0%tG3|W zPr_4QEtW76Oa6UeubK1L*L#5O_0M%&h4R!J@0ZgT*Bue$)Rh1j%As93S;lfkN!*kT z7~p=ysDcw4@Tf=!%^Kjm`VVVaKV-O3TYQqE$FwufF_L63_c(=m)G8PVSR;8ETuQA* z1q^R&5R}xa1U33W9eYL8F*=-A5LBQ0j*>P#5*4POH{J)eQ(~2k~5j@&GqAz$xl-H@n)!le%8Tiu{vIx^*3v5z&)6F zCWT{DpWC|1nEPM7-|rQFa_(9brG9*0P2a5gF+omULl8{Pi5{cZvzPJ5xulUA=K=0I z#%+STz6I{a1kN&ecN|)eIs%Cs#FI&cv5oXoVm=ABuZ5J}#P(!3{J60VbA&Md6UU%# zV7{Z~H&Sv>%IHaHJkp(UzLDTP%W_<-t;fY%7ss$Rpb(zgj?NHI!E|X@WE$$gys{s$?TK@8Ezjb1L zWj>NdU)h}?qjo01r40nQw1EI~47(AQ)I5S3BcLO_E**&u-I0(s*MPP}Q`KU8bYm`i z`s&rDXlwsF-bg;SD^#>F4I{nCM_|q=j8@}V5HrDf8Kz%~e{yh;e-g&{rx-A@D^3u? zK|k@U-pkc-&|Jhpb4d4z?i{+UrX!2_)IC-g^~P(Q(81%J-lqjyF~ac;pz z5Y0Hb2ZLc`->&mb^fK)JIR(IdAN?-~lQphHm=(yAC5-zYAWe_?x!6i;jbJN2mr)MU zXbH36Nc0bxEII-oBi07&l^-BpWg#)n8|Xw`Sj74eUOi*nj{uMeR!UaDP-DuKq0F>_ zvV%9PEcxshJ^-D_`3|OgKunxg=SB1fryF(Wjv$$7)7SFJybJ!u^p&em0WOs4TI|cF zUmyb>QLw{oBxlzF9DOIDF5#5xo3Bi%+Bm=$hEn4(`06I z64(TgOTYuUf)GG%0a2u3hH#{}mmr51pn@QRCxU`EB3_6G0)l`Ff}%o@zls-v;(aaO z@Ap=9cXiLqW`lmu=l}WgWT&d@uD9N+-nu*)B~L)-5fCZo+Nl5Pt=eJowihej_B?RF zKMObp-gY(}98IJ%#xSt2-w6BShtrjjb(Vs4Az-+KW$ex}VCQezi1Hgqgk2b4L8Y-E z1zZKtHVuR&aSx(<3S~5JPXVUV;H)R*DG1^+rR@A)!aQ+=n?|x>=W0}oogg_-_SaC~ z(s}k~algdv36sLZ_HIXp5GY(Hy%D_FVSn}%nBZP`^hEDfA1SAd5zT6hfRx@@Noid1 zE+TrULHv-Pq=YV~r{yT4GiZ4rqeHw1Wpo%~RM#1S#B|is1R_*Juxfv>IYT~|vur|E zH{mvnAHK10LAy}a8vQ5&rYy3v=mwW{0+F4%&dsrBrTi>6uRPOoZbA8~Zc%w`w_ADq zCeg%s9|uqwS-mH0E1g4TFxuEIJhy-lpvPWBkHkC&h8Amkj@iC4W{%*ohoXVUZ=jR% z$LOSepH9Xfrvn*%p12u*v$$FRe7gPqCOTs*07(C|AU!`6(xa~bE&K2AF08c_a0#qF zKR0!W5XXi_vcnD9szNnGqBuoMMl}|sjAX(lwZ0KWK)jJ3LnMJP`XLq-u{-a_AgdZI zx%3fSm5hl;2xu#<1L;I=NT^8LawgY!pa8>9CV7!@uJI>gcP|_LQ;I5E*c;UtvN==#n%~{_V1vR@xMVQm;pN{13Y;sgL4;shui z;sjD1;_fAc!nmCEF~DBW*9l6_*XhRR>tTq5Ru_ zr<|L>FXUW;(o^c>@B1nK-UI33zn4rJd)?_^uREPFhJj`OR#-MasN3p&ij&o5d-tHu zph}Ee*7_27=LqY3nbrfYMRCA%7Ng`eUg+URB%;-fy+shG$g23$MiY{K$GsEFIF1Jx zxN{vU0q)#L2Yd19U@tx$?8T=8-2g8a!p-=2ACd_6K{{j12n2gZ5R4xR!DMnt6k00t z`S)Nbmy_o8YD>rYd^Cvd=JSGG5)m3ZNh~;bq^0XTE2l0;9%HyM!xx!|kt0><ke$sBz9N>QoJ!zFZ z_c1h(HA_uP`0N!KYZb;DtiEJbi@aH-JGXWYLI8gj)>G}xW43;!*cvS7D99;uKLPA^ zvXD^U&>D9e<1h|5BSj@AnHTGRRZ@-Zv3b1eJDBfxy)K;Z*Y>fRz&|_?UgDXmw&i5q z0hEK4i%H5EC|Xi4;&3}YB=k62eON<@x zAEeXoKTM}ZpSqu+Y5xH_8UNdGBAsOwVGEt*JB$o<2&K;iaZ*QzIH|Zp-1jCa^Px%N zq!%5^d}NY*kA`tVxwmQY0Qr!&{s5%WHXwEVbIEIzS!FwWfpflo{cF`Gemp$C9|82Vc{x|82u>cSdF3iGWB0v6D*^_AV zGVBYK8KHeaFetDu$VYqo0;5d(LYPz|VQ2e7SVL%EU;~o&1+Jy-1EpanjGZ;7iKRPi zb&46iq#WAnla?*rf~_09L@u;5dQothMlUiy=T2Z%!stalY#O~p`U-d6iqT84^ZGPf z7`oEZxqFHhE>Y}ZDznGP?As{nlmuv<-u#zq98CkY80~_&0tKk>1SV7We&iZmMcy95 zs8Hpn1W{Y`v2|%NK#Vy8X<-R%u+1pgEbZA>a#W5v)Gj#GJhzBD~Fv;`Mvs684Nb*+C?%@bs*NB+Jv*sbw6 zK3a9FA2BrT|Cmn3e~eBze+cYCqr_9_SW-eluL9{9d^rSN$o1JpL8`oWMM^34EjN;StAS(RdklEtc0-b&z z*Y<(+G7PL2a|W2-kJ2^C&ILaqnR$%X^LWp%-cm zT0nU>y1U5m5ayu_4?_&y6f!&tZk6FJ2C1!DgH#i4hZKxigSg#isybJ5A-Z8&gCNou zv1c#@Epitt9}Gc5%2#!VmB)6MD3AY3z}0rXmz3$q-O&(qbX=&*+B5Axu)dd?#~V2E zJCqF^`7@oA|9d)V|2aAtA9rGjEdQgp8UIgo`~7F>j4>k+={Z3pekeo|ra)9t_8%XE z_o1om=ZJ=_o&ATHsn=v0vHct*4a0b&^B!*O1sNmVB$I?zB$5+E5cFxvjWe){Vhf24 zE=rhMY@sJNx2>3emP0LU&rFI z)=t15toCpnr@aE5ob`FES@8%=Ir(9*2TWbr=uT5tcH5Y;g7=3ZMj_xaQE-gMB)2c< zgw&)$t|eJz&nNG;P{Bco5*#a0%@^a3(yO_ju^~crQ+Lhw2*Q-}SX?&jO1eK;(Y?%T zah{)aKb;Pqw4gJ_FpxCt0FVv*P-^*GIMSzjZw#^M zp)F8|1XHpJc|swtw=8V?4h86@Ejttncw1?3B-mW5zyS@3Z+2E@>oq!^my zftHgJQb_G5<37UOh$pW#@DXQoiH|tMM>&LpwUk5sbTWRG4(60ND@bJRqcg?~K-NDB zvhpLGLvrqeyKt@D$*1P(xzFLSxrD3wA=<=4g#KD4G}ulkY@}U;a7dvFnX#ziLg7M2 zCy1#gLlsCEHH%qst(u>wA8m6g_5PdL{Y_{1$!dq2}Ldopz(6D4diX(pMpH_y{^B*3*F z1v23ne0KEh^yEv~Ym6e)aly5x#iFRz3x&&^A6v!_M0Cqw$QT{af;>d6`e;iqv7o-7 zZ7}%$A&Avu${VImY^{w$KTb-K!}c==3zhlrM5`(ebhjEWWpVGr26+^Bc6E3p&0hAYJZlX{q#UO-r!!YhK&nQm^!jh{_|3 z-Keiu@luRKc-lFC*(nq9fYQ2SC!T-aD#*Cuz+5nHB{gn1YnvE1+)tp!EsWv=uxi|R zoNX)PmLyX>ZpmOhZta3gWpmtkf5JA88_oc`4{+Sd;kfa71&mu59*kQx8n+yhC&#U< z#%*R>=2TzP60FCqZNFxQ6oFfMG$#ZB}WP8aH(VMRf(%7d8Yo zvw`yL((JXjVkc`WBcCITyga`&9~Y69=8%^!C@rXOotJ}O4z#63;@QH|!uko8t&Y^H zi#il*Tx2rAMFDGEY=$lt);PWt^dp-ZHuIkcHE?k%{31Q+d4u&K=I@=!8^ zkyNGD-x8A`+#DLM6&Ra;e> ztLS(*#FOny+Y?X1@BmMSovXmRhpo~O#%ZWD6kZLow6t{O%4)e*+kgSBsru@rx>4Ck zX(Xsjkg^_Dwyd;FRi?v(%IXeoUSnl7R8}k1!qe}|OUp;D4x~V;yrQ%Mcx0F6Y9xjt z4=5DND{HUpTj|_O?wKg^^&eH1D#Jd}&af3m+(tmPYXufjv-~R~oEdaxO$=wOX+~%3tTtkP7&} zv*qlL0U~v+Ev>~h*7E7%KvfYaxCe!NTsFTwl+8fW$1lN8d7YVJQ)9+yFs$>&#_aeq zz}z5}Rzqmyo`XQj=yjvYWsTQ4A0I~*qs49K5+TDT!lsb^sun5df#;KcxR{<)m=&7?o z51yUG8Y3IMC;e&io#V+FC5w zcVHa`?G)NJ#z;_XnQC+^2}L~$5~`at#1);bODHICl~VDt`gAN90b@n z03FJmVgZe@tnKi365`IoAIl49>19Z?H)yH31MsZ~L%|xs_IARRDs7v&#LeioqPtO2 zb&~Mh9Z{f6!xM9m<)?@Fa947B$>Z*X%+(bO+oO&|PN-9)YK<~c#Ydtl@V0ZS2GphS zi>Fe`7VkTkMM=!o)TA|CPe+$zs;fHE4>OI6Yt=P%$TGViy&-vdoKB3u*2jW{nxl7S7*-jpY{^G-Uz z&L9zHG;7~XG?;~Zi;`m-SC3MlGnv;k7M+3JG*9z@luU4X%mE|Rjc_{+~ z0%%xE#(KImy;f=oo|Y-in3kKCcm7CALrDQi*%V3x%Fxi4^$1q?Xv(zLVrI>^lIAA) zDsG~yqF?TvNCjkxOcQ;<2`F#{rE+U!`|)A0nR3PCcQ0xD4zL!LB0UZpkx3M=1qDRG zm;^>oOP4B!Qh|>@0m;f+)7w*}e$_j{&QhiMOo*CQ6E!(|1Ljpbq9&hU3KK-Asb_aw zv}ucJ3Z*tA&=YD#v0A~PD0Od(1qEr3IV3g9It#q^69C*I@E!t?Jhu!T>vR>J(EHxi z2y8O8_bf<4&ei7o`yG)y?Fih45ef35*4!VBNcB61qixH2#ZiYBYhC^QO$=|*XMtF& z%*Y)pu>2)#N$Z*cFHUWQU3_+t`YKjk=5Qi+6woB=jsmT-?oRlvI)5jn@{NF$h3ys= zjELBWejK8TS+(Kgc=&NA*vJBbWPMf(KzV>!31!rRr(KjBb|s%RdMyFel85Bp<8T0= zjwHw7Kt%GU;Qp2vj!>_>Tu15EI0<@lUdGbBl&wS%i1qY>XzwaWC5GWj5<}6FgjraT zRr^dn$DJ`C#~>=3R%z^1*7*ma1a!cfe!;pAaC!;hl-_tK0bJ>>^knN`9-GjJ?PRw- z)RW%A+DniSrw}E4;Bfaxh~9WE9-yOiVr4ViMdAsA;Y7GFqohp^hJ?#b8CX3%SG}fj zBGzQ(IykCD6oCaxnf+iTlG&~TJOj(Oo zF5|8jH{~88E?E03l_%pKN>7VSqA>&Xfk{cC0avjBYL?Sh(~<@ESd*WQa*S?3<67#X z{O2>sFloy<$+d4l56o^K+t`0&$m$`46{`mYLjM8J30OU260ANGTy)kgf+8aiBuvX* z0)mQ3XJzuXbIw17vy6T^(Sq(q_gUyS4!z(461nGWZU*Avec$Z+4dSu&J-J5 zvaoVvaUN$sxF>fQxbZULMyg&*xkmsz^@4IQ8yQHs zM>3#Cxms<)h8|EOu;>{KRP$9x5POznR^w`dfqY)!d4$Bed=$reba6fTwU~I~xF$KY4%uZ&5IU$1il>N3@_&jMKr?&lPG%5>luyjwJp{Z}Z5s_g}l zl0(O`j<#jyJjUfFvd6JS$K%IEI!w8&(Vw6TZNVjr3wIbjBuK|!jUS_jC*o80kTHoK zma`5Lv~&?u-=L3VjmK_tAKMoicJd@P%IqWs1##vl82Fb1XPPG?MG-5uuYrqc*(q?^ z&#k~FK=feV<@6|a1VN#@2pz&%_lx25mOK7cm>H|y% zI3~q(tF}kHh@Wf{RvjB3VsJk5Dbqng1OX+}Anuh;TgZB#CpSzfD+ z%8i&=z=+;j0I*eR?){)vJKfUzIn-h~W=SxbPvIy&)m zkV-qgIo_%B*(n8o#v~LkTvEVv@ z&)|^UaLAn*YF4fE85Nm#Aw19qYRjrJ#qxPGE{&T@v{=|mYM4N&5n*%1T1P~{i-8si zJFG!Xa~cPaW7$p>ddYmso@lD78k2-P?@YfRfNw7-r?TL!Y71E2XV3t{sym~7t-QV% z+-rs?SSpFh^7PmN&>X{nPhvZW%0!l@ff{3ZGlIF2dal!)SCD+Nve=7-UMRaQw3Y44 zy3lATaZA}_XxLmUyNTM)CY1JG=7x}!CO4bYsGQdk{#w)dcL6;&w!Hw?#1qAmqsp7- z0pH3t!Izdz$=wrYrMouq7oUCD6v>d=fnzD-&3)6^(ev`c_224pgD!0GZj>ljD{?jyKQhynAN-# zRh8#pTg?=hj(-^vm*()f$YObJX)bnFPCcJ`%C@DYcsPdCQpz1uo>!Vz$I_wN#MQoE zy7JPTiR{~utNBU_vqSMStT)(q8&^41%Y&ssyg$>POpT)69xp0Rh<^ZH;^_i1>Q+W5 zk|Dueuuthf!U#d1+_u+9Fv11x36vLc1veQb8Qlq+JHj_$bO8~8N3{d^aA|n$H~s^XC(aO;w1+cySpm*V zwh7MMfF+qa!Fh>>v%wMPG``sxGMW`)8&w&5wG=B{`hr=ZRZAFe_dh>U!yoU*pqA@a zo`!vF`&#=wg1S^!i($)JW-wDVpr|gCmMJVR)s1DcxZFX4&bDUItMe4G8JvIIgG+IQ@) zU0;z#mh?Cl*3B$eMp+mWWq~Y^JMY%s%~6#V^tp6zgP_SJRS`z;1L#P)tGy!CBb}4L1JWJ4z)hGwRo}F>OE?h^Qm{^r&)_u zS{cssXs`4k?4aYr#%(Sfu04f@6}4zc6?M7tj$e)L3B=zG&qVeb{A!3ZMu88as)pCp zxYDSz(mQ@_JnMU+tc;1W;tlORffd2BQ=8~6x=@raxA2W|n#E2*!x01%saYPDQ2L)9zdC79K3L{{^(fi-$3 zJFgPg<2IC=7}J6rQ{_ORb!A6TxG~k}P8w+Y1Di_TWF5vh$V^O9k--l z;3dRn9)0SKPS5Ha8-^N>gkjxsWoc}e4egKnS$TPyM(?!PA>R7aqt-Jf(fYyR#9>=~ zw3Szd>buK=7hm(?_2$7nnmOwifFqV_xqj6Kj(BXqgyR`eOBj=A$u>L`{KDXPJ#bC! zknffU+n$|yXXSiBd1U97;#qlpaZ9k&`Y{YbaMmzDla&|@ zme)DQKmvOTjh}_}uWrdE_0MSumioVn`dP19l2he~)l{EzEHr){l&sh01dACsUB5#8 zGjuOZ{ktIbNNyVJ=Hb06M196hZ@t>3rD4+E4rk*u(z3}sM>Pe!?ZyQzNxV(h%TTzc zr-OYe0g=)a|MEEHjmFXP%m^(RlR(SlxJ-+`gqRV?hAe@G!0k{QpY)!VX~~OMWN>BF zVlWX6N1n05K?elNZ3WYDs&u+KRXW2e^v#H$Dy4~SC=5pIEG!eLT{{Wnu~15Q3H0=> zohl7DdO+Y1B6xt-D)s4erF*B=U#;Hy;vF%&K+?m04|=Dvl}$Md(VdNVLAx7SC_%Va zl0m^a%rF{c1`StkB49b(i>%7oh-1iI^|iRBgeA#GU45t!XvAIhSw@HoW|dNAH7s*5 zQRWPzOd~1Q&DHz0X8rpcY3qBak60h18IBoIYVGJZ zN_++%Xcv||d)0?J<$?1dKGTVwGT{CVsvFw%B&D@BPmqOfIkPoN7uuCMF0dPkKBO;ao`zgW<`toksU1i?t z-MojK@?QL)1{$G*+rFd29;m^HP$xZb?2{R2$w_384Km1LM8&ea-pF#T>NW*3`(Z?x z&$ye z#fWNt7USpMss@o3tz;Go4P-H*Vp(2cWC6VpQMkZ^R{&&VhAyq@9;U_wd(y%h^qy1M z8-gA4MpX5+?&nmCu&FIf&n=}ao>BnC8&OsF^C~&kz{BK#izKHIKnIK{nZUVUP+1N# zvS_rDqbA5=M8&Y=;5J$Ko+YvvQDzogC&|~zic1&b>M!w-Z!HIpfl-(Gdr*$ez6SCdl`t zSR9rZY|GjpWk!6i)>wQ2?-?RTlEw1I=Xd5eyX5Q-)lV(93G=i0_*1ct3)bmI*N{P` zsk>ng$J=AUgN-Zz>!mOe;LZ7n5dvE5ad5^yjAJ0;*d4JlK(KQU152qdP_8BnzFCYh~%8J>yk?fBKRRmM17u=U8a7&i|{V^{&}k1F6-`wAE{ z{uTTf6?_$+x&p=+736dedayTcL!|SNEASu`dxw}WAcmb~+4UZ5r!!;2(c9Rizow6O0WnWOs@oY+gY@O$l!bpKiq?!v$g=fhbz41JhfL()%d&})KH8X zu5`T>m?4+rZ%PF#&FVx?YW(Xc$bi5d_|y>Yv2{V)6Vl_~h-beu%FdWX zc63qjExbs3pfPeGWOHL9esk(RYr#)t3{bdiUa!uFj{k`FYee49ZhQ#Y41`y^G^BvM z%nR%>5`$8&jcI^xML4$^nPr5;?q;AKPl>b;W(ZDsjC4tT7?&BbZ}L1Les31Ph;@ z;uHv%n8@&|n?k1U8aW!j-KSBF;%3`aPP$_`Uuso!CZNng(RrRu#z(gj_c88+wjTjJ zZQhL*;XT@K!tw9H4|dSqODDyv;fuJR=RP|9{{3{um;x8_q|qVu;d~n*0*{=WD>yR3 z{e-RSHNo5nH&nsa_33DC#Fzwbwwtnde7Ko?6|Sj_E<=sp(2#}m?l|Ir6H#KYQ2xLu z<4L~TF{c%K3$?`oIhQq6D-HFQDOzdBnG#l-Q{wQrIf4gc67XoT(%7o?fmw#^YzbzE zG|L!K06|OLJXeshZUC-ujuE~fh-V_cgJB0^eU}by{(TTG?yQpKkLh@q zv-uDL+_iE7S}t-e;;=C+!qAJWylIT-)9&2}@xKSJRogcVP2ogB2KXfrHgAe8VjREK|`;Xh#bt_&w>!giE4<}h+EH<&6O30&ZgqD77OcVh>-nqs;qAXoEI z=KmpnaFlizic5AYdSGC<@eg5btkNAt2KPeXlzS0=Fb%@5ak@5`!>n9o?V{F*CU46- zFN)f7+?3k#QRGly+19o^gr2bv-i~Qp95X+MYk`|Dg7+7Kzn~iFXq`lr|aagI_5tWd4C}Z zW%kXoB6d;mf64EZ|0_Ca|JQUf{%`1D`u()H8UMH9X8mWx#olDNIF*~@sayzZCRZG$ z3`FLa;xf2CQW1U`bbl(^F7pbk!eDz(O|EAwI=Ex4HvW5L5#{PRcqX!cU#3A>I}672CRMgNHAD=9T19p*BB zM)po~nZLy1GS;s_XE4{8&$xs_7yN@{O|ZND)b83s!UCLT?#hoI9HPzTZI8q5{0l#UF8eazFHUNgnox?! zv(Ld4mD(eDHu8~YchO1vHl2*0q66Yh)9v@cC&9v*0W3TR77jtocWZ7%xyqKPNLI^X zyxEX#Od|U<_JvcEHI0{EOtA-Gc$n%VaIe>KxX+*Ojvrm)g7FF=Du>BinbXj&c?|HyX0Y_oo!y$8_2Q4i5$$<%hf-TcG#JlU z9vX~i%GwL5x4q%7yd2p@R@*GX9u z)$MRzKwnOyY}kA?XlS*%K8W`8sh1Cwf+*XT^1l^I*_1y=>1A`3UN%qZW&R-DlxVa5 zLip92N3Tbpk0ZVR0LlmG{UFl&C!u|S-akht<$sC}Y~^%dE2l$Sxwsks7ICxwXT{C= zx6wLI}am@m_Hy5=xFia10a4E-tsn~E^Xd~7d^mpp zsWu*q`q~ZSKceuKHg3Fh>usbR4(4p@1k!W`*Bj`khq}XydP7s(AD0EDxF%jj|0CsQCEtKI9mp2wA( zayJpyAry#m28gCr%hNT8rj@2&Q=XB-p$!2M)|Uw)9?FP=Xhzhs4j?ME1rhI(iGyfH zskAi^F-dz6m0}<&nFCdtUYe#s#A`(3AexSQ4sj@kDF7lI@lYUAgH^7=gi-~Q;rw84 z;L{`Ic?}wDi-K+4sd_G@53E27IMb^3){e)*L_uAMk#Rb>eH4m%*V$Fik3WpLK>RiYm4r*awLvJA^t%c4yayhQs&834gGc;0d z!hz&M?IcS*tCubnuF=f^QijbSuIyqogUJvr?I=d=;0B3!JBmR&a6$P79{Ea3Q-Dn) zmqG^$I>2SCvMzr)x|x#!fz`A;9Uz@fzRmUEoimp8YDMD;M3|!#2(i(Hh^hAQaY_MM z0Y~cXTooj(_EHS2s+Vw|H%81I0s!mtf-hpV zx+P02?8bhHH#*W2%bs>6zQ4T_eEmg8$6tad^0 z6;_LryW6utxl&&5_rUn9eG*+kiK@Y2+A<9N>@^OJO8+=4!?-SMF$$=zoKxyiuWd-Z z(@J@{kaVI8tBvds7aaG-$ugBDDiaBD5cAKxED5(>CA(Xio+{;IovrO@mR#nN;R^6S z+&?U3l-iV0N|s@bP6t;HA+|1ninN>qB@heSC}2=SQ=b+QOjn>S~jONN40FWY8js0 zXldEpmX_6y56W$iTs#f58?ivQHmqG$GT5e)!Inx!SAafo(>?~)Sq(|;ZU;(lI2fY= z_ab=fyS7B`5Jk>!iQGMm6cQMaONraj^sII?{UHoROOc0!Mb=yEJ2s5e_3`54?c4B> zcJF7IP)HeD{nQj1!FBo(+!l3al_c3A>=|1Y;p>V5=E zMbs{%r6OrRqsss0*2kOTBl%D?l8i}=WD;2aUu}JqIj3!%W3Ru@o=y=&UFMf?PoyrB zlC5z?*$>{WwgiIQxDP~qh}O}aYgm^B46c9mzPZM$jnC1vXgdR|m**Of8R7GDjmq1i zT%~Mdm*`W(Jrt+|(1L~JrE(D>9^y^#c~y2Pofd^AWgO|s^kpadUk#GytfE=Q%(k4X zRieO35C%CUcT&BAoyR}DdYyAB$iq*+A0Dg|;ATj!6AaM7n&V7yv;KB;jZ>!nECx8U z@hfwB-e=PXp@2JPX~&MXDA>-0=$S0sHCo=3lF~gEosUkvxcC+K8{BvXcHQtlk%6*N&Cy`^!uP`7<-rk#-1V#;(u=4 zrLhvx!1GmfGX82hFeB|CZpK*y7h7O=q@(6M3NEK;xa`DqAzU)nYtY8mPKNUzB?g~F z;uiC`?MeNfRPRacp41)fkwN#2tua|Bq^#8KMt{_uo9{xMpP=p#oO+TytSR*jg5KK- zQkrQQ;VoNRb#mBjxN8xr1(KfvOjhCMW}ZsBPVEwmS+E{c8_+CbE0tS1)`qCLy(3_nYk%&;H^l zJ7W^rF%1n_@lLblRiB}%0fOs>1{&43Tc=+)G&6hM&~}Yii+@(`I_D)YY^dANY)^*I zlhN~J@H`Hk!cy7R)uWFhs@+`qncSqu(Qxs4H;{H|h^ZojULFjK*k$~^q0ZS=e;+z3 zWM6t)_K^cR+yVipaSH^%W^Att*Je-EbP8CsyrCGxNregg3gQ6Hj`^g89r8(&JH)*- zEK>k+xK`8A=DhVP4GS{tmoQy4URzGE- z#>;wQBBLRI+u#v@br|0XnEufLPnNBc>Uzv^D28fYgjd%vFM2xCrWunYtZWlKjlC$J zyUqpFc|v$_d-r9^hoe9*SH7ydpYqu5E0o92pjg{E8e`O>Xh}};=8-#3^~4BM$9QqQ z;P2R|=uLSwZ#)rW>k`I)G{&|Ug=1_hbW;8_I%$78os2(&4j6Dr+>GBRZq_f;?e}}= zjIjV9!ZbkyekephU7TOyO=R`{tSu-wYuTZ)ab>81tti2JfQ`>$B!azwzdJJY+a5{T zoHRDR5~Z{Sn^m^jA-dG<@$h(1($q`+cKcGpcLYg1vt(cQo>s2$YoxZvNJJA=SVizm zFcnwYIMm^}T*H0`mpn;egWD(0Xw?>@gb$&W_83c@s3LPq2}ts$WA%|y+aooNrvX?I z1`6q(iI9#l38YKbY73e3?Oc+(c@mAvYm=(6M968hOl@C0dOH(r9n*vyo;$=EYEe!^ z26N@%Fc`7nX|!aeSS#J?+qpXv39ty>rMp8J270pDmLy ze}D7~vf%(aD&#M%e&LgPA3i38!nB0J>}8?LnMWl;Gb%oYdYSPMXsp z?%=RK;rk~=d_QMlhpg^s%0Gzdrp))H7oN1&la_hX29LF+oKtiq0ndjvQ)>QA@de~5 z`q&apzJRkHB=x0q#ux@tpDv`%4+ll+x63E1&i2@Jqs}zfTdW4_{EO6S``e>9TCaF| z0?c_DNJug76q&bLLm=}e#=a2doo%8G#i7BP3jpvLhOE0@JXQA)ac%dNbbSX6v7J)^ zAKZ<50B};cZ4Md9ZDSlbcn0CGq(+n5Dx5kBeZ-EAQuCh%TvwoYz;#DDDSss$Ofu+T zl0k=)3~@958oK@daynzo2;gIH3buFiLjm8=naFRsM+~?7a&FBL*+za#^61QOiAyhp z-?o$*@h1HZL}D###79c>w;MErXUGTFBO6oceG z02?p-9P;Uo{P8e!3;b~d9mO9Hr?-Vaf+WZvK@sGSAPAE`o~ijG-tB7Pk3pPNl;Cqg zoYdYSPMXsp?#Qq{LH08{@y8>WZp!>odf`cXJ!zRIZSYuI$~im1A2*VY0bcIMLC&K8 z3KFI5?@y=S-;d51!$6`XAyIxfC|L8y$*QwGHr=Q*Z9NIzaTe=*Uh~J7u?Fnse>q%( zPew}ae~eE84B(S>7i|Kc%zCWR1yt}+bzdc}?H)zfe<`ADXHyHWtas*>*m~88SDwxO zLY)a=d@%cL`y1$_{PlEzn{1h3?W8i)k1v?JY= zqcdyS@y&~&#Z6H+C8>1gmBgz+5q&#!In6hZ)iq2>Pi?6o#y8v75b{vzQG$mO%_rxf zB!R(tXCBH@JMvIc4tXfuwmeiK{yiR=Y}<=f<+rmRZBIKc<5c1HY>0t7CAhlcb5V;#!;BY|qWJK#j$t@o(vK8B(E{7Ek8EA!Tlflq`&(Zw-7&bYyS^t*dgx3uuLJ| z3nJbhw~4%(>88y4rKO(q(~}-~(mqdG;<3(@bFowv=*Q=hH(_>6-h?47`VBG~+i%k8 z_s^g+#xSs*valU~IH*Y5M7Ca~?XeSKy;*A~=yID_FDBZk7uV;b$gSB#l=_^oh-jrb z5*7)I2v2UlFr^yMD-NZ`PesdQdipweCbF;;1(#(pMs3p1aRUJ03^_8m)CH)ih38y! zS|kgg4%c>1qU*cJW;<_ckt|C)OBUE3;*y19N1KO77{Z1Tj@{WP9N-+Mlk(4@llIT0 zlkqpvfn4##&G=*DW__P-zke2;F&2P<#vX9U7k;RLMqLS;2T^Prb#Ste&T@s=`a*Q@ zmQrJ~Bq}wOAJX!K{2-A`E>gG)Qh50=_Ne&iaIlVW4DJyOf~X#lK&RNWC$F(zsA zNYrWz8B-jQoZE^ciTL-#QKHiSyEYGOcvbQUr@T%>B3 zjQ<)s|IN~fG|RJ7V_FtTrxLOuh!Yreh!ePUhY z5x_#PVqfM7`7k7Duf}2GwZQXN+NBPq+&e?1>)^N-i#aAJ6f&ugUh<5M3SDuAT)P z##t8(!y*x8t2H_5=5HW`SdWU+Kj7E65s$2xU{u-GgvIm;@uGIpKy<>F>#?t~Z$gAp5= zmFFddiG@HAM%Y((E5@Xthta2?l1I^eQr zY4>b#{d4HFa9ZFZIW4e|oc44&|IM5>vU{ITJOnTD*yIGy4C2n1B(5<@oB*;zndeTD zPaxkRUvrXtGEyD#$>?>6lOgR8w<%U%%6eGi$&~l4ctnl3j0i)vDkD4&OC7sA=;E$J z<$;8gMarW)H-cv)7_S$8191~90a%v@O9WbJWLnvqVeV##t&X=yAfTt* zy%dNZtjz-RxNB>!3sj;f2IOMv0&_*+v|X5;pAa|! zye}kd78~%s4MhXqU#8RVe~Hc*!vJrr%>my0Q1GTa`6_H#*ilWpzksx$K^ojbq@K%B zf#aV+R#B{PhG!x>k8L^-0)1#RV-kvWu(Q{YP`02Lil(HhWg5d6iM9eO!tz#ur8fYp z`&fq>`%=z$B*XrdefAhVO5pHzl-d$qCA2H)9!8ih4*%e#rEec6tvHaa_$g9bID$=n zC5TeSg+zxUrqRnI8xjo|kxc}Wj>2jlQYq2Mm^PA*yd%iK{R7OPL?dI`WFS-2JB#y; zlUf=;{wA+3v3;9cqRBSpzzU3KX_ZN#? zmI#r{-H^-ON-pCT+`gW;T;>szp)eS+pGhNk^-IvM{wI{(!|Ihg-kEVP{R zrB?~L6vS<2Z#u-CKS|shCW#aHb|_O|-XTr~qC?!pVSO^+x;dKDq^yk?+ija~aYW;? zGz{6QEKT`uVp~$qXQMW#dDR=qf3XHl8xe@3=zkBK5d8OHI{p4bbjBD4{)-I};J^HE zAmy~YW5K#u&Y$>Vz?)d+5-HR6A4GC69*(D)DB?;%e*9-s*3Ae zpg-qKjGE(u2!fB43mghQsxFWw_^@4I31?HE1EgXL;d46Arm%D#pG_$plY7eEOjy(n z_&&5=g<+ zi!p67kicap8yk?nA}QcV<68XW+K3;LBn1RrQ$TPYCIUhtL_icEAPP!A;E8hFSr*$5 z#N(!%xT#<`p@5jvA|MKpfGBKDK(uZL!o#wq9(^};vupj`YTkBLE6aZ~`UIB$7CIUK zt#FJrj<*trFxR=1u?c<^#9cN?+$CY0@UkyQd?aICvdz4VO^x%iFk}k6>}_m|?MYWW zX|yNJ^BCcLRhky)mzR+Kc2M*O6fF9`C&k(Rb9DOs-_aRk80ZhvYtSD*9FRb9>BZFN zC#{8ap0@5p|1V`dt2EDh7DZsaLJm@Mzvc@z6agEt%HV=ua`B+xg4uHM0I(BJ)x}`T z;sHh*iwDo3Ufa1N$+?g*-)Rfa>ICZ|++KnHT*m(FWWepuC>wD5JDrsO7dmPGuXHm0 z-{|!Ff1)$SgaGCo0VY2bFi|GY!2Fl*%@-ThpD<^8o6w7lejRfPVgVm~z_QBewHbQe z#Xy;NwV5h(HfBYbu9@>inTtV^t0bfwW$a3q;xK1cPowrh3;!a7 z1I{YHMmzvdmx4zj(SU-{5_IA=`dUNG8Tp0`l@ijM9&dD@LJ)ScMD@Wn)%h7mm z}|x-;EUL3p4I zVZ%5XMtqxvau4S@EQz!|7Sm_BC;{(g>dS_ij{8Ni_Jw;$ZpMA&%^qAmRK$hFOL1&4 z_YSugpTjv@-FE^r9`=RFnWW&_j@-b8ZbnZ)D;>E%+qfNNsJN``P!CR(bKEo5S>WyO zBz;zj!Kx0Q&4Bg9eJNIT)WsFuxwSm2X{82_8C>p`(15`a?1QDJC+{qR1M4CIA$LDj z8>a(#3eJN7igOYQQOAM`4lWqLE^_>ky=*)T4Io?R1t7qKwVy%-R`U+r?ok9!MmG0$ z_(22TfHTy@9Uw*bZiZ<8J%;~VhW~!U|84r+FY-6ryc5p9RnBcJ$1Y_+PmhpC;op`u znVc!=uZWLjlo-FiwL{zjsS%`ZkfR1_4UhsAyj^A6jaL-zczcug&_gpQ4|4NQe zY9pqSvy0ggJPXK!2DNVIOgLHhP54#F!+W3ph5T1BJ&p*UhnV8%g9t&3H#3=K_jNhv z!{>Yt9q7RcT;~n=lChBFy`vX0c}kL(F;NB8h3U%~d@;QPTEVG+Qr7taiYe#vG*Qut z)p!`amkW|c_QBU<;n#`yIs>|b#H~Y#=zZg7LG-$7RKPP~z%2+EeH1@w_W?j1hi9)* z#3dIm^@YI@#MdGMiSLud_r())R>H(8I7<9JNqlcSF=Z?htKcwk?Mz&Y98XDW7*nd? zDCNu2?l)Gc?j~l#Q#oAH(=G-vde+#~r9j1Fpd{k$o|>jQ1j9XftD+ z`A`%T;~jmQ)Ig5$2GTq^hWk~)&T|63L6+28aQ+2xQBJ21#2r>&mjs6exupK|f$kR& z>^zJTtlG}WxGzOXif}?Z$5HcPvOLgA|@C<{fD4Q=v{&$l;nm41_MH>PV3vXvY zG!Gn8ok+RYvHw|nrhHtlK4!_shtVEgj3~EKT1%^F!hSUbXrFYF4V(I(xbyn^aqDYZ=;d4d89px1WF4 zd*_@_MW|xucx`Smd))jhx~#4vib~}Xg=M*2doqi1Kge>g!w)Xjb_S6cmnta18M@1w zKSd)pBV{^Dv=EK>5VLI(TU+D%z(E}Z=X%7*6>3q2qY-=qf^83xX=%gEBPY6|1RxRE zL~tK~buIhheHe)`0(LDkdIvgZ+2eIkvi}j5QT1<>qU2+Ye&&(7Ng|5iHXj6L=_c=}RM{1<@lSdWvD+8$$j?J+tN{ov%Y?fxJuO8WwW{V(DN zZKdOXiGGj20wnDnCcGXex#FptQr5o>@m6&+gLy4mR#eqtC%jU3cH=1wwe2yT@$#97 z<8kH+PCc$h3kk`p`(^wNS9PV#hxcgYS3vJ^9Gr#h7xYAHoCDasWkrh4oCBBL#5fi=! zx2Ml`z7AJo1hdZ|lrvn}Le%$7dT8Qy2|*crhY5SV;)Z<(b= zP%0;mro&O{=O{(t;Yf6eOd7Dh{wNeF`Iobv{)07(@Q%YZZJi6azE|K1gjR6PjNZmf z_RJDAPY)sp&Ghy3fggR8~1DjwF#q>cPX0$y9z?MOCs1LkJn{oV>lZ{n( zlJR3RF@6|PHGZH2HGYd_{65Z>dyK{S(J{tPvIgS^)ZqBh@lhSePl7ytkZv-Bu4JjG zzE)IsD$;Nymt1449}4N6zzIz^Q_GWc?qU|98xjltkq)ST;T)Gi2g{nzQEUL|46*T| z)cDdAz;!fcsbCaKli$mlccb*p-^5QuNJ)VdeD9+s;9^{rw?!e({>eJO6{|Byo^+Qr zyLyoL+p)xyYqTg*`rX4;pl@Z|%17PkeZaSrGlcQtJvdNM(Z*!*|4`ax%^tSx(OBEi zq;4oR5n%8bX8{4W_amfJw?npx{PARwk4+Z&_+*h=qDWk!^aQ?8cghzJ0)7$%hz9{r z1_9a=Xd8I7BZv_XlKwOZ5Dx-=76fRI&bzF+gi!jqiq(O|)KdIkn%cN8*aqY^MpC>H zWKiI*V_7h^vsYxT_rSP-8;!xMfk1)oaXXkh+4X%00`c5W$9n+3&I4fI+6#p_>n^4- zh|dc5#2`V$Mdq z$!_cSSG|=u=;+({>6~O0lcXd`cr}+a^81NKg2-jYiVIVNHYSsRQnNm&2k_vpYU8fP zrC$|^9fhh-Sg_6Yy)__`up0vG>Ui&=GhlB6V8Jo4DyFX_SqpPf2;(22`6CULze6dk zg0D}^?hw!6(@`}Hr}BE=3E|>B6ndK_a2cO<>Qu_h9tLmW@@XYwaEdZGvSgwl(J>uI zNYc5(U^G?tJ1DfA$K|HqrH31VAB1OQA5jyDr*`G<7KKLdIeZwoy?q3D^Bnx3O{nx5Z*RuBSh z(+EAQy7;ST<)3HM?`d9e$|zn$>G zYyR}*ffb+Ck8V)(PIwUIxb@;Z4elQTV@dw(VTaK)$Y0=~I8X!04T^sZUys3%H?ULlqVBZ;1}bKU@bO{a+0FzH}1${~h8! zDD)2f~2ZSV(ygW?b34Y5IIRs2B;R_cLx6@Q@Dl#_;Z&YYL3Nkeg9DgG~O{tB(w{A>I~bB17##&w(na{BihMB~k}E=&+P z=R+^7Fz%menK*8Ho@LFaS@myYRjalwYd*uMXOmHp+1B>3#>ypnuR?c~`gX5{;*35W zz)ttaI(<^(&@07i`#ThhiR|y;$fH;?t!1Ei7`*g8Wfu5AMowh@TmiP zsO9_-f$pF1gH;Yp{;r@TAW=v*N%3c9TZU}4eQbM-9_KF%S`Hu3o&~ypMSwlV5V5Rl z@AU|E|ArrwD3KHWmr;XPh5Q{6BcIqZ05cp8fw0_(>Ya$zJ3e$!KZ8&W6p*yH1MDw+ z1$y*71dTpI+IS5x0hgBQHW$$=TwU7ul7wz&0N}bI94QH#>(szUg6(a4HSR=meeY|S zWPA{n%2qNW-$eFs;9>J0X!g)%#yEA9pdOJw309=|{ip)JnP`ic$^VH=*f{et%O1EC zTj08I;i`ggm16)6y?8x?oqr*n465yMXmz5nmlfm)Z88; zfZ4k=tB91mt{WRrY>%njdHO@5yAeG;AHfDr91-CJW5yT6qmN{C5AqFdW{k5O&35OT zh4wOXBt2Zg+egzvf5w>(zq^nr{q2!6Mge$3dDq5|fU!oqFS#EGWP42O&PBG%PPyb< z2?-g1(*zc%jXLBVL~}Uo865WZ@$Z7H$`HFne-%E-28d(|pKOm|3d{H;Y*w0OJx)@D zd@gnSt0j*~sc7f=IRTkodzDG1&@DL`S+B>mzLYFL!nvH}dI1}q^#$%;_c`33-i5XnvoG=sScKp=K+anLR3`-0XL zH3*91Dzd=dBr2tMF zx$Z0B*C3qGroDjWFnm5_!zlh%z#shM{Nl9;I|F|X{H^u{B~z{!nX)7L8j~qIBcP*9 znE|ZC<prieEtQy3D+6e%Pw zQy7$xDH0UOl(mTOAX5ef0U=YQ%`Gw|1c1ntu(_RON|@zGd?pOeQ+dG7!#K%Qs@+9 z3T$CO2!jGdrZj=}wgM;Htz`<+#$}2i16g=NrU=qhg27>L4Vi*@u*eivst5}gMT?(U zreq4MGGz+PYGerUc1AMg=&Q9%2^$oXDa_p}QzW#bObJU0Ws0O%GDVta$P`5$09`0k zBzrrV!mOc85j3j!38!=QSXhJF7yXLKl>HD8lPPb6B01Uz zfksW_6$FF#QvAAo#3^jx;tDG^KI0uNGvZ7{G`@y0Z`{sznmfqa@M6@B#7IG`CElH^vYxiNqU|L<|WekrWb_L<~wu zA_>xxsBtr{F==Az3)w0i3Fm82X`~65fZ(vx{wPMLXc4qrU0Zt{yB+pB>fm~0ti2M` zH+obD4}lLIWRY6bGDJGq_#c4S9+PkOQoiL8jBqx`xS+pMru6rH!EBB}iT+AZAbDSg z_zsdcoXrU!S|o1>9+A9Z>pM%{Fv<8rRBCY9S4CWwF_TJOsZ}H|XHJy7a#|@ipOZB0 zWG|85_SA2@pqT6xm?+t+#+f;k?2Q-QM)q>r)CClgMK&8AJ)a{Xa*^$Dx-^u%1Rhyr zTP3n?7n#p7mV%J3A$uh=#G=gSUda+{kB*NwmdLgw$m2(g?Bye7Ikt!9e`7wU+Eet8 zUnSaDQ@6^t2Q9FIOalD&+H%U&t87v0{VsMOrfU|!K_h>;9k4b>u-=eiRMNkIGomn z?TU$D=57_i653G&hb4s~SkfyIEX^}Su%Z%E1c%g;oYpZbMQ|@CY=TV{pJ9NSP^VBw zsn?v=bxIY8;62`{=5(I}+vS|D7c;hCPRBVK_vOPlBxg2)aD2+#&By%gO8o7BZ*#84 z@O$x>oa-F``Fb+`l5@RxBkTkC>onH`+^i3aTs{(=jmhO>5fGEhUqz!wUk0u~xqKX9 z;~j^akfkqs!^ptKjL&Li+7s$TP-b2j>`FL!L=y zlqd4+WR_ribo>+OulN$=@uNkaQH5!8K5AzQwhe1omTQpOpd4Elk$wXrs&l6 z7^cuu$urid<(bI9*Ge9fWYOF<@+@puOr9}!t2~p?j`A!lDU@fDUdc0Qo*~Z^m6-A@ zq?V*SV^+#D*_9;NRPh-Gs0nonbzpPSospTcQ>sv&X&Yrbc^1g6TQP0J5_5~(Vt7{@ zx%Ebby&r!`x%D8z9>rfLx%DXI)<;Bcy&j#4$*l$gVsfj=`Q(I_TTQ~ibMf0&ZbcCZ zxy5{e+>%7Ca!Z1v`K06k{z-5ox6VdEBDd&Ka_bzHjhoHjXt~7@Ew{uQlUoc4EINYFPaB;Gd$CHf{o!QAn5#BWX3N}F3`t%QcMHf(NZSsNx9pMy#bu6k(1 zRT(p>td&}~GIx|T?PM(x-S*UPyr7t@6__Yls|J=il&p;x-A2}Snmdx{ICngcF2&br z@W|W|hnQivRdYwia_&gikhPLIm^*qb0k`OPM~kfOG#fCU;`@- zi?D(*3qokAV)xnrkPp{(7?-0^bE9XY4`l`*Fb zWH6otvChX|a_-3RTk)5iJMIiwx*mT?8GI4KF2P?UgO@d3;OXY`(YI&|QFvsM9x`+6 z%4ss$g|TGZPn5D&qmeg4ZsU4_nLy~qQ?Mqw+mW1R;b(pdQ%rTq+3qmsKFAG8IPReC zH(1u3jU=1FQ;q#gY7~3MX5h!lStC1GGb{KsPO-@S8W&)E zJ}Pawgl$ph;x?h`x3Nj%vP0uCc)9gLZ7X)LL|enfLt)@vh><`y+B(Zabl(N2yKxd* zHqP!P`{r4Po%64tgA>)k z+v%?aLHwcy;9t&QkG~^!?HJo*gnOH9W$`(xdv_js*Ia?t!%!{V!DKBvu)%*n!Vx4{ zMi6AF4be5+Z7ficd^JSqaGD!f6E@k(AuwrcMYT-&i1S`*m}YaBTB3u|GWXBzhH>F( z(*=M@yK$=m5kDs5_D2lh9B|LqYRXez- z1akg4K`F-a>?Ylb{?oVxfqQ7zYd?fx`62!m zw8f>g-0=_NHP*ha0YnTQ@Lqg+=gX+P2VNIyMT`eTf!n|XSO<8(2kC$ZTnkrtz&aVQ zXJo(_2_8Vl-~o~|-~sPve%qttzmNWkuY>p{Jm3Qi_V^2;UvGPi2zUUl@|NDc0liZ^ zpc>G>N?b{#|mNU z!2SmSJ)rUpi1IEZ(d*M&xFCs(iaO>38PV$rjTym+1{YiE zg~#t9Jf7{sf!hz$A<=yZ9yu_*GY5Fft8l{rLU7uajxoB-hmy$PhpjD{VIE4yVP@f| zQl^v?f>b146du5`YYss$!+P*ZD?`3X+4tlx+nr@LU7zj7Yk;{BD#->o#@b__#&6D4m7?H8eU;hm^rXB+q55g5?=!4Vk=wh8Yq$?0 zs2N+XK1=`C(Rr;V$v5r>Q{R+&CsXS60j?B(JTWRs?v!B^?_Kb^4*F1a7Xj2F`xe8) z@f?CXqUen60G)lF4kh0$@PN*;&aOgd$KehEgn-WIO!R*@*jXz1P}C9><$sR3J^u3I zfE-1R#7k+VoP%CK7|F!}QFzYTp22d*E$Qo#$J&ii#`+?#6bEu4SH6G>G)^A`fZZmw zehI(MFMuMdpX?sHNpzKNDwUC0fv$JZ0lIz>uAu9S1YHkD6}HDnper4tqmmPaNk_lJ z{I*BO|1$kJmam-K>39rtm!f)}o8WGQ|50PhMta}Ch}5y6GyHJZf#ZsO|3PT~JQ&Nn zkoU#r&KDs9x?@?rkH-A_o=Vj!0HR>XZX<*h&5)hAlI;oKT(-vFr|toqfDH22y}4~1-gSTLKhbG zBB@xA9~V)m7{PI&ol;S=!G)8hisY85o16?{I}Lx)eA}GYrmP!$H)creh%Px z7e2k|WX*B08igyds#EqdWgX+HRBh@R^YKLnu>h{-f2;%i?`}HOGwy^(^bDXD^o&Dn zk5S-%bPOrRd?-nzSRj_9EGZ!_mZI8O~ zylL#4OvUcQXKWb&cSTvFI1We5W2Bm)9g8o?*+Y^*q1hq1c%ykZIM2W!Zs)(3|6X;=xaMVe5@=_AL8)5izsQi$FIk4ztT7x9AYj?p5<62s^kh{Vj%^ijsh#BpKS zy)Cazr&NpJ*26kg8ed3!tP~m`1j1mYzmJhn|IrBpCDkXe_!y z$9XqT5Kz0;lT4|u;u8%N1mcs-mgs;M_Mia||CZqI1mG>+J&-$OmENuHr+GiZuz#b& ze8#pSJ?`76o_gGO;d(PjCN)EkW2`;)9sI`hxF~pvdfc8E(a#EfKFIo%9`_yg!uB2x zYK9*7J^H^1LNF&kI{2RU!S|A|s2Gr8EyE~_z}0yqau-C31tSGjK=c6}`z@h3sS}qc zq}@G$eN}fk$`Bk`0S~#~O1PT)vGw47-={;weFz@W{?I{iKWKl90{5dc(f>%G{YgF) zwHihFk1)5#-%$ILcqt9q-wsHmwZAAl=d58cjEkmh=muQ-@HY#PY-g{c>;U_LF8Bjf zXXt`Ik~aJhzs~Q#tyHhsS$3Mb;7Yh7N*82S=z>qufiCzcT+s#h5@OAXF33pef^>{- zOHLFf-F}?;ZI6!sWBMz;1XcXU_~kLo-4WG-1H;ZG^BP0<3Zr>nLa~i*mq?J*y;upb zO;U}jT10)!JiZ8of`$GYZA4?)KO&7Z=b zbNzEc!1&D{MQGLF^4vnhu6)-lmC@MHDU;}J&EE=v*xBV;ySkygE%4InUM`KszfQov zRhnM;5u;MPHdm0FYqGLU6{04E-2D5?O;uNKh@=>|NVjzL$AeUgnG22Frg8OSv)4gl z3|^&IQ95oFw~>cNt{>wttNu_P zOz-S*X}ImB>U!_C4Su40WP`k({#x~c4Rea8 zC;VKoNoW6C5cdlOb*q)08LgRRC0$N+IEvQvWs096fQhB`(lNqYzgX-G(VB*ew%N>V zIN!aT%vxk*S@h*nz$jYVY0Bu#8hsM^VSugZGzqQItXgxrg>3^`qh>&Bzr8xe zYbSaF_?|T)mUe|(G#?UYv}Uu=UR%o@)3@3T$~eb&i0GPpc%3(LU$P+gB?4v6{lb$6 z$yw_>!KAF0#4ip&*HV6ZSzOh)0l6S6x-~>^5{*T-4Y{0i@2EBj?m9%}9-ng;&%9by z6#I<7QsITI2I)8Qr1z=C#0Yoj@K_Zv{93vDEhbz1FEzvYtBF3;2GqJnv$CwjGn)9K z%{sE+z5uPhx)__^%eTRoUJVld`Z%b6kdI6eJ4l3TUG=8y_RwqI4&GhC;op>B^GA4s zHSI^6f1G~aZ2AMcuTK+G^QVZ%33aR4bJl2Cm6y>;dtQA!S^gQe#M67=YYK_8=d5V? z$@;wE(F)-zb9o=C*5+sKDcY&})0M#!>U`IkJBuFcqJL4o z;Axq6x3s^Ty1fV3`&XzRQbVXeLIK*g#`^rcB@1*t8UA4qD zGxHvgr+=5Uk@55*sc6I^<c$DKDM88v|AVh9{G^36T@!J(@}HLVwUnYhA@4gfWULVlNbj*A zt_h}0x+eG%9A5nVhdjO}Sh;8seVr<3kcbsZ#VN)il1kX2s5Y}f%ZKht6YYR9%@*+w zQaoL#>qtA$;gPx!f@Edn@MuNOtP`v$5}Y_*9KUK)jBPHDj!TUei0_`bKo{OAO2b*H zNyX{LHnn;3)o)G@ah7V^^kbWwQ>ORLY2>%WZ)Lu}=x_3GiCt&(<8bD^Zd)@;X z+qmP1?hgm7+hg5rH#|TRHmC_w6^q1|uGTe=)tj#3Mx~`$ee7HfsJmBSkRa8k$Y3!@ zIo+{JS6`dDSghD~r;QVa8{UWTL4wR3YRj4>FpOt+duK;vkzLDnRX2X(>MQpZ#qS@Q z-GZ$fimTs0`a$8}KfB2F@1N_r)%{at9V8<4`v<3Jb)?kKpJ;WeCh}_)_waU=VtAuC z3~w%0KfJl@D(r5GooJk;ir^*}E)LhF;4>RO7}kLv*4Z77Y1ScfnstbqV4Zvz;6%^R zHjnVZh<)g6VW021R}u+4m}H>#EC7=NSq_qQw}Gxy7zio`a%^uPLgR%y%T>Rt;)=r2 zXdu=1oYvBoDRyS@zGKFO9>!b_$9R6x)QBwd8)<69O)@4gQ+P-?aj>u8P8f61s4*Ay z#^mD*(byROCK+>4Zf#^aNY;JKm{2jMV|!x~(lFw?$gRm4G;-KUO4he_u9JQnRK z1^wG;(T3-ddXO$7N;<9^b+q)cw+QtEROj`H6r<(XC=MOPS+x0+eX7|8;<|^oEN#kK zDTmkU2Z<@`;^?8@S1WL6=-PXV-&ZGBS* zP1$|=Xo{gxQih(z!O$z^@ef(ywlFkNGBi$MXwr3t4mH|r(V(G--GLJ4P(>*%zW;7}sT@I;)c}LIu?K%VK_<-$v1KG%S9<00d%sPJZ-%u34P`PYKbE|Kx z@ap;`J(-hkB9}SorgGO`!^b@kp*iVhI6^x&m+Lv{hBm^fgG7ubB%Cd)F6!1HNhU$J zkRuSz3&zWao3OZAo3>w%c_8C$d-}s!SaM%}*irKz<*?^LvU)xf zx~$56orBzUM(WOJqeN}*U@^8f(Hs0}je{8 z9;_i*ca|I?Vy977_(C0o>dRytsr!Q$mg>Tz3Q|?ynv$wEygp?$t(;b*ivFJIU4Q5I z4F9g8Kjw>1=XV6MEv66^6HwE>;|y^Tt&ZU`%vf)Y8>&&{f3wUn=?;_ofC7w!O z7P}q7g{K~+hcZSdA1ohgoz}kuO4?tb>26>$Pd9TrwD;!n&M#K_xudxenEY2PE)s@! z{?|%A)JEJoA$T*@w^#1filwa<*%Cj`oAnaej@i68tU_I>)1f{` zU?x8MvvDCge^-3{L1S^(mytCh=*OV$AJ>%{d(3S5&>i^Xp!QErAI#rDx-~-0`mTiT zn_SlD*N<$=bMEN+O`=E%LaXby)`TR?I?MC0iKYMewMykIA)ND1+(E6AG>g3LBNknUULi*1_`Ix zh+o&e;3NWFuiz%=jhsW)mqQ< zSKFQ1lx-t+Tk0EeFxGcc{cEo-s@a1&oBc&cs z6yYXm=7A_R)cWoeSS8UtRj}%MC^-aC0+&MI+QL;-sIE^EbwgLCzPaQ9s}Zh3Av?J} z1p}j3qve;b*^Ct_MzBFLPh0VmBo!?+k7^*yBlnD-R9puT&_ZMU7t zKp5qQIAE0P$zzOi3q}~Worw}a!P&CvrybmLI*GcsL^U@cb>hjkvk&+>-qHl|!h}9_ znCYEiRMrmTz3H79<9&0nqoyroPIrho>ffI7St^$?h%zHHgH!0T2nRK-3fF#=uS)B z;Li6?gzN-C&RHOI_(pe|Q&lQY$@j;@%JFIPv_}^x342#}#AWa5cJg@dN}pFy&$;^` z5k;TE-LmQzUDt6+344HqHFqF+;@O|raJ_B%#X)LQcKtd7*-n?Y%JC$B*=p+ISnCC(`A zWUI4~18RxVXaJxzMpA>c_?3q_wRP}79AMa;Kv0OK!+@ zDgp+{j?>T9w@2{(Etn^eix2z&xuO(M>xWPPLoTPSoB~Ur1gMKRRUNNJw70w+ltWXS=wT(w%|l;xvr_-j`VWymo=Ex)AU zhOK))NTZvZ!f{8`-6;`rpR1y!yU*yh$r$VmwRS{8H!P0qJqZTQ++_;ZVvRtbyPf%% z#>Gi%1Z)S*Ojsk(x|Vv(L#fF^F}CQRwjn9`vR?LonRlKaLdkj!)&wD2chg(gc0NUR9zM@kc{{=IgP#493c*l+ zhFm~%Bew<3uYuQYW50Xm-4% z2{b=SOzq5{=}U%>hI~ZE%x`~RhnYv``?qKv=M%Qc!<9ul-|N&UEi{SZ3Ll;CN6Dk} z{erly&-al*t!5N!J%O@rcjtbgCm70#L4Hv&jd-JCo*Q?p>wwj=<_t0ErVKx=(EY&& zpAbi_Q&+kaOF+5SQ9&BtLatAZa_N9>$2E7AT4!{-(CYegIS{6*KX1zXW2m-AkbBUF z9|m7MvLF=r0%0mC&?r`cs6UYAIk+Ir)8#SJybH~3vkI*8 z5=&deEg*&yOP(RdV~{XNIL)K+SB*)DKo2p53pVQ2CJAjJhGR3tcx*_a0y;B88s1gf zG>SoB-%&y4{)sGxQbZSC2PL9W?;3<}2jv9i5jN7QOBwi+`2 zG><3KL9$|rK%k07J|-wAzz)A=F-Ry^G9*`Nf;(Wx^DzvBA&nw+!A(x77ROF+!%dx$qhT6h=4(|`5 zCrN5s3#;J)J6yGAJ5`hof9=Yl3=!ij`+?->b`ph}N0WhTxPH8>;?tP^6h$##Mm*rf zhrQfobO{eRR}GCojy0&FvsaBfbQOKb-BI_N#dvM-vLh0@k-c0eTB|YqNd29l%3Qck z1a|rQMC`JD@5S|KpVQmoAC`!KGO-upn|SJW&*NN`akhQ}t!4tAc?uRt@GKqPUF{D% z0}VU_b*NvF;2CInvhDB;)Uql_Q9n^xZ5N*TE$X+LkMEa^MRc1cR_Vb;HugTGM>ZQk zHt4cq@xs(aI2z)~6j~U^sy|7pgK^HnT067Q6EMyvJ)b{SS{E4S=?Z4EuhAVTB4mq? zV;skS${6R#Dg+qkY`I{ZbL6%dhg^hlo{7V}@-%sjadcoYFb+||I5=BYX~Kx_?l_%9 zJw>9LXOKGa>@kkxEln8bsbXp|PNpvzJ`M6VV4O45H$G*XJWE-$80VD0I9mDKEm8HO z7-y6`ig6aiT?)oAcR%vT?hp#Qk3pEHW0B{IX)ymS0gC2%coWaL4YiJ?(3}XZuD_cD zA-3LZN}I>0fgLX(bxSB<2V{ve?06w8p;o~GwS*m0mNl@bmNj0B!?MP+?_c* zn|@O1dIb@+tbtQt4kzuFHC~JWUDY9{c@ciyr-73Q^q7NXjSBKl4i|I&B+r0VlktGq1Qc5VSexHyY=>?LrATkp$Ze`hhmnm+Lc=nj1T1XSEBlwjT%(GnTh*ChUpG5(TIh?j~3M_#VxURw~ z>ZfW@dBd+6)s($Al8UVJP~W@;$<{RBZWLlRE@{B55eeNWUE-DBYf$*B{xV)UYW^SWT zrlC99mdxn4+0-?dtpb-fNbYR?985d`xV#Y?BzTq%b(58W3p9WW)Zu+a)F=im&!8P} zfm+ryDeC7ctN#XYu}aCn#ojY|;Ib#c1zolQxZICI3%FSI=Sg*d%k#0;&Mb7UXwH*d zS9A2IJx9MuO1E?Lt7DFSizplw#XYw?6Y{&eXsMum6X30i)N*yKA*{Y@j(D3QVncA% zAQA9vUdOb}`4XS!(Du$TMWT0zFW2=NUDkq>$93y%o5p7C7sy=AJH<4Z*RfGuu!1-7 zoZGX$C?;w`tNmrUTDL-AT`2j;3Cf*U>wbtXYIUs(F1kSIQ2*4FR-vyl#lJ_%Gz411 zVgiS(ygkLg7nU&&sO1#Tz2%e6mrx^|FZm=c=S$u!kI$FrjTBAt=Xzy$yuNspQfqs@}{(85ozFk>xY@X#m5K<^`m{2!%$UnTlv}rzQD$nkG z$^AP+#|Y4xDn++JNb0*yh^t?u%G8Wb?W|!%q8idgnhzs7^3p{k3dB_XZuuCwp%imD zDwGV#ts}u5bNP$i!*pE_6wl=!l23Ql=-JQZoGf{2JO7mhHWQ;&^AQq7<&KrfbM^Vb zU?;&nTc1Y4k3vs8%k_cK5^DVt6!fIzJao|rDJmzVz^;cXEUs&H6xlBi^z~Ux)gL4E zAlb)Qv8EMwF3(5JEP}_|Hb-b>jue z9;w-=T}*TM5uT{*eYCv8FZ;*k%cU?sE?*&+AD6F`+y1yj9sRicKOBBs>K9G?xUAKF zy?{=Xeq7>gS#@#uQxfee3sOSXaD2U@s_3^mtk?AI?43jj@_A)@BVOn{rum; zBo|1b+4|Mea1ti@oRx-W=}<2;8IwQ*lRzCl5DVyv68UrWbeIHcuA@j%zeZX8H!z7+ zdW@^u-p9%t+eDWElc4=JV3JJ~T9^d(`n6IWO!7LcwKEGnib-}8Ci$%U#pk6(i%ED9 zQ#yPR6Z6ft^+FW{7NUwchf-n+HTR;f)(jGaTutMc;`J(S^A#}-=6|VKzxgWO#B=U4 z^{)aM5Na`n&hTO#C>c|r+IjVFa@6YjcR3I`)VjApDO-iU2d4PCl68avQ$SYU#uVRx zCCX56KrJ!Flw|`9s%3*8;Q$)GAdi;~=4scP&oQDPR?7xB1)y-!ZrR{l2+&Owa++`A zuNspQfgVt>Y%l^S9Gd~fw?hi`5%$yd5b_TnBxRcKn98#|4FRCAm81K%c1qFaUCVu& z561e9s!0I~619MW_T6kobmXOLNfZdY@HP3EU!fF$0u@Szyyh zyYdYZ&mK?!t~x+b7T8P-HO+-2ikclOlL3WV2n==-+_UwAN%(!}i6?-9RRqpCgqBe2 zH>02dh4aug7^KiO7;-4E>p@pw1Qm^XK+)G{0VsX|-yqq^6}i-N&bGO2dvwD@5j z*UV%|gDg1!g=_AINN$UUzqaiuL&P}CF+c$|clbzOzePrw0w^#YfWkMsx!qSW9#kz*Eh=e7>w;^EU4B5klB_1^uPwYCgtA@z`^SJqA zsn?F1(dN=mMadJE20;kfCgXU5_~1%sdQ!23C&)Wg|In$`w@W|p!#m`HAKodq#SdgJ z{P1%e@WW5!@#6GD)Le}ph!TFl*|O>%9e!{+iF%hrH9sSD;@RT|$6K24Lm1fjA=5jv z^=DQu_{x76Km0-p&DQUhhLiBaFRe5@ONS3tVcCptlH8wey5YD4@*?@TT&;UedBk$rK$0M zL`?0@Or|dxo)5XdC-(eLkGFl+eD0w!E~kCWU%`jcX7UG}7J%>D(&pbXWQ7dL+`2n9NUEJ?;Me}lzB%F`B53;cp@ zSrWmv#bHkLm2DUAE(hEGL1EiAVcQnI5G(WI6!67KCCw)-{(+o9!fF1FziLcM1bXteTHaFtA|ojJX&X`Z&yCrKLQ zrWEkSHMhulM$z!swmoHt7-u;KU!dk8O4scuTz^tVnF3#k2fp}=25$GdW=Aw-<5pTV zRJB6xtySY5Sw%;1m(qQdF~E5HVMio%L(#~3$T!stzNfzvRGE{`OYHDI!xEWtw*C~& zWWqkfQX3tfrNc+4!7(R8W8#E5e58o#o6z#q(9P3OOXHKG{deWX#acVF(4%uQ*!1(Bb9R@~qu6x0DB19u zlObfAkI%`(2UmKkjbjNa%YW5&?;@MBnj<+;T&tDW%J3VLmlHr#i=X)6@VN>Sk zKWKjbf^D^za%gR(7rwwRml363{~&Pb>mU1wYs9<|3iFQbseG9tt`yT?{$HBrn+k8@ zIk&#v!o(k;yxM^x=hc_wsMYl@yY+m!UqbQqz?29KHKyr02?V!<0xdvRPDTr}usD5* z7N8br!7u+zc=rSIX|>~ja9HiwTOO}=Jchb%;R3N*?Z7GEf|IHR87}OHfI-4(_QhW{ zCM5zrTo_yJaBPMP`-c>45%wD-NW;fUndSgfd6ugk*t{LsT05l}4P2-FXb|G+uc+Px z7f95?1$usS5TYZmK_U=nV3mB#JWvX_fC?o;azjXP2VD3njac$bFv53kEDX{CI z3X4|_8uf6Yug?N5972ABWG7d6vD$HHFt|!4)y~{{T_XXHYi6>fL6#hF!8Lc7Q$^A6 z*S0-nh!|%%1{a{_?mch?)?b%VroaW{_p2Rl_f_=%Dtdm^P}R!R-L-1mC9CKN?owLq zhyl-VVMiqNL*ocuxR=Jk)AX0|!cp@F@2T?&Yo$+~UjB3E6)r2ev-LMd=+%tGgiKHv(mXZA(UjhBD;do0EuK2!~T3nIoONKvyoN>jZJu`5H%s2BT z+wLgk(Aw@ffh(>c3THiVr=IorUqxzq8b9lCMMdcGfE6niwVN?ZBb1>D+MHMK-ZIt8!=qaXM6dUVP;(W825qR{ zn2VdM7K8$sKvtGUCL3U}m=c*lEs+VA+WKq@=6JA0ZyD)@(fOnL4xiMk<)C%ue(EV5`i9^@IJ(cT-EK_4##G2ax6)r zIJzRm=^+izk~YoN9Oel);nfJ%GT>@Q%Qj_-A;uNk4>7@5|4@}Da6+OMoG_d;$0J(z zl;9)+fjzD+AM+fP0-T^i$&lO{65Ih!end}@JW~u#j#Jzq@$A6~w}5nO8R*&-*i4M< z%{8EgHO9(haB|IHu#@1Pt)EQ7YgrsmzzNrduoV+pLal#{f(9qfLzjJ!LYIBWp};nT zF82s3#Sjt2dW_OnYk^U&4WI7#z{&MqV3ZSr!8J3flIHf(9Uo2|bw5c`AvrLLEAT|8 ziW1_lT?G^+Vw~j|MuD2UdRVCbiEJ|kqac6zg;!s>C-;1~`Rj@ha@G|g;kd`@ijWAo zBe+lLGrKWrZrJXm-N0I&p?tgW$ouqnbyeb|HH<6iex5IDjGgqpD&JsIYq+jdoUMOK zLl}E`wS*mKiCgT~qeM=$ba=Mf7_b8xume%Ub3|E5jSCt zYH}``=>9(B@0471n~FqND;C#3k1jLirCBXZ7T0PG{c4FYiuHQFCvkgUAaCqu9KS-* zm|-Mgc^}tPD4VX1x2=Am+^ZG4hZZ}ryc6~?zT&z122!=1tJ^({8;#g}jc)T3Ay@J^ z&LKXy(u)BzTJsQ?`K3w*nE91lz|61ZwqS-l1!hjd0nFS`9)p>u($)YoLJbN(XcuNzQ`JI?rFq7#^hQEh=se2gr7MA&{?Q;`l(AsCIFUOky z1G(SAx!+vR^b*RGa6m1=)3k%JR5=G@?}f|3*qh4ZgRxJeeQrL< z;E7mPeQ*o#<*gGOYSHZ|>Zi~NaOiBcL@Wg7y2V?NY0`1`4y?<-gjHK>_m?(W1 zY>*%g88MqX6Pb8|q&TYKS6$qSVzjciAFV<{{U1HNospf7_!whL* z$qb?H9t?I8+_Ux5Nq7&7;|YWkRx^Z(UI?}RGrdslRyS9`S~V7-n=2H8YC}|E>Z(Db z9y|55T41M>5i&@2a7KzbwT|YF*OeUbwDmJd(jZF??Btp|#i^ob_@i@Dh8)u$ zY<0V>VqB}DqgK&LtA^TBD)*`?8nXL@4z|W9>y?=ukmJkZBYuzRgLT{!aX$q! z$XFAEtxb3&7_Rm#_jl#QEcXw&%yPQZznkUAMYG)fahT=qE01TnXQ&-|mLp2D9L|-e1<7O6tV3pXD5HX`1CO5mP(MW%`og%u)<+>GwqZNbgF0!!|ihS+w(< zMme?r`CTNVd7$%ufS&0!-7GP2o|`@mJ;WkH5PrU)%4iQ|`R4V~V33@_Yr704&U4cz zp@$Y3;2+K40!`&@2L0~@)iF61b-Zvjpk5U^ zSR4tn^-`pTWs)FG4Dm-E*;39ErG83xo9vM~bL)m+vVKQ$SudAHFp>FNwPe$ruE)%V zquofyBwxD_!BRqvn6>MVIDCc1i7cEvXXjtZEH{6eo@-YwueGGGcxJ`&b(#syh`J?D zlgLC>*>bdu8&Idr1u`x=yx)@DcVSpYTndjUC;s(_i%8T5Hb#{JOTmB$Rfa<3J8tr6y) zx#Dtp{v^*9-Hf-|*N5J|zW{{d)!Y@(H1f3_A?jDRWQa6;78C0uh;*mcjS3`jHz!vo z(Sz+xFk z>OVkf9#trXzg`yYF-9ZgWHl{Sw>yZ4*2rCVrB2sSrHZ0HT2Wn5@n;!?NKCc&u)y{n zy|IXfRWZXrjrA9(3>d7xK+7Pds}-nat&pPLLs{*>`b(*a zF2wTs%M&G!MUp+E+w43grd?V#W&Op9yk7mhHOw2j;bU$i>o1sL>iUZYQ?I|+R(q*n ztiSB^0%kPY-C6ccj9jqj3c2ly z3%Ll3o`VC1I7=R5QJo+PEJ~EHD9)BuD>^LdbP}~vqMEZwop|=UdKTpd z3Ci-#ckq&kGw8=ZRRM&e3Kl}e`Gd70v371_J;%y~PO=_iceXy%ZltddBhWmZ{9B1@ zz?RP_2nBM4EQwyscqS~NM8N^I#FkUu$ib94qw;bbRx6$&kI$&Qkc!{@GL3<{DMCb@ zQNbyIrIV^Tc^l|C2+*|%a++u1uNspQfqo@}Gb$fiE8&6s~skYz>#9-@BUnejnoMeN~-;4I$c@2W+6vH!mcEL9!BwKrB=| zUq0q+D8)(!ij)j)Bf6qPo zU%ADC#!KNFBs;nG3*_>$U~v6Rs;W7CG{QV>HBFK<$dUuOxB|~Za$67hqxVvjh;f#E z&+X<&sJZ(_`uaq5N6(S^ij9%WvaKT*4-i5wzTnh7ql)pUiauRMPp%sG)++jldz&uX zh=I|_WxJB*v9nwsd6q`07wT`)9uad3?m?rycNp65 zOeMAx!=Y<>uQ8mx+V^bt(2fJcVYsOn?mWt-Jv5l=|53rfa67$#;~4Hc?q_e176pcT z69wysp*4d9A=mJDCv*JK?pbS97JAmy`0v?t{GA4 zSvXr(&2~M@=_KlM64kt!)QM-`vm9?}>RCsKsqI;rzGS!#@-||)@7gABRTiTd?nv@~ zhx32Cp6Nqd#cNa3FOeqZaNgOcT+vG8Z zdj%EWVmM-j;cyBJ=cFBmdmjRHlZKq;J@|D=1x_L`9m6>`W4QN|B+8<@Gn^jMkm08J zfWtgX3sv(W6y0cbx8Qaq6h1Ns}bP~`RQ9@@pTUH&=p);qGsH;j; za{;Ln&mNsQ-qM85Hi)T3XPLfaxDoPJfA?@c`(UkW>l=mow&UlOL2I9%$NJha`fPP;= z{`@f-LDtS4TOZrvM18#2o2&?`k0a206~;DYfdEObgvN+phsDJ%PkciyG2*m6Wa^YX z3+r4oRXox*^BuAq`(IZJO^o%oCW%+;Ueo+FTPcn%mot<{_cJn%a$82GZ7i zTD`vVfZkk)v_W!?i9kTUugM3lfKp&WaxEF$40XGX$bku?b+!~^!p(})O+I?|n2-bS zS9ISQEu)#3Y@6>n5zix6>Q)`OzKl1|yBu=*Df63jC%Tw?2WNa=gdr1f^8@(?i7@kU z`H4wv)Y&%Ydy%O;xda%uyac%a#N{{h0fS`6>1XRVP@o@KFi)^*_le2q)==xK z)2)qFowjlcY5*lnr0LCi$NOM$*r(}t3L^biDlBLw|MT@ zK{8L<5+_M2+IPTJrnTm$NN$@5{un?gL&P}Ce(>n77=)TfkVs!2C-Y1>f9{b`uhj3w zA#!)dDn?^n41@x@7$_WCsX`tqbTJSicXWNJGUf)K#M%)F-7GRQ@{ZgyG&nzBe<#q} zv`<=odmNmqEsvS+Pr<2riH5Hb@#AgH1@c~Ld4PsE)Un6Xjan#Bt4KdrDQ4^AV@~*m z0-mTh9jns}wNFdTpRIl%5aPJ6XpT5i-}UPQMyp-F>^?EF-^}itbeurPAu``Nl0tq^ zbX$y`^}afY+k8_JN2vQl{hFw|Z~EAgnpAG1gljk5WEtZ6Wc3gA6>y#Jy;UZYF37d> zYBT@5B-I+#7O&iG^~yzhmuU93`W0_Aw1Q>*z9g36?KGj(*N_=F?^0hA&oX&vHr@@< zJ$v>0mBsocE0(DTQdCBR-57;duUtI8TyeY;qC+o-qlw-D(|H!Xbd`113Fd-ieRa5c zach(ekd|+HsH`7nRf4Z`|eXVQv*I$x9I)k*OJ+7KrB)WN-?dt&A5xtCSi63=!>e_R@~F0Q#flYE8T_7s zpqE<*4QQe1=Z;ySXe>8filr}(>|;oCy=XSF#ZQpMs}(E5Itz`{{fhe!)YVLJ60_U; z{(*7mucdymZu(mVa~oWv3yMU@4P_jpJN`CC<|nE!AoJ_U1({!0Zi~#xMaca3IAEXO z$YW&wCbd!{bE1UIaki|Q>yWwAN!0Zvs`(wM6VD!*JKoZS%x@s37MW-IlHm;@A93mD zFf{7-OBz8;&juJoZ%h8!WS2W0^&mMwzB^UOC%{cpq3DK%2qa((K6_gWpY>s{iDKO z27NR2xcO-UFS>+8v04VjDe$e6cFUmuK#p!_lGFSRziwy3Nd$U)JGPbW*o<%gNs=gw zu26D%NU@duFNb-S%b;-Ot!&q2bZvW!Q5D8+D?3Cx^I|Jot%}^OL?RG~c8d~%O`sHz z7ez{j6paAx(XDJ#40$h6+#vDnrdD8j|6U^+cf~f7x3YH$ttOVt&~gwAb`sp}R`#yY z6VGxPG_-_TY-KwSUCu;`sv(jB+Yq{=3AJ=bQ#dHr&a$65kJ!uATh}9a@|GH9IAt?=?|SLXHTRgA z5wOx4#Znn%*N*|3Lycg)|2k$Sl;yG+kZ z87Z%K53L&T7+W>i-y%W~{`$rY-qlv|_RIvhs1-R1Ep_ZE+GhdFa%HOk=>hqatk(tKF!00ayYP9yWs zEm{(x`UIh-X3yX;fddiEUJw$`K$==Ag~x~;c(wS*xz-FV*N9=H>X>1cZ+ed`+#<>O z>nfAAbH~)z1GDL*)D7&0?dlskFk9aUx7j;%vzfoH8E@_S*~5dewf$F_25-;Aa~W8N z#|fox`YV}TQONvkeLrHC;k86-RuH{u-;?P;`2A(cW*?}!i3BGq^Bdi~%JFpPYvew1 zJUx@+c)C#dtikz%_!aNiEJkP1dwxdGd=_2X+kK4BznACC*RI^XJ&V3OXVH71C6Dzc zOPAf1R0HRuzUl+ztyekh(x;-B6l!<}>{e0s`Jc&J%_^IL=V9tu`d3|Jcw^N=eG-*1 znBN}+yXn=(=qK57c{yrL!-$ObCbzv?GD7QBZ2*DwEP-aVyo1EE-a~{buC70L%i@sRfk@C*LvosZ@$3E`oJ64bA$ysY(!Lo1^4IUKjbFlWgH3by znR!5S5b2^!gXFfHAPwIpm70Sslqc|jm6ZESL%6!%!A1LMy#+jgvHQ`5zxdJB%qgsV zoqZw@^Zu-S%#%J+Rq$3d$gsWk{drS&@^F0 z{j;z@H=?pM(j4mK9w@rykv=fCJffeSM;0QKHq&|Hz?D;LhIG!C;MC+hqOf$?BR7nw2Z}S?L{`mHX_o zPi)a#XRvQSQ0&vJM|eL_?4yC=?H(xfm0{V1*p>U}A|1KKK1~c1`@}xY<&ZE)IL&48 zS4~SI{Me4QKj>Siq|yso417M@~ZryGH( zp4#g=9VIX8G)Ex7uw{_&*C$C4m5~-%-$Z_T-l`R=j?`L0Pg@6CDFMSSF0A^;ac29aB+}`UAcO22JV(srwI%UR<(&G z?oi&E6kFBRo+~S1?;|y9)7%D$Hh6`jqo!EBnO(Q{!c`!BW6-4?UkTcG#lFW}>t9+4 zQXcM}Ra^g~7U`B*pl0w`REC$t_G_2K_S^ayRcdhg=EtgFEB9w1c`3!H0uWan2&4mw z2*#7+nW+i{RRvP2Mxc={X$wvx1YOb=AqF!gZzo9)Uq-4c_HS209`XN4fxP50^1EY$ zVDs_%!#E4qv3)0|*0_J<-yN4%$=dao#h(7sl|;#Hc=@Jp(G7HBUCXBP-Z#B6#u%7y zcqf3>(Ga{VxX03bRg~p?S?KG$`et;)rQMF<(yG21Fl*`R+B=6rhw#SE;nLhs)3KSerw_#m{66+Vo^>7#!uON?qalF(0>D&61rHe^K)GrR40zEltx301g z0lLLUPO|}j)tHnBjI68dsjl9?Ug+2!D>TQDGV$!ELbe(|8+Cy#X6u`K6pI4ucBP!c z8*j%Fj>r`2E4I7=lrmo2TrC*vB)HoRuB&e)A;0#U<6uaz9jTsg#l5@1US$5f`Q2nL zHwkmbu9)6DF7baqyWe*OH*|g6~Xh(gOUD~@9^&4v)0@@2 zmDJ>l&s%3h?3@A?C&ifSk5L`|*mM02rE5Fa$Iy~)OyT-gy+-#-iI5FEz6C{ma3$SY z(s{q1y+6p_i?a8J+56+{{i(de`+14*HZlq;gSVB-e%9^ew)F`QT63Xzkp-^=*MdS{uB*-9fsY zVr#7#n|Mdu<_;u?nBl1at~(Wk0sujlM4zs@Gb|QXt}#I^AQBe;$oO|b&|4P29}X73 znLM`m`>^=tcL`PK(ijnCbesYqIjM~9mniRwfI-4(?t)*}C*dRlJwoCEVF_(;#`-R*C@n^k zs9kQNFE=MEEM2TpA`t5zca)C_4ob1ygjyv-a?K~WV`b#7G%v|B#VaHCP~0H#9D#$~ z{hH|78No~pq0K#^PAQWS;3>giC&8`j+DLdWi{r@;W6q^Vt&6je7e5~CpUs(e!ovJxJqKo9j%=?tt6PIZ3vSj6_R6q zcg@|`c}CIj*S0-nh#2S7kA&TP12qqaVVe5xGK%M$@=!NFiRX0*$Fj3|y>h4}jb+1j zLyAoM8^PT{su%;R=-Ij?4dryzRygjux@wD%`<`wDkMYT;opwY*Hp0Zr6zO#DcKM^r+^dY z{-1g-I!)FZo%S{~0tAEBi%_Ya$dc%}|Ix5mNICaIz4W;sy=C!paj^J< z*9h>L=$AuK^p<9;xgf#r9 zlxfa%m?v|;Q%;%tN!g7;VVD%X8o{aW)saR00M&x#eiF5FKYh7*g2F11RZ0Y6YJa4B zOe0W=xgWJkhUA)0aL3&LKG?i}YCMZ;g)_LL!FoaNZu54D_cNMFy(DBCml zlc=Bj-9dCem}tt|&ADo*e}&wwtHxcoiXP*>r@24IC(r#mBB2|}wm$bCHNS~(fjmXp zP|y?5EN`ardT*j0Oy#-ALyV|NRb@9jOuKZ?@Rl;>>yAoqv#bj)GW(xI+aF-Cv} zMu2hn2@!=6pp8$VP|G?aMg8Ee&bAFBboXWw56Q~z93`eLQcSrY z%GUU!XV)-{ya819=WYSaF!gSMPf<3V%(kr_s)BL1z)mkTVM_~1%^u}Li9AK80x_Wm_{|CYUf&)$D#?-qH7Pc&qC zn9KxZdAM94%jt4k$U*@$fj$?93G`X=cmn-24Hw8llx9zyEvwdbkj3dF>I{i$ow=_YPMocYa$@C?|M?e;28QBZkOSWBgDeD!#u}qtgMbxU=}CsFw5%@pc_NvG_S>9H6|qj(=m%!We^Og)-${V6ev~Rom<4}}S?Jcyn-o@wtWqKn zkmS|!G5tX)Fbisx49PX0;1104Xxf+LnPSZHM#T*h&xx3&G=iBJ(wjGvXiAxkS>6&1 zb`spPwKl}oHE)HUc$SzYw1iqe1_g~-oJZAIMCF7O*oLU07ODn~dd$+-ae-OhMt*~2 zCpUruv%EbRTqTogXHIYKn5S(BlO(mxAn!-G=H7wiwgT|iwmoHtm}mt94hrsi_`2>l zGSoaYM*8}(GRpQ~7VOz$7I%;;#(*k%b`|}(YG?*h$X&OJ9^<|z%n}2XG0Tof=!UYb zW0pe)!#S<9XvF)EVUc&KNcu9K+j)97WEL!f8Kz>9&r>#G z5!>nsDi~N~rx&oqBD>A#)`gj0dOm!wRP}r~Sa)Al^ZONyXBwzXt#{Y#T_o@D83qVX zljMoF%sf2uRgz^+6nFtM|#{+3E|lCIA9anyPTNth#&$5S&h;&X%a=1Efwo zdw}40OA|miM@%h1$n+({b0G^L>~a~f)smT)zi#q3&AFTMSGK{2ltqgP?&3xI`KOTo z$DRMj^t3HJ_)mO4XZpM9pS6e(gui|&%ITgJ`Im3zq-svyR{1{!=&}Ym&1djejY)|>4^y2kZg+tX~^)>e9ly!z!axk08_ZHl5G`Ib^~TuCPm+O)%ATp80)90 ziUm_h)WQ^ceDeje(?t+Ci9n!`PszuO2c>{1s8uq!#pp^8kpregLux68DW6xI?t##= zhbiUjJ*5%M#Ax4qkwjCn+jfI{x3Rdfz_Ga-@~5sgT8L_!`rOHA?vjZ){1?4cYreI!dX@SJ6b+plM76GzT6fjQ2@cD@8bZIHp^p}^mQ68Fo`I^B%Cd) zbj#@hKJx5z67@ofYQ9J6#IuJ)g-MydWcXsp+q;gURi&BV*!DkAey!~< zADHPSDDx{T^Fuv5xOAvG;4e+(nP_;WWR;Uo|Er0@E>&V>1T&V@QcAuq_g#A;VPj zCn6J1FpyJD!9b+!2HvoYtFra>W5^)ESie+lLGvyC76UPIG=EW8C9+D1KtP<|%ExpH zrNBU_RWhV#TyO^ldKpbv@=P%X`m^HncC4NgF;Hm)Gcjv47n5j8nT&z{8Vq(4+_UvJ zN%%MDiD!v{LQAOic_?TMF?xqmuU6b*lE+f#;!ah5#>>ZVwzxfkp54pP2c zM)4H8jn{OOh@~38>+B9v#V}Jv*RG;NR}IZT3c2rA(PP~AbfPrIKm(&4kF`@>fZ!cy;2o&LZ;PnW6j~llyUKuC zRt72RS9X=LeQPzPCf`95;hmY~fp=b&mEAc?Y$x8aHS}Y@HCEDnJuTi@3EsgBQ}NDs zDVy+)ZS`su47{_`3s~Zv-DcR^_^s#MU1Z^Q&V2!E8@gUWlx*ZRLCBRnj(14VCR=Tj zSi-98-B;e>8w^}tqw)e=UMm;i@;bRKa6uCRmqj=Lmw`M6E}LnA02iVJTyVCmx@rep zoKB+NAW_Y3q)t40;No~o6L5K>m|EbH=}U%hf?TZceB;8&>pNhT-`Q@9mBk2FNlQg3 z0m^c#!ZXoQ3V?!@WN1hA)3 z1e!fb&Uwta1LlFi1Gf3jBKI3?~toj#V6+vC2x4L|ODQy3<1%GQ>2M!#u$%PB{gukg^*z zLz-)~_4fTgvZ&vpni5taQHxdR_04Ls8zifg2m}<_TRx^eCJ!|7Ro+Ug zl{{07RaPl(ka$kSD$yjv2xel$Z)Qm}rA)>u`v!xZ1ov$HJreE*J@G8DN@xkSej5rJ zt2ht62uO;`2`R7*p;rfkibg$F>Fc<_D*MAXNOp1~D6q-_!O-`)g|#!MJFU#qHiSu% zisltZVO(UD08cxaHorQt6leE*7Gx?a!)I+;d z&cax){XA>iyT81#hI0^@hSE*NG~HR4ome(k*T^xOk^AD7&D>O&=J%ePb@@#42W9WU*}Eot56Rv`vv)3g56j-Q@(w>>RJ4_2F_cB9 z=(0GVqW_V{sOb9|fsKlY5-P$ej>R~gP?3+t98T)Qvqwdax3tk?F_}JTFL^)Nc#Zz1 zy~Fbf+S_+!Uk?-&2yogh)6_n#2HENLaGXRSFy2+=15ZFHKp<+B3~ttg1o!CK zB2x?kb%B8-^Xx$&Z$)?SLQ$uk5zOSXMc0HnrA!8a*9rzZ3GVi6(X}m(Cm>LlReRGe zx+B!$Y?1S*8jH|d&WfbKHiTaKMo!hBQ4a$9Ixaxq3GnIdYnK2whvmwdKp%BG#it!{0~ zeL=4|le1oP4#(ZMYN&A$-BWdk0wMP^;l1J*(T+&yhW?TBkXO^#er^4opeZ%p-#lvm z<>0;RDdz=vZ>R6s-9UMEOULPk6g@%8dv?$OWl+04J80v`3u+!{BgKyH*_E1fdv-UH z{9?~;=P9wBYgks~aN`ksFDq~0y+goz7;Y-w>-Owmsu%3p?Ysi!Ms~mz0`L9NSmVah zqQx35-n)q?xu%8pAmmCO$9u#FSGt@{VhKlN@4D<=pS?$A@8z@i$n3pB_Fhrm;RVKf zTiL#&EW&#?!(nbbNgm_9i#ohVl<*!-v3=)s-S*v0Nu7B1c+c^cHoAS6>D_{K`5W)j z@ZJkG9%#VRds{bGW^Em4hg`G!y!Y~w!XOkaYz(i(?&2Z+?&71oQa4*a zyIrv(eY?AO7kM?sS>orwYj-UO1sa1qcSzv1yTcMm3J$2-g4d`$@Y(}#!E3jW$9V0B z#%u33UL%$^iCf?`C+_gtJ&`a-IL$rqSB*)Dz;wLk*o@as2`N}WuO<5lDK;4I-HtCR=?9J`x*z!xY5UPG;t!Hq_5 zzKcA%!Dx!{+PxL0m%H_xh}TLZn8_QA_a)JkG8wPkFBt43xZ4fJQ=uoGC0>ih4z<`| zbRJb>5miGZ1-2pdDm!wj290{W*4J@?*X|FW-c82IjiA75rv(GWoLD<^hYXT=+J-Pm zQXx6;nrp6ho>4UXd4n-xoMqpKyLBR{xg$rf&l`-(+xMlHZ~cxn4;2D&dvNl~9i(ck zh~7^}E8XZ24$VLzci$>{j62_oJ<1Kn9g#3;Jl7GD8STc5V7NDd;T|Y8^7Q)OS+kp0 zp53ph^dRhzAmxQMXka*~-TQ0M^32}V8Pu}QNU@!3d;OYSsY$nH_h88@-e22!N^B>F zvm#eA#<2Iw@&<-G5DbSIree5m&Ca$OSy&smHg=Acb0h1{UH#ek;UQAB#SiWKYY!78 z>!2AHLayX-3`cx$rK{K^mT=YV-I%?{Wbd)ryCHk^Yo`--oV>&DT-rh%1rTsM9fwKs zq4F5G{ip+OL5uncn|e+rIbLSgZSsZJ(6igtfZI zTbV}BSTNIC9f1tHrhVdV`q}lfEiwe-?^eQ~bZd2I%AaV{qic1e#3zkr#;DEX<*pJ!=`#ldA?01Gd#(qC8*6N6*S>qPi&xt$icP;}$XuTCov(C$g{0fnFx*blWzh7=7Q?$Nb6Q;hwdrZ~Mqtmj1RR~o@gUaNZsiKdjv z*zcLaU?;)duGKvYdg57Pzt9qDu~z3is>UL!hDZwRx~Ur1Le-#AkNx^OF0kLT#UMrP za|h~eUU=GuFiBF|4D#VJuhl)*siJ83^IBcRILp2dcWZS}b4S*t z5~Sokz$t5W#P@r%?hCrnK{T1lEw_s9t2-cq=$=|d=Wst8U8~y>3H|6_{%#*%tJ?|h z{5@Y~nyugALkQ^w6fi+rI{b;o4UHA1f#0AGf68DIv^=YK_>I)1-APfuv)d@&zH?-y zCO<7L)Ub?p@zNJkT>w#e&9FEFcrV)ldL{RW?Q{m1>+pq zPA_1I-*%nhPQQzdAzma^TMQ8!4e2G6t?yx)B_ZTW9>;IQ2Uoh5O=1Zr$UD?`BlUTQ z_o$E@9(%7`4v)Q0ZhLr)?1jEwhQl=VVtI_denGS2@EB1-UpQM<9oroqb2^FofJ8Mf zC3WK2qc6u>n$Xt=#nc`i%k(9~4?#Yne>d=guS`BWcA@arUu~=NltXJPeSCwpvJaE} ztDXI;^mO?HbmE35{8eL8A}}3sIW{A%w}cdIGDtQ@f;43GY~E@rPY{<=PC;Cx?B;`_ zWwhRYXp1cB^VR;;xJlF^E(Wyb?PND_{<;D{fdEvmlMes_r9fP$RWi6a>m~}3193$w zZz)DxZ&RGECeU*t;wp_`CML7y9VD7kCL^wQ27{dh_iX(u621$1;#nfD=!Q`1kJ1g* zv~@oLtW{$Xl@mgB-RL5Qh(x0varJdvAg*`Ar#I_yaw8}Z*L#A2Vzv{Hy?yP>?WZ^7 zojMxABuRzjSZ#C7z1OLtX!xW5Qih0eK7HTqW`3x-1IKt&e@sU45xH$#ZSx@3t+u&? z=#mB0(IpGvxKHa^k_fr`>N*QT?tEHpi^1JTh1Mc?wOv?dfWSz zb)HK9JMTGuP5*6o?vRtxq_cU}Q=BkR`N{$>pF5ve-5-u6*Z za!m`bLCBRnj@O6}u5>+{#1gKby*JF>8)ff}v-bwsds6n^RNkS!+9|}hm5ovgAjJ1^ z9HzwZ>f|KB9#9aEgsmr|ULKKSt`rvqyZ6x3tlX(oF9b)-`OGzqxp)V%1j8 z#<5rWcia9G%CEJ3xmWr{EAuHmJu|g?rC%_WXQJU1d!-m%n8;E6xT<=CP}JK(OcV($ zYh-gZXEDCHx*+b~fq7qdd7`ZNyUkT7%Qqhj%$twB(lt}}N>QiXEBzAU+A`~7n2Vb) z7lZ=6L7rO^=hJx&51ko_6;QH zd-8Icui@9H+Hn$r>FCX|8NGdzBvG6}vN;l@*em^(2x)F_t+yZO zB8zUXltkrT>37I(;QaNnx&i^tz9Jt$07`-0P^)A}(JJ5`-77W4=<%&GgEr)>z6Bo)o8*em@3lG_TvpZ7{5###2G zOos!Y=AkCiZ}(oQdwz%B+(D|wHrD+fXr=o-!l4-`K(DF>()dieoU67*wM2Doe zZw;-~QtS=pVV#CBpbbWJxie6aWC@&+bb1t!A`Q!&{eD4X8Jw5>j+ zg0Y6S(+gN)vRFg=hjGDAr0VDz+RrFk-|N)5A>>LP$7I9@SGuK5VhOjFcc^b)3sHSq zg=7uwGjdr&`>fn{4UO!DsD6RN)b&$&jHv!dvttd7C?P7GEvt_2*3g_zqArlA=I5kN zJbOgtcuNza`ka{BHMC4$GW|m9JN~D_^9mU*nap-^;7%#**|&^u^5|3POR5Aa~g5Pq0Lif&=QdU?*w~ z>@?UzF4*Z;A{aaUi8j_^Ct_)UxCM4{;to4qjHE%rY5t5~pC`vj1g2vr$7byGSCT|= zbVq^HLmD#XHGgxMC)mj;r(h>icB6RFm|AZ?AVn7SmsGo2`65w^ofw9ie~{fES*1iE zpwS=Y14=+CuoG&P3~nsC21De)PSJ*1im}t*6{q_d^qh#DXa=1T%)}Jb{1fVwG8sGl zD;Vq~xM%A>lW>d0@hq`ZG;*l*muci)`EnjrV-b}TQeYcG_gWyQYS5_1PJJC0*y$4Z zbWZ_JZUhB((s$vfmc-vc)9`AZwjoTCR7ei&t0`F-D_8wCr^L>opWZ3lxKGmAT4%XLCWXMpn z9X)4OYSNuETO#?zIkTOo#CBpVD{>nH3VUxWZ(ytgz*rb=D#q&0nZZ;qIA^x=3YZ&N zx9;^XRR)XEm1#$ll=9?=t#6PNGoHKKFCFX-rw9GNg7w60ln0n5P^zAvb{m4H` zG~7dNuGzmJ6vz(p+ySv}b|5S^Lb>Y+bz86>wGZ}NhYR-GOCDpti)p#-JE6qVtZ@tM z=foZMTZ06>kuIk>2!GX>ln6}6evZx9?~ss!O>~KcpOE65*`W^e1p7JV6zoUJZgweJ zNbBtf%E+QSXGWqH`}wre|B#(-7r;pb0@@uQA20$+f&EacWJuA_;T}C_W{R=jVT#kI z%JrOx{YoR4$>+@0l4weqjQtJ|20IDv_MF*ep(mat_6sec7U#^Ihdz2v3Vmi>4h6O$ z^hNZbqEV0i`Z_MK-w?h*vXdJ@f&DHQ3>4E{eqrs*9WY4dX&b^MNo_M&aL()qB)1iS zKc6#;7-!k{;qIIn)ZCFH{npNzdE64r^L=IR3%W~%oOPE?}3{#E0K#)1Pf)i+cy*2s2x0ZaTA_my2@3~_m>+G2?IzOw(NY<&+CeuI!Jc^tnHA6)4ao5T|C zo4xm!cetN{*f&*Pmdm~+m*ui=%Wap-&_qD&N;u3|SCGd*?4Ptimdl6|5X0HB>e}6M znbS$scO|O1BB>M49*8;K(gegdi>X~M%k(9~3n6dAePv*;nO%85^UBI%6nlM-{Eu<| zSJAV_UIa4i*?#PG4T}uH`0MYZ>>xquu-8WU-5y7=*C;tF0rpxD_wQh@YZe;fAJs6h zm$NHd6@;QyjbX1hc)e|P{l<2^?al3a8|mt|I51nk6}LH-{G&v}{lQ*WD+mSlf;_i6 zu-9?0*a#)|g1Rl(i`oZ!-53|_b+kOjUjL%8w%ChUS~6~dy_~qiUe`jxAmKE}uy{=7?D9#|+90}5pakM$X@_2&1oN@~GB4sx-6fLCn_JdqxQU5^gQ0s0a zYOxnXTXP+<8#w<#A`sB(>hb|apcL2(wMqszYu)A{a$v7$?JdRF>qN!r$_YIuVlNs< zX9P1btu@z$I;Bj;Ue^l-I|=UDdJ74!Z*e?J>=oS+YJCyi(d%x`qiQUoazYC1x~ZZT zss@dE?A6zCfxT`(e!4CICpUrud)+V?+@WF$vbV3Dxz&SYp0*)Ol2k~JbvM`Cjhtr` z4S)1w$`CQmr|-iZ_JW!_a*Rv$4`q}oXZ$^Gb=b>&p^9O%ijJ%cY0yI#nS|q>s*6kr zxt|Gp#W3zAwjGhs5BOWhUPsOUlr^@Klyjaw|2t>PZmK-H(*x;d6g@%8XUm|0(V%u` z%b?|%yTfQu%laY3j-D+mHR;Zl-CXjDvt>I^iS5K_R^&9J5PNHR1EbA>(J;eQjMkkk zv#l1KE!%ko%#EyDW81}8;}%kNbdBv+qU4$uMuU(mc^sn=A6)5yHi;!{%H9WM?}M}V zA=x{hy${Xahs!%08rp5;Y#9X*w7U%s6XGr9F|@lxBdnnvQG#|j#o02a6SRAwMw8~& zq)t40XyD@tu9XMMyuc) zW^+_Of~wvi6!o?c1w{hO8rewAS&W}8TM+l}0K5CRJW*Es-PtlIqi4(J7Mv}MlEs-a z-J9l1IhvCZ*OvKm;Iw-dgaW5Qo|_Atb}v}MOa%wjZNX{O9ysm6xZt$g$zz;0GXST> zn*qeqEO85*=ENONyDt(338%R?{;Dx45txqC9Gh|4{Xz;=G)Oi_f)r=VPBoP$IL#@i z;51TpvqKoi?XC6p16^d%oh>6#i_;k1n$yT`;QVzVgaQG>PLYo(A4-AKP^)A}(JJ5` zJzHjqaoYVAr;94|oQTs(Bbdo&%W4u$DU)&91A@U$g1bFi_CV-~XNl87OQ^-!GUrh> z7Ev`sQefAOuH`^Z)u2(2)A~9taM~vL^xb!y+z1MsHXjUqcU)LIb91^-z^S7lOp;Vc zF3y%c$f=@e`19Gah;f$vDAVBpsClT-4IiZJFZ$ocHv>q-3!1)%!yQDIY=|a{xfHsc zCPFj=5#4=ts|g`@zR|N~J0hVQ(o5|2UpZU$5EWv!{t?;Nenrblogbw!YVCZikR7 zc^s1wA6%)iNi5;9+532ThZ_v8ex~xWZuWDztegEpZo6)VCIVLt4zt+l@)%q#q6M;U zMwGx6&X!fz?bgklPNIG#QOy~oPCR>X<#kr~KXObXdh8saEk1q%X7J)2@evk2quvo!zRS9Z|R)j!?A6Xm~ zdcNHCCk$4vUDjY4-Sht}9Paslq&&Xoe=!x=-t$ka?)k?lpo){KdHB1GXCYvaaGEFK zuNspQfgY-ieV5U(8LB)vq(p7l775ajA*MN-$ix$<;*<-ZO7~qxQg(x8TXoU@U5kDH z*X;{ptbeDP(vlMX7OK$en{yRbiL6p05J=<+@-cHmDWD2!l?=&MpWqIt@_SmX*9{bhAV_?z_5Kf{^>3)|q11^E%UxNazR1604l5v2gU8L`Tj4opq*XE9X4jEZg-6 z{m)0_cktWNgY-O!ovr^wlPW)6be0;J2Gi$LT=Og)E>+_M$3O$ekaD=Yh%H~9-MWf` zv#cmm)PL?OYWr|ZsmU@l5srbjQ*zbC84?Xd`b+e+4d1~Yi##lXrNMA_KA$(hwy`gR^DT4LeBVbQ1MXiE3U#>cq2$G>*44L7IPwsf9F|zGS!svLH== z|HMTUILg|Y#Y8zd9*fsvka@=@^Vqut0BBX?vcX?AE`|@hgU`T-1U0|;ap#W zzdCjX_n6sqes|~n>3V%z0&)jXWk4t@V+`wDLeXC%ra^iotXI^5*!9YhfHwf^SPk8`1=`cIJG7WH1?n!6cJIV=cMWA}13}G&zZ6k_jf~98Ja;VhzuJYTd`(kAfQEfGw6UdCYMq7AkpMH=WBQPsr1rJmo^EJb9Wo z*|qSxAU}->)uEJ3xn%E3_b0H<}jK3C>W^ zl~9fIU3Qc1d9C)8M&xJYQ_4->VNkdV6sMc)*Hn#jE$F1YF@AJ2 zd|Zo(1O$p%2nAB>Pn0$SRYEH48A3#$Zb2AMfxy)hsPK&Zu)q@HQj^`vNI~}t%OnDI zn+eECDczCG!-%&NPk9Y(J(f$NNz4q2Kq(EJ0>KzK1p*EWtct*45QefC0GTn*qkOX# zi$Qh=Ek5 zJ&($Nnj>0F7C0P)G0Ui%0e+fexTj3&{y6Xf7?R=mhogK~ZQ$a-2Lm-8G_*jOY+4m% z`aT+p2{`0T&ww+%guk`WsQFp>m3hFK?m-TUrS1QSGlewi9HfXT;(nylku<2^rw_2$ zf|_eX(I3f~h>@JA`vSl@0>Fc4I70ql16C$9=4w_CvD6LIMajBM`BYcGCOxN z@f~eHs*N*51>`*wUgJzllQXdz2INe`SvGJc)m0M;Mq)G93s`ilQA<>!MKG^7X}y04 zS#|6E&DK300a8>lmT3Y-BlqP@3^%FtY*mRg{G#xlTX@eYyywGP+fMYU8MQ$AGzc!~ zQwv;2pO`<;r^o1UU3(ZF(I@N@H~PdN&?h=QBY%+7C&h!R!BCYw%GfEdo<1pD+CZO% zK*-Uj0&l9#LwG`I80)1e`tZ~Kxf8yl6E&+YA4dYNF6XE&yN5FM=a_o;bD#}i8&BdU zdEW7fr+D*%ZaSAvUX-Uj!Q{{qLG)RMzQUXAd8#m^wmsR#3jq*t3Bu4Mw(%lGq$IT8 z5DnM{Yn|pB)_P#RVM$QyZ_;6{KLL+wy~jN*f>q@A`St9$b?s+BCfF(#@yQh>krqRak1bsrp zG=7ILobiCGXBuQ(`PX>D0!xS!boP5j8lX&K8n2sxoRrcX367HM%Kkt+<&{i>oUDq8 z-Ev7Z8O{ufX($aGO28O6ngI?Atct+P^@g$-0GTn*G<>rLOydp8#i^X4-2q-L)8>3*IQhm~NV!-R_A1-+)v$8-Xcc#r+9&+~I_Uq1N8!`vsIHEr$}tj>DrbB8 zfXyhG=2|;O8+jBl@+iivbpXV0BUY@gd6y#^b~(mKM&@1ayV;(?oXpFdfJc1@edJN? z%>CTV#CPOTs*MZ83FO5&NRCGhCXZq@49KJY6d8|FU3H*fb-DZI((5?1|7audQGTm*S@e-V~eF%}@oq*nxYvZ$ZK?RvHpc320jaLEHARiyenT zWHE%|Zh6b}S_ZQQ^D~cGBmGtmnCF!L_MS3k^bwerCjOXQgkblBE!Qtiw?0UbA~ zWBg1m5j~ZWSS`9AMxx`6U`TCVjJ(=vyrAZ~EGHH-xr~sB~kc=IZ{3NVBJbpIKaC zzpuXfDo&X}mb$gAb?QZ$Xxg(@V3u3eUdnsR?O^y^Zk11bk{XERb_l~#yB4_}+%|Y( zuiQ!rK0YmZ>dtdZKi(?Vl_@7Kw?o>7D7R>~JiGI>%`NoB zaA!kJfKKP&_Uf1=F#M|t7l&*ZgHmZo=}*RR$}psL_McfJtYK?vs*O_(pVS6U5BiP` z;QSgvrnZltB1a4xK1_4uh@r!W+9bKQe*Na;61NS_hEwN=ws^)D0EQ18-d3BRv*hga znQ+R`5kun{bc2~vk)cmBWg9i5ytd9+Zp3g-g$l3QsHLq)5ageIkh>$G0IV^=F}0$rkhjWRoz+>j%FFUU&n(i9%@J7CgqBh z{J}lu3gN<(ydea`b+$b1$(w;l@)mEh1*pu_)DjM)1p^>>5+)2ydJ-N(5v3eH2^0P1 zCt;Qe>)j+eT<@yzXuTVymb8!6G89W5o#07WQS&F^u~ZPJbh3r$#~ZA4Qr^@(3EzPZ z9L3J&uF&F1cwt7dqTrQN#V1rF&&w9kJyAzf@wzZ>^2g#GIYp_mZ5+w#374r$7QzU@ zlQ5OICt;1G@l=g>gz2Qbu?O8w_&9=y1W&?DH55qI15!%cldz4$*bqGlk3$%~sf}yD zPr}S=USJ84VrPpI9iU8l60VtmoRrcX$!JDgOzL&Wdxrs{C ziblW9fh>cCC`nH&^XCzw1p|rIfXTwBl<)Eg%tUE{*CVh7171F6cJT7CIU2jwj2#1@ zhAH0f=AFhFo`j78$^!p=G~_c{$PwExU(JiZwfdRQMt~zOjbry;!uzCAIoY}?YH6|G z(J_izo2IVHv8kb1N&KiB96k;@8~bDwq9a+v)|efZ~{fni66fHdl zuLA=p8oBS|9K%g2y;@Zw4cEY1J4Ae>hMe$`Z85lfWSaojJ+d)*EMd#i;S#nKJX*pQ zVz=WC1O{RKqSG^S>->>T@t|rVRAtLBcFL8_^)N#te*dQ?uZyHJ$t9RU__VMnP9kAF+Fe`bNEM!n;OY%2)+LQO?nskD4AT(Qv z>Rnb2BS~2~00NRi7^*~4R;7sLK9C?9kdzSvZ4O|yadW_ibh$ZTd3dxrU@RMX_NiD8 zcM-va6D1*?HLf2 z^(Ysoa*75Ih|2mVFktI+;v@EwQOoqNDK0b{QBlinK+UcJ=ucGlEQ5t8Nk7o@T>(Uk z(QfgRrBNvZ>=oyL8m4cSE#_2{ZM7lAqO|?bPp9VK`jM4bB z4Q2!49mz84;u1}-#bjr(((B;WYHM=IvJk^~V;nc$#z7%$cTH`LHiUkFARtjJ>p^n> z;^XNEOE`Xp4D!Q%;J1)64B*DnFMUfti1tVRBB+EltwK@4aXYweT@)2|B zs+Pz56oZAEo%;lQUXCgtyaQL~d~FD2!hItL%4}SyhFvojYux{7RjB?{Y0ew!l9h zEbvn6`@tB~QFMX6REZH>N;jxKOT(`U?~R4`W_WAIh(Jw2yN}@83{&ADlUf0;V^AzC z-e%Z>4&P?j6dt|JP-EvIgJKX~WuVhD@<%y?Qaq?y397Qq89U{b45~u2jKZa@tx{VV zLXJTdcvEc^!V^%#;e4?I+F^D4%@4dkn@kgSXbn?4ZHe?;J8f#;6I+#;*-n|+8dtMa z!_Li{!csj6{cal|m@sTJ=hm>u-5P_-?5wD~b|m)#K-2SPdU>yCe_gsa##rmV9zn_7 z7H+9gDp`%iiBlr2vloFmK2CoGzdBCPSI~v(;UH(oYp<~0?*;q3?gG_#I}lf&SKdtT zz_wIfWCiXguav6K>mit)UBY2+WKM$K*oSU@f_a29Zox8H&$E($aDHiP=p38;(|qm8 zXXdd)lF#j~Bf75Xhz6_cQn@RmSaI-md&MWDr7hb{_q=kA#p;>uL!EId zr|1R&)!f$v)KErD>f5YyEMCZ_jOz;hX$m@6v7~1EDV7z2epd*T&_a}sALKdJBwCDg ztAu0?RMh}fQ&U|2da*`B)u!F54drUaE`dZfj;oo*YSo5^MjBo(wlzUi^ZRJe3%hA``((veto|Se(e@C*GEgT21&IC2ry3m`&W{0*l zB!^+qnXiYxcku^KZYd*K!Nl2~ypEt`QCu+3Ed~ca=T$n~!zO;XOR1B#I3`q^$f?b+ zzMPAaVIN?OWEyhT$1XY`{fwr(iflz=PDAdnEEJim<=l~pq_>Hr$a_1yqT=(DJ2FW{ zZtng7WV1Gjm4L-sSy>xd;h^R(b3b)emk0#CYi!igE1kY~=WO!-qGX`aOmwa#&|gcT zDyN`*`+407zbuBYK&f`;ak=Zib`i>2tczzVZ1PZ551p$8ELyQ`s5MwG4&D?kiHGX`;A?MJF2UQzD zRdxttr@VSAq{5{QR>%z@=Z*W1LAq}Mvgb*c|;-bX6WOP?J6EXX1K^*IEU&2#7{ z7<4?QA9TDv9Jzvtsh%UVPG==eoUqy&=1-c<)1I`L$5bY*c9$K)Ou1w(CNn-R00Q1i z7|QSzpB+yL%UB>l^xF_)b`BEbbLo;8r|^gvFV4<9dxGkLp(Mt117fVmIWazo8t^ta zoa_Yp@j^76ls9$6cnkGH_p`7<3u1gSqgZk9g0bQgsx5)sWT)t!*N_-fDqmDBrdx8< zS^Sb?>XJ>+4`KabBu9)n7iK@FYP>s7C*_Ut-ech-dn6JNV`d=~P`Abl@_>yPTW@!W zi1Dcii&I|fi18#nB-9sJLSzKlX^O<_#1U~yw--6!ewepy!enSb5aJo90}x5T4*>L& zCtx+5YA;6&l;jzZ#H-}EP8?>gl5Fqc{@D>&i6-ttBJT&H^QxM~)z72?yqNCwbRXsYP^Y5df zSeQb7{wGZH@73}1V!sVJ^=g<1ss*RcCkfbsSJJT16w%uloSnz)r@ZDP2|s85!Unu&;k-Pqo+7)Vk_HTv3irOA)vF{Y#FJAElCBe;|vRi#VAV}_52BZAR8|V6}79qE<<9jyjx_|;c} z?txxY4;Pu>`Q5$3>Us@c?C+by0qwWhO+gOnug~E&MGnJm$Ml14*N33ub5*?vDl2kU z(q;s-bCG1Y`P!4Jd8|yyNW06fWv&dXT~CI3eEq@A$JaUu$TKBw$6qQo>vJ~_Y=k+tKsY`Z1PXt9}Bu7y>t!B4THQwf@ zlk&zG=ymXsQ4k3>1TYJsfI4=ZQral0^>>GeqTY(IIOR28Sh)k+zrz<6*o2s?+Zkzq zGKmk~VFGeeN_Qkv81YWxDX*dJ)&?ZeWJeB2@jj(d&7`8Lh%B%w0;eQUPc>tXyp`6s zXR-EWcTp}*nbGt<$*(&ZMA>YxMp!;V247s4EoBxS^1+Tq3#+;Mg&-@9uYx;s# zLkgzP7v2{O?< zCRWho+~7(y?5K=Un3BKMPKIwVC1d}il4e6V@3ZhadWujc*~gR&6SK0Co09qa5Usie z*w&JplILE@oGFZXJhw5?vh){wR=kn^fd4y6_kaEP8KWqRz-BqJ(Vl#bRhij_Rrzr`v?@OWkF3g5v093aEHO zm$rJVa)JAY_i)Z`Kz+7;4QIcj34C7l{RC2T^}UjDcG;I-P*$G8)i^uIF>eC84Eyra zK)#oK`M1(;Y0#frZ;7hn64dF}3NIA&#e!|{Cm7>=1&Z#aGtH!l00NT735Cg|L~9|xSk zW9XaNOVr?ifX5R?>a;Y!?9&KoJkf7Mg`D;78jMpWJK`2j?iMpW*y#gR2AuCsxAf#d}IrklOS z!dPkI)EbtM*}#9#z?4^>@v4};&Ugi9pSUlok}-3F;OfTKPjzy?ewtuz7iXlmpIg0Ph<$si7Uio-5v~8%&_)}{dfr;*#1npIF(ZjsNjL^FDB4$-O_B2LP*4o zq5c#FBQ-GFzeB~YX!I9Fvk;}|=b8L@jc75~TKumw+iR)9xhlhGw$}uQlT?^8PEs*P zQ!>sOvOCt1&6;h)oV{M>s(h!Y{jT*ZU@c!Af5o{f^>+H_F=R&R*+uV><(3lI>F?v< z=+{i&+LRC6!OhNukiLr&bR;{Qq3v%hj-aO6idX@_GYNsrQ>+FmLBl+ug0AIH97Mya zW{hMP=+!)rg@YTV+Zw*sG9OL(n3)eu*hSytrkg$iGL*x%tt`E+ClPu7kUxoZF5HG- z=B01!K$~^6l~F#df^)BcmXqWssFiA4Q?d~4cdkNfFY#%$pwK+igEsTg;&bnz0QENW z4}hdBF>U7lCNPSQ?G1}neUr^xn*1;tV>*gv?MuZO!KE}?^)C%`3h$eR_pQSFHoUbL z#lLq&ZOCT68$7g`?+(}5%vo;O%s-+-3i3WYvYD^Ku1K3XgJ3hK(=&4S+-9zLP_-vi zWgjwj%B#1TD_q)OGv5nB&SqZVO|`uVe3V8vlmP zoHqsE{q8pNFQw8H)1U0iY{w~)+-Ckc{OT(~_du_yhl@WMK{|Ya!$5;s3}hAWM9x<%><>q$yWl|%tGf_0d;Jg z*a6shs`Yn=h^NK~!=WX(=F453%{(lygt*dW4U9BEnM4X3O+Zdc>5gP|M#SN&NR8Lf zW^MzLXp(S1ihC&y9HYS)I2Z&D3#^K$T8&pT77QRW=1u3mS&P*$YoZ)ZHK9|qd%(n+ zO+X{dRz`V!BXur}<6RWn+P*(cf#za`%myizm5_cL&@76DC>=kTb1Fu(7|}LCCHtdp z1~8p#0s|G(_mkB9aefo~Ox4D2)kbVJ)2OW4K+u?i&D^GRQL*n7HJ|nCZRNC+Z-~Ev zxY!?HVp*_XF7_%PY`&R`U1QHbt*FfW=`bCvS|-$_t;qPLa-KoGo}FO5oVqpR4hkNd zFiYr>sjZQZOFXjjK+G#t2OdX#x#gHpUmiy^Y$wJjEXPfb$2EN|kDKxU@?@Kk2lal= z8G&scN*Oy*&~@egGrTe!kK()cOi|A_O~s=PU$<9IY`gKG+?qM}%3v?;QGZ>vpo#Ht|kZH$rE@YF( z=};g=ry65G(VzMfNJenc{;D1!4e!7UTZ;VHuGCPQEw1=AwpwNdw%Rs2wAIc7k8HJT zV3rnDWDsn%bOKwg;^ns5VT_&f>TR_Om$rIaZGrpew|xKaYj5^{mhaSN3<}j7PRPvb z?bX0OJD-xT;%fX5M2t59HA6?id1>FzKD(f_TN?D|Hcuk0vv_6qxEsyOie-_9V1^w;O`Fb zug~K`MIQYMh(W;I1%sduot3E>54gp9d~EmJ)Z94AnVK8(J<8bqMU~Ff+?dUe8?XT- zGly(;Q~(5QmawxNkEVph2n2|RWVQ*f<2{J?bVl$kzTo9OcHp?Jk}XLWQ~Hb%@C>gE zZ?3J$;Wm3yS&kXX<09w=WLA-(Plq@!L=8Ay2u`*D{WznCj6k3SKGdUawMknQsG3Z6$BTXYB3vqp76b~%K%xxGi zwV8uT>Mg`V#JtBL4Cid&>X|pqySas!Mab($Lb4DqDwJ1Ri0SrXIkfmX3o%0jsuRzs z0mv=H^po{U^B?B;%Aw-h;!)7z2lqnZsuD7Ggg>g6ERSl*9Q+bgZKn=Niyjmo07r z{no9s5KF|3q5c#FiVISdEukc>uIVp|W+6(^Ps;gY3DII^wyOC$3$YeUJeIW4Lad3b znkmhyO~O^1dT|yRvxBq9=xBCqYYQ#J-zlnR81>I3_hQL@q|Qb>xqCmpYq=B>Ehw9v zQ5{|SIsneP5W|@xEy#x)@`BAwB0!Y&BwTzaGNqz6XMw-MY0YUo&83-^QNo4o9*b z*(W5j2jJ(drs5nGnAjOuEOc$tPsTzwsJ0vA@}Dq|VD#ijT%+QI6F&TXYNVSQ;*?T@ zYHMNrg#oFT)`h3P3axF8lgcBzaHdL)@3WqKC|+5s?a6e`v!6<-hdaxusWy!Zx%rc$ z0CY^o%ZUupUFW!^hvBr{!EKG<)XAsKr6cIaYrqwn((B9CF@3^i$VJo1_)RrTxh@&Z z;5?^k6u_cfN)vk5W~T6O%BMxe7InA$^v$5(>R)rx^xqZtV^PrXC*<0hEcy8?xy9f! zrfOhN?O)(flW_F5yZtwBQF?d#Ic{O8l~w5i=B5Vg0Dfj*uq=ZK4l}7FTcB4@TBt5o zpoBW1gg-uW?QgFuZfzZvvulN@wn0CttI4C#?P3(gZ=L=Hiff$)RrCUK);8$C-=eOA zvV2xw7MBgZg>=b)Wf?vsISz(X9{0=NPq+A*66<%-1^X9hPii#3_FL3NTvo${lNIWE zqg4np*tK9k<-T|p%B`jhenLU}9SsFMLS3#O%_DHU7hg`oNz>flcnpN_5W8Yj+gf#f zY+W<9@0Fa(%C7yezrf@ihCvAf%2dGAwnM_M^3RRikvF8n-BRdtaDd1el z^lBTj?xU{J5q^v+g3&xdXwWvOj-9v!PwxIXVjqDQn}cqk zcQsDoM=qmy=2T=RI}0#g%)>S9p&bC9c&^~xngv1X2;#LnUC+U_qjm~-j2fdTW^3B#6TRQmok1)7ca7kOu1)p4uVovPMxs+l@RRZTMc zArt_niniwLYUBp(s@(V|f|=6?Uyc{k?^uy$26pn9zr;l!D&R2dsa%6=_a>M~#vQ?s z+KQMFY8&J01}+YJ`^;-`3F2H=#9>Gg2Om7-y*8?8;WD7J6{jH-BW$?;9#HpfIP9u* z&IG*0i+KF7MKhm3)Cp}YTjy=wXy%SP8<<7yL3j@(K_vy35~<87+3yWaB+y6J6R5nioF$^iD3pd5Ex6XV7mmtogMI43{aj^fN z_u&*npmRK?7$$C=f4F}c#7!}K_s;ba?$v9SB{Y?=J_h*lmO-4Onm9+P`{K1eCaG@U z))dZBeS-U)qaMH<#h*%g&rz>q-2AcE9Q7DdI^rL7q-%}x%n9YFVN~)s!tfX~p%2iP zg!M&MF)hiDG3irD@B4y!VV-M=-bcR1X`aJC$>%xDt~SB#hti;jln}(n()OJEQcI1^ zWNj0tW%v`EcS-Yzs_rAi#q2m_(9{P}p*f1*Fk5P?f+S4BJ}=4P2Tnt1J>WBqJFs1W zc*x7Eh%tjGNv#xhwI|ObS^W<40zEvd`$c#r*=dUGVccExJj$ZoMWB8y+FgWC|6qOD z8BL8H#Rw(MrQ0*|-cmFw9*H;Y7#ZqbfivD`-wI`)a>UlmiM&7RJKe>YZj&fQwrvG(ef3F{a3ad~wC&E#xgE)n$c4x3k z+XmIv!AZl>oN7H@TbF3TtA?Q;Y>Dx|EB>~GKjc-n0lOD}#k=>DyI&x$y1HLp^(yju z#P4wVdR{ds`T{z~YreSwirnw=duWW?v)vtl@ilN<)6rP3!)H5!ae9-kH{;q-o6O;@ z7#1ZAjc42fnHnrin9_euZ;YopeDGWGZ`JiS!b?-hoxFGHb|T&M&6tT1?l59?7bUu1 zLmBbZ$V?=^ho6s-%uDjRyTRiyzU*T+MGlfT9O5&Q%oY+*zc~alkk`EYK|Yvxz~8hN z^+5~;5;^_kxt2b=#5%>J;v;l8hJFQ)9u+s&06P-XIlfa25RZy<0s^O~`J>`}RDkzp z;biyF57t8`4H=vno%JwzzNQ=ZFzE&Cm6iLYRE<3rm9FmJ zKK*)ie};t?=4!{Nuz833Z9d`z*#lJN8W1@^Ua5cv&aUi1C1Y30b-#(KZk@ff<{MuC zTJ>nv)$eK^t$oIa$A<##?3O`7j#0ARlDD82Z$&CO0%OjqPon!HzA3yV^K>tQqplru zlg7h}fX9Tj( zaqXLbWn&Ps(VjejSw$;2r@JO#&DMLcFHLaOs<73lLi@o@+_ zmb!LTlaY;ywjs4;G+XN1t$l)ek0F$bQDzl9u5 z8&?xDc0@BS#eCWONpC585>yxO^B7ncSociW6zv5LThpA2ACzs*ZJe?T9y(C$$v`IJ zM@YJ-PQot}ixWVnrfc7XkL({)PgBR^ZwcOt$+U(kL-s$UH zMVa|rn=+-|GV@RWTMU`nx@fBWmtv+^8-yx~Q+Zq1miGKPbtT#k4R@iv1^EbCYef`S zXnYR9xID9H#q|(#$`w)_R9O4F#}Z)#o9II|<(srXra;azh1w zWX9v>L_CM84lSvzpo&?mDnl-V&j4IuV|?IsPDiDE@!^K{wC@MYZGv&s620M|k%Um# z`kVx{(SckboRt!%yy+>ynvuy9;whJWsv|SL! zc4ymBRiCz_)fH{0PH%}7ZN~`l3}sPmw_(tBM0>TJpuTO_t3DQ@(l}+cU~49|sO`oY ztR_r(vtzcfM0n+|P*brzCLjCiy1n~{zN8$2OjuyD34E^Cr=TS*$#HmSZ(nj1lTOEJ zYETPmvUviv_ALSz62hUSVeZn!%?-nf{z_|17ZL*k3&tihzh}Lx?BU+{c*_3 zxbF3MbqTxSGUmE!jB4jPZiNjEMk-w+tU#+Ya+rH2X6# zB8K7vLNn+F_8&%uIcLwg9~8RMZW0d;E8-jIV( zG*@Yw0vAPS*JR9p^w=n>!H4oQUYzn~_|W7!{H`{ha}n>IF#GeQ$MT7Y@q2YXkP^mNynl zg~c{c2%>_jndV`9%9VZhv~myJ9l(P^{6o+Z*e|1r=#(LTBJPPl8Q{1T zpIQd|2A0@5+tx%B>xk7+q=HZ78yw!J*{d|P-|dQ?Iq|G6?je3;fbXW>&BXiJOVS9v z9mynCdH504V=0bT_7EDUlxePQk1>KD<%ID>D5A9=bKn?Ov_<~9J7b4GhA>7l8A)k# z`nUUTYBaznOEKN|IS>ka>6m1?nhYfJqDJizrE@WUZ;Uypix{2=g#+)q_~w} zZEH^O69xOal=E4*tL-gOG^dhph^hk>#^SrRotbKg>M`Md4XaNR5D%qo7jZKcEC zZJXiI@3uR#d+-%>24TXb(=!rgK(nbU9#kz0RapyTr@Z?2iWDww*w(llgxo9W1>RI! zo^bJf(|>=}|9eG8;$;i`y48kh7b&=UeVsElxG0c`6U;r8>m`Bq^C#lz!hCvFCb4&7 z+{d`^5!8R}R{Yj93^DZU2EUGa&}l`$Pz21sGVYO32`uiO!a8r4cU`Vab#K;CWLAR4 z$LryZor@*wo3B0D&^(~5kVrPNyR3t146FT^*6eu$Ab4|zFtll(z0(a_F3 z(7QEkM7~?IC|$l=GXx&JTeB0p-0ZV4UE@UwfPA-xZeR#fn8V5Drysl1 z>7=~zdj-fy>RuFAXkn2U%_vqJ5P8KXRNEQ3$rjK(uiPGxpL0YhH}krfZsJl;@DrD* zOQxc^&>tDe?G@m3m5rfld>x!l${TwdWkLA3f)WW1S7jDLfmH3EQrccuS%HHI`h@6p zl}?1=Gx50k*Hw6+k^LxFUtkGwmBiYLH@R7af zfB0Jqt=ilE{(U)34Y}_~R%Tb}htn*^vZa)1uKfg^j+}-VIStX;t^m>Nh!qoZzT^`P zYo0NZRgl!&<21?$W?+}kbOU&0cJ1sUr(q5TkyuhzaRbKr~UJocQ95asxB8t0`*B2v!(7 z<$s>j3lg#<0z^WVfhQ*+u%Pv#Aj=`Nt}O@zZPA;8bZ?6Fe_Ur*g384&MeWHJa^sZo zk}Y|YEe~(py)Nrz3cVIs+lMS+Y5)W*fiRScC9FUZ=?hr`(U2t!^i6hF5x>d4E?p9V zCE(FF+4o?3&c0AAfuU?{x&cd25gPCMqEqkcqL09pCU`JToO$-UqglUw+H|^;Z?H;g%wM{@R(_bTXVuO!lT-*1jDbQ>z zK@GT$(zFuNpQs5~6bn(3o+adK713h&S`8%|qHeTSwYp zfc;}tPLciCKh{HbJCcpqVM4C(Gf1OPtvT zxEod7l5IzaP zsG7#@mQ!d!Uv^*=E3nm5oD!;WKFW5KK3;SB((P)~O|LFyY7>Ln&QA=cF4+d{1Nvgk zqQtq~rds2qknLirD-$VijHB!X9~VL*0f}KoLV;Axo>JOK%(m>l$deF}n4J+8r@Zz{ zVwmGRZxZ5yko|Ua%FjOCJO@*`$YBt~geGpWGm zy%ER)t0M5xYU;s9tIc7?Jc;p*8<3dYDTgne(5a)Ssq6 zvym7z;GRm;N=SdACSXx4L`ixQlbbq-7GpYAJ0{zqZU!)QP(S%fEBD1{5L9i*S8cdg zZQSBZ;LHxb1WrdItF6^db>b`EDQZ3&eiL7r+}%7BKj!R>G>aw2e&@l}|Cobj|Gu`5 z1gbld?b&xiKI4AR*`I|?Dbrk=j$TMULyUZeC|`sjpCMMvtT~?{8a4%EBtJ${bII~3lX3h&N^7h9+DXuHB&J6^P6CuEnjVrRId z6}!N7w1Qa$tvHYlmzL@9h*liP?m=3?AkYdrJtI%aX@%lJ)vi#L9l+Qrubx&YT-rb@ zc7u?k6$Rc@+nw+?|DMCMCYMmX9)uKJz5d#G#UViWdk$Uwoj)I=MHdKpt@BD}6~2?UMXhn(!eN;@1vaW|TgyKtG=nfv0R-*z}@ z^i*0ff4JXv7-E}v_}fl`28R)*b3%gVmNf=#t^K=9IN6Oi*%9z!_E%O;Acr|J00M?W z7@EXkj-rS~2_%Sy9EN9~J%}`V@7QJQaL4Xxbh%^qV0g4+_aOEqccL#txnq}Zz+n_Q z-?4iPHQ*!)IN8zk<1?{zQr>tD!wtE0CK!bl9OhU?vEty=48+MR_WfxJdX%vjHQ>*w*_Dv~L`}e=ScsDB!(NCM zgWlpN`=D+HU@xpeZ*5WcuiBhYwXs{Z5nIhPD)GH!=1OA<))t#l#a_Ns)O^wnzoYa# z>@0luVIW(}4VY@b+g_89j+|jejnk3)j$~i;<@5{|B_-5cI~0A4+=Ljp3DMeN0MW^a z6%%XDO^AjS%^1mk(EOda$?MElXwu;O)O?F5#PmT0kPl@9^Qy~dx;wo3U1mX26K0?; zUTEb=Sw2vcxmFfSKS@vlq$c~bibHCG-({Mk*=XM-wT7OF%(^vn6Qj&1KkB z$(!Q1Q0y7BpBTao5a&UpXccf70!4#N@3Y+f6j{p7hfv(T7uJm-gNk!KncS>oZ?0H_ z7EJb$+n($v*Ayp-Zn6s)-=%dH*RzWPAXu#kFKElz#gwqz1p-9F zAIZ;xM~~z)*gM@LIYY^t=myJ~BIl3fmr_HV(#bBNznTe3dE=Ke{-RL#QCEc)%h_e7 zg_VsXOLQev%aEIFmhO4YAIZ6#Q7RvFRuQRnVl|=f#3q<@qnWUrF_K%(*mtuls2XRv z&`Eh?tJQ_@aY`f-EN9F@D3Ge%Q%c)%b^!Y)^a;^&b~(cEwPalVau)ug5EfWMoH4R1 z8EJqrX*s*f1mvWY?nq`b;?=}cUc-lR%O%m|Kn)-kO=(m!si-OZy#;gvTX{ zC21w2KT*}Q2o|Cg`z&Kbi@}VqnKR}=sFMMfF@|%$fgZxu?W;D{arO*?kQ!SWj>c;> z)1a){IM9&7v-rWR@;TaX@O?Bi)efP83223IUE2(E9>1rt7VzHt4MyQex}7lnEu}f} zdgRc}i65yc(_aCpo8t%+)zbHQO%d39!AC_p@vU9z@o@hSBjfq=EkDMGgA6F|VqsFu zy?Yj3OrSZsFTAxg^?-LM%C8r74}*tKdMRA@gvY|+Mctd|ka*t!k6zS09K%6Rcnrc@ zx^#L*o{>M{DIQeKfU4|9#!h+V6JCV|7llh3J{n^!IIYg2Z0mEK9g7x4GM&BRA21A}g zwJSA@k3@6mh1jF$Au%}`o=I!!g?m;QAFuDC%g5{6;nCyu(Hh7*|d@Le5rG;7zsT3FAD6(VQP`Z~GBww&Ux@abeXY z=UfYRn`PA2cOx~|)<;=e-wPyFov(>-h|3#91 zQ9~yp5OktGD@7@@8P(s?dVBK4w~2tvG5*S3))HsOrid*FCQx zZ>5x*wO!SvHtDHt{G?~`AJ|mxk%2yfIq(AbjLNL;~K*EQA87 zx?uaF#_dxk@z$qJKu${Oj^sE-e1>?+ zYsgzImqe43m_eCgltwj^imD>Az^aI<)p#{yjy!Mm?HTaa-!Q#6l~Xi$V1Iem1k@z` zwGIyKkceyZ{uJSW5ayhW*?6lO?l~%U^-q7Is%H@_L@D|qp0CD4i*au8lao;=-(?33 ztFv{^2KJRDjRl-W!t7Kt%>z{%&ee>)0HDS)PQS1_7RH7fEHpNcu1!Yt|3Xnd@rLv6 zb>OtO;BN!8c5hz$eRCt>4+c+y-ei>06Z z92Gzcb{gxvm%XMOEsJGxS*@KfA+v7ne3&aQz6T4WsAVj11d0mo%aas=wNcNL>fvwZ zNlNB65tY-CX+3Y80S})y&V=ipH<)2OZ@fx}WaMRd^t|yib`t)g#2`Fx(CHa@Ud~b! z530_Fs_eIno$~6RHxw>yc;5I0gd9sL@TS^1g!vqp@2%}=EY070jF6j@z)hA@{r(PV zxcc45xXJH*9%q8G!u~+7OYnBmjM)JYun5AVjb_ZDgk>=hAo^`+2J4M9<9)iM z8Lz=3nsE}_dG;*P42F_s&<$vYBIh*YEoz8UI@z1_S2IB=Zw96r3N2{HA59BuFiur5 zDWTfQ$W8XPP+mitK`A%sxvEQT&QLS>Im6T?=b@U>7Z}OW3{DlyI8lW4{} zCLkxJG%A7-|4KaNHKZAqOQOjI%%Et7(x_%qQB_11SnW`?8pkmuh~jC6Z_j{cyvy|P zAz(U1g9kL@ZziB7>92K0;{(NtY;E43qCm0H3^m+)ie)9EKT*}Q2o|Cg{b0@)Gorr<7@~or+#c{y~iVgJ|vN0I@O>D^|w5$%uwc#u&-Pd6Rux{_zLY$hZEzNEta% z{6pTK<@}>_5D5r#FdzXrjRl0EX08>+(oZfy4Um9b%1RFj$fzY6qOGtLF0b|R@5rlL zAOFNEh|_-nDQX$39D$;O`|=M(U~Sa%k9zo<`3L1)>Zhn`rQp=UdosMW2SrdWL!m@a zX2C;(ayeW_P*@@mluzl9pnL+42+HZ~MIKaE{1oqH+JIWt09;c`+K0|V@EmktF@-HAf5{a%m z5~=SGcK=0SU4sz_8mtd3`6WyE1%zOmOlv=!wmiYR{gHW1N}oPcm>D+*iqAtW=&&ZcBNp@jzz zgTog79QSHr7`Oc|cML@%(+QY~qC(rl(3XKkGM{v^h<+S3MknQsXD0Z~xc-Mbg%->t zW)v$+UWtTiXCgCMS^9V-Gr@0w+K0l5bBPGYl5r!aKTUyVqb6#(R;6i0 zqd!sIvkVrZBt13Bx6cwSMzvKHVXB7d^VbGR1XblNm07V>>G_z5wb4>!Slw{;x{Ddt1kH%4RXyMKUpe~#u7)z7;>Lr{wy z$qnow0l%0y5j|)gRW=2hYcQFMTo5C%+QX~pYe?X#u?=XodP$;<(sdF{AT!fTNzq>q&YMH7v zWEiBihQwW4phUxQYuEHlE}u_p`Me3*IH%qWmm5ZJf$LUJ#>a-yDjh!AwZWqeqj-?F z)ssQkFiNLqhm%6Zq#~9Hor2$Yv)qQ8Cs}P-c=K{1lKX%v?pg3 zH~7jVpyX^Jc2oNe7q!uVF<&q=T(Ss5w-&VpDAGrQXt1cU-nqS!^&YHgEDP#=0v*gfb)nxaCR*0fG4z%dVSvIXhKp$T+S-uN|*AIz8|is9Z5 zQE0KIjbRikiq#R0qySXopvV@IK3=(|@w7I+AHte+L(s)^9iKIp`i^gc$(?8@tZ9to zvS#mxu+wJ?6SWj^gamGE;Ti=WCrKi~%EpX@0;$?RrL?VVcd=VRpAfBVV-bcA#^UN% zHg3R>D?g)3H~bbL-}2Rgt17My`J&`n`NmNJPM7d{I+6>hc)S2! z!K^nNl9kcA0KHu!Y(zht(aHa~KqF)3{U(E#i zEecM_s&p=e!vYlB8n8c2fo5C!)U=B!mX(eEM2*8T6d``mQpd&-7L0=rj+(<(#GQsC zjt8+j^>mFHELt|ZXwmvU8uEE4T(f?Q27Cj5YoQtP=jJu}+}wrqi`jTAo|})t)}R8x z?w&~$LA*6KUw@5~eQqckjQfL@nY_g0rI%QG$*H)B8l!!1{q)XqwD8O*+VQS(G^SFD z7T)}T>3ipTq9Yz?h#tKP-#6QG^JuNz8nI5pzs{EHF;83I{xqC6z3>|QBs)_W z|Kg~zwDl#ocMVz)H~%dy9ktuXj_`%V=qkKli+n|E4~?RoheXlufT5Q~i(*drpw;9s z$3{GK+b%tdEYkPw>&gk=r!KA8GQ5N%)v@@ z0JKjL<>KTqmz-^roX4}6KEcFH`9F_z7fBs?{)aBjYcCcn_Nn41N59O zbi_*Z#nF~pOY{KRh;dt@-=33eX&95Y!f|gz(Uos8#^Pxd?E{IHXmOO^Qrqj2Tub?i zD7pr@szlqNWzJfgatFX?nn%yE(3a@A833aj*9=4)Ejr{v&fO$BxPS(3cvH{(<*h=I4@O zkL7WPBY&30=Dzj+gWhSH=U~U8`JP`g_x;6}@)_jMLbtsj_brXM)-o^pzHzp1^V>02 zEylCH{zhW#T8+Qt^;P{?9raXRYd4;p$DMbR9Q%up@#)KXd)(+XKk7^V4Dx4vZA?SS z`EErU8FmP2(#GnZ@Yz^h1AW|lucHpk_Xx^CUnP3YrPdOy_C$`|g_YFG_PDRBANsbu z(}&LX^>_497$0iiYcVd(x60>v*}ix6Q|C{JUmFWa~Wa_m}<{Tuz>M$d*b za^Gs+cR9*nC0`zx`Tm7gFyF^l=lbsVb-Iw(eB=pvJ@4Yj);y?5&WV-iFAL@4XyhZg z?-#;|pEzEZ)N@>19zHBevX<8!uYgmg{ z{u8Gv4U4d6FWLmN@Kld9qn+8WiNuf`7QK$%wd{paG!6G*vVQ(RxBQ+8{@ki#8RKpq5O})My(aqwg|g!)T>wCn1l$l_Tp#$3!^V zJvtY?fU#}{FS%Z&*yxB{&$d7=L%A*+V@MQj8$F}iXvbP-X>A+5EX_Z_c*~Jjgj|T( z(2yU2Nm9@8|I77k7oi$}JmZjQ(RTRK6p>p!vP1N?ayT44*mAf_^p21fG1?5-$02{b zEl2iu$o?*eH%A9JWHBG>V28{DE@gT$hb-w*zd5?!A#Z~}o6N&NP_XED^khR`bu!!e zw1$@~ho>Eu%d|V>(|2=ZK8MW4YGZmvJLGDQj3t8Fco*{zWu`@|I;3Zv99g^cxn%zG zR*tM+>QVhPV_cc$jY^HB68d3_Z?8=p^1@kptW8Qy=m^82Z86>$YizVxX-J9fH3RyI zL_p>j@{jXOhRC8q=Kr`rY9;ph<3af?&zqH267u5D3S<=_{|jVR6>{2%h0JO~+JacC z3%NOvSwqNjfy|mh_6#(yC1g^7OcU~Qpl59%cLaLY5%NwDYh5AL09jAS#sRXvkZS^D z10l}@$c91=3)0$1$R`1^v5*S`vLoa z$yEPZAlnF8+#_3;ej?<^^>Uf*OFtE|f=7OWwAnXCJ!mrcx?AaJ^sy-V_)S48UROvAxNB%iSjxW6+WG@VIlR3WhqLBGKa$@OKA#;4J zQ%Y|NxyK`?mfjZf(w}lYXO=z`GOw38v-FXWa)5j+WWFQwSZ9|$6Y{y&b8hKNAy;_h z!crq%c8 zzMaQ1_{Km71|c8)AxHjPxfKUJ^3JBmXS@R>%&% zZ+u#MO~|%Bt$&r?6mq+7!T*&0EMz^e=gZRjLLT=r|0{hY9{cOO6s_?*LZv16d$WIUO~wE9vL66 zCuCb+ilyV92>HP0d6{^3AwP4P$4AS=dkERf$66-dQ^-la6wAbW3E9vi%f|Z(xy;8} zHr`Ljx*O-EST;_CT>4)_CPd4{-9qkn$mD4G_&_03|6?*sMN{H~g>3JT<)W$ap+XM- zx5=y!t$b^0QyGPJFhIW`|6V){V~*@`fw>LD72gc|wkJ$YIg? z@dZNGaGGaE8^jk0dG>SDd{neye2I`aCD%vu> zS;$we?AJzH#lIG^ij(Z;5^w-ytM*^?ZA@O?;P-&792L(YEnDhB!U< zM?Z@16LOA=^>DOZ{D6@2UAe|Y+s6+H+115*Jo-ueJ0Z(B%}+5*aOn}qD|k$#o@<-ba1mqT-8>GHcm&OSazmM#BX z$jguA$kg&@jh7)mJG)r;0!lfq5INYzBGQa94vWtCB#*UfxkbqKC+5gHW&ErMnGKiA zk&Vj}gdFXjyN@XETHZ{thTdZ`Cj;5MawKBic|sm*k1|gA19GZwoxRF?Db}7xMbT$> z^SNo?@_x$U!cQ3zMM*i8%u+yZ{CyN%T29JGN%K?COk`TLfB9s|Y>fOEa$xy9AzS)b zhn26uXIq9vgI~c9DR(i}jPgwu>#_p5S;)-8qUg10CUdXy^HYaJh;_e^JJ1iWKP1Ax z8RZ8QYu96%ChB_T}fQ6VQijHmL~ah6Avm7f%HhC^PDjx0YXWGRQt ziH<6uKJhZYD7OoF0?!Vs{ed#)mPZR2@nMdfUtUPajqm5k zh2`-=xP$Zz1D-th>tHLe}>(ca;wm@~YQ!cll5u%b_h+ zRqNbcPK9jbk^9Pr3wa$aXfh9#j}bE3%REs&K}fqp_Gx&we6o;NT&z7Bo-3awV6ask?OKJ}L0m47MZSLi>6yjH$m z$jcsiqkNN)_0Xm!^H%v*A;Y|$Kb7wka-x$ttKo0udxdP`WX^5)p!}ea*z5VY{HTx} zJn~8TNg?CC=6{ucBjlG(=9dj$lwS~%IGO7kzAV2YWQ^DIzw&EB*fTB9al;!z*n17B zG`uCG0rSREm~GyPS{nW=A1}&-{?tR!G+}hKvRB zW2JR8dS;&1PC|On=W}EiAt$0A76?mPhV`2W^Ruf;`W~#`hOFMOPxBEa>@vo$35KlI zaDZf*-^r0_4TlQZ_sb}nt+rUZ;YcB!Pvpq@4aY;zu;|jqv3meB>9lCmhLa_;!Oezj zSl+bZ6d~JsWSfTbg{=ImTxPF^n}pOna$v)QLK<$&WzvSHgk0`rj%xU=kOw?+Lc?1^ z7WJ`CX?Rb_8(!wjhR=k2dVQ|>{D#sX_OYiuGOJ>y-0kG$KkuaK8+%4Po9kP3O<%Y4;v zl8|X$rqXz}kS)B-@Wv~IoZ)5WYy6dvR*#HtykE#I9$C8aIU(10J*zg(7E<#v(;D9q zGOw4}wDB_`AA6at8+(Kd@@3zpaYzg6c?U1EU*jktiPv*j;A#eH~bw=Z+LRRrI7c}l56$B-EMbgdFW<{?z!2QeWEZdB5>Z z$;`q$#{6tp{%2#4ka4~gJ&i4`ti$J>%rtz~eu$7wyynJAn~)1IBU!ncE7ew(blnL# zGP<&;WFB)eOO+O>EGy(jhinL5zPyk>`TQ(XSzE}R9+_HMU&xt0_0=ky3VGZk>sNLV z@~p4J%`5u~xz5XMS4oB3?0d^@l@o=`hbJkkjr}TT3t7-3S>av}tFKTwIwWtN>j_~tyV*DLb~8H>Khf77BrRE7!J3O&S-H!8!0 zTsk;MW>>00e(B3Tr_w$+MvuDl?p)^0%Dlahw=12!^7EI&|BkMHnDrDm+Ir5{XJ%pUHVvg+Fw0Ezx zj%?bm7jjI~bRj?Sc|NY`Kodai9cNytH7^NmfX3K{N8dP~#kLJG}yHk~D84_}9mG@T=) z*~faK>3kuD=I5F&5;Dolyx4T9kV5nCnl2YoXnwotDj|jDcbcy0g?!L-eJ|wmrW=KP z=*#}!rdx!(zHnX}QS)s=HjQ&+Nb{XS&adXk@aB7j-0jjZ+QIa%xq@rk+Bx8h7q{$Q+O8?I_ zthMj^?vztJkJs<}@AZ1VuJ3z))^x3F4SU^t?-P49sZURhEoV(P%t7?8mN_l9B1v;r zY;_VT6?=&W&wiQuzW$>crkp%BMl>Bi7u89S;4gWm?3(WYVyl zBducFm>j6$NSoLbn*GDjs@v7`{64+{I8Z-AIr^T_j!(N zh~;5Y)A!)^SY9SK<#L*xv2-Ty`4P7}mY+$wkBuKWNHJynixM zi=`*d*k`An%9^O9=cJy&Bx+ab)H9hh^=&VodNz}bd~DQ7Eyd&`-_om6%P{Fy)wS#D z)N`49?q~knQ_o{k-RFEqY9%I@UG7qKNxgtc)Tddg7c+@k`e5oMOz!i2@o;K2CQ*H+ zrq*N<)%n@fE0Q#`Q)@AK)YtjN)VfR>`j)Ovt({rb z&6te#V`ool3nnl7Ncb_e6%)KY&i`teSl;WIoKeD&3VCl}5{-*`d2ePCjf?tuZ(&l( zkFUmg+b5;!l=qILR9*6RWRmVvbnT%G;mGo-yV+kB&#?DwlxO1{xarJt5>9BZOTI3wTVOrl6QE8j#WReU6r%J+0q zK6Udwla$X@`KBf1(=gu*Cfj`+HqAFHDWALYJaB(ezBdrAehP&bN#;QRz$by}=|ZeObPhOdj*4ugtfGNmTk* z`QBs_mHu_Ux0qbyOW&1mV^Zm1+PkcYO3$740h6foSlUNSzVfA~r+vaC8aw6EK4TJ% zoeF7NnSAa`ublQ(Qt6G-zGh8SdgHWjnM9>GOWVcdPG5Sfw7pEC`017Q1CuCz`lS8D zWP|Vbd((bNDt&C)Z>)*dVpCea#KKK)!K(ac{ly#kX`em1@^y%LjXo^P0b0h4GgXqRO-R3rNwn%sOmD!X z)a9~=!xzO*LmZmpla*E&EEK6^}B#NKc)30H2iC-^Pr(ee;Dt$+K8zxcdJJWAu zlI~0YF1;<2$cOndZeS>n5_2Xij4c1obO5Pj4USCd2)5eNG4Bs(llc<*YFNsdW($lOkVWlnvBPpRPm%$ z#*<8%cye9F(@X|=(k5dvlL?;OkTI1>bjNyg#&oVvba&h~V`dV$En^Oo=x(b+#yrmF zKHrMY880QJ8j!IlDb;-$OF30%pX&aMc=W~^Y%F2C1$GGl#`W=6)_OwxS2W@Ws~ zsp|R&e?H?wCPlqwMaIWT`Fxu3DQiafi25?)t0c{z8DA$6n|~*#ie{4B`M+ZljjufU ze_%4*&k||*_c4j)u~PZ>Gl}N0GWmaFlIdrg3i%HtrK*?zP*SP}`E7ohArJX`hbH-R zBnyAiq=1*f1)%mXc8BCV=I`_(7kV!O$kIG+|Nue5U26!xgQ6|x>K0E)( zNu|G-zc_1V`#EZU{?nO6`^<&;Gnu^a_nEKcFTo_5TQ=rDhske#)!UT6G?OhpT0YEQ zE~)h0`75v{x_8){zY>$^-r@WFm6=TN`TU&!A|}!OPI`e$m_+wG1qxJUV!g+T6sVC@ zdf5V(vnHCO&Mi6+`{$y z5-Co~MKvu8omdr7npm}zRWxlk!Y2(4-Y#&yDrlOk{|cJ&U*Zi2zIy88_#GTM7c}4X z!Ebn(WL4XO=L>KbT+qa>cWiHa@qIy4uBZ6Epvmm!aw*o<Y_w@Gl0KERlJ*=pX`n1|WQdKz!7vQ_4DW1eH{{rQHUJ+bD&LB_0P zHU&Q2#MZIbU<&;FIj8++>ync4CSsSyR?C5z_Z#yK%4j*T{U>5&8aIxtsnY{q;~ES) zAStYQ8c!urT5FoD!86@_wV}Uyqqh#%#g{t}@w^XdTMj%Mu`AX)o`s$r@a!iQ;P;a$=Sych>vnH-dET*;yfw&Mx$x_Tq&?AFFZi^1UvyW$_tsh7 zs_JvO6Th`cE)BeOH-2{$Hhhk=M)<3ppL49Kw<>$<_gU_09$%Ml{na(z8tSc$zO+5w zn(M8R-nznDZM;>|TdCe^;_KYmTf2SjTVni5+bWK6*7)Ae+PT?TZ>)0Gn_hRwB_ ztHV9(&JJ6+(d&wS1?@B2@Ef0Xj<#xGpjPScz+xwd9}OxFvg7J@_TMK-xW_xQB z)*eYa<}GK9@YdNsJJ!!zv%OWoTdjPpURdl>%-iRzr@Zx;Ptns`)x7nyuj#Ko#d?2r z;}Vx&Veiw86CAt7>%PERD=q5rowHj1>8w~|XI1t2UG=SFCoFQ-soy*6L7%pj_u6k$ z+|`F3ch!M%8ijS)r*cF_>anqBpC@m9|gqKi-46g$h3oVGhwaj^~!cI;uy zgu-Z^6l=vF&Z^{7(A+6kC;1dKiwZ0Gv9mI~MKh~h{o+$+T|3fQwY~M0FYQ%t(OfKP zX)YG)F3h%K(OfLn<%mDAKJYr4pM}w^EEdhmV$rNjmNla`;JX8CeL2YOKr10~WG^}b zF)2Hq9}y+Oe#c&*BB!X(0^gNlYgWW#UE`idemj~w_7nR2UarA6@bh4{0@Rf5+N>FSt*g~f zH#m#>V<_vWKg6Q`5bHP3S|ev+ltS)yqTU~d-j`bKLEEI|-(Bad*2qs?c4h!?3T-Ajrm*ZW?L%82rdtlzvR>!FV%m-T3+ z_&K{=F2nuSqwMFay5nm&Y)!?u6t8UoORh^vw09EgR-(7&uocyGMNhdW#=Ru!On1lD zj6u(cHPF|uGSW&JO?;nI&ht6H*L};UdW-sZ315wJX@jfMwjr32R`At`z3n|Y1O2;} zuP*j&TY5e2Qkg~bM$|LQZgVZqEK<$kVnG#V$PXCyZ2A_d*MSaYMFMWZ@z^6hvSvyb?1 z2;y1FDDUTk7JhUWKxuL{ir6<%Ux}fY{rGK%oTUc!QTqd2zo^^^7+aD{W0WDf0X_xA zM(&5G&ZLu^qq*s9)KtcFXK$T=Sj*2TqB5c=dB#WLCd{nKqcIviG{Z@)YM>p3Ilnom z%gJofSUr=iD2AfdbOc6)KwHwngycK z6Rk(tl@{d^`94Y!#X;1U+2s<|IjSkGjlXd04#X@f)=yYh#p;ezL|J>Hv{95?-AMW) z)BHIfUz$U|iB;KKmwBs^x32fr?cVC?t^2(7h_~pA3X=1)-g?PfZ+L5?w?6gOPH*k^ zR<2<#zk=R6&0A%?b+NZ>~ULsLxp0yzy$F~wlfd1s0_2Ns=+;@d*d(K~r5<|kNm zE-HRL)8|~lTUEVP50*8X5gXrdqoRm^4o?QNLs3k%<|2lBNqRQPN{c{X~%uu zf0;3Nz^Z7{n;O%FtqaN+)19s2=NZ$Rtp=6xojkT~yV#if*qU}JzPiKK$m+%nXKVCj z#*AX?k1OyMBeuRTjBlo~)v*M=M#vC?5t5RBpv+(ULzB<3G%cW*Tmvh|=` z{_MO~a+0$eW4@Y=wASQW>w2rlL0sjP^VWS%*XurfQ;Bschn%m@o$0J6|8&+@-kRWb zw|OgC?LWZ?kl5&sJ`(E{c$|D{&Ay(7&#tYx4f_|l7jnPe;EmBK!h>%HCRss9Ve_Ucy+A6hja>VomnZ*&bt1>N3}lia)R>3+sT`pcI*=(L`fj zM1l9D?Po)MG%}X88Hn57O6#A_o zEc{}p7Jk>kY(~EY<}%JN70sQU@!lDy=#SZ!tb%43cEggkIIPlq^&n=S%51#{zf@!0 z4n!jLZ$Wbg$`xxjcBQrXYF|W2bGF{_)(h~^EzCafRy(BV!E6eAB{f**tq&1b_w&^< zH#zH1&l-4k1M-^yoi#6Dq{!TKUJt32H7yX6!hXX3PkyVs6MHjZ8J*lZbL?r~g-<1y z;y%9yC_`8$U+&LdcZJt=@VcCqJI<$_@2yMF3sPFO=FaNjt>?TImC?qt(cY?!{-s`-#U}4ovCqtc}Vt&9WWFOyxdu@rT}; zhn2kn_1m9)+%Lw_i0=vZET?$X_v&w$RpbPt9>!|Q)s%KW#v9eZnyXv5Gm6!SXSo`s zjo8fSOW0DZTVh>R(OC<;E~A8F^~yPG zg4gZ#y4$?&X0KbOx`O7xajtC{qp+{zww2!Nta6x@rR5)C42nf}4zfZl0+X3Pdb-2S z?fCBDmondH8n@C#dj{*D2eJMc2U!3|5M7Dc5+ zWmwZ=J-+Y29%|#`Ia+ake$1FF&ZqotKVZyPtjq3dv@%7bB1#eEa+fb-CE{ua=lAJt z?(E^iyIe0sEIRXutSIf#Q$)J#(*83n$|bVgX$ro&ji{5jI{d0N5zDTo(bdSJ-TEH( z8r@-tbtU5Yhei||=PkyULU1+H)bQ38^d0RAGI^&@vrnd>v@#Ek!RmL2^Q+m()ztYu z(~QS_mG@yv5m}#L=1OGNf!B(FW04wXNRZAE^?w;#iw=oMIO(t zR#A$``m5M*Ip;LRvFkF;K|hk+jG1YiWz8wC=VupY_Xc65F~X9`i; z-#M4Y*m2A5rg2+mMW=b)u&b9-$>_IzUljFCRCiJgkz2zDz-@WG*v$8U79-ST3`CB)-+mx=Q2S4yxf2{3SiG zOw;g3+-tBd+D~>_hnpBmT7M6hwq2*)jF_fcbI8Debdch(b}C4I~2OVv~kberS?61mwO+)F`mm9t5&oh zik{cY^v`!%Q+u%MqZ_?75A(g8mMubyrg45Vo{`!6ukzc88CcRb*x;-));VjU&$$V9 zg0hcY)W}(9-|MV0{_4c7j%5vZR+AadYKHxlL^0KL&N0<=<9he|>X+}k-&ZL=SwEUj z!}pC6^0Q`feYb*5LjOu+f7Vc}zw%21X=Of_a%Le77cHtLx|8=NPpy=#v%7fQS7 zn9@>;PmU=?RA)-N?KsmWws+4lp=!)x_du|};dc*OixA$BE-hwYJ(l9T+39WlSd>u1ed z-?~}!Mm$L*bHsIi%&bo4ytJTGr6Xh58#yESGy9DZ^vl4vz_e$&jm!*|E zrqU+*v5;LWTVl4A7`pW@%e~+@%Z)rqzN&sqxm?`b)$i!FZ}yk9uX9Z0Ms<#AK(%jt zOu0n9|7EE$*K*n|uq1LK-$!wkT`Ln~?bv!Ds{Q-egS6!u?1S}pYH)0xjC}CFZFy8K z^;^ed>bJ;i|65;0 z_Z(9zBM(LKe0;4uwkUoc`+ceN3w}p&>14<5^K(r$^ps!I{;IdkPPeOy%KiE$=To=8$~4hVhH9{c zYjFE_PUrSg1dnZ{=*<3&~wuwDwSG>yp~L8jMZ|GX0y0e^pv` zt&H|-hqu?pwb$+3@N~yN((=g9QUB84*OZo@>vtJc+Pg_DkACZL@7TrPv#-UTP)<&w zGP0|^>#d6B^PA-t@`C>SApRZCv)+(jn{jgNt-;t`%lKG}QzjXCWk-v3^j^p`op5d@ zzq22F%dPwEFh|G^V7Kr67L8rbbXu1Cs>HjPmEGjbmt zCml!6<*%-GUwu3+qF({x@5|QWH%R)`9M2!1e&gh-f9hbsY&^BbEc!*K$h&T4eHdr! za;`F0pB#vPAJ+NG#{K5yA}8{JjXNiF=S}#VuD;Ksv#*@?w0mYE)AvHADWEG;yi+N3+#)$gY{i>B|oDZThvOC?1k3=^Xa-Jf)I_E4G zJadwTwmnEa9j$89)h~G72X~+J-VUCa@oPNI0$Yx07KqCD>zud$*K*!_oH-whU-lnU z8QHBf(L70hHdyCrndJDo&^A1 zJX6dwNGEIZ#NzHr)XJsYlc>|myJzydo{#egto@jGFT!sQY&~_UOZ#AT7aLF1bk@Er zoK@Dkr$9bG6@PsKX|t<~H4mW%5@93HanG7AtKck3Teknsj<$l;S4N@9=&rYWklY--EZZu46u9I6g_?@>0cyIR*&^g3?BSE0RTd@5)u#{hJAd^q#E@L27#Hguy_($TG+Q9K7N%pmf_+trAsLVUG1 z=D(BJnvMBSp7x^o?^I@|VE#Lstr3?w9nF8Dn}enMT)ui?q4=4w60-rN@e41k|G(7q zO!%}Gx4aWZsCf4Y_*A@G5k3{K(V8OOeI9eMc$a)C>_hleSo6Xz?Ky~QN&8$G=ke0# z{kJ?`>2J0}+Iv6NMyc~;#D+vkku(2Wb-wIx*7=|Fz04a|Ar6Wfni*vOLNfzda`kGy z+7|O)b6CPQm8BFk)2w5QW*V}RM^AN(R~g;cB5n3p%`7|t!B=TbA)PfJV-F&4F!si{ z6pQvCVjXEEkwQZ2k zk94xG9=S!7A3bN3?E5Uvg?u&M=O@o2eFP6Z>2sdNSC3Sek z4`!Mrob$DqX~d%0n{ttM9Jw@V$8xVba(k&ol(R&gq=be5{mv zKIcL`eKA|z5lvK@H5B8*KB(jv-Qx&5h_;FDNHyrkakXTrJb4yh+L2O-U%nZOXV6fC z_!N0jzuH`@qo@60fiZRc{4CFfQ;HsK+$>+8b58WL)Rf{%o*)126t`Zw(qx5bjI?r3 zEO&BrPb}6mfwK-`&k)_Kwcr#+_rQ3I6TNU9*MLfE$5yMSYUoS3a~)I(Z~ifR9dRo6u-nm> zvOlGrkytliXC%M1WnpI|Yt)m`ek?S!#LGdCfC|;;EYr4TN;-UYQUvA=ZbLJNrtG6OWQA6ia zG~Q&Cb>Q}ruX?bRI8ypBtMIOy_15%uGhx@k-b$DWDHoXuhq6T;qB8ys4?W7|=FCIM zV?kQ({31~zEuttHhn&TK)7c{3T(%PZw~*P9d_^h5S1Z^eUr~PlhOahoxyR=#X{Gal z_)1ztzIqoqi?6<9i*&o$O7zta30EZ-Gn%|Xx#WeF+((ikaV4gl#ix>%d`jj18$Lam zYoAk}(u{r@w~{8T*y~cgMY(UEx6pA`ATN9 z>yRROHoFl__6&Ehl^9`N60VB>?g5hsd*FyEj%EI%a>b{TGx?Ni6~CjHalYICt-vlw zc71dYCRPgeX0q2?hn=9T`wK63t4nq}!6U7lW4YX%`BX;e6YK+uziDjIo{OGaPab)* z5_ICpMO+$1;v0N5(f5)faja4q;wwoT{mQczt0~pRnxpTU&-VM+E#6n-{jQnL;l!uI z3OS$l#qLXdx(2&1@$*C2eF^)dGS)`k@l40AS$5K?*fnqBx=cW6vN!t{C&KdmtG7@_ z^4^TRMo;G_d+kHyBGLIZ=SO?$U2Kupe&(x*UQ13vI}b?_`6|0##0uaJBi9)6Utzy@ zjC@7s+2WTw;VU_*{1SH7{Ovdk(IY>eNlN2;AsocLBmy!RDeus7|{3rXr zSADFF@UeEJJG5q8gX6nHYsKxQv3eWlLebQTEsCaIe3iU=zt=s&7I~N6sz{E`(Fr>7 z?i4Wb?(=*#u|JYikar~od6&xlcfGrWYmig#k|&pQE6HoCvT5%|W=V;0&3aVs@yvSkD~gQi@rXnjtGNri5!wZjC~OyIJ(;iOU?j_2HyR^Z z=C!Vv^=9Kp(wfsT>&ewMnDt~Pd>8Y^uUx-znDr#ZLnuRL!X9V2oXHzky>4i=U+tk0wPCrOHhdD`upg-%}37LSZ5@f z8db#ULPM&3(+gazy@qv0qHYn&kT~suG9vfpM7GG|^d4lg$BQTE z#N%bTG>Y~M_-dlZB}L@%Xx>QNb5XhCKgo~$N43hi|FXM#3NSy*s`fKhPFaPHW%qw2 z*C1#6Q;Fw#NFnju2$p#F8n!5&Z)S_UOK*22d$)apPQ2R_OyYR}UrqF`q;T(?rI>#% zo~fqNA5sJA4{Arw`{SRB=ZCr6V~OX-*jME7C)py8)0?r$9)Bi5Cmw&1OQU#R%vTdV zE-509A1R)xT=AdeNB*N){Tu#U$K~eCe-g!SBgK(t<@azE-)j2HS($V>pOqI)a4kjbsXu587J-$0ifEscxVxd!WHpdnXf>d^~Rm*a`-e{Rn1z%@9QIr~neka*7S zKC}m}=48i1y5pI%qa9C9ckoBr=SU6yFU{F~*!L9KgMBa1H#w3cduW1AdSM**2SxT| zzM2@>lHzH98gQh&Je4akF8NW6Q>~6C#{V0$_gt>avCQ5Jk>bd+_ba$6(SG#3Bk7K3 z_Kxd8t2LJER-mkI8DaO}&-_zGul4E>Bf=+z@Dfa@!_&0ntF~%iDGnp`q6TK@bqNh*hedwOUi#(pVUQ!Lj&yw?H@Uxsy(Qk`XQ)}|z7oy{R zZu9tl<-Ul^J(l&dDpC|R^o}g~xu~fL_eUPT3|GbD_1Pki(^q(sJ>ED$Cmz2MOgw%E zUrqG5q{zLR|EGAPEWrtvYJ)8Byp?vp>gx!hxk@q3V>s9ETr zEYstP`EJ6}xp|87DjIN4zO2Jva)_fJZ%eA4-!R9L^T? zAbss9#ni?BrQiKh%ua88RSLh3u&!$bXT6Fj7Pk2!XC?OKw1hIOISqIIG8X79k_EUb zaqueZvP+v?97H2;ChAA|CC34^$eJ#gG3DL$IjFr@XQ1}-y^%_&y;xf=biZ>>#B=bo z;a6)eukOxiy5lTJ>bwKLZi;mQehZXSoOSpuP}s%zl~%0Z@GGsftu4-ijL=4>p;-OeVYkm%gP7DXq0 zPb+zT`659l^UL>K8hQ73zM2?Uk|K(s#MzrllNm&EA+J$g{td6CK2GK4)N8c*Wgvz4 zuMk^n2g&mS$zG$sm?7S!6ymjVY?0S47Bbsf9_V^GdTcmEg8V{36;j%81M6;c#6^j7@U?4hYUjk%pIdd8+RTht48 zvz6$-{s~vbh~D!V70idVsU#7}y@gHv%iDc^%WUx{&U&67A4mpS$m%(ik;9zCx@aVpO@t;5bx z=0EC%sq9JWg*n;ybbi8B>4n$X8!%AK?Btsjt}$J(AEmgF+F9_3OIyXc{871Vp(qUO00@wyYPB3)hFAxLR0 zu@Z=tTkowTzvo%!-trUnAv3zWlN8_Ku9_^lx}iShO!sthmG0?2WY*ZVbgna~W zh^{g2UBoJNiL-93CYI!!-hgtRn#bJ_mN-c)xq1a(J^a2==6m`EXNuW?b@ddsu2~^p z22C-EUt~}Uqg@nM%7f@Ps=!O5=wx~QS= zpvl!;U}PotuYC0&yZ$|IjeO@M`F>^~`(Qiv5kIii96pF@O5Z_~2)ls$^`quO=&T{gpabM(rg| zqcGdvIKo3HO($g_hasyaSye3JLXP#N2UTw5ea)}{MWyJTuUXT7(o;9DM zl`=xdlySNZ=f%fH6vZDPMNvbmkVL0jg^HR&sHw1h=Vl)fM~+yUk%}~?x^za%<(%sT zf8w>bykigIZd=A%1)SH3^#WQx8>@~rUsrRw6o2P+B3drGg6Ln-os5=?Mc)O>yqD5; z^DV!)qGPvJcHS6aM`7ZFi!Ct?(@XD1+#$U@+`b7ex8j{A?#|DA&g=u8f8t; z-lFEF+-@9g$09-FNJd#b9)r=@HGRvGu0|`Y?2sElCu>hDwi0*9Z4$1^9z&ck5z-dlyd181gi7jTV1fN zIF9$^?&orI_6ve|_aXKWMdxU?61_Vi;i`CdCYM1yJ@1Gqj?br51N_Zh_>^jeK!Z=E zwCrYvX#P9;3U++&1TW_ru&H(@7b0Pe(QVt9!cthEET2xjFNx%n`vvnh$E~yiwE~X^zMPoy-vh*-G?Z z(S)nw@w35Xj;L_N6n}S)pt^|fr8M$A)%4%+eRVE3XTF!2;R^N(#dAZp5`Ef~*`i5q zcFgX~Epc~4xrjGzW{bQ*W#s&%E!y4OP}8kANB{QIk>2?4$mQnL8`-to`9-2hT14Zw zD{_|D9RRDSISuPJt!m=aAz%`x53`k+^J58DCFf_rBu;1NAO)Q>NQ!!xJ7rC#^@z%i ze_M74_7?KncAZPzdy5;Yx&77A&u)(8&5gxe?y;;#%ea-~-F0jwdg$$htKy;0xD4|B zjvS<*)rHEC)kV^FgNNk2&#aZJuWE{XFV!Id?jhgS5$+4!&m*e+?@GJqHYjU6g5BK z{3Q!kipeuWW|hWgV0&t^P8z(1T0;N3HjZE;4{}Ewd5lXQEyT3>9B%}Hgl2(~9w5(x z03C2vl~mq$QwOv(RN<+cwR zQzK@~8KzY^LPNYaaI?w(R^_I@c)c1mh{!#-3D1p)Ly=C?7vG8n!6Kn#=+pSV5JjaY zD|h32k04xO&{erVoR7bf48lb-SuhCC(SVdUHz(ESJkyEESaS{PQXiW0%xET~%;|OU zP8LW-6FZNJ8)XW7hHo;0R5Imo)S+$UXR zS}7R<(i0loSmG{|ygCV`_XD}al*0N$IbZOqF@r#=n&yxZdHZd=Hw#kTEKyPeu|zr7 zFa_wy4Vo3ujLbBqrfJP&tjR>5zJ!(bGBZRpCq1|Z8su}i$;90=N{>zKgL@n%bP7x4 z1(3&?oTp^zJUm|ma)r4_$$KC(nAA}61L`veG(8(2;y|u3!<7{L9&y2B ztq||kYs@E1vSK4~&s>!?UnzMCq!yFiN^ZieaWzOQvrkD!kg3Ip92DZm&b1~_b*hid zEv=C1T9e6Sm8k`fH4gE7ytzU&u?O#Sq`s0zK?)%K^`<$KL9xxamA)PMv^K4kYy)}z zG$OYu$-5f8(;p|^rn8b$K&nF1#`Iz$_346qZZPA8nBt4@1Tx6YCcOsNIW`JDq#Cw0 zMU;#Oq58Bnr!k4@bBigd#MS2(Q$dNVPdjsw5?7ygrY4i9KDU~7LbyKnKaJL!bwYf7 z?l7B_xcb~-K4B8or-S)QiK|Zsvs;O)Pe-#)iK|aXbC5|?pHAkCn(Pft4}wxh)GnR?q-V+-(S5;Lu2r%bWHghuO3v6In%<^^k_$md)7x}+sWis=n0`uJo%@&}N?e`$n&C=Z zo%@y^03eAeW`&V%~hMdmD1Rf&tt=S&YJE;47E*-BhwK5w=uagjO46vr-ya(0pV zf@!YAMdn;HT#1X!7tIPKE;8qt14>+E&Nr2>qMW11Twuy!RfvzwMP`kX-D4zHUol%6 zMw+`PVLxGdHxfb`B1_CfL^j3qE$I@^OU-;GvrdtCe$A{?Qt2Ft=jG-LC53R`OY!`M z`Bh1^N)pd2P5#D`^Fod1)uyD95gN~HNq~Q=(%mfjrT`EZ&k=F)yxwbEJV(T>)R=<# z->P&M&k=F)j44<(E}kRe;`wc_aq;ZPigY)NZdA>RbQi0RtV(yWid#kgw<_Jm>LyQI ztiJ1si`Dl$aj}Z2od2y#cd`0`CoWb$^u)#LN1nJ?-Ry~r)sH=KvHFQ8E>=JF#Kr1orY84tmU+0hG51cwy_4CX*Nk}yenlDWw zCec07mn6WyRp~GOi2Jxkq>+EC(%%HR;~q?=-om!ZAd)dGhddylVrp z-II!aF~?8B-JK^7K7*Gz63F|H$sOxArWMz4teN*2er15>8#A;kC6sac63Dk^q7buo ztlXdOG~4bX%^tm(M{nl1a3qK4e~JB5nT-IUh2)?v_+8pTI6r;_}IDcQA?a$zzKl0^pz6Jepr8 zACK*?Q)FgDY1{$tM@WbiM`e76xp2i`cx4p%}eK9yd|#_l6cG~!Cz z5<)E99nV0j(za$CnGI6Lwi`^T2AP7;P@T)+fAnuv?z29}yC=|;_k`-c2&951XCT!W zc(tM@y+6bKGBlMuIbZWRKY^@+rg8##2ZY|tp?|A#Qz|<5yD))lf#xDl9z|K(K&p81 z6jJR4xx|y5m=Avixzv+7NcAU3RZq@&TzpvFk#st{7 zUh@?Q~wY}z2kfI6XIV?D&spB;(Ku8mjSFq8z9_^~@ zHLF2#qt12h=pp!zdCYV`f0aP0dUoVUBBRWB?2#*h)VJo*NK+l8fgS!>L>hoJvX#e2 zX_IBu!h=fycZezDDkH`ri z9c;PRBXTN8M>{@_lm+Q*KZ+w&K<>27S464mfZS!Pt|Btl&?smD(%p_`60J?W?31dw zW)Hq^3QaFNlgTL4B)4VK+ip|MCI%ZX#DChz<#Q!Tq_3H?V8H9Vu0PNnsVrK z8Yu(qFRG~wLL+6MJ)|1f(m^)Q8eA}gW3HuxYyl=&u>7tqkY-iOBRLujnmug;8%}{%%$E)U1&F3LINi|b7pNH(TsyU#VVfIDUq-j3G>?@-2y*%8$p{ZPK47YD;Di<5W z?R!b7M!5Mf_g?Hk3!pC}QU_y@$irUq{VPHq@uZKEk)9Mp36yG-{WPwuY3RX6?LH=h z{CV$adq9ah?;UMp=x@3UaP=8uTPtz(8EX$HarGHz8zUwtm8;KqJ5`CR&jkB3ldRaE zlW?w%`aEtAD#@5^%zP#(d=!us+x3w#uYf#ZGnDKHS;6E)A?*3LK_=QugqYIHjQJGg zDSMTY^OZbpTQeDC%EPPMpqXSRVpmH0DA%rM>O)lB<~YGz%Ui3{x>C4HMo{Jdm;Rx$#F;^!s%r;@ruMe`q zY)?9jWFAJ!Xg;*2q##~jww097no^L-rAlZ`A`EVf--J{Z%K&l1~9Nh&-~nk9CC5Z}_JcIaVbl%}F~(H-kj zJAujI7_XH~o>7h46})O^smARJUbXW@RruppGo$zb+Yt1LvA`$hP{Z2L2 zFe+)5SZ4RDrXC3O;4*98mOj0zk7$}b`vwy&~Js>Zc_wVkFK*Y?$Rj%r-n*Vva->?^8qzm2|S-%!m{m_;alHrO{+GaaM=irrw}6OAwZ zZTqRFayh?kw`(ew^V@c>YTPf^8|^QuaW&j%52@y-F*0YqWAk8K(eCsB2+f)A*aA$l zV&^uM8g8;Dsiq1@0cbYaOwsrnzH7^9Dt9OTuC1i0+@1Kl_EOcH(ok}K&t9RLk|31x zd$xgUTz|c9o2$n4*Za1OXng4(*!G&rdG!O^MN>JieqirTO7)=~n3U>6J2WZPhjx@| zPQl3}_18ysf@(^FP@O-r�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 K=>Pb04txP@M~`0s literal 831488 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 |3l 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

Wk^qi3!BII-@bAE0S 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ⅅ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

6NX*)({c&kuxYu=^D}%>YlSUiUU0 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 diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/PubnubApiUnity.xml b/PubNubUnity/Assets/PubNub/Runtime/Plugins/PubnubApiUnity.xml index 11147e22..a270fefc 100644 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/PubnubApiUnity.xml +++ b/PubNubUnity/Assets/PubNub/Runtime/Plugins/PubnubApiUnity.xml @@ -102,6 +102,47 @@ + +

+ A simple not-all-covering implementation of CBOR serialisation/deserialisation for internal Pubnub ParseToken() usage + Converted to C# from https://github.com/seba-aln/CBORCodec + + + + + Decode incoming hexadecimal string of data and outputing decoded values + + Hexadecimal string to decode + Decoded value + Thrown when input is invalid or unsupported type + + + + Removes spaces, converts string to upper case and throws exception if input is not a valid hexadecimal string + + Input string to sanitize + Sanitized hexadecimal string + Thrown when input contains invalid characters + + + + Sanitizes the output value so it contains even number of characters and returns it upper cased + + Hexadecimal value to sanitize + Should the length of output be in powers of two (2, 4, 8, 16) + Sanitized hexadecimal string + + + + Encodes value to a hexadecimal CBOR string. Because C# does not differentiate byte strings and text strings + the only way to manipulate output type of strings is to pass a string type (one of CBOR::TYPE_TEXT_STRING and + CBOR::TYPE_BYTE_STRING). + + Value to encode + Type of string encoding + Hexadecimal CBOR string + Thrown when unsupported type is passed + Dispatch an invocation i.e. call a registered effect handler. diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.dll b/PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.dll deleted file mode 100644 index 32bd6f0889ca33975df709fa2f986ae71c579261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18432 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 - - - URIUtility - - - - Contains utility methods for processing Uniform Resource - Identifiers (URIs) and Internationalized Resource Identifiers - (IRIs) under RFC3986 and RFC3987, respectively. In the following - documentation, URIs and IRIs include URI references and IRI - references, for convenience. - There are five components to a URI: scheme, authority, path, - query, and fragment identifier. The generic syntax to these - components is defined in RFC3986 and extended in RFC3987. According - to RFC3986, different URI schemes can further restrict the syntax - of the authority, path, and query component (see also RFC 7320). - However, the syntax of fragment identifiers depends on the media - type (also known as MIME type) of the resource a URI references - (see also RFC 3986 and RFC 7320). As of September 3, 2019, only the - following media types specify a syntax for fragment - identifiers: - - The following application/* media types: epub + zip, pdf, - senml + cbor, senml + json, senml-exi, sensml + cbor, sensml + - json, sensml-exi, smil, vnd.3gpp-v2x-local-service-information, - vnd.3gpp.mcdata-signalling, vnd.collection.doc + json, vnd.hc + - json, vnd.hyper + json, vnd.hyper-item + json, vnd.mason + json, - vnd.microsoft.portable-executable, vnd.oma.bcast.sgdu, - vnd.shootproof + json - The following image/* media types: avci, avcs, heic, - heic-sequence, heif, heif-sequence, hej2k, hsj2, jxra, jxrs, jxsi, - jxss - The XML media types: application/xml, - application/xml-external-parsed-entity, text/xml, - text/xml-external-parsed-entity, application/xml-dtd - All media types with subtypes ending in "+xml" (see RFC 7303) - use XPointer Framework syntax as fragment identifiers, except the - following application/* media types: dicom + xml (syntax not - defined), senml + xml (own syntax), sensml + xml (own syntax), ttml - + xml (own syntax), xliff + xml (own syntax), yang-data + xml - (syntax not defined) - font/collection - multipart/x-mixed-replace - text/plain - text/csv - text/html - text/markdown - text/vnd.a - - - Specifies whether certain characters are allowed when - parsing IRIs and URIs. - - - The rules follow the syntax for parsing IRIs. In - particular, many code points outside the Basic Latin range (U+0000 - to U+007F) are allowed. Strings with unpaired surrogate code points - are considered invalid. - - - The rules follow the syntax for parsing IRIs, except that - code points outside the Basic Latin range (U+0000 to U+007F) are - not allowed. - - - The rules only check for the appropriate delimiters when - splitting the path, without checking if all the characters in each - component are valid. Even with this mode, strings with unpaired - surrogate code points are considered invalid. - - - The rules only check for the appropriate delimiters when - splitting the path, without checking if all the characters in each - component are valid. Code points outside the Basic Latin range - (U+0000 to U+007F) are not allowed. - - - The rules only check for the appropriate delimiters when - splitting the path, without checking if all the characters in each - component are valid. Unpaired surrogate code points are treated as - though they were replacement characters instead for the purposes of - these rules, so that strings with those code points are not - considered invalid strings. - - - Escapes characters that can't appear in URIs or IRIs. The - function is idempotent; that is, calling the function again on the - result with the same mode doesn't change the result. - A string to escape. - Has the following meaning: 0 = Encode reserved - code points, code points below U+0021, code points above U+007E, - and square brackets within the authority component, and do the - IRISurrogateLenient check. 1 = Encode code points above U+007E, and - square brackets within the authority component, and do the - IRIStrict check. 2 = Same as 1, except the check is - IRISurrogateLenient. 3 = Same as 0, except that percent characters - that begin illegal percent-encoding are also encoded. - A string possibly containing escaped characters, or null - if s is null. - - - - Determines whether the string is a valid IRI with a - scheme component. This can be used to check for - relative IRI references. - The following cases return true: - xx-x:mm example:/ww - The following cases return false: - x@y:/z /x/y/z example.xyz - . - - A string representing an IRI to - check. - true - if the string is a valid IRI with a scheme - component; otherwise, false - . - - - - Determines whether the string is a valid URI with a - scheme component. This can be used to check for - relative URI references. The following cases return - true: - http://example/z xx-x:mm example:/ww - The following cases return false: - x@y:/z /x/y/z example.xyz - . - - A string representing an IRI to - check. - true - if the string is a valid URI with a scheme - component; otherwise, false - . - - - Decodes percent-encoding (of the form "%XX" where X is a - hexadecimal digit) in the given string. Successive percent-encoded - bytes are assumed to form characters in UTF-8. - A string that may contain percent encoding. May - be null. - The string in which percent-encoding was - decoded. - - - Decodes percent-encoding (of the form "%XX" where X is a - hexadecimal digit) in the given portion of a string. Successive - percent-encoded bytes are assumed to form characters in - UTF-8. - A string a portion of which may contain percent - encoding. May be null. - Index starting at 0 showing where the desired - portion of begins. - Index starting at 0 showing where the - desired portion of ends. The character - before this index is the last character. - The portion of the given string in which percent-encoding - was decoded. Returns null if is - ull. - - - Encodes characters other than "unreserved" characters for - URIs. - A string to encode. - The encoded string. - The parameter is null. - - - Determines whether the substring is a valid CURIE - reference under RDFA 1.1. (The CURIE reference is the part after - the colon.). - A string containing a CURIE reference. Can be - null. - A Index starting at 0 showing where the - desired portion of "s" begins. - The number of elements in the desired portion - of "s" (but not more than "s" 's length). - true if the substring is a valid CURIE reference - under RDFA 1; otherwise, false. Returns false if is null. - Either or is less than 0 or - greater than 's length, or ' s length minus is less than - . - The parameter is null. - - - Builds an internationalized resource identifier (IRI) from - its components. - String representing a scheme - component, an authority component, or both. Examples of this - parameter include "example://example", "example:", and "//example", - but not "example". Can be null or empty. - A string representing a path component. Can be - null or empty. - The query string. Can be null or empty. - The fragment identifier. Can be null or - empty. - A URI built from the given components. - Invalid schemeAndAuthority - parameter, or the arguments result in an invalid IRI. - - - Returns whether a string is a valid IRI according to the - IRIStrict parse mode. - A text string. Can be null. - True if the string is not null and is a valid IRI; - otherwise, false. - - - Returns whether a string is a valid IRI according to the - given parse mode. - A text string. Can be null. - The parse mode to use when checking for a valid - IRI. - True if the string is not null and is a valid IRI; - otherwise, false. - - - Resolves a URI or IRI relative to another URI or - IRI. - A string representing a URI or IRI - reference. Example: dir/file.txt. - A string representing an absolute URI or - IRI reference. Can be null. Example: - http://example.com/my/path/. - The resolved IRI, or null if - is null or is not a valid IRI. If - is null or is not a valid IRI, returns refValue. Example: - http://example.com/my/path/dir/file.txt. - - - Resolves a URI or IRI relative to another URI or - IRI. - A string representing a URI or IRI - reference. Example: dir/file.txt. Can be null. - A string representing an absolute URI or - IRI reference. Can be null. Example: - http://example.com/my/path/. - Parse mode that specifies whether certain - characters are allowed when parsing IRIs and URIs. - The resolved IRI, or null if - is null or is not a valid IRI. If - is null or is not a valid IRI, returns refValue. - The parameter or or or is - null. - - - Parses an Internationalized Resource Identifier (IRI) - reference under RFC3987. If the IRI reference is syntactically - valid, splits the string into its components and returns an array - containing those components. - A string that contains an IRI. Can be null. - If the string is a valid IRI reference, returns an array - of five strings. Each of the five pairs corresponds to the IRI's - scheme, authority, path, query, or fragment identifier, - respectively. If a component is absent, the corresponding element - will be null. If the string is null or is not a valid IRI, returns - null. - - - Parses an Internationalized Resource Identifier (IRI) - reference under RFC3987. If the IRI reference is syntactically - valid, splits the string into its components and returns an array - containing the indices into the components. - A string that contains an IRI. Can be null. - If the string is a valid IRI reference, returns an array - of 10 integers. Each of the five pairs corresponds to the start and - end index of the IRI's scheme, authority, path, query, or fragment - identifier, respectively. The scheme, authority, query, and - fragment identifier, if present, will each be given without the - ending colon, the starting "//", the starting "?", and the starting - "#", respectively. If a component is absent, both indices in that - pair will be -1. If the string is null or is not a valid IRI, - returns null. - - - Parses a substring that represents an Internationalized - Resource Identifier (IRI) under RFC3987. If the IRI is - syntactically valid, splits the string into its components and - returns an array containing the indices into the - components. - A string that contains an IRI. Can be null. - A Index starting at 0 showing where the - desired portion of "s" begins. - The length of the desired portion of "s" (but - not more than "s" 's length). - Parse mode that specifies whether certain - characters are allowed when parsing IRIs and URIs. - If the string is a valid IRI, returns an array of 10 - integers. Each of the five pairs corresponds to the start and end - index of the IRI's scheme, authority, path, query, or fragment - component, respectively. The scheme, authority, query, and fragment - components, if present, will each be given without the ending - colon, the starting "//", the starting "?", and the starting "#", - respectively. If a component is absent, both indices in that pair - will be -1 (an index won't be less than 0 in any other case). If - the string is null or is not a valid IRI, returns null. - Either or is less than 0 or - greater than 's length, or ' s length minus is less than - . - The parameter is null. - - - Parses an Internationalized Resource Identifier (IRI) - reference under RFC3987. If the IRI is syntactically valid, splits - the string into its components and returns an array containing the - indices into the components. - A string representing an IRI. Can be null. - The parameter - is a ParseMode object. - If the string is a valid IRI reference, returns an array - of 10 integers. Each of the five pairs corresponds to the start and - end index of the IRI's scheme, authority, path, query, or fragment - identifier, respectively. The scheme, authority, query, and - fragment identifier, if present, will each be given without the - ending colon, the starting "//", the starting "?", and the starting - "#", respectively. If a component is absent, both indices in that - pair will be -1. If the string is null or is not a valid IRI, - returns null. - - - Extracts the scheme, the authority, and the path component - (up to and including the last "/" in the path if any) from the - given URI or IRI, using the IRIStrict parse mode to check the URI - or IRI. Any "./" or "../" in the path is not condensed. - A text string representing a URI or IRI. Can be - null. - The directory path of the URI or IRI. Returns null if - is null or not a valid URI or - IRI. - The parameter is null. - - - Extracts the scheme, the authority, and the path component - (up to and including the last "/" in the path if any) from the - given URI or IRI, using the given parse mode to check the URI or - IRI. Any "./" or "../" in the path is not condensed. - A text string representing a URI or IRI. Can be - null. - The parse mode to use to check the URI or - IRI. - The directory path of the URI or IRI. Returns null if - is null or not a valid URI or - IRI. - - - Resolves a URI or IRI relative to another URI or IRI, but - only if the resolved URI has no "." or ".." component in its path - and only if resolved URI's directory path matches that of the - second URI or IRI. - A string representing a URI or IRI - reference. Example: dir/file.txt. - A string representing an absolute URI - reference. Example: http://example.com/my/path/. - The resolved IRI, or null if - is null or is not a valid IRI, or if - is null or an empty string, or null - if is neither null nor empty and is - not a valid IRI. Returns null instead if the resolved IRI has no - "." or ".." component in its path or if the resolved URI's - directory path does not match that of . Example: - http://example.com/my/path/dir/file.txt. - - - diff --git a/PubNubUnity/Assets/PubNub/Snippets.meta b/PubNubUnity/Assets/PubNub/Snippets.meta deleted file mode 100644 index 9d57da3c..00000000 --- a/PubNubUnity/Assets/PubNub/Snippets.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f827c90ef6be4e6789a58a9d9a6d8e64 -timeCreated: 1750936995 \ No newline at end of file diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.xml.meta b/PubNubUnity/Assets/Snippets.meta similarity index 57% rename from PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.xml.meta rename to PubNubUnity/Assets/Snippets.meta index bffeb029..f40d8fb4 100644 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/Numbers.xml.meta +++ b/PubNubUnity/Assets/Snippets.meta @@ -1,6 +1,7 @@ fileFormatVersion: 2 -guid: 8f704e9f368b35d48b1f0294c76313ec -TextScriptImporter: +guid: 724dda23b1698074d8037cc7721395e1 +folderAsset: yes +DefaultImporter: externalObjects: {} userData: assetBundleName: diff --git a/PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.xml.meta b/PubNubUnity/Assets/Snippets/GettingStarted.meta similarity index 57% rename from PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.xml.meta rename to PubNubUnity/Assets/Snippets/GettingStarted.meta index 649b5e01..2705dce6 100644 --- a/PubNubUnity/Assets/PubNub/Runtime/Plugins/URIUtility.xml.meta +++ b/PubNubUnity/Assets/Snippets/GettingStarted.meta @@ -1,6 +1,7 @@ fileFormatVersion: 2 -guid: fa1f8f3af7c5b4b42ad2845f93eac01b -TextScriptImporter: +guid: 82b9c95bc2daddd49a3061d42fcd7db1 +folderAsset: yes +DefaultImporter: externalObjects: {} userData: assetBundleName: diff --git a/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs.meta b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs.meta new file mode 100644 index 00000000..4560c9b0 --- /dev/null +++ b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedExample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e946e731600fa2c4b98ada7cf18aea31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs.meta b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs.meta new file mode 100644 index 00000000..9790c461 --- /dev/null +++ b/PubNubUnity/Assets/Snippets/GettingStarted/GettingStartedSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15c9087d7e872fa40a667a9742720cd7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From b8e24f5aab10c50c0be7ccd5208479488093c602 Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Mon, 7 Jul 2025 15:40:14 +0200 Subject: [PATCH 06/10] exclude snippets from codacy analisys --- codacy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codacy.yml b/codacy.yml index b437e3fd..3064ccc6 100644 --- a/codacy.yml +++ b/codacy.yml @@ -5,4 +5,5 @@ exclude_paths: - '**/PlayModeTests/**' - '**/ThirdParty/**' - '**/Crypto/MD5.*' + - '**/Snippets/**' \ No newline at end of file From 590a83c55e89253928267b35932fec75370f1f2d Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Mon, 7 Jul 2025 15:53:13 +0200 Subject: [PATCH 07/10] inline comment update --- PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs b/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs index 06390c7c..d127bda4 100644 --- a/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs +++ b/PubNubUnity/Assets/PubNub/Runtime/Util/PubnubUnityUtils.cs @@ -23,7 +23,7 @@ public static Pubnub NewUnityPubnub(PNConfiguration configuration, bool webGLBui /// Creates a new Pubnub instance with Unity specific settings (like WebGL setup, logging, and JSON library) /// /// Pubnub configuration Scriptable Object asset - /// Client user ID + /// Client user ID for this instance /// public static Pubnub NewUnityPubnub(PNConfigAsset configurationAsset, string userId) { configurationAsset.UserId = userId; From 13b9b87092c6f87d4454ce7af5856e38bbbdd84f Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Mon, 7 Jul 2025 16:14:27 +0200 Subject: [PATCH 08/10] fix codacy config file name --- codacy.yml => .codacy.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename codacy.yml => .codacy.yml (100%) diff --git a/codacy.yml b/.codacy.yml similarity index 100% rename from codacy.yml rename to .codacy.yml From 80595a959a3da7126f3bc6a6a10720345efa0f2a Mon Sep 17 00:00:00 2001 From: "PUBNUB\\jakub.grzesiowski" Date: Tue, 8 Jul 2025 11:56:04 +0200 Subject: [PATCH 09/10] add secret key mention to access manager sample --- .../Assets/Snippets/AccessManager/AccessManagerSample.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs b/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs index d9775c4e..6e080078 100644 --- a/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs +++ b/PubNubUnity/Assets/Snippets/AccessManager/AccessManagerSample.cs @@ -19,8 +19,9 @@ static void PubnubInit() //Create configuration PNConfiguration pnConfiguration = new PNConfiguration(new UserId("myUniqueUserId")) { - SubscribeKey = "demo", - PublishKey = "demo" + SubscribeKey = "YOUR_SUBSCRIBE_KEY", + PublishKey = "YOUR_PUBLISH_KEY", + SecretKey = "YOUR_SECRET_KEY", }; //Create a new PubNub instance Pubnub pubnub = PubnubUnityUtils.NewUnityPubnub(pnConfiguration); From fedebcdf942c4adf3471e088fc13316c4a57027d Mon Sep 17 00:00:00 2001 From: PubNub Release Bot <120067856+pubnub-release-bot@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:07:01 +0000 Subject: [PATCH 10/10] PubNub SDK v9.1.0 release. --- .pubnub.yml | 17 ++++++++++++++--- .../PubNub/Runtime/Util/UnityPNSDKSource.cs | 2 +- PubNubUnity/Assets/PubNub/package.json | 2 +- VERSION | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.pubnub.yml b/.pubnub.yml index 8ff8dadb..fa8e05bf 100644 --- a/.pubnub.yml +++ b/.pubnub.yml @@ -1,6 +1,17 @@ --- -version: v9.0.1 +version: v9.1.0 changelog: + - date: 2025-07-08 + version: v9.1.0 + changes: + - type: feature + text: "Added the PubnubUnityUtils.NewUnityPubnub() method to streamline creating Pubnub instances with Unity-specific settings outside of PNManagerBehaviour." + - type: feature + text: "Implemented an in-house CBOR solution for ParseToken() handling to reduce total SDK+dependencies size." + - type: bug + text: "Improved parsing of file download errors to be properly set in operation status ErrorData." + - type: improvement + text: "Updated log type from Error to Warn for TaskCanceledException." - date: 2025-05-30 version: v9.0.1 changes: @@ -779,7 +790,7 @@ sdks: distribution-type: package distribution-repository: git release package-name: PubNub.unitypackage - location: https://github.com/pubnub/unity/releases/download/v9.0.1/PubNub.unitypackage + location: https://github.com/pubnub/unity/releases/download/v9.1.0/PubNub.unitypackage requires: - name: "UnityEditor" @@ -911,7 +922,7 @@ sdks: distribution-type: package distribution-repository: git release package-name: PubNub.unitypackage - location: https://github.com/pubnub/unity/releases/download/v9.0.1/PubNub.unitypackage + location: https://github.com/pubnub/unity/releases/download/v9.1.0/PubNub.unitypackage requires: - name: "UnityEditor" diff --git a/PubNubUnity/Assets/PubNub/Runtime/Util/UnityPNSDKSource.cs b/PubNubUnity/Assets/PubNub/Runtime/Util/UnityPNSDKSource.cs index d1409304..502de7b9 100644 --- a/PubNubUnity/Assets/PubNub/Runtime/Util/UnityPNSDKSource.cs +++ b/PubNubUnity/Assets/PubNub/Runtime/Util/UnityPNSDKSource.cs @@ -5,7 +5,7 @@ namespace PubnubApi.Unity { public class UnityPNSDKSource : IPNSDKSource { - private const string build = "9.0.1"; + private const string build = "9.1.0"; public string GetPNSDK() { #if(UNITY_IOS) diff --git a/PubNubUnity/Assets/PubNub/package.json b/PubNubUnity/Assets/PubNub/package.json index 349e790a..2c66cc7c 100644 --- a/PubNubUnity/Assets/PubNub/package.json +++ b/PubNubUnity/Assets/PubNub/package.json @@ -1,6 +1,6 @@ { "name": "com.pubnub.sdk", - "version": "9.0.1", + "version": "9.1.0", "displayName": "PubNub SDK", "description": "PubNub Real-time Cloud-Hosted Push API and Push Notification Client Frameworks", "unity": "2018.2", diff --git a/VERSION b/VERSION index 37ad5c8b..47da986f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.1 +9.1.0