Skip to content

Commit a4f5a93

Browse files
committed
Add XML comment
1 parent 7f40c74 commit a4f5a93

39 files changed

+141
-59
lines changed

Benchmarks/Benchmark.cs

+36-11
Original file line numberDiff line numberDiff line change
@@ -9,64 +9,89 @@
99

1010

1111
namespace Benchmark {
12+
13+
/// <summary>
14+
/// Contains benchmarks for the StringExtension methods.
15+
/// </summary>
1216
[MemoryDiagnoser(false)]
1317
public class StringExtensionBenchmark {
14-
private readonly string input = "hello world!";
15-
private readonly char[] charactersToRemove = {'l', 'o'};
16-
private readonly string oldValue = "world";
17-
private readonly string newValue = "everyone";
1818

19+
private readonly string input = "hello world!";
20+
private readonly char[] charactersToRemove = { 'l', 'o' };
1921
private readonly string substring = "l";
20-
2122
private readonly string phoneNumber = "555-555-5555";
2223
private readonly string email = "[email protected]";
2324

25+
/// <summary>
26+
/// Benchmark for the RemoveCharacters method.
27+
/// </summary>
2428
[Benchmark]
2529
public string RemoveCharacters() {
2630
return input.RemoveCharacters(charactersToRemove);
2731
}
2832

33+
/// <summary>
34+
/// Benchmark for the IsValidEmail method.
35+
/// </summary>
2936
[Benchmark]
3037
public bool IsValidEmail() {
3138
return email.IsValidEmail();
3239
}
3340

41+
/// <summary>
42+
/// Benchmark for the IsValidPhoneNumber method.
43+
/// </summary>
3444
[Benchmark]
3545
public bool IsValidPhoneNumber() {
36-
string phoneNumber = "555-555-5555";
3746
return phoneNumber.IsValidPhoneNumber();
3847
}
3948

49+
/// <summary>
50+
/// Benchmark for the CountSubstring method.
51+
/// </summary>
4052
[Benchmark]
4153
public int CountSubstring() {
4254
return input.CountSubstring(substring);
4355
}
4456

57+
/// <summary>
58+
/// Benchmark for the ReverseWords method.
59+
/// </summary>
4560
[Benchmark]
4661
public string ReverseWords() {
4762
return input.ReverseWords();
4863
}
4964

65+
/// <summary>
66+
/// Benchmark for the IsPalindrome method.
67+
/// </summary>
5068
[Benchmark]
5169
public bool IsPalindrome() {
52-
string palindrome = "racecar";
53-
return palindrome.IsPalindrome();
70+
return input.IsPalindrome();
5471
}
5572

73+
/// <summary>
74+
/// Benchmark for the CountLetters method.
75+
/// </summary>
5676
[Benchmark]
5777
public int CountLetters() {
5878
return input.CountLetters();
5979
}
6080

81+
/// <summary>
82+
/// Benchmark for the RemoveDuplicateCharacters method.
83+
/// </summary>
6184
[Benchmark]
6285
public string RemoveDuplicateCharacters() {
6386
return input.RemoveDuplicateCharacters();
6487
}
6588

89+
/// <summary>
90+
/// Benchmark for the ConvertToCamelCase method.
91+
/// </summary>
6692
[Benchmark]
6793
public string ConvertToCamelCase() {
68-
string text = "hello_world";
69-
return text.ToCamelCase();
94+
return input.ToCamelCase();
7095
}
7196
}
72-
}
97+
}

Benchmarks/bin/Debug/net7.0/BenchmarkDotNet.Artifacts/results/Benchmark.StringExtensionBenchmark-report-github.md

