Skip to content

Commit 1baa5f9

Browse files
committed
Merge pull request #1 from Azure/dev
Pull latest upstream changes.
2 parents d83c3bb + d961066 commit 1baa5f9

File tree

2,549 files changed

+50589
-23296
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,549 files changed

+50589
-23296
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ This repository contains a set of PowerShell cmdlets for developers and administ
5050

5151
For detail descriptions and examples of the cmdlets, type
5252
* ```help azure``` to get all the cmdlets.
53-
* ```help azurerm``` to get all the Azure Resource Manaber (ARM) cmdlets.
53+
* ```help azurerm``` to get all the Azure Resource Manager (ARM) cmdlets.
5454
* ```help <cmdlet name>``` to get the details of a specific cmdlet.
5555

5656
## Supported Environments
@@ -72,9 +72,9 @@ For detail descriptions and examples of the cmdlets, type
7272
You can also find the standalone installers for all the versions at [Downloads](https://github.com/Azure/azure-powershell/releases)
7373

7474
### PowerShell Gallery
75-
1. Install [Windows Management Framework 5 ot PowerShellGet cmdlets](https://www.powershellgallery.com/GettingStarted?section=Get%20Started)
75+
1. Install [Windows Management Framework 5 with PowerShellGet cmdlets](https://www.powershellgallery.com/GettingStarted?section=Get%20Started)
7676
2. In an elevated PowerShell session, run ```Install-Module AzureRM```
77-
3. run ```Install-AzureRm```
77+
3. Run ```Install-AzureRm```
7878
4. Top install RDFE cmdlets, run ```Install-Module Azure```
7979

8080
### Source Code

setup/azurecmdfiles.wxi

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2286,6 +2286,89 @@
22862286
<File Id="filBE0227C54B508F10C09F536EDD6BC540" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.Resources\System.Net.Http.Primitives.dll" />
22872287
</Component>
22882288
</Directory>
2289+
<Directory Id="dir14F62797AD72DE375C926D693DEB479C" Name="AzureRM.ServerManagement">
2290+
<Component Id="cmpF725005539C2C4CFDDDC204E3674DEAD" Guid="*">
2291+
<File Id="fil73381F22B6A918831220BB05A929BDF3" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\AzureRM.ServerManagement.psd1" />
2292+
</Component>
2293+
<Component Id="cmpEDC95F54977C13A99FA427539106CE35" Guid="*">
2294+
<File Id="fil645B0C3C416CEF7E45264B5FA4518812" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\AzureRM.Tags.psd1" />
2295+
</Component>
2296+
<Component Id="cmpFB7F0A3E01F1374D24620B3886953A33" Guid="*">
2297+
<File Id="fil01A2FDC1821E718DD4CD652EC5F5B053" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Hyak.Common.dll" />
2298+
</Component>
2299+
<Component Id="cmp592197EFD5C708253467ABD403F4A5DB" Guid="*">
2300+
<File Id="fil2089864CA50D503B148C6E88106094D6" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.ApplicationInsights.dll" />
2301+
</Component>
2302+
<Component Id="cmp817A8367CB097F66685088F17C76578F" Guid="*">
2303+
<File Id="fil160F9CC9E9429A0FED0E9B7B24F24202" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.Common.Authentication.dll" />
2304+
</Component>
2305+
<Component Id="cmp641A55172552752A0A19DDA524157054" Guid="*">
2306+
<File Id="filE2FCE5F3FB749C8925E10706B3AEFD74" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.ResourceManager.Common.dll" />
2307+
</Component>
2308+
<Component Id="cmp8EC8B3EAD2057B30B326C05F9D9C376D" Guid="*">
2309+
<File Id="filC46746B9CF56A68FB86F605FA6AA3918" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.ServerManagement.dll" />
2310+
</Component>
2311+
<Component Id="cmpDEC10E607D922A8AE8F14D4D43FD1AF5" Guid="*">
2312+
<File Id="fil5C2D6A3508ECBF9DFF05BEB19EA44A99" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.ServerManagement.dll-Help.xml" />
2313+
</Component>
2314+
<Component Id="cmpA09E0591EFE7AF2F3C3F3503D78A1751" Guid="*">
2315+
<File Id="fil3F9AA2E11CC130F0A5D12847711D3FBD" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.ServerManagement.Format.ps1xml" />
2316+
</Component>
2317+
<Component Id="cmp17C8392DAD4019C4F95CA7C6E1CE0860" Guid="*">
2318+
<File Id="fil6B62BEB317188AB3AAAB912F6AB6F0E2" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.Tags.dll" />
2319+
</Component>
2320+
<Component Id="cmpDA509BC0DD6F873D0B77B3CF4010F78C" Guid="*">
2321+
<File Id="fil497A8EA6B9E4C588AFD7E02DFF72FC57" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.Tags.dll-help.xml" />
2322+
</Component>
2323+
<Component Id="cmpE759C3E5C6722343927630513B99819A" Guid="*">
2324+
<File Id="fil583F3F61A481C820F3B63EAC766DADBF" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Commands.Tags.format.ps1xml" />
2325+
</Component>
2326+
<Component Id="cmp57ED324D8FA865BB9A2DE9C8EB9889BA" Guid="*">
2327+
<File Id="fil4446A57D4674DBA57620E2881D617424" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Common.dll" />
2328+
</Component>
2329+
<Component Id="cmp32DDA2B33740B316C60A5318E6C94F05" Guid="*">
2330+
<File Id="fil49DEA4867C8D8C39946C0127A5A53E25" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Common.NetFramework.dll" />
2331+
</Component>
2332+
<Component Id="cmpF7CF2EDADDB3C6A4D24A2D73463F60D8" Guid="*">
2333+
<File Id="filB195AB3151250DC5125D4A139BBE795E" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.Management.ServerManagement.dll" />
2334+
</Component>
2335+
<Component Id="cmpE228D1DBB5AAB5C0C37552258721AC65" Guid="*">
2336+
<File Id="fil36C816C1986E3A1950FC2E805D5A86BD" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Azure.ResourceManager.dll" />
2337+
</Component>
2338+
<Component Id="cmp1C4B26683FFB0DBE7A08A3D45F1BDA99" Guid="*">
2339+
<File Id="filD9436F7E5E9714450E065E6A83E64678" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.IdentityModel.Clients.ActiveDirectory.dll" />
2340+
</Component>
2341+
<Component Id="cmp02DD1EC816057E30612FD7DC15076387" Guid="*">
2342+
<File Id="filDC6C45C67A40D5BAE078D9B2C2A410A4" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Rest.ClientRuntime.Azure.Authentication.dll" />
2343+
</Component>
2344+
<Component Id="cmpD8BA9CABA7640D80C031E84CB655F0D3" Guid="*">
2345+
<File Id="fil4DAA80C2670DE99AF70E4C14DCB85C59" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Rest.ClientRuntime.Azure.dll" />
2346+
</Component>
2347+
<Component Id="cmp95413CC345F9BD796303ED5D77E057E3" Guid="*">
2348+
<File Id="fil5F60969C30A10B1F58610438579A2FE2" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Rest.ClientRuntime.dll" />
2349+
</Component>
2350+
<Component Id="cmp1ADE806D06163DB828DC8D1A514DF3B9" Guid="*">
2351+
<File Id="fil26D0E9B5EC76183152ADF0EFE26D42BF" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Threading.Tasks.dll" />
2352+
</Component>
2353+
<Component Id="cmpBB1E1E0FFD2110DD0C406E56705A577D" Guid="*">
2354+
<File Id="fil8CB6E327EB10A83AA3C02D0445D374F5" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Threading.Tasks.Extensions.Desktop.dll" />
2355+
</Component>
2356+
<Component Id="cmpC15C00B5D79892B6637B3136279C9145" Guid="*">
2357+
<File Id="fil013D0AEDCD6FE1A45E6D2EDE1EE3D90D" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.Threading.Tasks.Extensions.dll" />
2358+
</Component>
2359+
<Component Id="cmp5301D89C061F426377FC442040837761" Guid="*">
2360+
<File Id="filADA99CFEF4A777F77297B287244DB1FA" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Microsoft.WindowsAzure.Commands.Common.dll" />
2361+
</Component>
2362+
<Component Id="cmpC71298F3ADA1AEBD92C8E49A3E9FBCDE" Guid="*">
2363+
<File Id="fil748975CDEE7144B1BF98C239A41EDAC3" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\Newtonsoft.Json.dll" />
2364+
</Component>
2365+
<Component Id="cmpCB722985905F7FDE06F3BFBA79C3B296" Guid="*">
2366+
<File Id="fil3B5CADA4D90E21CF8865A1D8C99A22E5" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\System.Net.Http.Extensions.dll" />
2367+
</Component>
2368+
<Component Id="cmpEDFCEE40FFADD7B2D89FE968BF011310" Guid="*">
2369+
<File Id="fil1BA7DDCC9E306E41944084A1D4327887" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.ServerManagement\System.Net.Http.Primitives.dll" />
2370+
</Component>
2371+
</Directory>
22892372
<Directory Id="dirC63F4F2C0F6AE7B19B68616D946C4B21" Name="AzureRM.SiteRecovery">
22902373
<Component Id="cmpF9C7E5E1065CAC726499F6E0E92B2FBF" Guid="*">
22912374
<File Id="fil81232881981F6C69DCFBF96303CB1365" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\AzureRM.SiteRecovery\AzureRM.RecoveryServices.psd1" />
@@ -5804,6 +5887,33 @@
58045887
<ComponentRef Id="cmp3BB1527FA803EB75EB5EC78C281B3212" />
58055888
<ComponentRef Id="cmpA534986DA2E43D7E50E9A6E219478266" />
58065889
<ComponentRef Id="cmp6D34FB8F9A9678D4511D4BB8E0800104" />
5890+
<ComponentRef Id="cmpF725005539C2C4CFDDDC204E3674DEAD" />
5891+
<ComponentRef Id="cmpEDC95F54977C13A99FA427539106CE35" />
5892+
<ComponentRef Id="cmpFB7F0A3E01F1374D24620B3886953A33" />
5893+
<ComponentRef Id="cmp592197EFD5C708253467ABD403F4A5DB" />
5894+
<ComponentRef Id="cmp817A8367CB097F66685088F17C76578F" />
5895+
<ComponentRef Id="cmp641A55172552752A0A19DDA524157054" />
5896+
<ComponentRef Id="cmp8EC8B3EAD2057B30B326C05F9D9C376D" />
5897+
<ComponentRef Id="cmpDEC10E607D922A8AE8F14D4D43FD1AF5" />
5898+
<ComponentRef Id="cmpA09E0591EFE7AF2F3C3F3503D78A1751" />
5899+
<ComponentRef Id="cmp17C8392DAD4019C4F95CA7C6E1CE0860" />
5900+
<ComponentRef Id="cmpDA509BC0DD6F873D0B77B3CF4010F78C" />
5901+
<ComponentRef Id="cmpE759C3E5C6722343927630513B99819A" />
5902+
<ComponentRef Id="cmp57ED324D8FA865BB9A2DE9C8EB9889BA" />
5903+
<ComponentRef Id="cmp32DDA2B33740B316C60A5318E6C94F05" />
5904+
<ComponentRef Id="cmpF7CF2EDADDB3C6A4D24A2D73463F60D8" />
5905+
<ComponentRef Id="cmpE228D1DBB5AAB5C0C37552258721AC65" />
5906+
<ComponentRef Id="cmp1C4B26683FFB0DBE7A08A3D45F1BDA99" />
5907+
<ComponentRef Id="cmp02DD1EC816057E30612FD7DC15076387" />
5908+
<ComponentRef Id="cmpD8BA9CABA7640D80C031E84CB655F0D3" />
5909+
<ComponentRef Id="cmp95413CC345F9BD796303ED5D77E057E3" />
5910+
<ComponentRef Id="cmp1ADE806D06163DB828DC8D1A514DF3B9" />
5911+
<ComponentRef Id="cmpBB1E1E0FFD2110DD0C406E56705A577D" />
5912+
<ComponentRef Id="cmpC15C00B5D79892B6637B3136279C9145" />
5913+
<ComponentRef Id="cmp5301D89C061F426377FC442040837761" />
5914+
<ComponentRef Id="cmpC71298F3ADA1AEBD92C8E49A3E9FBCDE" />
5915+
<ComponentRef Id="cmpCB722985905F7FDE06F3BFBA79C3B296" />
5916+
<ComponentRef Id="cmpEDFCEE40FFADD7B2D89FE968BF011310" />
58075917
<ComponentRef Id="cmpF9C7E5E1065CAC726499F6E0E92B2FBF" />
58085918
<ComponentRef Id="cmpE1FBC775E0C4E8ECA1EB6C0F338FEDFA" />
58095919
<ComponentRef Id="cmp02DCD4998B3C2CF365F95C5A38848DB3" />

src/Common/Commands.Common.Authentication/Authentication/AccessTokenCredential.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ public AccessTokenCredential(Guid subscriptionId, IAccessToken token)
3131
this.token = token;
3232
this.TenantID = token.TenantId;
3333
}
34-
34+
3535
public override Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
3636
{
37-
token.AuthorizeRequest((tokenType, tokenValue) => {
37+
token.AuthorizeRequest((tokenType, tokenValue) =>
38+
{
3839
request.Headers.Authorization = new AuthenticationHeaderValue(tokenType, tokenValue);
3940
});
4041
return base.ProcessHttpRequestAsync(request, cancellationToken);

src/Common/Commands.Common.Authentication/Authentication/AdalConfiguration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class AdalConfiguration
2828
// These constants define the default values to use for AD authentication
2929
// against RDFE
3030
//
31-
public const string PowerShellClientId = "1950a258-227b-4e31-a9cf-717495945fc2";
31+
public const string PowerShellClientId = "1950a258-227b-4e31-a9cf-717495945fc2";
3232

3333
public static readonly Uri PowerShellRedirectUri = new Uri("urn:ietf:wg:oauth:2.0:oob");
3434

@@ -37,7 +37,7 @@ public class AdalConfiguration
3737
// login window. Also adding popup flag to handle overly large login windows.
3838
public const string EnableEbdMagicCookie = "site_id=501358&display=popup";
3939

40-
public string AdEndpoint { get;set; }
40+
public string AdEndpoint { get; set; }
4141

4242
public bool ValidateAuthority { get; set; }
4343

src/Common/Commands.Common.Authentication/Authentication/AdalTokenProvider.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,14 @@ public AdalTokenProvider()
3737
public AdalTokenProvider(IWin32Window parentWindow)
3838
{
3939
this.userTokenProvider = new UserTokenProvider(parentWindow);
40-
servicePrincipalTokenProvider = new ServicePrincipalTokenProvider();
40+
this.servicePrincipalTokenProvider = new ServicePrincipalTokenProvider();
4141
}
4242

43-
public IAccessToken GetAccessToken(AdalConfiguration config, ShowDialog promptBehavior, string userId, SecureString password,
43+
public IAccessToken GetAccessToken(
44+
AdalConfiguration config,
45+
ShowDialog promptBehavior,
46+
string userId,
47+
SecureString password,
4448
AzureAccount.AccountType credentialType)
4549
{
4650
switch (credentialType)
@@ -54,7 +58,11 @@ public IAccessToken GetAccessToken(AdalConfiguration config, ShowDialog promptBe
5458
}
5559
}
5660

57-
public IAccessToken GetAccessTokenWithCertificate(AdalConfiguration config, string clientId, string certificate, AzureAccount.AccountType credentialType)
61+
public IAccessToken GetAccessTokenWithCertificate(
62+
AdalConfiguration config,
63+
string clientId,
64+
string certificate,
65+
AzureAccount.AccountType credentialType)
5866
{
5967
switch (credentialType)
6068
{

src/Common/Commands.Common.Authentication/Authentication/CertificateApplicationCredentialProvider.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
using Microsoft.IdentityModel.Clients.ActiveDirectory;
1616
using Microsoft.Rest.Azure.Authentication;
17-
using System.Security;
1817
using System.Security.Cryptography.X509Certificates;
1918
using System.Threading.Tasks;
2019

@@ -35,7 +34,7 @@ public CertificateApplicationCredentialProvider(string certificateThumbprint)
3534
{
3635
this._certificateThumbprint = certificateThumbprint;
3736
}
38-
37+
3938
/// <summary>
4039
/// Authenticate using certificate thumbprint from the datastore
4140
/// </summary>
@@ -47,7 +46,7 @@ public async Task<AuthenticationResult> AuthenticateAsync(string clientId, strin
4746
{
4847
var task = new Task<X509Certificate2>(() =>
4948
{
50-
return AzureSession.DataStore.GetCertificate(this._certificateThumbprint);
49+
return AzureSession.DataStore.GetCertificate(this._certificateThumbprint);
5150
});
5251
task.Start();
5352
var certificate = await task.ConfigureAwait(false);

src/Common/Commands.Common.Authentication/Authentication/CredStore.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal static class CredStore
2626
internal enum CredentialType
2727
{
2828
Generic = 1,
29-
}
29+
}
3030

3131
internal static class NativeMethods
3232
{
@@ -69,7 +69,10 @@ internal extern static bool CredFree(
6969
IntPtr pCredential
7070
);
7171

72-
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1049:TypesThatOwnNativeResourcesShouldBeDisposable", Justification = "Wrapper for native struct")]
72+
[System.Diagnostics.CodeAnalysis.SuppressMessage(
73+
"Microsoft.Design",
74+
"CA1049:TypesThatOwnNativeResourcesShouldBeDisposable",
75+
Justification = "Wrapper for native struct")]
7376
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
7477
internal struct Credential
7578
{
@@ -108,7 +111,7 @@ public Credential(string userName, string key, string value)
108111
internal IntPtr attributes;
109112
internal string targetAlias;
110113
internal string userName;
111-
}
114+
}
112115
}
113116
}
114117
}

src/Common/Commands.Common.Authentication/Authentication/IAccessToken.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public interface IAccessToken
2525
string UserId { get; }
2626

2727
string TenantId { get; }
28-
28+
2929
LoginType LoginType { get; }
3030
}
3131
}

src/Common/Commands.Common.Authentication/Authentication/ITokenProvider.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ public interface ITokenProvider
3333
/// <param name="password">Secure strings with password/service principal key.</param>
3434
/// <param name="credentialType">Credential type.</param>
3535
/// <returns>An access token.</returns>
36-
IAccessToken GetAccessToken(AdalConfiguration config, ShowDialog promptBehavior, string userId,
37-
SecureString password, AzureAccount.AccountType credentialType);
36+
IAccessToken GetAccessToken(
37+
AdalConfiguration config,
38+
ShowDialog promptBehavior,
39+
string userId,
40+
SecureString password,
41+
AzureAccount.AccountType credentialType);
3842

3943
/// <summary>
4044
/// Get a new authentication token for the given environment
@@ -44,7 +48,10 @@ IAccessToken GetAccessToken(AdalConfiguration config, ShowDialog promptBehavior,
4448
/// <param name="certificateThumbprint">The certificate thumbprint for this user</param>
4549
/// <param name="credentialType">The account type</param>
4650
/// <returns>An access token, which can be renewed</returns>
47-
IAccessToken GetAccessTokenWithCertificate(AdalConfiguration config, string principalId, string certificateThumbprint,
51+
IAccessToken GetAccessTokenWithCertificate(
52+
AdalConfiguration config,
53+
string principalId,
54+
string certificateThumbprint,
4855
AzureAccount.AccountType credentialType);
4956
}
5057
}

0 commit comments

Comments
 (0)