Skip to content

Commit

Permalink
Merge pull request #74 from dasha3412/branch-addFeature
Browse files Browse the repository at this point in the history
Make Address optional
  • Loading branch information
riccoljy authored Oct 10, 2024
2 parents 146b66b + 3a8b0ed commit 26a9a27
Show file tree
Hide file tree
Showing 13 changed files with 76 additions and 59 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@ public AddCommand parse(String args) throws ParseException {
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG);

if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS)
if (!arePrefixesPresent(argMultimap, PREFIX_NAME)
|| !argMultimap.getPreamble().isEmpty()) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
}

argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS);
Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get());
Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).orElse(""));
Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).orElse(""));
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).orElse(""));
Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get());
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));

Person person = new Person(name, phone, email, address, tagList);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public EditCommand parse(String args) throws ParseException {
editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).orElse("")));
}
if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) {
editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()));
editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).orElse("")));
}
parseTagsForEdit(argMultimap.getAllValues(PREFIX_TAG)).ifPresent(editPersonDescriptor::setTags);

Expand Down
3 changes: 0 additions & 3 deletions src/main/java/seedu/address/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,6 @@ public static Phone parsePhone(String phone) throws ParseException {
public static Address parseAddress(String address) throws ParseException {
requireNonNull(address);
String trimmedAddress = address.trim();
if (!Address.isValidAddress(trimmedAddress)) {
throw new ParseException(Address.MESSAGE_CONSTRAINTS);
}
return new Address(trimmedAddress);
}

Expand Down
5 changes: 2 additions & 3 deletions src/main/java/seedu/address/model/person/Address.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ public class Address {
public static final String MESSAGE_CONSTRAINTS = "Addresses can take any values, and it should not be blank";

/*
* The first character of the address must not be a whitespace,
* otherwise " " (a blank string) becomes a valid input.
* Address is optional, so validation regex accepts blank address strings
*/
public static final String VALIDATION_REGEX = "[^\\s].*";
public static final String VALIDATION_REGEX = ".*";

public final String value;

Expand Down
3 changes: 0 additions & 3 deletions src/main/java/seedu/address/storage/JsonAdaptedPerson.java
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,6 @@ public Person toModelType() throws IllegalValueException {
if (address == null) {
throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName()));
}
if (!Address.isValidAddress(address)) {
throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS);
}
final Address modelAddress = new Address(address);

