Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
tef
May 30, 2004

-> some l-system crap ->

Paolomania posted:

QED

If i'm being a dick it's because I am channeling dijkstra :-)

Adbot
ADBOT LOVES YOU

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

The "dickish-to-people" group of people has a larger than normal overlap with the "interested-in-programming" group of people.

tef
May 30, 2004

-> some l-system crap ->
welcome to something awful

DholmbladRU
May 4, 2006
Writing a "database" join function in java. It will take in two ~ delimited files and join them on common columns. I created this where it could join on one column, now I am trying to expand it to be able to join on multiple columns.

I am having trouble with the method that finds common columns and stores them. I created a class which has; value, locationA, locationB. However I am getting a null pointer.


code:
	public location[] getCommon() {
		int len;
		int count=1;
		int tmpLocSize=0;
		
		if(d1.length <= d2.length){
			len = d1.length;
			
			
		}else {

			len = d2.length;
		}
		for (int i=0; i<len; i++)
		{
			for (int j=0; j<len; j++)
			{
				if(d1[i].equals(d2[j]))	
				{
					tmpLocSize++;
					
				}
			}
		}
		
		location[] tmpLoc = new location[tmpLocSize];
		
		for (int i=0; i<len; i++)
		{
			for (int j=0; j<len; j++)
			{
				if(d1[i].equals(d2[j]))	
				{
					System.out.println(d1[i]);
					System.out.println(i);
					System.out.println(j);
					System.out.println(count);
					System.out.println(tmpLoc.length);
					System.out.println(d1[i]);
					
//null pointer is here
					tmpLoc[count].setValue(d1[i]);
					tmpLoc[count].setaLoc(i);
					tmpLoc[count].setbLoc(j);
					count++;
					
				}
			}
		}
		return tmpLoc;
	}
code:
public class location {

	String value;
	int aLoc;
	int bLoc;
	
	
	
	public location(String value, int aLoc, int bLoc) {
		super();
		this.value = value;
		this.aLoc = aLoc;
		this.bLoc = bLoc;
	}
	}}
Here is the console
code:
Plese type the name of the first text file including .txt and press enter
1.txt
Plese type the name of the second text file including .txt and press enter
2.txt
EMPID
0
0
1
2
EMPID
Exception in thread "main" java.lang.NullPointerException
	at compareDbase.getCommon(compareDbase.java:91)
	at compareDbase.main(compareDbase.java:198)

Sereri
Sep 30, 2008

awwwrigami

Just quickly looking over this I'd say it's because java arrays begin at 0 and your 'count' starts at 1. Go from there.

DholmbladRU
May 4, 2006

Sereri posted:

Just quickly looking over this I'd say it's because java arrays begin at 0 and your 'count' starts at 1. Go from there.

same problem is encountered when count is initialized to 0;

Malloc Voidstar
May 7, 2007

Fuck the cowboys. Unf. Fuck em hard.
location[] tmpLoc = new location[tmpLocSize];
//next use:
tmpLoc[count].setValue(d1[i]);