+11-11
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ Intel Core i7-9750H CPU 2.60GHz, 1 CPU, 12 logical and 6 physical cores
88
99
1010
```
11-
| Method | Mean | Error | StdDev | Allocated |
12-
|-------------------------- |----------:|---------:|----------:|----------:|
13-
| RemoveCharacters | 305.79 ns | 5.967 ns | 8.168 ns | 328 B |
14-
| IsValidEmail | 79.97 ns | 1.640 ns | 4.625 ns | - |
15-
| IsValidPhoneNumber | 170.67 ns | 3.396 ns | 5.083 ns | - |
16-
| CountSubstring | 64.06 ns | 0.470 ns | 0.417 ns | 40 B |
17-
| ReverseWords | 44.00 ns | 0.954 ns | 1.949 ns | 152 B |
18-
| IsPalindrome | 416.24 ns | 8.134 ns | 16.245 ns | 536 B |
19-
| CountLetters | 104.75 ns | 0.732 ns | 0.612 ns | 32 B |
20-
| RemoveDuplicateCharacters | 253.15 ns | 3.618 ns | 3.021 ns | 624 B |
21-
| ConvertToCamelCase | 45.49 ns | 0.214 ns | 0.167 ns | 48 B |
11+
| Method | Mean | Error | StdDev | Allocated |
12+
|-------------------------- |----------:|----------:|----------:|----------:|
13+
| RemoveCharacters | 368.67 ns | 7.008 ns | 17.058 ns | 328 B |
14+
| IsValidEmail | 96.72 ns | 2.697 ns | 7.868 ns | - |
15+
| IsValidPhoneNumber | 191.88 ns | 3.883 ns | 10.758 ns | - |
16+
| CountSubstring | 63.27 ns | 1.306 ns | 1.603 ns | 40 B |
17+
| ReverseWords | 46.03 ns | 0.977 ns | 1.432 ns | 152 B |
18+
| IsPalindrome | 648.51 ns | 12.651 ns | 19.319 ns | 648 B |
19+
| CountLetters | 123.07 ns | 2.478 ns | 6.396 ns | 32 B |
20+
| RemoveDuplicateCharacters | 326.46 ns | 6.632 ns | 19.555 ns | 624 B |
21+
| ConvertToCamelCase | 65.63 ns | 1.386 ns | 1.753 ns | 48 B |
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
Method;Job;AnalyzeLaunchVariance;EvaluateOverhead;MaxAbsoluteError;MaxRelativeError;MinInvokeCount;MinIterationTime;OutlierMode;Affinity;EnvironmentVariables;Jit;LargeAddressAware;Platform;PowerPlanMode;Runtime;AllowVeryLargeObjects;Concurrent;CpuGroups;Force;HeapAffinitizeMask;HeapCount;NoAffinitize;RetainVm;Server;Arguments;BuildConfiguration;Clock;EngineFactory;NuGetReferences;Toolchain;IsMutator;InvocationCount;IterationCount;IterationTime;LaunchCount;MaxIterationCount;MaxWarmupIterationCount;MemoryRandomization;MinIterationCount;MinWarmupIterationCount;RunStrategy;UnrollFactor;WarmupCount;Mean;Error;StdDev;Allocated
2-
RemoveCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;305.79 ns;5.967 ns;8.168 ns;328 B
3-
IsValidEmail;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;79.97 ns;1.640 ns;4.625 ns;0 B
4-
IsValidPhoneNumber;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;170.67 ns;3.396 ns;5.083 ns;0 B
5-
CountSubstring;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;64.06 ns;0.470 ns;0.417 ns;40 B
6-
ReverseWords;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;44.00 ns;0.954 ns;1.949 ns;152 B
7-
IsPalindrome;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;416.24 ns;8.134 ns;16.245 ns;536 B
8-
CountLetters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;104.75 ns;0.732 ns;0.612 ns;32 B
9-
RemoveDuplicateCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;253.15 ns;3.618 ns;3.021 ns;624 B
10-
ConvertToCamelCase;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;45.49 ns;0.214 ns;0.167 ns;48 B
2+
RemoveCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;368.67 ns;7.008 ns;17.058 ns;328 B
3+
IsValidEmail;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;96.72 ns;2.697 ns;7.868 ns;0 B
4+
IsValidPhoneNumber;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;191.88 ns;3.883 ns;10.758 ns;0 B
5+
CountSubstring;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;63.27 ns;1.306 ns;1.603 ns;40 B
6+
ReverseWords;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;46.03 ns;0.977 ns;1.432 ns;152 B
7+
IsPalindrome;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;648.51 ns;12.651 ns;19.319 ns;648 B
8+
CountLetters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;123.07 ns;2.478 ns;6.396 ns;32 B
9+
RemoveDuplicateCharacters;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;326.46 ns;6.632 ns;19.555 ns;624 B
10+
ConvertToCamelCase;DefaultJob;False;Default;Default;Default;Default;Default;Default;111111111111;Empty;RyuJit;Default;X64;8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c;.NET 7.0;False;True;False;True;Default;Default;False;False;False;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;Default;16;Default;65.63 ns;1.386 ns;1.753 ns;48 B

Benchmarks/bin/Debug/net7.0/BenchmarkDotNet.Artifacts/results/Benchmark.StringExtensionBenchmark-report.html

+10-10
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang='en'>
33
<head>
44
<meta charset='utf-8' />
5-
<title>Benchmark.StringExtensionBenchmark-20230816-155011</title>
5+
<title>Benchmark.StringExtensionBenchmark-20230820-043153</title>
66

77
<style type="text/css">
88
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -24,15 +24,15 @@
2424
<table>
2525
<thead><tr><th> Method</th><th>Mean</th><th>Error</th><th>StdDev</th><th>Allocated</th>
2626
</tr>
27-
</thead><tbody><tr><td>RemoveCharacters</td><td>305.79 ns</td><td>5.967 ns</td><td>8.168 ns</td><td>328 B</td>
28-
</tr><tr><td>IsValidEmail</td><td>79.97 ns</td><td>1.640 ns</td><td>4.625 ns</td><td>-</td>
29-
</tr><tr><td>IsValidPhoneNumber</td><td>170.67 ns</td><td>3.396 ns</td><td>5.083 ns</td><td>-</td>
30-
</tr><tr><td>CountSubstring</td><td>64.06 ns</td><td>0.470 ns</td><td>0.417 ns</td><td>40 B</td>
31-
</tr><tr><td>ReverseWords</td><td>44.00 ns</td><td>0.954 ns</td><td>1.949 ns</td><td>152 B</td>
32-
</tr><tr><td>IsPalindrome</td><td>416.24 ns</td><td>8.134 ns</td><td>16.245 ns</td><td>536 B</td>
33-
</tr><tr><td>CountLetters</td><td>104.75 ns</td><td>0.732 ns</td><td>0.612 ns</td><td>32 B</td>
34-
</tr><tr><td>RemoveDuplicateCharacters</td><td>253.15 ns</td><td>3.618 ns</td><td>3.021 ns</td><td>624 B</td>
35-
</tr><tr><td>ConvertToCamelCase</td><td>45.49 ns</td><td>0.214 ns</td><td>0.167 ns</td><td>48 B</td>
27+
</thead><tbody><tr><td>RemoveCharacters</td><td>368.67 ns</td><td>7.008 ns</td><td>17.058 ns</td><td>328 B</td>
28+
</tr><tr><td>IsValidEmail</td><td>96.72 ns</td><td>2.697 ns</td><td>7.868 ns</td><td>-</td>
29+
</tr><tr><td>IsValidPhoneNumber</td><td>191.88 ns</td><td>3.883 ns</td><td>10.758 ns</td><td>-</td>
30+
</tr><tr><td>CountSubstring</td><td>63.27 ns</td><td>1.306 ns</td><td>1.603 ns</td><td>40 B</td>
31+
</tr><tr><td>ReverseWords</td><td>46.03 ns</td><td>0.977 ns</td><td>1.432 ns</td><td>152 B</td>
32+
</tr><tr><td>IsPalindrome</td><td>648.51 ns</td><td>12.651 ns</td><td>19.319 ns</td><td>648 B</td>
33+
</tr><tr><td>CountLetters</td><td>123.07 ns</td><td>2.478 ns</td><td>6.396 ns</td><td>32 B</td>
34+
</tr><tr><td>RemoveDuplicateCharacters</td><td>326.46 ns</td><td>6.632 ns</td><td>19.555 ns</td><td>624 B</td>
35+
</tr><tr><td>ConvertToCamelCase</td><td>65.63 ns</td><td>1.386 ns</td><td>1.753 ns</td><td>48 B</td>
3636
</tr></tbody></table>
3737
</body>
3838
</html>
0 Bytes
Binary file not shown.
-80 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
4 Bytes
Binary file not shown.
-512 Bytes
Binary file not shown.
-24 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
0 Bytes
Binary file not shown.
-80 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.
-512 Bytes
Binary file not shown.
-24 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
Binary file not shown.

StringExtension/StringExtension.cs

+35-14
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
using System.Text;
22
using System.Text.RegularExpressions;
33

4-
54
namespace StringExtension {
5+
/// <summary>
6+
/// Provides extension methods for string manipulation.
7+
/// </summary>
68
public static partial class StringExtension {
9+
710
/// <summary>
8-
/// Represents a regular expression that can be used to validate a mail address.
11+
/// Represents a regular expression that can be used to validate an email address.
912
/// </summary>
10-
/// <returns>A regular expression that can be used to validate a mail address.</returns>
13+
/// <returns>A regular expression that can be used to validate an email address.</returns>
1114
[GeneratedRegex(@"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$")]
1215
private static partial Regex MailAddressRegex();
1316

@@ -18,13 +21,16 @@ public static partial class StringExtension {
1821
[GeneratedRegex(@"^(\+?\d{1,3}[\s-]?)?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{4}$")]
1922
private static partial Regex PhoneNumberRegex();
2023

21-
22-
// Removes specified characters from the given string
24+
/// <summary>
25+
/// Removes specified characters from the given string.
26+
/// </summary>
27+
/// <param name="input">The input string.</param>
28+
/// <param name="charactersToRemove">An array of characters to remove.</param>
29+
/// <returns>A new string with specified characters removed.</returns>
2330
public static string RemoveCharacters(this string input, char[] charactersToRemove) {
2431
return new string(input.Where(c => !charactersToRemove.Contains(c)).ToArray());
2532
}
2633

27-
2834
/// <summary>
2935
/// Validates the given email address.
3036
/// </summary>
@@ -34,7 +40,6 @@ public static bool IsValidEmail(this string email) {
3440
return !string.IsNullOrEmpty(email) && MailAddressRegex().IsMatch(email);
3541
}
3642

37-
3843
/// <summary>
3944
/// Validates the given phone number.
4045
/// </summary>
@@ -44,7 +49,12 @@ public static bool IsValidPhoneNumber(this string phoneNumber) {
4449
return !string.IsNullOrEmpty(phoneNumber) && PhoneNumberRegex().IsMatch(phoneNumber);
4550
}
4651

47-
// Counts the number of occurrences of a substring in the given string
52+
/// <summary>
53+
/// Counts the number of occurrences of a substring in the given string.
54+
/// </summary>
55+
/// <param name="input">The input string.</param>
56+
/// <param name="substring">The substring to count.</param>
57+
/// <returns>The number of occurrences of the substring in the input string.</returns>
4858
public static int CountSubstring(this string input, string substring) {
4959
if (string.IsNullOrEmpty(input) || string.IsNullOrEmpty(substring))
5060
{
@@ -83,7 +93,11 @@ public static string ReverseWords(this string input) {
8393
return builder.ToString();
8494
}
8595

86-
// Determines if the given string is a palindrome
96+
/// <summary>
97+
/// Determines if the given string is a palindrome.
98+
/// </summary>
99+
/// <param name="input">The input string.</param>
100+
/// <returns><c>true</c> if the string is a palindrome; otherwise, <c>false</c>.</returns>
87101
public static bool IsPalindrome(this string input) {
88102
// Remove all non-letter characters and convert to lowercase
89103
string cleanString = new string(input.Where(char.IsLetter).Select(char.ToLower).ToArray());
@@ -92,14 +106,21 @@ public static bool IsPalindrome(this string input) {
92106
return cleanString == new string(cleanString.Reverse().ToArray());
93107
}
94108

95-
96-
// Counts the number of letters in the given string
109+
/// <summary>
110+
/// Counts the number of letters in the given string.
111+
/// </summary>
112+
/// <param name="input">The input string.</param>
113+
/// <returns>The number of letters in the input string.</returns>
97114
public static int CountLetters(this string input) {
98115
// Remove all non-letter characters and count the length of the resulting string
99116
return input.Count(char.IsLetter);
100117
}
101118

102-
// Removes duplicate characters from the given string
119+
/// <summary>
120+
/// Removes duplicate characters from the given string.
121+
/// </summary>
122+
/// <param name="input">The input string.</param>
123+
/// <returns>A new string with duplicate characters removed.</returns>
103124
public static string RemoveDuplicateCharacters(this string input) {
104125
if (string.IsNullOrEmpty(input))
105126
{
@@ -116,7 +137,7 @@ public static string RemoveDuplicateCharacters(this string input) {
116137
/// <summary>
117138
/// Converts the given string to camel case.
118139
/// </summary>
119-
/// <param name="input">The input to transform.</param>
140+
/// <param name="input">The input string.</param>
120141
/// <returns>The input string converted to camel case.</returns>
121142
public static string ToCamelCase(this string input) {
122143
if (string.IsNullOrEmpty(input))
@@ -154,4 +175,4 @@ public static string ToCamelCase(this string input) {
154175
return new string(output[..outputIndex]);
155176
}
156177
}
157-
}
178+
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)