Piped delimited string to int

F

Fariba

Hello ,

I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol .for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Porblem is ,I am getting this permission mask from a checkboxlist and I have
stored all these numbers (like 0x00000002) in its value property. When use
selects multiple checkboxes I dynamically generate a pipe delimited string
and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set "Object
reference not set to an instance of an object".

if I just mention 0x10000000|0x00000002 in the method that's fine ,but it
seems I cannot dynamically generate it from the user's input.

Your help is much appreciate.

Bye
 
J

Jon Skeet [C# MVP]

Fariba said:
I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol .for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Yes, but that's the C# syntax - it's just doing a bitwise "or".
Porblem is ,I am getting this permission mask from a checkboxlist and I have
stored all these numbers (like 0x00000002) in its value property. When use
selects multiple checkboxes I dynamically generate a pipe delimited string
and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set "Object
reference not set to an instance of an object".

if I just mention 0x10000000|0x00000002 in the method that's fine ,but it
seems I cannot dynamically generate it from the user's input.

You'll need to convert each of the values to an int, and "or" those. I
suggest you do that at the checkbox selection part, storing just the
result of "or"-ing together each of the checked values.
 
N

Nick Hounsome

Fariba said:
Hello ,

I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol .for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Porblem is ,I am getting this permission mask from a checkboxlist and I
have stored all these numbers (like 0x00000002) in its value property.
When use selects multiple checkboxes I dynamically generate a pipe
delimited string and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set
"Object reference not set to an instance of an object".

if I just mention 0x10000000|0x00000002 in the method that's fine ,but it
seems I cannot dynamically generate it from the user's input.

Your help is much appreciate.

The right way to do this is to modity an int directly.

const int Flag1 = 0x100000000;
int flags;

// on check
flags |= Flag1;

// on uncheck
flags &= ~Flag1;


// better still

[Flags]
enum MyFlags
{
Flag1 = 0x1000000,
Flag2 = 0x1000001,
......
}

MyFlags flags;

// exact same code for check and uncheck then cast to int for the method
call (which should ideally be changed to use the enum anyway.

Note that if you use an enum with the FlagsAttribute then ToString() will
give you a string like "Flag1|Flag2" which makes debugging much easier.

Also - if you set the Tag property of the check box to the flag value then
you can do it without any ugly conditional code or loads of event handlers.
 
C

Charles Calvert

I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol .for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Porblem is ,I am getting this permission mask from a checkboxlist and I have
stored all these numbers (like 0x00000002) in its value property. When use
selects multiple checkboxes I dynamically generate a pipe delimited string
and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set "Object
reference not set to an instance of an object".

[snip rest]

You have fundametally misunderstood what it is that you are doing. You
are not "piping" the values in the sense that one would pipe output
from one program to the input of another in a command shell. You are
doing a mathematical operation, bitwise-or, on two or more numbers.

This is such a basic mistake that I suggest you stop what you are
doing, grab a book on C# written for beginning programmers and read
the first few chapters. Then read them again. A third time couldn't
hurt. You need to gain an understanding of the basics before trying
to write a useful program. I know it's not as much fun as diving
right in, but it will save you a lot of frustration and aggravation in
the long run.
 
F

Fariba

You'll need to convert each of the values to an int, and "or" those

I tried to convert "0x00040000" to either int32 or int ,but it seems because
of leading "0X" there is no way I can convert it. What I have to pass to
the method is something like this

0x00040000 | 0x01000000 | 0x00000400

I tried to remove 0x from the begining of the string (TextBox value) and it
works fine but int.parse(check_box_value) generates another number.

Thanks for your help
 
F

Fariba

Hello Nick,

I tried the enum way ,but "|=" does not seem to be working. It always return
Flag1 and never bitwaise other flags .Is it [Flags] or [FlagsAttribute]?

Thanks
Nick Hounsome said:
Fariba said:
Hello ,

I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol .for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Porblem is ,I am getting this permission mask from a checkboxlist and I
have stored all these numbers (like 0x00000002) in its value property.
When use selects multiple checkboxes I dynamically generate a pipe
delimited string and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set
"Object reference not set to an instance of an object".

if I just mention 0x10000000|0x00000002 in the method that's fine ,but it
seems I cannot dynamically generate it from the user's input.

Your help is much appreciate.

The right way to do this is to modity an int directly.

const int Flag1 = 0x100000000;
int flags;

// on check
flags |= Flag1;

// on uncheck
flags &= ~Flag1;


// better still

[Flags]
enum MyFlags
{
Flag1 = 0x1000000,
Flag2 = 0x1000001,
......
}

MyFlags flags;

// exact same code for check and uncheck then cast to int for the method
call (which should ideally be changed to use the enum anyway.

Note that if you use an enum with the FlagsAttribute then ToString() will
give you a string like "Flag1|Flag2" which makes debugging much easier.

Also - if you set the Tag property of the check box to the flag value then
you can do it without any ugly conditional code or loads of event
handlers.
 
J

Jon Skeet [C# MVP]

Fariba said:
I tried to convert "0x00040000" to either int32 or int ,but it seems because
of leading "0X" there is no way I can convert it. What I have to pass to
the method is something like this

0x00040000 | 0x01000000 | 0x00000400

Why? Why can't you change what's generating the string to start with?
I tried to remove 0x from the begining of the string (TextBox value) and it
works fine but int.parse(check_box_value) generates another number.

Could you post a short but complete program which demonstrates the
problem?

See http://www.pobox.com/~skeet/csharp/complete.html for details of
what I mean by that.
 
N

Nick Hounsome

Try playing around with things a bit. I did and I came up with the
following:

namespace FlagsTest
{
class Program
{
[Flags]
enum MyEnum :int
{
Flag1 = 0x01,
Flag2 = 0x02,
Flag3 = 0x10
}
static void Main(string[] args)
{
MyEnum e1 = MyEnum.Flag1 | MyEnum.Flag2;
Console.WriteLine(string.Format("e1={0}", e1));
e1 |= MyEnum.Flag3;
Console.WriteLine(string.Format("e1={0}",e1));
int i1 = (int)e1;
Console.WriteLine(string.Format("i1=0x{0:X}",i1));
string s1 = e1.ToString();
MyEnum e2 = (MyEnum)Enum.Parse(typeof(MyEnum), s1);
Console.WriteLine(string.Format("e2={0}", e2));
Console.ReadLine();
}
}
}

This gives:

e1=Flag1, Flag2
e1=Flag1, Flag2, Flag3
i1=0x13
e2=Flag1, Flag2, Flag3

I made a couple of errors in what I said before:
1) Clearly the flags are separated by commas rather than "|" in the string
format.
2) I used a stupid example where the flags were not disjoint and this causes
ToString() to revert to numeric format(which can still be written and parsed
but isn't so readable). NB You CAN use compound flags such as
Flag4=Flag1|Flag2 and it will use them in the string.

[Flags] and [FlagsAttribute] both refer to the FlagsAttribute class. It's
just a shorthand. Most people, including me, use the shorthand but on the
whole I think that it should never have been introduced.


Fariba said:
Hello Nick,

I tried the enum way ,but "|=" does not seem to be working. It always
return Flag1 and never bitwaise other flags .Is it [Flags] or
[FlagsAttribute]?

Thanks
Nick Hounsome said:
Fariba said:
Hello ,

I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol .for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Porblem is ,I am getting this permission mask from a checkboxlist and I
have stored all these numbers (like 0x00000002) in its value property.
When use selects multiple checkboxes I dynamically generate a pipe
delimited string and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set
"Object reference not set to an instance of an object".

if I just mention 0x10000000|0x00000002 in the method that's fine ,but
it seems I cannot dynamically generate it from the user's input.

Your help is much appreciate.

The right way to do this is to modity an int directly.

const int Flag1 = 0x100000000;
int flags;

// on check
flags |= Flag1;

// on uncheck
flags &= ~Flag1;


// better still

[Flags]
enum MyFlags
{
Flag1 = 0x1000000,
Flag2 = 0x1000001,
......
}

MyFlags flags;

// exact same code for check and uncheck then cast to int for the method
call (which should ideally be changed to use the enum anyway.

Note that if you use an enum with the FlagsAttribute then ToString() will
give you a string like "Flag1|Flag2" which makes debugging much easier.

Also - if you set the Tag property of the check box to the flag value
then you can do it without any ugly conditional code or loads of event
handlers.
 
G

Guest

Hello Jon,

Try this :

string var1="0x00040000";
int test=int.Parse(var1);

It throws an "object reference ....." exception.I even tried to use
int.Parse(var1,System.Globalization.NumberStyles.AllowHexSpecifier) but still
it does not work. I looked up the net ,lots of people having problem
converting string hexadecimal starting with 0X to its int counterpart. I
removed 0x from the beggining and I tried to parse "00040000" and just works
fine ,but int.Parse("00040000") generates another number which is not what I
am supposed to pass into the method.

Here is the method signature taken from MSDN:

AddRole Method

The AddRole method of the Users and Groups service adds a site group to the
current site collection.


Parameters

roleName A string that contains the name of the site group.
description A string that contains the description for the site group.
permissionMask A 32-bit integer in **0x00000000 format** that represents a
Microsoft.SharePoint.SPRights value and specifies permissions for the new
site group. Use the pipe symbol ("|") in C# or Or in Visual Basic .NET to
delimit values when creating a custom permission mask that combines
permissions.

Example

The following code example adds a new site group to the site with
permissions to both add and delete private Web Parts and to add list items.

[C#]Web_Reference_Folder_Name.UserGroup usrgrpService = new
Web_Reference_Folder_Name.UserGroup();
usrgrpService.Credentials= System.Net.CredentialCache.DefaultCredentials;

usrgrpService.AddRole("Group_Name", "Description", 0x10000000|0x00000002);



Thanks for your help
 
J

Jon Skeet [C# MVP]

Fariba said:
Hello Jon,

Try this :

string var1="0x00040000";
int test=int.Parse(var1);

That's not a short but complete program.

Please read http://www.pobox.com/~skeet/csharp/incomplete.html

Note that it also (when put into a short program without any extra
actual code) *doesn't* throw a NullReferenceException. It throws a
FormatException.

Parsing a hex number is a different problem to parsing a pipe-delimited
string. I had assumed from your first post that you'd worked out how to
parse a *single* hex number.
 
G

Guest

Hello Jon,

Here is what I want to accomplish. I have a checkboxList with permission
names as text and these hexadecimal numbers ("0x00040000",etc) as values. As
you know both of them (values and texts) are string. I would like iterate
through the checkboxlist selection and gather all values that user has
chosen. Because these values("0x00040000") are strings , I have to cast them
into int and then bitwise or them and call that method. Let's say user has
chosen "0x00040000" and "0x00010000". My question is:

1) How can I convert these two strings into int and still keep its
hexadecimal format.I have to have 0x at the beggining since method signature
requires me to do so

2) After I convert each value into int , I need to bitewise or them and send
something like 0x00010000 | 0x00040000. I guess I missled you by saying piped
delimited strings.As you mentioned in your fist post these are still int32
hexadecimal values which are bitwised (bitwise or'ed).

Thanks for your help and patience
 
G

Guest

Hello Nick
1) Clearly the flags are separated by commas rather than "|" in the string
format.

I cannot call the method using comma delimited strings, I have to call the
method with integral values which are bitwise or'ed.

here is the way I can call the method:

usrgrpService.AddRole("Group_Name", "Description", 0x10000000|0x00000002);

As you can see for the third paramtere ( 0x10000000|0x00000002), it is not
string and it is int32 hexadecimal format.

Thanks


Nick Hounsome said:
Try playing around with things a bit. I did and I came up with the
following:

namespace FlagsTest
{
class Program
{
[Flags]
enum MyEnum :int
{
Flag1 = 0x01,
Flag2 = 0x02,
Flag3 = 0x10
}
static void Main(string[] args)
{
MyEnum e1 = MyEnum.Flag1 | MyEnum.Flag2;
Console.WriteLine(string.Format("e1={0}", e1));
e1 |= MyEnum.Flag3;
Console.WriteLine(string.Format("e1={0}",e1));
int i1 = (int)e1;
Console.WriteLine(string.Format("i1=0x{0:X}",i1));
string s1 = e1.ToString();
MyEnum e2 = (MyEnum)Enum.Parse(typeof(MyEnum), s1);
Console.WriteLine(string.Format("e2={0}", e2));
Console.ReadLine();
}
}
}

This gives:

e1=Flag1, Flag2
e1=Flag1, Flag2, Flag3
i1=0x13
e2=Flag1, Flag2, Flag3

I made a couple of errors in what I said before:
1) Clearly the flags are separated by commas rather than "|" in the string
format.
2) I used a stupid example where the flags were not disjoint and this causes
ToString() to revert to numeric format(which can still be written and parsed
but isn't so readable). NB You CAN use compound flags such as
Flag4=Flag1|Flag2 and it will use them in the string.

[Flags] and [FlagsAttribute] both refer to the FlagsAttribute class. It's
just a shorthand. Most people, including me, use the shorthand but on the
whole I think that it should never have been introduced.


Fariba said:
Hello Nick,

I tried the enum way ,but "|=" does not seem to be working. It always
return Flag1 and never bitwaise other flags .Is it [Flags] or
[FlagsAttribute]?

Thanks
Nick Hounsome said:
Hello ,

I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol .for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Porblem is ,I am getting this permission mask from a checkboxlist and I
have stored all these numbers (like 0x00000002) in its value property.
When use selects multiple checkboxes I dynamically generate a pipe
delimited string and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set
"Object reference not set to an instance of an object".

if I just mention 0x10000000|0x00000002 in the method that's fine ,but
it seems I cannot dynamically generate it from the user's input.

Your help is much appreciate.

The right way to do this is to modity an int directly.

const int Flag1 = 0x100000000;
int flags;

// on check
flags |= Flag1;

// on uncheck
flags &= ~Flag1;


// better still

[Flags]
enum MyFlags
{
Flag1 = 0x1000000,
Flag2 = 0x1000001,
......
}

MyFlags flags;

// exact same code for check and uncheck then cast to int for the method
call (which should ideally be changed to use the enum anyway.

Note that if you use an enum with the FlagsAttribute then ToString() will
give you a string like "Flag1|Flag2" which makes debugging much easier.

Also - if you set the Tag property of the check box to the flag value
then you can do it without any ugly conditional code or loads of event
handlers.
 
J

Jon Skeet [C# MVP]

Fariba said:
Here is what I want to accomplish. I have a checkboxList with permission
names as text and these hexadecimal numbers ("0x00040000",etc) as values. As
you know both of them (values and texts) are string. I would like iterate
through the checkboxlist selection and gather all values that user has
chosen. Because these values("0x00040000") are strings , I have to cast them
into int and then bitwise or them and call that method. Let's say user has
chosen "0x00040000" and "0x00010000". My question is:

1) How can I convert these two strings into int and still keep its
hexadecimal format.I have to have 0x at the beggining since method signature
requires me to do so

Numbers themselves don't *have* a format. They're just numbers. It's
the same as with (say) a length - if I tell you your height in feet and
inches, it's the same height as if I tell you your height in
centimetres. It's just expressed in a different way.

Now, to convert from a hex string to an int, I'd use
Convert.ToInt32 (theString, 16);

(I don't know why NumberStyles.AllowHexSpecifier doesn't seem to work
when using int.Parse, but it doesn't seem to.)

To convert the number back to a hex representation (if you need to) use
the "x" format specifier, using a full format string if you need to:

int number = 256;
string hex = number.ToString("x"); // hex="100"
or
string hex = string.Format("0x{0:x}", number); // hex="0x100"
2) After I convert each value into int , I need to bitewise or them and send
something like 0x00010000 | 0x00040000. I guess I missled you by saying piped
delimited strings.As you mentioned in your fist post these are still int32
hexadecimal values which are bitwised (bitwise or'ed).

After you've converted them into integers, it's really easy:

int a = 5;
int b = 129;
int c = a | b; // c is now 5 | 129, ie 133
 
G

Guest

Jon ,

Thank you very much .I used Convert.ToInt32 (theString, 16); and bitwise
or'ed the results and pass the bitwise or'ed number to the method and it
worked just fine.I so appreciate your valuable time.

Fariba,
 
N

Nick Hounsome

Fariba said:
Hello Nick


I cannot call the method using comma delimited strings, I have to call the
method with integral values which are bitwise or'ed.

My program is not about strings unless you actually want to use them - the
enums will just be displayed as strings in the debugger which makes them
easier to maintain.

You can just pipe the enums together and cast the enum to int whenever you
need it as an int.
here is the way I can call the method:

usrgrpService.AddRole("Group_Name", "Description", 0x10000000|0x00000002);

As you can see for the third paramtere ( 0x10000000|0x00000002), it is not
string and it is int32 hexadecimal format.

Whether it is hex or not is irrelevant unless you have a particular
requirement to display it as hex.

[Flags]
enum Perms
{
Perm1 = 0x10000000,
Perm2 = 0x00000002
}

Perms all = Perms.Perm1 | Perms.Perm2;
int x = (int) all;

x will have exactly the same value as 0x10000000|0x00000002

No strings are needed.

You can populate the CheckedListBox using Enum.GetNames.

When you need to call AddRole you can get the values of all checked items
using Enum.Parse on the item, put them
together with |=, cast the result to int and call the method.
Thanks


Nick Hounsome said:
Try playing around with things a bit. I did and I came up with the
following:

namespace FlagsTest
{
class Program
{
[Flags]
enum MyEnum :int
{
Flag1 = 0x01,
Flag2 = 0x02,
Flag3 = 0x10
}
static void Main(string[] args)
{
MyEnum e1 = MyEnum.Flag1 | MyEnum.Flag2;
Console.WriteLine(string.Format("e1={0}", e1));
e1 |= MyEnum.Flag3;
Console.WriteLine(string.Format("e1={0}",e1));
int i1 = (int)e1;
Console.WriteLine(string.Format("i1=0x{0:X}",i1));
string s1 = e1.ToString();
MyEnum e2 = (MyEnum)Enum.Parse(typeof(MyEnum), s1);
Console.WriteLine(string.Format("e2={0}", e2));
Console.ReadLine();
}
}
}

This gives:

e1=Flag1, Flag2
e1=Flag1, Flag2, Flag3
i1=0x13
e2=Flag1, Flag2, Flag3

I made a couple of errors in what I said before:
1) Clearly the flags are separated by commas rather than "|" in the
string
format.
2) I used a stupid example where the flags were not disjoint and this
causes
ToString() to revert to numeric format(which can still be written and
parsed
but isn't so readable). NB You CAN use compound flags such as
Flag4=Flag1|Flag2 and it will use them in the string.

[Flags] and [FlagsAttribute] both refer to the FlagsAttribute class. It's
just a shorthand. Most people, including me, use the shorthand but on the
whole I think that it should never have been introduced.


Fariba said:
Hello Nick,

I tried the enum way ,but "|=" does not seem to be working. It always
return Flag1 and never bitwaise other flags .Is it [Flags] or
[FlagsAttribute]?

Thanks

Hello ,

I am trying to call a mthod with the following signature:

AddRole(string Group_Nam, string Description, int permissionmask);

Accroding to msdn ,you can mask the permissions using pipe symbol
.for
example you can use something like this

AddRole("My Group", "Test", 0x10000000|0x00000002);

Porblem is ,I am getting this permission mask from a checkboxlist and
I
have stored all these numbers (like 0x00000002) in its value
property.
When use selects multiple checkboxes I dynamically generate a pipe
delimited string and when I convert it to int (either using
int.Parse(my_pipe_delimited_string) or
Convert.Int32(my_pipe_delimited_string)) I get object reference set
"Object reference not set to an instance of an object".

if I just mention 0x10000000|0x00000002 in the method that's fine
,but
it seems I cannot dynamically generate it from the user's input.

Your help is much appreciate.

The right way to do this is to modity an int directly.

const int Flag1 = 0x100000000;
int flags;

// on check
flags |= Flag1;

// on uncheck
flags &= ~Flag1;


// better still

[Flags]
enum MyFlags
{
Flag1 = 0x1000000,
Flag2 = 0x1000001,
......
}

MyFlags flags;

// exact same code for check and uncheck then cast to int for the
method
call (which should ideally be changed to use the enum anyway.

Note that if you use an enum with the FlagsAttribute then ToString()
will
give you a string like "Flag1|Flag2" which makes debugging much
easier.

Also - if you set the Tag property of the check box to the flag value
then you can do it without any ugly conditional code or loads of event
handlers.
 
C

Charles Calvert

Here is what I want to accomplish. I have a checkboxList with permission
names as text and these hexadecimal numbers ("0x00040000",etc) as values. As
you know both of them (values and texts) are string.

This is a mistake. You should not be storing the numeric values as a
string. You should store them as a number and only convert them to
strings as necessary for display purposes. Stop trying to pound a
square peg into a round hole.
I would like iterate through the checkboxlist selection and gather
all values that user has chosen.

Great. Here's one way to skin that cat:

1. Create a struct that holds a string and an int. We'll call it
COptionPair. The string will be the name that appears in the
CheckedListBox and the int will be the numerical value (e.g.
0x000400000). Override the ToString() method to return your string
member.

using System;

namespace WindowsApplication9
{
/// <summary>
///
/// </summary>
public class COptionPair
{
private string m_strName;
private int m_iVal;

public COptionPair()
{
}

public COptionPair(string strName, int iVal)
{
this.Name = strName;
this.Value = iVal;
}

public string Name
{
get { return m_strName; }
set { m_strName = value; }
}

public int Value
{
get { return m_iVal; }
set { m_iVal = value; }
}

public override string ToString()
{
return Name;
}

}
}


2. Instantiate as many of these as you need and stuff them into an
ArrayList or another container that implements IList.

3. Set this as the DataSource of the CheckedListBox. Ignore the fact
that the docs don't mention the DataSource property. It's inherited
from Control and works properly.

4. Once the user checks off the desired items and clicks on the OK
button or whatever, do something like this:

private void m_btnGetValue_Click(object sender, System.EventArgs e)
{
COptionPair op = null;
int iVal = 0;

for (int i = 0; i < m_clbOptions.CheckedItems.Count; ++i)
{
op = (COptionPair) m_clbOptions.CheckedItems;
iVal |= op.Value;
}

// iVal now contains the bitwise OR'd value you need. You can
// stuff it into an internal variable, property, whatever to
// make it accessible where you need it.
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top