tmpLoc has nothing in it. (Rather, it's an array of null location objects of size tmpLocSize) You have to do tmpLoc[count] = new Location(value, aLoc, bLoc); first.

Also Location should be capitalized in its class name and constructor.

Das MicroKorg
Sep 18, 2005

Vintage Analog Synthesizer
Java newbie here!

I'm stuck on implementing a KeyListener. I have a JButton that I want to be triggered whenever the user presses the enter key. It should trigger the button's ActionEvent no matter where the focus is though, unless it is on a specific JTextArea in my GUI.

I've searched several tutorials, but I haven't managed to adapt them to my case. Can anyone help me with this?

Paolomania
Apr 26, 2006

You probably want to use key bindings. Key listeners are for trapping key presses on a single component.

TheFatController
Mar 6, 2003

Pretty new to Java and was wondering if anyone could advice on some 'best practice'.

While learning I've written a small servlet/package that sends xml to a web service and returns the response and since i'm just taking the xml and sticking it in the body of an http POST request I've dealt with the actual xml entirely as a String so far.

For :eng101: I want to store the request body as an xml object rather than a string and do a bit of manipulation on it and i'm having trouble from google on determining which is the most typical way of doing this as every example seems to use different parsers/readers etc. If anyone could give me a pointer on the 'best' or 'most common' way of parsing a String to xml then manipulating the values of particular attributes etc. that'd be appreciated.

(I'd also love it if there was something as straight forward as jQuery's xml manipulation for Java even if not typical).

Thanks

epswing
Nov 4, 2003

Soiled Meat

TheFatController posted:

For :eng101: I want to store the request body as an xml object

Grab jdom and jaxen, put them on the classpath, and go to town.

code:
Element root = new Element("root");
root.setText("here's some text");

Document doc = new Document(root);

XMLOutputter out = new XMLOutputter();
out.output(doc, System.out);
gets you
pre:
<root>here's some text</root>
(Completely untested)

epswing fucked around with this message at 03:45 on Apr 20, 2011

TaintedBalance
Dec 21, 2006

hope, n: desire accompanied by expectation of or belief in fulfilment

Been working my way slowly through the thread as I've recently been thrown face first into the world of Java. To get myself into it, when I'm not learning it at work, I'm programming an RPG at home (surprise!). I want to throw out the general flow I'm using so far and get some feedback on my overall design strategy, at least for creature entities right now.

I have a class Creature, looks like this (will implement a levelup and useAbility method later, still prototyping it out):
code:
public class Creature {
	Object obj1, obj2;
	protected int hitpoints;
	protected int strength;
	protected int defense;
	protected String profession = null;
	Profession myProfession = (Profession)obj1;
	protected String race = null;
	Race myRace = (Race)obj2;
	
	public Creature(Race r, Profession p)
	{
		hitpoints = 10;
		strength = 10;
		defense = 10;
		r.addRace(this);
		p.addProfession(this);		
	}
	
	
	public void printStatus()
	{
		System.out.println("Profession: " + profession);
		System.out.println("Strength: " + strength);
		System.out.println("Defense: " + defense);
		System.out.println("Hitpoints: " + hitpoints);
		System.out.println("Race: " + race);
	}

	
	public Race getRace() {		
		return this.getRace();
	}
	
	public Profession getProfession() {		
		return this.getProfession();
	}

}
Now, race and profession are both interfaces, and then I implement them for the various things that fall under them (Race: Human, Elf, Dwarf, blah blah. Profession: Fighter, Rogue, blah blah). Does this seem like a good practice/idea? Ultimately I did it because I didn't want to lock myself in with inheritance this early in the coding, and I wanted to avoid tight coupling for now. It seems like a lot less of a headache at the top end to be able to say "addRace" and not be bothered what the actual race is, since I know it will conform to what I have defined as a race. It also serves in my mind as a good basis for a template system if I ever want to add one in for something else later on.

I've been mulling over the has-a vs is-a relationship for the last couple days, so I'm sorry if the post meanders a bit. It just seems like a very pertinent thing to consider, especially in something like an RPG. I can see defining a creature both as "it has a race (human) and a profession (fighter)" or "it is a human (race) fighter (profession)".

God of Mischief
Oct 22, 2010

TaintedBalance posted:

Been working my way slowly through the thread as I've recently been thrown face first into the world of Java. To get myself into it, when I'm not learning it at work, I'm programming an RPG at home (surprise!). I want to throw out the general flow I'm using so far and get some feedback on my overall design strategy, at least for creature entities right now.

[snip]

I have a class Creature, looks like this (will implement a levelup and useAbility method later, still prototyping it out):
Now, race and profession are both interfaces, and then I implement them for the various things that fall under them (Race: Human, Elf, Dwarf, blah blah. Profession: Fighter, Rogue, blah blah). Does this seem like a good practice/idea? Ultimately I did it because I didn't want to lock myself in with inheritance this early in the coding, and I wanted to avoid tight coupling for now. It seems like a lot less of a headache at the top end to be able to say "addRace" and not be bothered what the actual race is, since I know it will conform to what I have defined as a race. It also serves in my mind as a good basis for a template system if I ever want to add one in for something else later on.

I've been mulling over the has-a vs is-a relationship for the last couple days, so I'm sorry if the post meanders a bit. It just seems like a very pertinent thing to consider, especially in something like an RPG. I can see defining a creature both as "it has a race (human) and a profession (fighter)" or "it is a human (race) fighter (profession)".

It sounds like interfaces would be a better option for this. This way you could implement multiple professions. If you went with inheritance (extending classes) you would have to work with HumanFighter, HumanPriest, HumanBlahBlah objects versus "is it a human? Is it a fighter? Yes to both? Average Attack Power go!"

epswing
Nov 4, 2003

Soiled Meat

TaintedBalance posted:

code:
public class Creature {
	Object obj1, obj2;
	Profession myProfession = (Profession)obj1;
	Race myRace = (Race)obj2;

Can you explain what you're trying to do here?

Malloc Voidstar
May 7, 2007

Fuck the cowboys. Unf. Fuck em hard.
something terrifying


Also, never assign class/instance variables to their default value. Numbers all default to 0, boolean defaults to false, and objects default to null.

Spraynard Kruger
May 8, 2007

Clearly it's still a work in progress, but overall I'm not sure "this" means what you think it means.

Red Lives
Nov 20, 2007

TaintedBalance posted:

code:
	public Race getRace() {		
		return this.getRace();
	}

It's a bit late in here but this has infinite loop written all over it.

Edit : that was kind of a jerk answer, but do you want your Creature class to instanciate what I'd call a creature type, ie a race/profession couple, or do you want it to instanciate an individual creature ? right now it looks like your class tries to be both at the same time but it looks a bit off.

Red Lives fucked around with this message at 22:07 on Apr 21, 2011

HFX
Nov 29, 2004

Red Lives posted:

It's a bit late in here but this has infinite loop written all over it.

Edit : that was kind of a jerk answer, but do you want your Creature class to instanciate what I'd call a creature type, ie a race/profession couple, or do you want it to instanciate an individual creature ? right now it looks like your class tries to be both at the same time but it looks a bit off.

If the is Java (and I am in the Java thread) I can guarantee it won't be an infinite loop. A stack overflow however...

baquerd
Jul 2, 2007

by FactsAreUseless

HFX posted:

If the is Java (and I am in the Java thread) I can guarantee it won't be an infinite loop. A stack overflow however...

Can anyone help me redirecting the stack to say... the swap partition? I want to recurse at a depth of several billion.

TaintedBalance
Dec 21, 2006

hope, n: desire accompanied by expectation of or belief in fulfilment

epswing posted:

Can you explain what you're trying to do here?

Playing with casting/objects and how you can call them/get at their methods and variables. Overall, the idea behind it was to keep a reference to what the class/profession are so that I can add a levelUp method to the Creature class that would be something like:

code:
public void levelUp (){

       myRace.checkLevel(this);
       myProf.checkLevel(this);

}
Where the checkLevel() methods would have some variables to add under w/e circumstances I came up with. Is there a better way to hold onto what it has in those categories?

Aleksei Vasiliev posted:

Also, never assign class/instance variables to their default value. Numbers all default to 0, boolean defaults to false, and objects default to null.

Done and done! Thanks for the advice.

Red Lives posted:

It's a bit late in here but this has infinite loop written all over it.

I should have left that out, I just threw in the whole code. That was part of me playing around with objects/methods and seeing how exactly I could use them. I am not attached to that code in anyway, just seeing how I get information back and how I can manipulate it.


"Spraynard Kruger" posted:

Clearly it's still a work in progress, but overall I'm not sure "this" means what you think it means.

My current understanding is that it is a reference to the object you are currently within. Is this incorrect?

And thanks God of Mischief, I took it a step further and made a Template interface that Race and Profession both extend so that if I get a wild hair to add another template type (is zombie a race, or a template? Thinking D&D 3rd ed here), I can easily add it in.

And thank you everyone for the replies, I'm getting a lot of practice and teaching in Java, but its informally structured and as such, there are some obvious gaps going on.

Spraynard Kruger
May 8, 2007

TaintedBalance posted:

My current understanding is that it is a reference to the object you are currently within. Is this incorrect?

That is correct, so that implies that your Race class has a method defined as addRace(Creature c). What would this do? Why would a Race use a Creature object to add... a Race?

Also the use of "this" in your stack overflow causing functions, as already pointed out.

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

I'm fairly new to Java and I'm tired, but this doesn't feel right to me. In Python I'd just used named groups to get what I need:

code:
class Main
{
	public static void main (String[] args) throws java.lang.Exception
	{
        String txt = "5 hours";
		Pattern p = Pattern.compile("((\\d+) day)*((\\d+) hour)*((\\d+) min)*((\\d+) sec)*");
        Matcher m = p.matcher(txt);
        
        int dayIndex = 2;
        int hourIndex = 4;
        int minuteIndex = 6;
        int secondIndex = 8;
        
        while (m.find()) {
            
            if (m.group(dayIndex) != null) {
                System.out.println(m.group(dayIndex));
            }
            
            if (m.group(hourIndex) != null) {
                System.out.println(m.group(hourIndex));
            }
            
            if (m.group(minuteIndex) != null) {
                System.out.println(m.group(minuteIndex));
            }
            
            if (m.group(secondIndex) != null) {
                System.out.println(m.group(secondIndex));
            }
        }        
	}
}
txt could be anything from "0 sec" to "6 days 3 hours 15 mins 5 secs".

What's the right way to do this?

edit: Or the meta-question is, "what's the best way to convert txt to total seconds?"

Thermopyle fucked around with this message at 00:24 on Apr 23, 2011

TaintedBalance
Dec 21, 2006

hope, n: desire accompanied by expectation of or belief in fulfilment

Spraynard Kruger posted:

That is correct, so that implies that your Race class has a method defined as addRace(Creature c). What would this do? Why would a Race use a Creature object to add... a Race?

Also the use of "this" in your stack overflow causing functions, as already pointed out.

Ah, that is likely a bad naming convention. I've converted all of the race/professions into a template interface so that anything can be applied, but, to be more specific, the addTemplate method adds the base values of the Template to the class.

code:
	public void addTemplate (Creature c){
		c.hitpoints = c.hitpoints + this.rHitpoints;
		c.strength = c.strength + this.rStrength;
		c.defense = c.defense + this.rDefense;
		c.race = this.rRace;
	}
Where rHitpoints is the Hitpoint value of a Race Template. It will eventually include abilities or w/e of the template. Would "addTemplateValues" or something to that effect make it much more clear, or am I completely missing your point on that front?

And as for the stack overflow issue, ya, after some sleep and looking at it again I hate myself for writing that. It has been completely culled.

Chairman Steve
Mar 9, 2007
Whiter than sour cream

Thermopyle posted:

edit: Or the meta-question is, "what's the best way to convert txt to total seconds?"

Would something like Joda-Time[1] fit your needs?

1. http://joda-time.sourceforge.net/

HFX
Nov 29, 2004

TaintedBalance posted:

Ah, that is likely a bad naming convention. I've converted all of the race/professions into a template interface so that anything can be applied, but, to be more specific, the addTemplate method adds the base values of the Template to the class.

code:
	public void addTemplate (Creature c){
		c.hitpoints = c.hitpoints + this.rHitpoints;
		c.strength = c.strength + this.rStrength;
		c.defense = c.defense + this.rDefense;
		c.race = this.rRace;
	}
Where rHitpoints is the Hitpoint value of a Race Template. It will eventually include abilities or w/e of the template. Would "addTemplateValues" or something to that effect make it much more clear, or am I completely missing your point on that front?

And as for the stack overflow issue, ya, after some sleep and looking at it again I hate myself for writing that. It has been completely culled.

Don't worry about. It was just some ribbing. Every programmer has done it at least once. Some of us more times then we care to admit too. If they ever get around adding tail recursive calls to the VM, then you can watch your stack overflows become infinite loops.

Jabor
Jul 16, 2010

#1 Loser at SpaceChem
It seems like you can only have one "template" in a particular category at a time. That being the case, I honestly don't think lumping them all together is actually a good idea. It smacks of over-engineering.

Both processor threads and pigeons can die, but that doesn't mean they need a common base class.

TaintedBalance
Dec 21, 2006

hope, n: desire accompanied by expectation of or belief in fulfilment

Jabor posted:

It seems like you can only have one "template" in a particular category at a time. That being the case, I honestly don't think lumping them all together is actually a good idea. It smacks of over-engineering.

Both processor threads and pigeons can die, but that doesn't mean they need a common base class.

You can have as many templates as you want. I've tested out giving something two classes for example, or two races. I'll think about making it smarter on that front though.

Malloc Voidstar
May 7, 2007

Fuck the cowboys. Unf. Fuck em hard.
Does anybody have an idea on how I can do better image recognition? I'm writing bots for Bejeweled games, so I need to be able to recognize the gems in a screenshot.

Right now I'm averaging the colors of the inside of the gems and using that to guess which gem is contained in that location. This is great for speed, but not so much for accuracy. It can't reliably recognize two gems of different shape but similar color, which leads to a bunch of issues. Including getting stuck forever unless I manually pause it and make some moves. The bot obviously still works, but improving this would make it work a lot better.

I just wrote a bot using Neuroph's image recognition, which kind of works. The upside is that it's pretty drat accurate. The downsides are that I need to collect and train it on a giant dataset, and it's really slow. As in "takes one second to recognize 64 gems" slow. If it was, say, an order of magnitude or more faster, I'd probably use this.
Anyone have any ideas?

Nippashish
Nov 2, 2005

Let me see you dance!

Aleksei Vasiliev posted:

I just wrote a bot using Neuroph's image recognition, which kind of works. The upside is that it's pretty drat accurate. The downsides are that I need to collect and train it on a giant dataset, and it's really slow. As in "takes one second to recognize 64 gems" slow. If it was, say, an order of magnitude or more faster, I'd probably use this.
Anyone have any ideas?

This method is pretty well known for face detection and is very fast (the wiki page is not too good but the first reference to the CVPR paper is what you want). This may be more general than you need though.

From your video it looks like you have a small finite set of things you need to recognize in known locations. Something simple like making a template for each gem type and computing the normalized cross correlation between each template and each gem location would probably work better than color averaging and is really easy.

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

Aleksei Vasiliev posted:

Does anybody have an idea on how I can do better image recognition? I'm writing bots for Bejeweled games, so I need to be able to recognize the gems in a screenshot.

Right now I'm averaging the colors of the inside of the gems and using that to guess which gem is contained in that location. This is great for speed, but not so much for accuracy. It can't reliably recognize two gems of different shape but similar color, which leads to a bunch of issues. Including getting stuck forever unless I manually pause it and make some moves. The bot obviously still works, but improving this would make it work a lot better.

I just wrote a bot using Neuroph's image recognition, which kind of works. The upside is that it's pretty drat accurate. The downsides are that I need to collect and train it on a giant dataset, and it's really slow. As in "takes one second to recognize 64 gems" slow. If it was, say, an order of magnitude or more faster, I'd probably use this.
Anyone have any ideas?

That sounds like a fun project!

I may try that myself...

ShardPhoenix
Jun 15, 2001

Pickle: Inspected.

Aleksei Vasiliev posted:

Does anybody have an idea on how I can do better image recognition? I'm writing bots for Bejeweled games, so I need to be able to recognize the gems in a screenshot.

Right now I'm averaging the colors of the inside of the gems and using that to guess which gem is contained in that location. This is great for speed, but not so much for accuracy. It can't reliably recognize two gems of different shape but similar color, which leads to a bunch of issues. Including getting stuck forever unless I manually pause it and make some moves. The bot obviously still works, but improving this would make it work a lot better.

I just wrote a bot using Neuroph's image recognition, which kind of works. The upside is that it's pretty drat accurate. The downsides are that I need to collect and train it on a giant dataset, and it's really slow. As in "takes one second to recognize 64 gems" slow. If it was, say, an order of magnitude or more faster, I'd probably use this.
Anyone have any ideas?
Since the only variation in the gem images is in the shinyness, maybe take a saved image of each type of gem and subtract it from the gem you're looking at (you should be at least able to find where the gems are on the screen). If the difference is sufficiently small, the gems match.

Jabor
Jul 16, 2010

#1 Loser at SpaceChem
I think part of the issue is you're looking at hue. Don't. It's irrelevant. Distinguishing shape is much faster and easier, and gives you all the information you need. Greyscale, threshold, perhaps some denoising, and then it's trivial for any image classification algorithm.

Eggnogium
Jun 1, 2010

Never give an inch! Hnnnghhhhhh!
I'm having trouble executing a terminal command from java in Ubuntu.

code:
try
{
    Process pr = rt.exec("./f2lp input.txt | ./gringo | ./claspD 0 > output.txt");
    pr.waitFor();
}
catch(Exception e)
{
   System.out.println("Error encountered trying to run ASP.");
   return;
}
I'm not getting any exceptions here, but output.txt is not being produced. However, if I copy paste the command into my terminal I do get output.txt.

I tried replacing the command with garbage ("BLAHHHH") and did get an exception. I also tried replacing it with "mkdir test" and it did create a new directory.

My guess is there's something getting messed up by the fact that I'm piping between processes. Any suggestions?

fletcher
Jun 27, 2003

ken park is my favorite movie

Cybernetic Crumb

Eggnogium posted:

My guess is there's something getting messed up by the fact that I'm piping between processes. Any suggestions?

Some googling led me to: http://www.velocityreviews.com/forums/t362758-facing-problem-while-using-pipe-in-runtime-exec.html

quote:

Redirection operators like pipes are a shell feature, but the command
passed to exec() isn't run in a command shell.

If you want shell features, run a shell:

String[] cmd = {
"/bin/sh",
"-c",
"dir | grep gpc | grep -v 25"
};

Process p = Runtime.getRuntime().exec(cmd);

For NT I believe you can do something similar using cmd /c.

covener
Jan 10, 2004

You know, for kids!

Eggnogium posted:

I'm having trouble executing a terminal command from java in Ubuntu.

[code]
Process pr = rt.exec("./f2lp input.txt | ./gringo | ./claspD 0 > output.txt");

you're not running a shell to parse the pipes or redirection, try one of the array-based Runtime#exec calls and e.g. {/bin/sh, -c, ./f21p, ... }.

ZeroConnection
Aug 8, 2008
I need help guys. :(
Currently I am doing some GUI java programming using netbeans , and i was wondering how to display the contents of a jcombobox based on a list from a text file that looks like :

a
b
c
d
e

baquerd
Jul 2, 2007

by FactsAreUseless

ZeroConnection posted:

I need help guys. :(
Currently I am doing some GUI java programming using netbeans , and i was wondering how to display the contents of a jcombobox based on a list from a text file that looks like :

First you read the file into a data structure like a Vector. Then you give the Vector to the JComboBox's constructor and add your JComboBox to a JFrame set to display at the right size.

Dub Step Dad
Dec 29, 2008
In my data structures class, we're learning about BST's, and I'm having a problem with a project.

code:
Object[] Stuff = new Object[1];
depth = 0;

...

public void addLevel(){
depth++;
Object[] temp = new Object[2^(depth + 1) - 1];
System.arraycopy(Stuff, 0, temp, 0, manyItems);
Stuff = temp;
}
Basically, when my tree fills up the first time, it adds another level to it just fine. However, the 2nd time it tries to add a level, for whatever reason my temp array has a size of 0. I looked at it in debug mode and it looks like for whatever reason my program thinks that 2^(depth+1)-1 = 0 when depth = 2, when it should clearly be 7. Is there something I'm doing wrong with my equation?

Nippashish
Nov 2, 2005

Let me see you dance!

Puppet Pal Claudius posted:

I looked at it in debug mode and it looks like for whatever reason my program thinks that 2^(depth+1)-1 = 0 when depth = 2, when it should clearly be 7. Is there something I'm doing wrong with my equation?

I don't think ^ does what you think it does. ^ is xor, not exponentiation.

Adbot
ADBOT LOVES YOU

Dub Step Dad
Dec 29, 2008

Nippashish posted:

I don't think ^ does what you think it does. ^ is xor, not exponentiation.

Oh god you're right. It completely slipped my mind that it's Math.pow(). Thanks!

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply