Skip to content

Commit

Permalink
Merge pull request #1385 from alliance-genome/release/v0.28.0-rc2
Browse files Browse the repository at this point in the history
Release/v0.28.0 rc2
  • Loading branch information
oblodgett authored Jan 8, 2024
2 parents 8b5b27c + 467b38c commit 681368a
Show file tree
Hide file tree
Showing 31 changed files with 91 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ public SearchResponse<E> find(Integer page, Integer limit, HashMap<String, Objec
Pagination pagination = new Pagination(page, limit);
return service.findByParams(pagination, params);
}

public SearchResponse<E> findForPublic(Integer page, Integer limit, HashMap<String, Object> params) {
return find(page, limit, params);
}

public SearchResponse<E> search(Integer page, Integer limit, HashMap<String, Object> params) {
if (params == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ public interface BaseIdCrudInterface<E extends BaseEntity> {
@JsonView(View.FieldsAndLists.class)
public SearchResponse<E> find(@DefaultValue("0") @QueryParam("page") Integer page, @DefaultValue("10") @QueryParam("limit") Integer limit, @RequestBody HashMap<String, Object> params);

@POST
@Path("/findForPublic")
@Tag(name = "Public Web API Database Searching Endpoints")
@JsonView(View.ForPublic.class)
public SearchResponse<E> findForPublic(@DefaultValue("0") @QueryParam("page") Integer page, @DefaultValue("10") @QueryParam("limit") Integer limit, @RequestBody HashMap<String, Object> params);

@POST
@Path("/search")
@Tag(name = "Search Database Browsing Endpoints")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,36 +48,36 @@ public class AGMDiseaseAnnotation extends DiseaseAnnotation {
@Fetch(FetchMode.SELECT)
@org.hibernate.annotations.OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE)
@JoinColumn(foreignKey = @ForeignKey(name = "fk_agmdasubject"))
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private AffectedGenomicModel subject;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private Gene inferredGene;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private Allele inferredAllele;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@Fetch(FetchMode.SELECT)
@JoinTable(indexes = @Index(columnList = "agmdiseaseannotation_id"))
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
private List<Gene> assertedGenes;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private Allele assertedAllele;

@Transient
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
public class AffectedGenomicModel extends GenomicEntity {

@Column(columnDefinition = "TEXT")
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private String name;

@OneToMany(mappedBy = "subject", cascade = CascadeType.ALL, orphanRemoval = true)
Expand All @@ -43,6 +43,6 @@ public class AffectedGenomicModel extends GenomicEntity {
@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private VocabularyTerm subtype;
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public class Allele extends GenomicEntity {
@IndexedEmbedded(includePaths = { "displayText", "formatText", "nameType.name", "synonymScope.name", "evidence.curie", "displayText_keyword", "formatText_keyword", "nameType.name_keyword", "synonymScope.name_keyword", "evidence.curie_keyword"})
@OneToOne(mappedBy = "singleAllele", cascade = CascadeType.ALL, orphanRemoval=true)
@JsonManagedReference
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private AlleleSymbolSlotAnnotation alleleSymbol;

@IndexedEmbedded(includePaths = { "displayText", "formatText", "nameType.name", "synonymScope.name", "evidence.curie", "displayText_keyword", "formatText_keyword", "nameType.name_keyword", "synonymScope.name_keyword", "evidence.curie_keyword"})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,22 @@ public class AlleleDiseaseAnnotation extends DiseaseAnnotation {
@Fetch(FetchMode.SELECT)
@org.hibernate.annotations.OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE)
@JoinColumn(foreignKey = @ForeignKey(name = "fk_alleledasubject"))
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private Allele subject;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private Gene inferredGene;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@Fetch(FetchMode.SELECT)
@JoinTable(indexes = { @Index(columnList = "allelediseaseannotation_id"), @Index(columnList = "assertedgenes_curie")})
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
private List<Gene> assertedGenes;

@Transient
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,22 +87,22 @@ public class Annotation extends SingleReferenceAssociation {
@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
@JoinTable(indexes = { @Index(name = "annotation_conditionrelation_annotation_id_index", columnList = "annotation_id"), @Index(name = "annotation_conditionrelation_conditionrelations_id_index", columnList = "conditionrelations_id")})
private List<ConditionRelation> conditionRelations;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@OneToMany(cascade = CascadeType.ALL, orphanRemoval=true)
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
@JoinTable(indexes = { @Index(name = "annotation_note_annotation_id_index", columnList = "annotation_id"), @Index(name = "annotation_note_relatednotes_id_index",columnList = "relatednotes_id")})
private List<Note> relatedNotes;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
protected DataProvider dataProvider;

}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class BiologicalEntity extends CurieAuditedObject {
@IndexedEmbedded(includePaths = {"name", "curie", "name_keyword", "curie_keyword"})
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private NCBITaxonTerm taxon;

@IndexedEmbedded(includePaths = {"sourceOrganization.abbreviation", "sourceOrganization.fullName", "sourceOrganization.shortName", "crossReference.displayName", "crossReference.referencedCurie",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class ConditionRelation extends UniqueIdAuditedObject {
@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private VocabularyTerm conditionRelationType;

@FullTextField(analyzer = "autocompleteAnalyzer", searchAnalyzer = "autocompleteSearchAnalyzer")
Expand All @@ -60,7 +60,7 @@ public class ConditionRelation extends UniqueIdAuditedObject {
@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ConditionRelationView.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ConditionRelationView.class, View.ForPublic.class })
private List<ExperimentalCondition> conditions;

public void addExperimentCondition(ExperimentalCondition experimentalCondition) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public class CrossReference extends GeneratedAuditedObject {

@FullTextField(analyzer = "autocompleteAnalyzer", searchAnalyzer = "autocompleteSearchAnalyzer")
@KeywordField(name = "referencedCurie_keyword", aggregable = Aggregable.YES, sortable = Sortable.YES, searchable = Searchable.YES, normalizer = "sortNormalizer")
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
@EqualsAndHashCode.Include
private String referencedCurie;

Expand All @@ -55,7 +55,7 @@ public class CrossReference extends GeneratedAuditedObject {
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private ResourceDescriptorPage resourceDescriptorPage;

public String getPrefix() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,13 @@ public class DataProvider extends GeneratedAuditedObject {
@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@OneToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private Organization sourceOrganization;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@OneToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private CrossReference crossReference;

}
Original file line number Diff line number Diff line change
Expand Up @@ -67,25 +67,25 @@ public abstract class DiseaseAnnotation extends Annotation {
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private DOTerm object;

@FullTextField(analyzer = "autocompleteAnalyzer", searchAnalyzer = "autocompleteSearchAnalyzer", valueBridge = @ValueBridgeRef(type = BooleanValueBridge.class))
@KeywordField(name = "negated_keyword", aggregable = Aggregable.YES, sortable = Sortable.YES, searchable = Searchable.YES, valueBridge = @ValueBridgeRef(type = BooleanValueBridge.class))
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
@Column(columnDefinition = "boolean default false", nullable = false)
private Boolean negated = false;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private VocabularyTerm relation;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
@JoinTable(indexes = { @Index(columnList = "diseaseannotation_id"), @Index(columnList = "evidencecodes_curie")})
private List<ECOTerm> evidenceCodes;

Expand All @@ -94,47 +94,47 @@ public abstract class DiseaseAnnotation extends Annotation {
@ManyToMany
@Fetch(FetchMode.SELECT)
@JoinTable(indexes = { @Index(columnList = "diseaseannotation_id"), @Index(columnList = "with_curie") })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
private List<Gene> with;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private VocabularyTerm annotationType;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
@JoinTable(indexes = { @Index(columnList = "diseaseannotation_id"), @Index(columnList = "diseasequalifiers_id")})
private List<VocabularyTerm> diseaseQualifiers;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private VocabularyTerm geneticSex;

@IndexedEmbedded(includeDepth = 2)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private DataProvider secondaryDataProvider;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class })
@JsonView({ View.FieldsAndLists.class, View.DiseaseAnnotation.class, View.ForPublic.class })
@JoinTable(indexes = { @Index(columnList = "diseaseannotation_id"), @Index(columnList = "diseasegeneticmodifiers_curie")})
private List<BiologicalEntity> diseaseGeneticModifiers;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private VocabularyTerm diseaseGeneticModifierRelation;

@Transient
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class ExperimentalCondition extends UniqueIdAuditedObject {

@FullTextField(analyzer = "autocompleteAnalyzer", searchAnalyzer = "autocompleteSearchAnalyzer")
@KeywordField(name = "conditionSummary_keyword", aggregable = Aggregable.YES, sortable = Sortable.YES, searchable = Searchable.YES, normalizer = "sortNormalizer")
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private String conditionSummary;

@IndexedEmbedded(includeDepth = 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ public class Gene extends GenomicEntity {
@IndexedEmbedded(includePaths = { "displayText", "formatText", "nameType.name", "synonymScope.name", "evidence.curie", "displayText_keyword", "formatText_keyword", "nameType.name_keyword", "synonymScope.name_keyword", "evidence.curie_keyword"})
@OneToOne(mappedBy = "singleGene", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private GeneSymbolSlotAnnotation geneSymbol;

@IndexedEmbedded(includePaths = { "displayText", "formatText", "nameType.name", "synonymScope.name", "evidence.curie", "displayText_keyword", "formatText_keyword", "nameType.name_keyword", "synonymScope.name_keyword", "evidence.curie_keyword"})
@OneToOne(mappedBy = "singleGene", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private GeneFullNameSlotAnnotation geneFullName;

@IndexedEmbedded(includePaths = { "displayText", "formatText", "nameType.name", "synonymScope.name", "evidence.curie", "displayText_keyword", "formatText_keyword", "nameType.name_keyword", "synonymScope.name_keyword", "evidence.curie_keyword"})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public class GeneDiseaseAnnotation extends DiseaseAnnotation {
@ManyToOne
@org.hibernate.annotations.OnDelete(action = org.hibernate.annotations.OnDeleteAction.CASCADE)
@JoinColumn(foreignKey = @ForeignKey(name = "fk_genedasubject"))
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private Gene subject;

@IndexedEmbedded(includeDepth = 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class GenomicEntity extends BiologicalEntity {
@Index(columnList = "genomicentity_curie", name = "genomicentity_crossreference_genomicentity_curie_index"),
@Index(columnList = "crossreferences_id", name = "genomicentity_crossreference_crossreferences_id_index")
})
@JsonView({ View.FieldsAndLists.class })
@JsonView({ View.FieldsAndLists.class, View.ForPublic.class })
private List<CrossReference> crossReferences;

@IndexedEmbedded(includePaths = {"constructSubject.curie", "constructSubject.constructSymbol.displayText", "constructSubject.constructSymbol.formatText",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import org.alliancegenome.curation_api.model.entities.base.GeneratedAuditedObject;
import org.alliancegenome.curation_api.view.View;
import org.eclipse.microprofile.openapi.annotations.media.Schema;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.envers.Audited;
import org.hibernate.search.engine.backend.types.Aggregable;
import org.hibernate.search.engine.backend.types.Searchable;
Expand Down Expand Up @@ -47,14 +49,15 @@ public class Note extends GeneratedAuditedObject {

@FullTextField(analyzer = "autocompleteAnalyzer", searchAnalyzer = "autocompleteSearchAnalyzer", valueBridge = @ValueBridgeRef(type = FreeTextValueBridge.class))
@KeywordField(name = "freeText_keyword", aggregable = Aggregable.YES, sortable = Sortable.YES, searchable = Searchable.YES, normalizer = "sortNormalizer", valueBridge = @ValueBridgeRef(type = FreeTextValueBridge.class))
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
@Column(columnDefinition = "TEXT")
private String freeText;

@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToOne
@JsonView({ View.FieldsOnly.class })
@Fetch(FetchMode.SELECT)
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private VocabularyTerm noteType;

@IndexedEmbedded(includeDepth = 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public class Organization extends Agent {

@FullTextField(analyzer = "autocompleteAnalyzer", searchAnalyzer = "autocompleteSearchAnalyzer")
@KeywordField(name = "abbreviation_keyword", aggregable = Aggregable.YES, sortable = Sortable.YES, searchable = Searchable.YES, normalizer = "sortNormalizer")
@JsonView({ View.FieldsOnly.class, View.PersonSettingView.class })
@JsonView({ View.FieldsOnly.class, View.PersonSettingView.class, View.ForPublic.class })
@Column(unique = true)
private String abbreviation;

Expand All @@ -59,6 +59,6 @@ public class Organization extends Agent {
@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@OneToOne
@JsonView({ View.FieldsOnly.class })
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
private ResourceDescriptorPage homepageResourceDescriptorPage;
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public class Reference extends InformationContentEntity {
@IndexedEmbedded(includeDepth = 1)
@IndexingDependency(reindexOnUpdate = ReindexOnUpdate.SHALLOW)
@ManyToMany
@JsonView({View.FieldsOnly.class})
@JsonView({ View.FieldsOnly.class, View.ForPublic.class })
@JoinTable(indexes = {@Index(columnList = "Reference_curie"), @Index(columnList = "crossReferences_id")})
@EqualsAndHashCode.Include
private List<CrossReference> crossReferences;
Expand Down
Loading

0 comments on commit 681368a

Please sign in to comment.