final Set<Tag> modelTags = new HashSet<>(personTags);
Expand Down
11 changes: 9 additions & 2 deletions src/test/java/seedu/address/logic/commands/CommandTestUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,22 @@ public class CommandTestUtil {

public static final String VALID_NAME_AMY = "Amy Bee";
public static final String VALID_NAME_BOB = "Bob Choo";
public static final String VALID_NAME_CLIVE = "Clive Fairfield";
public static final String VALID_NAME_DOMINIC = "Dominic Cheung";
public static final String VALID_NAME_ERIC = "Eric Caroll";
public static final String VALID_PHONE_AMY = "11111111";
public static final String VALID_PHONE_BOB = "22222222";
public static final String VALID_PHONE_CLIVE = "33333333";
public static final String VALID_PHONE_DOMINIC = "";
public static final String VALID_PHONE_ERIC = "65555656";
public static final String VALID_EMAIL_AMY = "[email protected]";
public static final String VALID_EMAIL_BOB = "[email protected]";
public static final String VALID_EMAIL_CLIVE = "[email protected]";
public static final String VALID_EMAIL_DOMINIC = "[email protected]";
public static final String VALID_EMAIL_ERIC = "";
public static final String VALID_ADDRESS_AMY = "Block 312, Amy Street 1";
public static final String VALID_ADDRESS_BOB = "Block 123, Bobby Street 3";
public static final String VALID_ADDRESS_BLANK = "";
public static final String VALID_ADDRESS_DOMINIC = "Block 9192, Dominican Street 4";
public static final String VALID_ADDRESS_ERIC = "Avenue 4, 201/1112";
public static final String VALID_TAG_HUSBAND = "husband";
Expand All @@ -48,14 +52,17 @@ public class CommandTestUtil {

public static final String NAME_DESC_AMY = " " + PREFIX_NAME + VALID_NAME_AMY;
public static final String NAME_DESC_BOB = " " + PREFIX_NAME + VALID_NAME_BOB;
public static final String NAME_DESC_CLIVE = " " + PREFIX_NAME + VALID_NAME_CLIVE;
public static final String NAME_DESC_DOMINIC = " " + PREFIX_NAME + VALID_NAME_DOMINIC;
public static final String NAME_DESC_ERIC = " " + PREFIX_NAME + VALID_NAME_ERIC;
public static final String PHONE_DESC_AMY = " " + PREFIX_PHONE + VALID_PHONE_AMY;
public static final String PHONE_DESC_BOB = " " + PREFIX_PHONE + VALID_PHONE_BOB;
public static final String PHONE_DESC_CLIVE = " " + PREFIX_PHONE + VALID_PHONE_CLIVE;
public static final String PHONE_DESC_DOMINIC = " " + PREFIX_PHONE + VALID_PHONE_DOMINIC;
public static final String PHONE_DESC_ERIC = " " + PREFIX_PHONE + VALID_PHONE_ERIC;
public static final String EMAIL_DESC_AMY = " " + PREFIX_EMAIL + VALID_EMAIL_AMY;
public static final String EMAIL_DESC_BOB = " " + PREFIX_EMAIL + VALID_EMAIL_BOB;
public static final String EMAIL_DESC_CLIVE = " " + PREFIX_EMAIL + VALID_EMAIL_CLIVE;
public static final String EMAIL_DESC_DOMINIC = " " + PREFIX_EMAIL + VALID_EMAIL_DOMINIC;
public static final String EMAIL_DESC_ERIC = " " + PREFIX_EMAIL + VALID_EMAIL_ERIC;
public static final String ADDRESS_DESC_AMY = " " + PREFIX_ADDRESS + VALID_ADDRESS_AMY;
Expand All @@ -64,15 +71,15 @@ public class CommandTestUtil {
public static final String ADDRESS_DESC_ERIC = " " + PREFIX_ADDRESS + VALID_ADDRESS_ERIC;
public static final String TAG_DESC_FRIEND = " " + PREFIX_TAG + VALID_TAG_FRIEND;
public static final String TAG_DESC_HUSBAND = " " + PREFIX_TAG + VALID_TAG_HUSBAND;
public static final String TAG_DESC_NEIGHBOR = " " + PREFIX_TAG + VALID_TAG_NEIGHBOR;

public static final String INVALID_NAME_DESC = " " + PREFIX_NAME + "James&"; // '&' not allowed in names
public static final String INVALID_PHONE_DESC = " " + PREFIX_PHONE + "911a"; // 'a' not allowed in phones
// phone numbers must be at least 2 digits
public static final String INVALID_PHONE_DESC_TOO_SHORT = " " + PREFIX_PHONE + "91";
public static final String INVALID_EMAIL_DESC = " " + PREFIX_EMAIL + "bob!yahoo"; // missing '@' symbol
public static final String INVALID_ADDRESS_DESC = " " + PREFIX_ADDRESS; // empty string not allowed for addresses
public static final String INVALID_TAG_DESC = " " + PREFIX_TAG + "hubby*"; // '*' not allowed in tags

public static final String BLANK_ADDRESS_DESC = " " + PREFIX_ADDRESS + VALID_ADDRESS_BLANK;
public static final String PREAMBLE_WHITESPACE = "\t \r \n";
public static final String PREAMBLE_NON_EMPTY = "NonEmptyPreamble";

Expand Down
50 changes: 31 additions & 19 deletions src/test/java/seedu/address/logic/parser/AddCommandParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,32 @@
import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_DOMINIC;
import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_ERIC;
import static seedu.address.logic.commands.CommandTestUtil.BLANK_ADDRESS_DESC;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_CLIVE;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_DOMINIC;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_ERIC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC_TOO_SHORT;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_TAG_DESC;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_CLIVE;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_DOMINIC;
import static seedu.address.logic.commands.CommandTestUtil.NAME_DESC_ERIC;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_CLIVE;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_DOMINIC;
import static seedu.address.logic.commands.CommandTestUtil.PHONE_DESC_ERIC;
import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_NON_EMPTY;
import static seedu.address.logic.commands.CommandTestUtil.PREAMBLE_WHITESPACE;
import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_FRIEND;
import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_HUSBAND;
import static seedu.address.logic.commands.CommandTestUtil.TAG_DESC_NEIGHBOR;
import static seedu.address.logic.commands.CommandTestUtil.VALID_ADDRESS_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_EMAIL_BOB;
import static seedu.address.logic.commands.CommandTestUtil.VALID_NAME_BOB;
Expand All @@ -41,14 +45,14 @@
import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;
import static seedu.address.testutil.TypicalPersons.AMY;
import static seedu.address.testutil.TypicalPersons.BOB;
import static seedu.address.testutil.TypicalPersons.CLIVE;
import static seedu.address.testutil.TypicalPersons.DOMINIC;
import static seedu.address.testutil.TypicalPersons.ERIC;

import org.junit.jupiter.api.Test;

import seedu.address.logic.Messages;
import seedu.address.logic.commands.AddCommand;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
Expand Down Expand Up @@ -120,10 +124,6 @@ public void parse_repeatedNonTagValue_failure() {
assertParseFailure(parser, INVALID_PHONE_DESC_TOO_SHORT + validExpectedPersonString,
Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));

// invalid address
assertParseFailure(parser, INVALID_ADDRESS_DESC + validExpectedPersonString,
Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));

// valid value followed by invalid value

// invalid name
Expand All @@ -137,10 +137,6 @@ public void parse_repeatedNonTagValue_failure() {
// invalid phone
assertParseFailure(parser, validExpectedPersonString + INVALID_PHONE_DESC,
Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));

// invalid address
assertParseFailure(parser, validExpectedPersonString + INVALID_ADDRESS_DESC,
Messages.getErrorMessageForDuplicatePrefixes(PREFIX_ADDRESS));
}

@Test
Expand All @@ -150,6 +146,16 @@ public void parse_optionalFieldsMissing_success() {
assertParseSuccess(parser, NAME_DESC_AMY + PHONE_DESC_AMY + EMAIL_DESC_AMY + ADDRESS_DESC_AMY,
new AddCommand(expectedPerson));

// no address
Person expectedPersonNoAddress = new PersonBuilder(CLIVE).build();
// address tag with blank address
assertParseSuccess(parser, NAME_DESC_CLIVE + PHONE_DESC_CLIVE + EMAIL_DESC_CLIVE + BLANK_ADDRESS_DESC
+ TAG_DESC_NEIGHBOR, new AddCommand(expectedPersonNoAddress));

// no address tag
assertParseSuccess(parser, NAME_DESC_CLIVE + PHONE_DESC_CLIVE + EMAIL_DESC_CLIVE + TAG_DESC_NEIGHBOR,
new AddCommand(expectedPersonNoAddress));

// blank phone number
Person expectedPersonBlankPhone = new PersonBuilder(DOMINIC).withTags().build();
assertParseSuccess(parser, NAME_DESC_DOMINIC + PHONE_DESC_DOMINIC + EMAIL_DESC_DOMINIC
Expand All @@ -158,6 +164,7 @@ public void parse_optionalFieldsMissing_success() {
// no phone number tag
assertParseSuccess(parser, NAME_DESC_DOMINIC + EMAIL_DESC_DOMINIC + ADDRESS_DESC_DOMINIC,
new AddCommand(expectedPersonBlankPhone));

// blank email address
Person expectedPersonBlankEmail = new PersonBuilder(ERIC).withTags().build();
assertParseSuccess(parser, NAME_DESC_ERIC + PHONE_DESC_ERIC + EMAIL_DESC_ERIC
Expand All @@ -176,10 +183,6 @@ public void parse_compulsoryFieldMissing_failure() {
assertParseFailure(parser, VALID_NAME_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB,
expectedMessage);

// missing address prefix
assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + VALID_ADDRESS_BOB,
expectedMessage);

// all prefixes missing
assertParseFailure(parser, VALID_NAME_BOB + VALID_PHONE_BOB + VALID_EMAIL_BOB + VALID_ADDRESS_BOB,
expectedMessage);
Expand All @@ -203,21 +206,30 @@ public void parse_invalidValue_failure() {
assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB
+ TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Email.MESSAGE_CONSTRAINTS);

// invalid address
assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC
+ TAG_DESC_HUSBAND + TAG_DESC_FRIEND, Address.MESSAGE_CONSTRAINTS);

// invalid tag
assertParseFailure(parser, NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB + ADDRESS_DESC_BOB
+ INVALID_TAG_DESC + VALID_TAG_FRIEND, Tag.MESSAGE_CONSTRAINTS);

// two invalid values, only first invalid value reported
assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + EMAIL_DESC_BOB + INVALID_ADDRESS_DESC,
assertParseFailure(parser, INVALID_NAME_DESC + PHONE_DESC_BOB + INVALID_EMAIL_DESC + ADDRESS_DESC_BOB,
Name.MESSAGE_CONSTRAINTS);

// non-empty preamble
assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_BOB + PHONE_DESC_BOB + EMAIL_DESC_BOB
+ ADDRESS_DESC_BOB + TAG_DESC_HUSBAND + TAG_DESC_FRIEND,
String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE));
}

@Test
public void parse_optionalValue_success() {
Person expectedPersonNoAddress = new PersonBuilder(CLIVE).build();

// address tag with blank address
assertParseSuccess(parser, NAME_DESC_CLIVE + PHONE_DESC_CLIVE + EMAIL_DESC_CLIVE + BLANK_ADDRESS_DESC
+ TAG_DESC_NEIGHBOR, new AddCommand(expectedPersonNoAddress));

// no address tag
assertParseSuccess(parser, NAME_DESC_CLIVE + PHONE_DESC_CLIVE + EMAIL_DESC_CLIVE + TAG_DESC_NEIGHBOR,
new AddCommand(expectedPersonNoAddress));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import static seedu.address.logic.commands.CommandTestUtil.ADDRESS_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_AMY;
import static seedu.address.logic.commands.CommandTestUtil.EMAIL_DESC_BOB;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_ADDRESS_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_EMAIL_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_NAME_DESC;
import static seedu.address.logic.commands.CommandTestUtil.INVALID_PHONE_DESC;
Expand Down Expand Up @@ -38,7 +37,6 @@
import seedu.address.logic.Messages;
import seedu.address.logic.commands.EditCommand;
import seedu.address.logic.commands.EditCommand.EditPersonDescriptor;
import seedu.address.model.person.Address;
import seedu.address.model.person.Email;
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
Expand Down Expand Up @@ -86,7 +84,6 @@ public void parse_invalidValue_failure() {
assertParseFailure(parser, "1" + INVALID_NAME_DESC, Name.MESSAGE_CONSTRAINTS); // invalid name
assertParseFailure(parser, "1" + INVALID_PHONE_DESC, Phone.MESSAGE_CONSTRAINTS); // invalid phone
assertParseFailure(parser, "1" + INVALID_EMAIL_DESC, Email.MESSAGE_CONSTRAINTS); // invalid email
assertParseFailure(parser, "1" + INVALID_ADDRESS_DESC, Address.MESSAGE_CONSTRAINTS); // invalid address
assertParseFailure(parser, "1" + INVALID_TAG_DESC, Tag.MESSAGE_CONSTRAINTS); // invalid tag

// invalid phone followed by valid email
Expand Down Expand Up @@ -179,7 +176,7 @@ public void parse_multipleRepeatedFields_failure() {

assertParseFailure(parser, userInput, Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE));

// mulltiple valid fields repeated
// multiple valid fields repeated
userInput = targetIndex.getOneBased() + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY
+ TAG_DESC_FRIEND + PHONE_DESC_AMY + ADDRESS_DESC_AMY + EMAIL_DESC_AMY + TAG_DESC_FRIEND
+ PHONE_DESC_BOB + ADDRESS_DESC_BOB + EMAIL_DESC_BOB + TAG_DESC_HUSBAND;
Expand All @@ -188,11 +185,11 @@ public void parse_multipleRepeatedFields_failure() {
Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));

// multiple invalid values
userInput = targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC
+ INVALID_PHONE_DESC + INVALID_ADDRESS_DESC + INVALID_EMAIL_DESC;
userInput = targetIndex.getOneBased() + INVALID_PHONE_DESC + INVALID_EMAIL_DESC
+ INVALID_PHONE_DESC + INVALID_EMAIL_DESC;

assertParseFailure(parser, userInput,
Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS));
Messages.getErrorMessageForDuplicatePrefixes(PREFIX_PHONE, PREFIX_EMAIL));
}

@Test
Expand Down
8 changes: 4 additions & 4 deletions src/test/java/seedu/address/logic/parser/ParserUtilTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
public class ParserUtilTest {
private static final String INVALID_NAME = "R@chel";
private static final String INVALID_PHONE = "+651234";
private static final String INVALID_ADDRESS = " ";
private static final String INVALID_EMAIL = "example.com";
private static final String INVALID_TAG = "#friend";

Expand All @@ -33,7 +32,7 @@ public class ParserUtilTest {
private static final String VALID_EMAIL = "[email protected]";
private static final String VALID_TAG_1 = "friend";
private static final String VALID_TAG_2 = "neighbour";

private static final String BLANK_ADDRESS = "";
private static final String WHITESPACE = " \t\r\n";

@Test
Expand Down Expand Up @@ -108,8 +107,9 @@ public void parseAddress_null_throwsNullPointerException() {
}

@Test
public void parseAddress_invalidValue_throwsParseException() {
assertThrows(ParseException.class, () -> ParserUtil.parseAddress(INVALID_ADDRESS));
public void parseAddress_blankValue_returnsBlankAddressTrimmed() throws Exception {
Address expectedAddress = new Address(BLANK_ADDRESS);
assertEquals(expectedAddress, ParserUtil.parseAddress(WHITESPACE));
}

@Test
Expand Down
Loading

0 comments on commit 26a9a27

Please sign in to comment.