diff --git a/.gitignore b/.gitignore index aeb63f7323..7b448f6cb0 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,9 @@ core-java-io/target_link.txt core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF ethereum/logs/ jmeter/src/main/resources/*-JMeter.csv +jmeter/src/main/resources/*-Basic*.csv +jmeter/src/main/resources/*-JMeter*.csv + ninja/devDb.mv.db **/node_modules/ diff --git a/algorithms-modules/algorithms-sorting-2/README.md b/algorithms-modules/algorithms-sorting-2/README.md index b31cfceb42..f8a675ed8a 100644 --- a/algorithms-modules/algorithms-sorting-2/README.md +++ b/algorithms-modules/algorithms-sorting-2/README.md @@ -4,4 +4,5 @@ - [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers) - [Guide to In-Place Sorting Algorithm Works with a Java Implementation](https://www.baeldung.com/java-in-place-sorting) - [Partitioning and Sorting Arrays with Many Repeated Entries with Java Examples](https://www.baeldung.com/java-sorting-arrays-with-repeated-entries) +- [Gravity/Bead Sort in Java](https://www.baeldung.com/java-gravity-bead-sort) - More articles: [[<-- prev]](/algorithms-sorting) diff --git a/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/gravitysort/GravitySort.java b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/gravitysort/GravitySort.java new file mode 100644 index 0000000000..4d60dbbf25 --- /dev/null +++ b/algorithms-modules/algorithms-sorting-2/src/main/java/com/baeldung/algorithms/gravitysort/GravitySort.java @@ -0,0 +1,60 @@ +package com.baeldung.algorithms.gravitysort; + +public class GravitySort { + + public static int findMax(int[] A) { + int max = A[0]; + for (int i = 1; i< A.length; i++) { + if (A[i] > max) { + max = A[i]; + } + } + return max; + } + + public static boolean[][] setupAbacus(int[] A, int m) { + boolean[][] abacus = new boolean[A.length][m]; + for (int i = 0; i < abacus.length; i++) { + int number = A[i]; + for (int j = 0; j < abacus[0].length && j < number; j++) { + abacus[A.length - 1 - i][j] = true; + } + } + return abacus; + } + + public static void dropBeads(boolean[][] abacus, int[] A, int m) { + for (int i = 1; i < A.length; i++) { + for (int j = m - 1; j >= 0; j--) { + if (abacus[i][j] == true) { + int x = i; + while (x > 0 && abacus[x - 1][j] == false) { + boolean temp = abacus[x - 1][j]; + abacus[x - 1][j] = abacus[x][j]; + abacus[x][j] = temp; + x--; + } + } + } + } + } + + public static void transformToList(boolean[][] abacus, int[] A) { + int index = 0; + for (int i = abacus.length - 1; i >= 0; i--) { + int beads = 0; + for (int j = 0; j < abacus[0].length && abacus[i][j] == true; j++) { + beads++; + } + A[index++] = beads; + } + } + + public static void sort(int[] A) { + int m = findMax(A); + boolean[][] abacus = setupAbacus(A, m); + dropBeads(abacus, A, m); + // transform abacus into sorted list + transformToList(abacus, A); + } +} diff --git a/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/gravitysort/GravitySortUnitTest.java b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/gravitysort/GravitySortUnitTest.java new file mode 100644 index 0000000000..89fc1ed687 --- /dev/null +++ b/algorithms-modules/algorithms-sorting-2/src/test/java/com/baeldung/algorithms/gravitysort/GravitySortUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.algorithms.gravitysort; + +import org.junit.Assert; +import org.junit.Test; + +public class GravitySortUnitTest { + + @Test + public void givenIntegerArray_whenSortedWithGravitySort_thenGetSortedArray() { + int[] actual = { 9, 9, 100, 3, 57, 12, 3, 78, 0, 2, 2, 40, 21, 9 }; + int[] expected = { 0, 2, 2, 3, 3, 9, 9, 9, 12, 21, 40, 57, 78, 100 }; + GravitySort.sort(actual); + Assert.assertArrayEquals(expected, actual); + } +} diff --git a/aws-modules/aws-lambda/lambda/pom.xml b/aws-modules/aws-lambda/lambda/pom.xml index edf52d0581..16f1c29f2d 100644 --- a/aws-modules/aws-lambda/lambda/pom.xml +++ b/aws-modules/aws-lambda/lambda/pom.xml @@ -95,8 +95,8 @@ 1.1.1 - 1.3.0 - 1.2.0 + 3.11.0 + 1.2.1 2.8.2 diff --git a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java index 625da62efd..442e7ab4ef 100644 --- a/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java +++ b/aws-modules/aws-lambda/lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java @@ -1,12 +1,12 @@ package com.baeldung.lambda.dynamodb; -import com.amazonaws.regions.Region; +import java.util.HashMap; +import java.util.Map; + import com.amazonaws.regions.Regions; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; -import com.amazonaws.services.dynamodbv2.document.DynamoDB; -import com.amazonaws.services.dynamodbv2.document.Item; -import com.amazonaws.services.dynamodbv2.document.PutItemOutcome; -import com.amazonaws.services.dynamodbv2.document.spec.PutItemSpec; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; @@ -15,7 +15,7 @@ import com.baeldung.lambda.dynamodb.bean.PersonResponse; public class SavePersonHandler implements RequestHandler { - private DynamoDB dynamoDb; + private AmazonDynamoDB amazonDynamoDB; private String DYNAMODB_TABLE_NAME = "Person"; private Regions REGION = Regions.US_WEST_2; @@ -30,20 +30,22 @@ public class SavePersonHandler implements RequestHandler attributesMap = new HashMap<>(); + + attributesMap.put("id", new AttributeValue(String.valueOf(personRequest.getId()))); + attributesMap.put("firstName", new AttributeValue(personRequest.getFirstName())); + attributesMap.put("lastName", new AttributeValue(personRequest.getLastName())); + attributesMap.put("age", new AttributeValue(String.valueOf(personRequest.getAge()))); + attributesMap.put("address", new AttributeValue(personRequest.getAddress())); + + amazonDynamoDB.putItem(DYNAMODB_TABLE_NAME, attributesMap); } private void initDynamoDbClient() { - AmazonDynamoDBClient client = new AmazonDynamoDBClient(); - client.setRegion(Region.getRegion(REGION)); - this.dynamoDb = new DynamoDB(client); + this.amazonDynamoDB = AmazonDynamoDBClientBuilder.standard() + .withRegion(REGION) + .build(); } } diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml index 7a9cefb9d1..fbad5e30d0 100644 --- a/aws-modules/aws-reactive/pom.xml +++ b/aws-modules/aws-reactive/pom.xml @@ -91,7 +91,7 @@ 2.2.1.RELEASE - 2.10.27 + 2.17.283 \ No newline at end of file diff --git a/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java index 838ada1685..7793eeb079 100644 --- a/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java +++ b/aws-modules/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java @@ -3,17 +3,11 @@ */ package com.baeldung.aws.reactive.s3; -import java.io.InputStream; import java.nio.ByteBuffer; -import java.util.Map; import java.util.Map.Entry; -import java.util.concurrent.CompletableFuture; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; -import org.springframework.http.ResponseEntity.BodyBuilder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,11 +16,7 @@ import org.springframework.web.bind.annotation.RestController; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import software.amazon.awssdk.core.ResponseBytes; -import software.amazon.awssdk.core.SdkResponse; import software.amazon.awssdk.core.async.AsyncResponseTransformer; -import software.amazon.awssdk.core.async.SdkPublisher; -import software.amazon.awssdk.core.internal.async.ByteArrayAsyncResponseTransformer; import software.amazon.awssdk.http.SdkHttpResponse; import software.amazon.awssdk.services.s3.S3AsyncClient; import software.amazon.awssdk.services.s3.model.GetObjectRequest; @@ -40,38 +30,39 @@ import software.amazon.awssdk.services.s3.model.GetObjectResponse; @RequestMapping("/inbox") @Slf4j public class DownloadResource { - - + private final S3AsyncClient s3client; private final S3ClientConfigurarionProperties s3config; public DownloadResource(S3AsyncClient s3client, S3ClientConfigurarionProperties s3config) { this.s3client = s3client; - this.s3config = s3config; + this.s3config = s3config; } - - - @GetMapping(path="/{filekey}") - public Mono>> downloadFile(@PathVariable("filekey") String filekey) { - - GetObjectRequest request = GetObjectRequest.builder() - .bucket(s3config.getBucket()) - .key(filekey) - .build(); - - return Mono.fromFuture(s3client.getObject(request,new FluxResponseProvider())) - .map( (response) -> { - checkResult(response.sdkResponse); - String filename = getMetadataItem(response.sdkResponse,"filename",filekey); - log.info("[I65] filename={}, length={}",filename, response.sdkResponse.contentLength() ); - - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_TYPE, response.sdkResponse.contentType()) - .header(HttpHeaders.CONTENT_LENGTH, Long.toString(response.sdkResponse.contentLength())) - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"") - .body(response.flux); - }); + @GetMapping(path = "/{filekey}") + public Mono>> downloadFile(@PathVariable("filekey") String filekey) { + + GetObjectRequest request = GetObjectRequest.builder() + .bucket(s3config.getBucket()) + .key(filekey) + .build(); + + return Mono.fromFuture(s3client.getObject(request, AsyncResponseTransformer.toPublisher())) + .map(response -> { + checkResult(response.response()); + String filename = getMetadataItem(response.response(), "filename", filekey); + + log.info("[I65] filename={}, length={}", filename, response.response() + .contentLength()); + + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_TYPE, response.response() + .contentType()) + .header(HttpHeaders.CONTENT_LENGTH, Long.toString(response.response() + .contentLength())) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"") + .body(Flux.from(response)); + }); } /** @@ -82,63 +73,24 @@ public class DownloadResource { * @return */ private String getMetadataItem(GetObjectResponse sdkResponse, String key, String defaultValue) { - for( Entry entry : sdkResponse.metadata().entrySet()) { - if ( entry.getKey().equalsIgnoreCase(key)) { + for (Entry entry : sdkResponse.metadata() + .entrySet()) { + if (entry.getKey() + .equalsIgnoreCase(key)) { return entry.getValue(); } } return defaultValue; } - // Helper used to check return codes from an API call private static void checkResult(GetObjectResponse response) { SdkHttpResponse sdkResponse = response.sdkHttpResponse(); - if ( sdkResponse != null && sdkResponse.isSuccessful()) { + if (sdkResponse != null && sdkResponse.isSuccessful()) { return; } - + throw new DownloadFailedException(response); } - - - static class FluxResponseProvider implements AsyncResponseTransformer { - - private FluxResponse response; - - @Override - public CompletableFuture prepare() { - response = new FluxResponse(); - return response.cf; - } - - @Override - public void onResponse(GetObjectResponse sdkResponse) { - this.response.sdkResponse = sdkResponse; - } - - @Override - public void onStream(SdkPublisher publisher) { - response.flux = Flux.from(publisher); - response.cf.complete(response); - } - - @Override - public void exceptionOccurred(Throwable error) { - response.cf.completeExceptionally(error); - } - - } - - /** - * Holds the API response and stream - * @author Philippe - */ - static class FluxResponse { - - final CompletableFuture cf = new CompletableFuture<>(); - GetObjectResponse sdkResponse; - Flux flux; - } } diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml index 4d3ec4b6dd..72c5017c32 100644 --- a/aws-modules/pom.xml +++ b/aws-modules/pom.xml @@ -22,7 +22,7 @@ - 1.11.290 + 1.12.331 3.0.0 diff --git a/axon/README.md b/axon/README.md index 6d3ef4a503..40547a68b8 100644 --- a/axon/README.md +++ b/axon/README.md @@ -13,4 +13,4 @@ One script is included to easily start middleware using Docker: - [A Guide to the Axon Framework](https://www.baeldung.com/axon-cqrs-event-sourcing) - [Multi-Entity Aggregates in Axon](https://www.baeldung.com/java-axon-multi-entity-aggregates) - [Snapshotting Aggregates in Axon](https://www.baeldung.com/axon-snapshotting-aggregates) -- [Dispatching Queries in Axon Framework](https://www.baeldung.com/axon-query-dispatching/) +- [Dispatching Queries in Axon Framework](https://www.baeldung.com/axon-query-dispatching) diff --git a/baeldung-pmd-rules.xml b/baeldung-pmd-rules.xml index 8175e80e19..2e3bb12d2c 100644 --- a/baeldung-pmd-rules.xml +++ b/baeldung-pmd-rules.xml @@ -3,7 +3,10 @@ xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> Baeldung custom PMD rules - + Test does not follow Baeldung naming convention 3 diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayslicing/SlicingArrayUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayslicing/SlicingArrayUnitTest.java new file mode 100644 index 0000000000..b8ed21ed41 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayslicing/SlicingArrayUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.arrayslicing; + +import org.apache.commons.lang3.ArrayUtils; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class SlicingArrayUnitTest { + private static final String[] LANGUAGES = new String[] { "Python", "Java", "Kotlin", "Scala", "Ruby", "Go", "Rust" }; + private static final String[] JVM_LANGUAGES = new String[] { "Java", "Kotlin", "Scala" }; + + @Test + void givenAnArray_whenSlicingUsingStream_shouldGetExpectedResult() { + String[] result = Arrays.stream(LANGUAGES, 1, 4).toArray(String[]::new); + assertArrayEquals(JVM_LANGUAGES, result); + } + + @Test + void givenAnArray_whenSlicingUsingArraysCopyOfRange_shouldGetExpectedResult() { + String[] result = Arrays.copyOfRange(LANGUAGES, 1, 4); + assertArrayEquals(JVM_LANGUAGES, result); + } + + + @Test + void givenAnArray_whenSlicingUsingSystemArraycopy_shouldGetExpectedResult() { + String[] result = new String[3]; + System.arraycopy(LANGUAGES, 1, result, 0, 3); + assertArrayEquals(JVM_LANGUAGES, result); + + String[] result2 = new String[] { "value one", "value two", "value three", "value four", "value five", "value six", "value seven" }; + System.arraycopy(LANGUAGES, 1, result2, 2, 3); + assertArrayEquals(new String[] { "value one", "value two", "Java", "Kotlin", "Scala", "value six", "value seven" }, result2); + } + + @Test + void givenAnArray_whenSlicingUsingArrayUtils_shouldGetExpectedResult() { + String[] result = ArrayUtils.subarray(LANGUAGES, 1, 4); + assertArrayEquals(JVM_LANGUAGES, result); + } +} diff --git a/core-java-modules/core-java-arrays-operations-basic/README.md b/core-java-modules/core-java-arrays-operations-basic/README.md index ca81c23c98..2e1268e00c 100644 --- a/core-java-modules/core-java-arrays-operations-basic/README.md +++ b/core-java-modules/core-java-arrays-operations-basic/README.md @@ -10,3 +10,4 @@ This module contains articles about Java array fundamentals. They assume no prev - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) +- [Initializing a Boolean Array in Java](https://www.baeldung.com/java-initializing-boolean-array) diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index d8fbafcbe4..cdb457e342 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -10,3 +10,4 @@ - [Create an Empty Map in Java](https://www.baeldung.com/java-create-empty-map) - [Sorting Objects in a List by Date](https://www.baeldung.com/java-sort-list-by-date) - [Fixed Size Queue Implementations in Java](https://www.baeldung.com/java-fixed-size-queue) +- [Difference Between Java Enumeration and Iterator](https://www.baeldung.com/java-enumeration-vs-iterator) diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/DataUtil.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/DataUtil.java new file mode 100644 index 0000000000..5d03715b5b --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/DataUtil.java @@ -0,0 +1,18 @@ +package com.baeldung.enumerationiteratordifferences; + +import java.util.Arrays; +import java.util.List; + +public final class DataUtil { + + private DataUtil() { + } + + static List getPersons() { + Person person1 = new Person("amit", "kumar"); + Person person2 = new Person("yogi", "kuki"); + Person person3 = new Person("raj", "dosi"); + Person person4 = new Person("prakash", "kumar"); + return Arrays.asList(person1, person2, person3, person4); + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/EnumerationExample.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/EnumerationExample.java new file mode 100644 index 0000000000..87f068468a --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/EnumerationExample.java @@ -0,0 +1,19 @@ +package com.baeldung.enumerationiteratordifferences; + +import java.util.Enumeration; +import java.util.Vector; + +import static com.baeldung.enumerationiteratordifferences.DataUtil.getPersons; + +public class EnumerationExample { + public static void main(String[] args) { + + Vector people = new Vector<>(getPersons()); + Enumeration enumeration = people.elements(); + while (enumeration.hasMoreElements()) { + System.out.println("First Name = " + enumeration.nextElement() + .getFirstName()); + } + } + +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/IteratorExample.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/IteratorExample.java new file mode 100644 index 0000000000..6ee6af6f22 --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/IteratorExample.java @@ -0,0 +1,17 @@ +package com.baeldung.enumerationiteratordifferences; + +import java.util.Iterator; +import java.util.List; + +import static com.baeldung.enumerationiteratordifferences.DataUtil.getPersons; + +public class IteratorExample { + public static void main(String[] args) { + List persons = getPersons(); + Iterator iterator = persons.iterator(); + while (iterator.hasNext()) { + System.out.println("First Name = " + iterator.next() + .getFirstName()); + } + } +} diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/Person.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/Person.java new file mode 100644 index 0000000000..ff7fbbc50f --- /dev/null +++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/enumerationiteratordifferences/Person.java @@ -0,0 +1,27 @@ +package com.baeldung.enumerationiteratordifferences; + +public class Person { + private String firstName; + private String lastName; + + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/tostring/ListToStringUnitTest.java b/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/tostring/ListToStringUnitTest.java index 479ccaf92f..92e85099fe 100644 --- a/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/tostring/ListToStringUnitTest.java +++ b/core-java-modules/core-java-collections-list-4/src/test/java/com/baeldung/list/tostring/ListToStringUnitTest.java @@ -27,15 +27,13 @@ class ListToStringUnitTest { List arraysAsList = Arrays.asList("ONE", "TWO", "THREE"); StringJoiner stringJoiner = new StringJoiner(","); - arraysAsList.stream() - .forEach(v -> stringJoiner.add(v)); + arraysAsList.forEach(stringJoiner::add); String commaSeparatedString = stringJoiner.toString(); assertThat(commaSeparatedString).isEqualTo("ONE,TWO,THREE"); StringJoiner stringJoinerWithDelimiterPrefixSuffix = new StringJoiner(",", "[", "]"); - arraysAsList.stream() - .forEach(v -> stringJoinerWithDelimiterPrefixSuffix.add(v)); + arraysAsList.forEach(stringJoinerWithDelimiterPrefixSuffix::add); String commaSeparatedStringWithDelimiterPrefixSuffix = stringJoinerWithDelimiterPrefixSuffix.toString(); assertThat(commaSeparatedStringWithDelimiterPrefixSuffix).isEqualTo("[ONE,TWO,THREE]"); diff --git a/core-java-modules/core-java-collections-maps-2/pom.xml b/core-java-modules/core-java-collections-maps-2/pom.xml index 36b15c24d5..da51adac53 100644 --- a/core-java-modules/core-java-collections-maps-2/pom.xml +++ b/core-java-modules/core-java-collections-maps-2/pom.xml @@ -54,11 +54,11 @@ - 0.6.5 + 0.8.1 1.7.0 8.2.0 0.7.2 8.1.0 - \ No newline at end of file + diff --git a/core-java-modules/core-java-collections-maps-4/pom.xml b/core-java-modules/core-java-collections-maps-4/pom.xml index e5afd87bbe..a85e2cde2a 100644 --- a/core-java-modules/core-java-collections-maps-4/pom.xml +++ b/core-java-modules/core-java-collections-maps-4/pom.xml @@ -15,6 +15,11 @@ + + jakarta.ws.rs + jakarta.ws.rs-api + 3.1.0 + org.apache.commons commons-collections4 @@ -62,8 +67,8 @@ UTF-8 - 1.9 - 1.9 + 11 + 11 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/multivaluedmap/MultivaluedMapUnitTest.java b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/multivaluedmap/MultivaluedMapUnitTest.java new file mode 100644 index 0000000000..2790560b6b --- /dev/null +++ b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/multivaluedmap/MultivaluedMapUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.multivaluedmap; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +// Unit test for MultivaluedMap. +public class MultivaluedMapUnitTest { + + // Testing MultivaluedHashMap. + @Test + public void givenMultivaluedHashMap_whenEquals_thenTrue() { + jakarta.ws.rs.core.MultivaluedMap mulmap = new jakarta.ws.rs.core.MultivaluedHashMap<>(); + + // Mapping keys to values. + mulmap.addAll("first", 1, 2, 3); + mulmap.add(null, null); + + assertNotNull(mulmap, "The MultivaluedHashMap is null!"); + assertEquals(1, mulmap.getFirst("first"), "The key isn't mapped to the right values!"); + assertEquals(null, mulmap.getFirst(null), "MultivaluedHashMap didn't accept null!"); + } + + // Testing HashMap. + @Test + public void givenHashMap_whenEquals_thenTrue() { + Map map = new HashMap<>(); + + // Putting key-value pairs into our map. + map.put("first", 1); + map.put(null, 2); + map.put("third", null); + + assertNotNull(map, "The HashMap is null!"); + assertEquals(1, map.get("first"), "The key isn't mapped to the right value!"); + assertEquals(2, map.get(null), "HashMap didn't accept null as key!"); + assertEquals(null, map.get("third"), "HashMap didn't accept null value!"); + } +} diff --git a/core-java-modules/core-java-collections-set-2/README.md b/core-java-modules/core-java-collections-set-2/README.md new file mode 100644 index 0000000000..48c70084ca --- /dev/null +++ b/core-java-modules/core-java-collections-set-2/README.md @@ -0,0 +1,4 @@ +## Relevant articles + +- [Using Streams to Collect Into a TreeSet](https://www.baeldung.com/java-stream-collect-into-treeset) +- [A Guide to LinkedHashSet in Java](https://www.baeldung.com/java-linkedhashset) diff --git a/core-java-modules/core-java-collections-set-2/pom.xml b/core-java-modules/core-java-collections-set-2/pom.xml new file mode 100644 index 0000000000..5f4ab83eae --- /dev/null +++ b/core-java-modules/core-java-collections-set-2/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + core-java-collections-set-2 + 0.0.1-SNAPSHOT + core-java-collections-set-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + 8 + 8 + + + diff --git a/core-java-modules/core-java-collections-set-2/src/main/java/com/baeldung/treeset/collectintotreeset/Player.java b/core-java-modules/core-java-collections-set-2/src/main/java/com/baeldung/treeset/collectintotreeset/Player.java new file mode 100644 index 0000000000..f46ab2e7e3 --- /dev/null +++ b/core-java-modules/core-java-collections-set-2/src/main/java/com/baeldung/treeset/collectintotreeset/Player.java @@ -0,0 +1,36 @@ +package com.baeldung.treeset.collectintotreeset; + +public class Player implements Comparable { + private String name; + private int age; + private int numberOfPlayed; + private int numberOfWins; + + public Player(String name, int age, int numberOfPlayed, int numberOfWins) { + this.name = name; + this.age = age; + this.numberOfPlayed = numberOfPlayed; + this.numberOfWins = numberOfWins; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + public int getNumberOfPlayed() { + return numberOfPlayed; + } + + public int getNumberOfWins() { + return numberOfWins; + } + + @Override + public int compareTo(Player o) { + return Integer.compare(age, o.age); + } +} diff --git a/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/linkedhashset/LinkedHashSetUnitTest.java b/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/linkedhashset/LinkedHashSetUnitTest.java new file mode 100644 index 0000000000..44224c6cf9 --- /dev/null +++ b/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/linkedhashset/LinkedHashSetUnitTest.java @@ -0,0 +1,141 @@ +package com.baeldung.linkedhashset; + +import org.junit.jupiter.api.Test; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.Assert.*; + + +public class LinkedHashSetUnitTest{ + + + @Test + void whenCreatingLinkedHashSet_shouldBeEmpty(){ + Set linkedHashSet = new LinkedHashSet<>(); + assertTrue(linkedHashSet.isEmpty()); + } + + @Test + void whenCreatingLinkedHashSetWithInitialCapacity_shouldBeEmpty(){ + LinkedHashSet linkedHashSet = new LinkedHashSet<>(20); + assertTrue(linkedHashSet.isEmpty()); + } + + @Test + void whenCreatingLinkedHashSetWithExistingCollection_shouldContainAllElementOfCollection(){ + Collection data = Arrays.asList("first", "second", "third", "fourth", "fifth"); + LinkedHashSet linkedHashSet = new LinkedHashSet<>(data); + + assertFalse(linkedHashSet.isEmpty()); + assertEquals(data.size(), linkedHashSet.size()); + assertTrue(linkedHashSet.containsAll(data) && data.containsAll(linkedHashSet)); + } + + @Test + void whenCreatingLinkedHashSetWithInitialCapacityAndLoadFactor_shouldBeEmpty(){ + LinkedHashSet linkedHashSet = new LinkedHashSet<>(20, 3); + assertTrue(linkedHashSet.isEmpty()); + } + + @Test + void whenAddingElement_shouldAddElement(){ + Set linkedHashSet = new LinkedHashSet<>(); + assertTrue(linkedHashSet.add(0)); + assertFalse(linkedHashSet.add(0)); + assertTrue(linkedHashSet.contains(0)); + + } + + @Test + void whenAddingCollection_shouldAddAllContentOfCollection(){ + Collection data = Arrays.asList(1,2,3); + LinkedHashSet linkedHashSet = new LinkedHashSet<>(); + + assertTrue(linkedHashSet.addAll(data)); + assertTrue(data.containsAll(linkedHashSet) && linkedHashSet.containsAll(data)); + } + + @Test + void whenAddingCollectionWithDuplicateElements_shouldMaintainUniqueValuesInSet(){ + LinkedHashSet linkedHashSet = new LinkedHashSet<>(); + linkedHashSet.add(2); + Collection data = Arrays.asList(1, 1, 2, 3); + + assertTrue(linkedHashSet.addAll(data)); + assertEquals(3, linkedHashSet.size()); + assertTrue(data.containsAll(linkedHashSet) && linkedHashSet.containsAll(data)); + } + + @Test + void whenIteratingWithIterator_assertThatElementIsPresent(){ + LinkedHashSet linkedHashSet = new LinkedHashSet<>(); + linkedHashSet.add(0); + linkedHashSet.add(1); + linkedHashSet.add(2); + + Iterator iterator = linkedHashSet.iterator(); + for (int i = 0; i < linkedHashSet.size(); i++) { + int nextData = iterator.next(); + assertEquals(i, nextData); + } + } + + @Test + void whenIteratingWithSpliterator_assertThatElementIsPresent(){ + LinkedHashSet linkedHashSet = new LinkedHashSet<>(); + linkedHashSet.add(0); + linkedHashSet.add(1); + linkedHashSet.add(2); + + Spliterator spliterator = linkedHashSet.spliterator(); + AtomicInteger counter = new AtomicInteger(); + spliterator.forEachRemaining(data -> { + assertEquals(counter.get(), (int)data); + counter.getAndIncrement(); + }); + } + + @Test + void whenRemovingAnElement_shouldRemoveElement(){ + Collection data = Arrays.asList("first", "second", "third", "fourth", "fifth"); + LinkedHashSet linkedHashSet = new LinkedHashSet<>(data); + + assertTrue(linkedHashSet.remove("second")); + assertFalse(linkedHashSet.contains("second")); + } + + @Test + void whenRemovingAnElementGreaterThanTwo_shouldRemoveElement(){ + LinkedHashSet linkedHashSet = new LinkedHashSet<>(); + linkedHashSet.add(0); + linkedHashSet.add(1); + linkedHashSet.add(2); + linkedHashSet.add(3); + linkedHashSet.add(4); + + linkedHashSet.removeIf(data -> data > 2); + assertFalse(linkedHashSet.contains(3)); + assertFalse(linkedHashSet.contains(4)); + } + + @Test + void whenRemovingAnElementWithIterator_shouldRemoveElement(){ + LinkedHashSet linkedHashSet = new LinkedHashSet<>(); + linkedHashSet.add(0); + linkedHashSet.add(1); + linkedHashSet.add(2); + + Iterator iterator = linkedHashSet.iterator(); + int elementToRemove = 1; + assertTrue(linkedHashSet.contains(elementToRemove)); + while(iterator.hasNext()){ + if(elementToRemove == iterator.next()){ + iterator.remove(); + } + } + assertFalse(linkedHashSet.contains(elementToRemove)); + } + +} diff --git a/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/treeset/collectintotreeset/CollectIntoTreeSetUnitTest.java b/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/treeset/collectintotreeset/CollectIntoTreeSetUnitTest.java new file mode 100644 index 0000000000..403f39340c --- /dev/null +++ b/core-java-modules/core-java-collections-set-2/src/test/java/com/baeldung/treeset/collectintotreeset/CollectIntoTreeSetUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.treeset.collectintotreeset; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Comparator; +import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; + +public class CollectIntoTreeSetUnitTest { + Player kai = new Player("Kai", 26, 28, 7); + Player eric = new Player("Eric", 28, 30, 11); + Player saajan = new Player("Saajan", 30, 100, 66); + Player kevin = new Player("Kevin", 24, 50, 49); + + @Test + void givenAStream_whenCollectIntoTreeSetWithNaturalOrder_thenGetExpectedResult() { + String kotlin = "Kotlin"; + String java = "Java"; + String python = "Python"; + String ruby = "Ruby"; + TreeSet myTreeSet = Stream.of(ruby, java, kotlin, python) + .collect(Collectors.toCollection(TreeSet::new)); + assertThat(myTreeSet).containsExactly(java, kotlin, python, ruby); + } + + @Test + void givenAPlayerStream_whenCollectIntoTreeSet_thenGetExpectedResult() { + TreeSet myTreeSet = Stream.of(saajan, eric, kai, kevin) + .collect(Collectors.toCollection(TreeSet::new)); + assertThat(myTreeSet).containsExactly(kevin, kai, eric, saajan); + } + + @Test + void givenAPlayerStream_whenCollectIntoTreeSetWithNoOfWinsComparator_thenGetExpectedResult() { + TreeSet myTreeSet = Stream.of(saajan, eric, kai, kevin) + .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(Player::getNumberOfWins)))); + assertThat(myTreeSet).containsExactly(kai, eric, kevin, saajan); + } + + @Test + void givenAPlayerStream_whenCollectIntoTreeSetWithWinRateComparator_thenGetExpectedResult() { + TreeSet myTreeSet = Stream.of(saajan, eric, kai, kevin) + .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(player -> BigDecimal.valueOf(player.getNumberOfWins()) + .divide(BigDecimal.valueOf(player.getNumberOfPlayed()), 2, RoundingMode.HALF_UP))))); + assertThat(myTreeSet).containsExactly(kai, eric, saajan, kevin); + } +} diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithCompletableFuture.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithCompletableFuture.java new file mode 100644 index 0000000000..dc46ca997b --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithCompletableFuture.java @@ -0,0 +1,46 @@ +package com.baeldung.donerunnables; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RunnableCompletionCheckerWithCompletableFuture { + + private static final Logger LOGGER = LoggerFactory.getLogger(RunnableCompletionCheckerWithCompletableFuture.class); + private static final int NUMBER_OF_RUNNABLES = 5; + private static final int PAUSE_MILLIS = 1000; + + private static Runnable RUNNABLE = () -> { + try { + LOGGER.info("launching runnable"); + Thread.sleep(PAUSE_MILLIS); + } catch (InterruptedException e) { + } + }; + + public static void main(String args[]) throws InterruptedException { + List runnables = IntStream.range(0, NUMBER_OF_RUNNABLES) + .mapToObj(x -> RUNNABLE) + .collect(Collectors.toList()); + CompletableFuture[] completableFutures = runAsynchronousTasks(runnables); + LOGGER.info("Right after the creation of the completable future array, every completable future is done: {}", isEveryCompletableFutureDone(completableFutures)); + Thread.sleep((NUMBER_OF_RUNNABLES + 1) * PAUSE_MILLIS); + LOGGER.info("After {} seconds, every completable future is done: {}", NUMBER_OF_RUNNABLES + 1, isEveryCompletableFutureDone(completableFutures)); + } + + public static CompletableFuture[] runAsynchronousTasks(List runnables) { + return runnables.stream() + .map(CompletableFuture::runAsync) + .toArray(CompletableFuture[]::new); + } + + public static boolean isEveryCompletableFutureDone(CompletableFuture[] completableFutures) { + return CompletableFuture.allOf(completableFutures) + .isDone(); + } + +} diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithThreadPoolExecutor.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithThreadPoolExecutor.java new file mode 100644 index 0000000000..17a13a1c19 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/donerunnables/RunnableCompletionCheckerWithThreadPoolExecutor.java @@ -0,0 +1,51 @@ +package com.baeldung.donerunnables; + +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RunnableCompletionCheckerWithThreadPoolExecutor { + + private static final Logger LOGGER = LoggerFactory.getLogger(RunnableCompletionCheckerWithCompletableFuture.class); + private static final int NUMBER_OF_RUNNABLES = 5; + private static final int PAUSE_MILLIS = 1000; + private static final int NUMBER_OF_THREADS = 5; + + private static Runnable RUNNABLE = () -> { + try { + LOGGER.info("launching runnable"); + Thread.sleep(PAUSE_MILLIS); + } catch (InterruptedException e) { + } + }; + + public static void main(String args[]) throws InterruptedException { + List runnables = IntStream.range(0, NUMBER_OF_RUNNABLES) + .mapToObj(x -> RUNNABLE) + .collect(Collectors.toList()); + ThreadPoolExecutor executor = createThreadPoolExecutor(runnables); + executor.shutdown(); + LOGGER.info("After a timeout of 0 seconds, every Runnable is done: {}", isEveryRunnableDone(executor, 0)); + Thread.sleep(100); + LOGGER.info("After a timeout of 100 milliseconds, every Runnable is done: {}", isEveryRunnableDone(executor, 100)); + Thread.sleep(2000); + LOGGER.info("After a timeout of 2 seconds, every Runnable is done: {}", isEveryRunnableDone(executor, 1500)); + } + + public static ThreadPoolExecutor createThreadPoolExecutor(List runnables) { + ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(NUMBER_OF_THREADS); + runnables.forEach(executor::execute); + return executor; + } + + public static boolean isEveryRunnableDone(ThreadPoolExecutor executor, int timeout) throws InterruptedException { + return executor.awaitTermination(timeout, TimeUnit.MILLISECONDS); + } + +} diff --git a/core-java-modules/core-java-concurrency-advanced-4/README.md b/core-java-modules/core-java-concurrency-advanced-4/README.md index 376c5cc711..58c6efd933 100644 --- a/core-java-modules/core-java-concurrency-advanced-4/README.md +++ b/core-java-modules/core-java-concurrency-advanced-4/README.md @@ -9,3 +9,4 @@ - [Differences Between set() and lazySet() in Java Atomic Variables](https://www.baeldung.com/java-atomic-set-vs-lazyset) - [Volatile vs. Atomic Variables in Java](https://www.baeldung.com/java-volatile-vs-atomic) - [What Is “Locked Ownable Synchronizers” in Thread Dump?](https://www.baeldung.com/locked-ownable-synchronizers) +- [Understanding java.lang.Thread.State: WAITING (parking)](https://www.baeldung.com/java-lang-thread-state-waiting-parking) diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/threadparking/Application.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/threadparking/Application.java new file mode 100644 index 0000000000..3d2606b127 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/threadparking/Application.java @@ -0,0 +1,25 @@ +package com.baeldung.threadparking; + +import java.util.concurrent.locks.LockSupport; + +public class Application { + + public static void main(String[] args) throws InterruptedException { + final Object syncObj = new Object(); + Thread t = new Thread(() -> { + int acc = 0; + for (int i = 1; i <= 100; i++) { + acc += i; + } + System.out.println("Work finished"); + LockSupport.park(syncObj); + System.out.println(acc); + }); + t.setName("PARK-THREAD"); + t.start(); + +// Thread.sleep(1000); + LockSupport.unpark(t); + } + +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/MultipleThreadsExample.java similarity index 85% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java rename to core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/MultipleThreadsExample.java index 492466e0c3..4ca91c486f 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/MultipleThreadsExample.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.daemon; +package com.baeldung.concurrent.startathread; public class MultipleThreadsExample { public static void main(String[] args) { diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/NewThread.java similarity index 94% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/NewThread.java rename to core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/NewThread.java index 370ce99c09..2581fd7a83 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/NewThread.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/NewThread.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.daemon; +package com.baeldung.concurrent.startathread; public class NewThread extends Thread { public void run() { diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/SingleThreadExample.java similarity index 76% rename from core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java rename to core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/SingleThreadExample.java index 16d8b2be1e..96c30e1a0c 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/SingleThreadExample.java @@ -1,4 +1,4 @@ -package com.baeldung.concurrent.daemon; +package com.baeldung.concurrent.startathread; public class SingleThreadExample { public static void main(String[] args) { diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/TimerDemoExample.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/TimerDemoExample.java new file mode 100644 index 0000000000..ad59d451d4 --- /dev/null +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/startathread/TimerDemoExample.java @@ -0,0 +1,39 @@ +package com.baeldung.concurrent.startathread; + +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; + +public class TimerDemoExample { + + private void scheduleOnce() { + TimerTask task = new TimerTask() { + public void run() { + System.out.println("Task performed on: " + new Date() + "\n" + "Thread's name: " + Thread.currentThread() + .getName()); + } + }; + Timer timer = new Timer("Timer"); + long delay = 1000L; + timer.schedule(task, delay); + } + + private void scheduleRecurrently() { + TimerTask task = new TimerTask() { + public void run() { + System.out.println("Recurrent Task performed on: " + new Date() + "\n" + "Thread's name: " + Thread.currentThread() + .getName()); + } + }; + Timer timer = new Timer("Timer"); + long delay = 1000L; + final long period = 1000L; + timer.scheduleAtFixedRate(task, delay, period); + } + + public static void main(String[] args) { + TimerDemoExample timerDemoExample = new TimerDemoExample(); + timerDemoExample.scheduleOnce(); + timerDemoExample.scheduleRecurrently(); + } +} diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java index 533f4e111d..def4eba92d 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java @@ -2,38 +2,40 @@ package com.baeldung.concurrent.waitandnotify; public class Data { private String packet; - + // True if receiver should wait // False if sender should wait private boolean transfer = true; - + public synchronized String receive() { while (transfer) { try { wait(); } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - System.out.println("Thread Interrupted"); + Thread.currentThread() + .interrupt(); + System.err.println("Thread Interrupted"); } } transfer = true; - + String returnPacket = packet; notifyAll(); return returnPacket; } - + public synchronized void send(String packet) { while (!transfer) { - try { + try { wait(); } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - System.out.println("Thread Interrupted"); + Thread.currentThread() + .interrupt(); + System.err.println("Thread Interrupted"); } } transfer = false; - + this.packet = packet; notifyAll(); } diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java index d4fd1574c6..ab62397e0b 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java @@ -5,7 +5,7 @@ public class NetworkDriver { Data data = new Data(); Thread sender = new Thread(new Sender(data)); Thread receiver = new Thread(new Receiver(data)); - + sender.start(); receiver.start(); } diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java index 21ba822bfd..f17f1a2b75 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java @@ -4,24 +4,24 @@ import java.util.concurrent.ThreadLocalRandom; public class Receiver implements Runnable { private Data load; - + public Receiver(Data load) { this.load = load; } - + public void run() { - for(String receivedMessage = load.receive(); - !"End".equals(receivedMessage) ; - receivedMessage = load.receive()) { - + for (String receivedMessage = load.receive(); !"End".equals(receivedMessage); receivedMessage = load.receive()) { + System.out.println(receivedMessage); //Thread.sleep() to mimic heavy server-side processing try { - Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + Thread.sleep(ThreadLocalRandom.current() + .nextInt(1000, 5000)); } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - System.out.println("Thread Interrupted"); + Thread.currentThread() + .interrupt(); + System.err.println("Thread Interrupted"); } } } diff --git a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java index c365294cdd..95d52ef639 100644 --- a/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java +++ b/core-java-modules/core-java-concurrency-simple/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java @@ -4,29 +4,25 @@ import java.util.concurrent.ThreadLocalRandom; public class Sender implements Runnable { private Data data; - + public Sender(Data data) { this.data = data; } - + public void run() { - String packets[] = { - "First packet", - "Second packet", - "Third packet", - "Fourth packet", - "End" - }; - + String packets[] = { "First packet", "Second packet", "Third packet", "Fourth packet", "End" }; + for (String packet : packets) { data.send(packet); - + //Thread.sleep() to mimic heavy server-side processing try { - Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + Thread.sleep(ThreadLocalRandom.current() + .nextInt(1000, 5000)); } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - System.out.println("Thread Interrupted"); + Thread.currentThread() + .interrupt(); + System.err.println("Thread Interrupted"); } } } diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/threadjoin/ThreadJoinUnitTest.java similarity index 68% rename from core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java rename to core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/threadjoin/ThreadJoinUnitTest.java index dc30ce6c74..10d566de96 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/threadjoin/ThreadJoinUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.thread.join; +package com.baeldung.concurrent.threadjoin; import org.junit.Ignore; import org.junit.Test; @@ -21,49 +21,47 @@ public class ThreadJoinUnitTest { SampleThread(int processingCount) { this.processingCount = processingCount; - LOGGER.debug("Thread " + this.getName() + " created"); + LOGGER.info("Thread " + this.getName() + " created"); } @Override public void run() { - LOGGER.debug("Thread " + this.getName() + " started"); + LOGGER.info("Thread " + this.getName() + " started"); while (processingCount > 0) { try { Thread.sleep(1000); // Simulate some work being done by thread } catch (InterruptedException e) { - LOGGER.debug("Thread " + this.getName() + " interrupted."); + LOGGER.info("Thread " + this.getName() + " interrupted."); } processingCount--; - LOGGER.debug("Inside Thread " + this.getName() + ", processingCount = " + processingCount); + LOGGER.info("Inside Thread " + this.getName() + ", processingCount = " + processingCount); } - LOGGER.debug("Thread " + this.getName() + " exiting"); + LOGGER.info("Thread " + this.getName() + " exiting"); } } @Test public void givenNewThread_whenJoinCalled_returnsImmediately() throws InterruptedException { Thread t1 = new SampleThread(0); - LOGGER.debug("Invoking join."); + LOGGER.info("Invoking join"); t1.join(); - LOGGER.debug("Returned from join"); - LOGGER.debug("Thread state is" + t1.getState()); + LOGGER.info("Returned from join"); + LOGGER.info("Thread state is" + t1.getState()); assertFalse(t1.isAlive()); } @Test - public void givenStartedThread_whenJoinCalled_waitsTillCompletion() - throws InterruptedException { + public void givenStartedThread_whenJoinCalled_waitsTillCompletion() throws InterruptedException { Thread t2 = new SampleThread(1); t2.start(); - LOGGER.debug("Invoking join."); + LOGGER.info("Invoking join"); t2.join(); - LOGGER.debug("Returned from join"); + LOGGER.info("Returned from join"); assertFalse(t2.isAlive()); } @Test - public void givenStartedThread_whenTimedJoinCalled_waitsUntilTimedout() - throws InterruptedException { + public void givenStartedThread_whenTimedJoinCalled_waitsUntilTimedout() throws InterruptedException { Thread t3 = new SampleThread(10); t3.start(); t3.join(1000); @@ -72,19 +70,17 @@ public class ThreadJoinUnitTest { @Test @Ignore - public void givenThreadTerminated_checkForEffect_notGuaranteed() - throws InterruptedException { + public void givenThreadTerminated_checkForEffect_notGuaranteed() throws InterruptedException { SampleThread t4 = new SampleThread(10); t4.start(); - //not guaranteed to stop even if t4 finishes. + //not guaranteed to stop even if t4 finishes. do { } while (t4.processingCount > 0); } @Test - public void givenJoinWithTerminatedThread_checkForEffect_guaranteed() - throws InterruptedException { + public void givenJoinWithTerminatedThread_checkForEffect_guaranteed() throws InterruptedException { SampleThread t4 = new SampleThread(10); t4.start(); do { diff --git a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java index 473fe6ff8e..bd642a36bd 100644 --- a/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java +++ b/core-java-modules/core-java-concurrency-simple/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java @@ -16,24 +16,24 @@ public class NetworkIntegrationTest { private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); private String expected; - + @Before public void setUpStreams() { System.setOut(new PrintStream(outContent)); System.setErr(new PrintStream(errContent)); } - + @Before public void setUpExpectedOutput() { StringWriter expectedStringWriter = new StringWriter(); - + PrintWriter printWriter = new PrintWriter(expectedStringWriter); printWriter.println("First packet"); printWriter.println("Second packet"); printWriter.println("Third packet"); printWriter.println("Fourth packet"); printWriter.close(); - + expected = expectedStringWriter.toString(); } @@ -42,25 +42,26 @@ public class NetworkIntegrationTest { System.setOut(null); System.setErr(null); } - + @Test public void givenSenderAndReceiver_whenSendingPackets_thenNetworkSynchronized() { Data data = new Data(); Thread sender = new Thread(new Sender(data)); Thread receiver = new Thread(new Receiver(data)); - + sender.start(); receiver.start(); - + //wait for sender and receiver to finish before we test against expected try { sender.join(); receiver.join(); } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - System.out.println("Thread Interrupted"); + Thread.currentThread() + .interrupt(); + System.err.println("Thread Interrupted"); } - + assertEquals(expected, outContent.toString()); } } diff --git a/core-java-modules/core-java-console/README.md b/core-java-modules/core-java-console/README.md index 9236e9cf99..180193d8c1 100644 --- a/core-java-modules/core-java-console/README.md +++ b/core-java-modules/core-java-console/README.md @@ -6,3 +6,4 @@ - [Formatting Output with printf() in Java](https://www.baeldung.com/java-printstream-printf) - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) - [System.console() vs. System.out](https://www.baeldung.com/java-system-console-vs-system-out) +- [How to Log to the Console in Color](https://www.baeldung.com/java-log-console-in-color) diff --git a/core-java-modules/core-java-console/pom.xml b/core-java-modules/core-java-console/pom.xml index 673c5d4dff..200e2707dd 100644 --- a/core-java-modules/core-java-console/pom.xml +++ b/core-java-modules/core-java-console/pom.xml @@ -14,6 +14,14 @@ 0.0.1-SNAPSHOT + + + org.fusesource.jansi + jansi + 2.4.0 + + + core-java-console diff --git a/core-java-modules/core-java-console/src/main/java/com/baeldung/color/ColorLogger.java b/core-java-modules/core-java-console/src/main/java/com/baeldung/color/ColorLogger.java new file mode 100644 index 0000000000..e10cefaf35 --- /dev/null +++ b/core-java-modules/core-java-console/src/main/java/com/baeldung/color/ColorLogger.java @@ -0,0 +1,21 @@ +package com.baeldung.color; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ColorLogger { + + private static final Logger LOGGER = LoggerFactory.getLogger(ColorLogger.class); + + public void logDebug(String logging) { + LOGGER.debug("\u001B[34m" + logging + "\u001B[0m"); + } + + public void logInfo(String logging) { + LOGGER.info("\u001B[32m" + logging + "\u001B[0m"); + } + + public void logError(String logging) { + LOGGER.error("\u001B[31m" + logging + "\u001B[0m"); + } +} diff --git a/core-java-modules/core-java-console/src/main/java/com/baeldung/color/PrintColor.java b/core-java-modules/core-java-console/src/main/java/com/baeldung/color/PrintColor.java new file mode 100644 index 0000000000..e585ce1478 --- /dev/null +++ b/core-java-modules/core-java-console/src/main/java/com/baeldung/color/PrintColor.java @@ -0,0 +1,60 @@ +package com.baeldung.color; + +import static org.fusesource.jansi.Ansi.ansi; + +import org.fusesource.jansi.AnsiConsole; + +public class PrintColor { + + public static void main(String[] args) { + logColorUsingANSICodes(); + + logColorUsingLogger(); + + logColorUsingJANSI(); + } + + private static void logColorUsingANSICodes() { + System.out.println("Here's some text"); + System.out.println("\u001B[31m" + "and now the text is red" + "\u001B[0m"); + System.out.println("and now back to the default"); + } + + private static void logColorUsingLogger() { + ColorLogger colorLogger = new ColorLogger(); + colorLogger.logDebug("Some debug logging"); + colorLogger.logInfo("Some info logging"); + colorLogger.logError("Some error logging"); + } + + private static void logColorUsingJANSI() { + AnsiConsole.systemInstall(); + + System.out.println(ansi().fgRed().a("Some red text").fgYellow().a(" and some yellow text").reset()); + + AnsiConsole.systemUninstall(); + } +} + +/* + * More ANSI codes: + * + * Always conclude your logging with the ANSI reset code: "\u001B[0m" + * + * In each case, replace # with the corresponding number: + * + * 0 = black + * 1 = red + * 2 = green + * 3 = yellow + * 4 = blue + * 5 = purple + * 6 = cyan (light blue) + * 7 = white + * + * \u001B[3#m = color font + * \u001B[4#m = color background + * \u001B[1;3#m = bold font + * \u001B[4;3#m = underlined font + * \u001B[3;3#m = italics font (not widely supported, works in VS Code) + */ \ No newline at end of file diff --git a/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/utiltosqldate/UtilToSqlDateUtils.java b/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/utiltosqldate/UtilToSqlDateUtils.java new file mode 100644 index 0000000000..b67ac61caf --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/main/java/com/baeldung/utiltosqldate/UtilToSqlDateUtils.java @@ -0,0 +1,24 @@ +package com.baeldung.utiltosqldate; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.TimeZone; + +public class UtilToSqlDateUtils { + + public static java.util.Date createAmericanDate(String date) throws ParseException { + SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + isoFormat.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); + return isoFormat.parse(date); + } + + public static void switchTimezone(String timeZone) { + TimeZone.setDefault(TimeZone.getTimeZone(timeZone)); + } + + public static LocalDate getLocalDate(java.util.Date date, String timeZone) { + return date.toInstant().atZone(ZoneId.of(timeZone)).toLocalDate(); + } +} diff --git a/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/utiltosqldate/UtilToSqlDateUtilsUnitTest.java b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/utiltosqldate/UtilToSqlDateUtilsUnitTest.java new file mode 100644 index 0000000000..50847a6fa9 --- /dev/null +++ b/core-java-modules/core-java-date-operations-3/src/test/java/com/baeldung/utiltosqldate/UtilToSqlDateUtilsUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.utiltosqldate; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.text.ParseException; + +public class UtilToSqlDateUtilsUnitTest { + + @Test + public void givenUtilDate_whenCastingToSqlDate_thenThrowException() { + Assertions.assertThrows(ClassCastException.class, () -> { + java.sql.Date date = (java.sql.Date) new java.util.Date(); + }); + } + + @Test + public void givenUtilDate_whenStandardConversion_thenTimezoneLost() throws ParseException { + java.util.Date date = UtilToSqlDateUtils.createAmericanDate("2010-05-23T22:01:02"); + + UtilToSqlDateUtils.switchTimezone("America/Los_Angeles"); + + java.sql.Date sqlDate = new java.sql.Date(date.getTime()); + Assertions.assertEquals("2010-05-23", sqlDate.toString()); + + UtilToSqlDateUtils.switchTimezone("Rome"); + sqlDate = new java.sql.Date(date.getTime()); + Assertions.assertEquals("2010-05-24",sqlDate.toString()); + } + + @Test + public void givenUtilDate_whenConversionToTimestamp_thenKeepTimeInfo() throws ParseException { + java.util.Date date = UtilToSqlDateUtils.createAmericanDate("2010-05-23T22:01:02"); + UtilToSqlDateUtils.switchTimezone("America/Los_Angeles"); + java.sql.Timestamp timestamp = new java.sql.Timestamp(date.getTime()); + Assertions.assertEquals("2010-05-23 22:01:02.0",timestamp.toString()); + } + + @Test + public void givenUtilDate_whenUsingJavaTimeConversion_thenTimezoneKept() throws ParseException { + java.util.Date date = UtilToSqlDateUtils.createAmericanDate("2010-05-23T22:01:02"); + + UtilToSqlDateUtils.switchTimezone("America/Los_Angeles"); + + java.time.LocalDate localDate = UtilToSqlDateUtils.getLocalDate(date,"America/Los_Angeles"); + Assertions.assertEquals(localDate.toString(), "2010-05-23"); + + UtilToSqlDateUtils.switchTimezone("Rome"); + localDate = UtilToSqlDateUtils.getLocalDate(date,"America/Los_Angeles"); + Assertions.assertEquals(localDate.toString(), "2010-05-23"); + } + +} diff --git a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/instant/StringToInstantConverterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/instant/StringToInstantConverterUnitTest.java new file mode 100644 index 0000000000..a3732bf7da --- /dev/null +++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/instant/StringToInstantConverterUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.instant; + +import org.junit.Test; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StringToInstantConverterUnitTest { + String stringDate = "09:15:30 PM, Sun 10/09/2022"; + String pattern = "hh:mm:ss a, EEE M/d/uuuu"; + + @Test public void givenStringTimeStamp_whenConvertingWithInstantUsingTimeZone_thenConvertToInstant() { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US); + LocalDateTime localDateTime = LocalDateTime.parse(stringDate, dateTimeFormatter); + ZoneId zoneId = ZoneId.of("America/Chicago"); + ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId); + Instant instant = zonedDateTime.toInstant(); + assertThat(instant.toString()).isEqualTo("2022-10-10T02:15:30Z"); + } + + @Test public void givenStringTimeStamp_whenConvertingWithLocalDateTime_thenConvertToInstant() { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern, Locale.US); + LocalDateTime localDateTime = LocalDateTime.parse(stringDate, dateTimeFormatter); + assertThat(localDateTime.toString()).isEqualTo("2022-10-09T21:15:30"); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-4/pom.xml b/core-java-modules/core-java-exceptions-4/pom.xml index e691e1446d..e9eb1bf379 100644 --- a/core-java-modules/core-java-exceptions-4/pom.xml +++ b/core-java-modules/core-java-exceptions-4/pom.xml @@ -46,8 +46,4 @@ - - 1.4.191 - - \ No newline at end of file diff --git a/core-java-modules/core-java-io-4/README.md b/core-java-modules/core-java-io-4/README.md index fdf9ebcb77..263077946d 100644 --- a/core-java-modules/core-java-io-4/README.md +++ b/core-java-modules/core-java-io-4/README.md @@ -12,4 +12,6 @@ This module contains articles about core Java input and output (IO) - [Java Scanner.skip method with examples](https://www.baeldung.com/java-scanner-skip) - [Generate the MD5 Checksum for a File in Java](https://www.baeldung.com/java-md5-checksum-file) - [Getting the Filename From a String Containing an Absolute File Path](https://www.baeldung.com/java-filename-full-path) +- [Mocking Java InputStream Object](https://www.baeldung.com/java-mocking-inputstream) - [[<-- Prev]](/core-java-modules/core-java-io-3) + diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/mockinginputstream/GeneratingInputStream.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/mockinginputstream/GeneratingInputStream.java new file mode 100644 index 0000000000..5fd0c3cf03 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/mockinginputstream/GeneratingInputStream.java @@ -0,0 +1,23 @@ +package com.baeldung.mockinginputstream; + +import java.io.IOException; +import java.io.InputStream; + +public class GeneratingInputStream extends InputStream { + private final int desiredSize; + private int actualSize = 0; + private final byte[] seed; + + public GeneratingInputStream(int desiredSize, String seed) { + this.desiredSize = desiredSize; + this.seed = seed.getBytes(); + } + + @Override + public int read() { + if (actualSize >= desiredSize) { + return -1; + } + return seed[actualSize++ % seed.length]; + } +} diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/mockinginputstream/MockingInputStreamUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/mockinginputstream/MockingInputStreamUnitTest.java new file mode 100644 index 0000000000..4b29a778b0 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/mockinginputstream/MockingInputStreamUnitTest.java @@ -0,0 +1,59 @@ +package com.baeldung.mockinginputstream; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class MockingInputStreamUnitTest { + @Test + public void givenSimpleImplementation_shouldProcessInputStream() throws IOException { + int byteCount = processInputStream(new InputStream() { + private final byte[] msg = "Hello World".getBytes(); + private int index = 0; + @Override + public int read() { + if (index >= msg.length) { + return -1; + } + return msg[index++]; + } + }); + assertThat(byteCount).isEqualTo(11); + } + + @Test + public void givenByteArrayInputStream_shouldProcessInputStream() throws IOException { + String msg = "Hello World"; + int bytesCount = processInputStream(new ByteArrayInputStream(msg.getBytes())); + assertThat(bytesCount).isEqualTo(11); + } + + @Test + public void givenFileInputStream_shouldProcessInputStream() throws IOException { + InputStream inputStream = MockingInputStreamUnitTest.class.getResourceAsStream("/mockinginputstreams/msg.txt"); + int bytesCount = processInputStream(inputStream); + assertThat(bytesCount).isEqualTo(11); + inputStream.close(); + } + + @Test + public void givenGeneratingInputStream_shouldProcessInputStream() throws IOException { + InputStream inputStream = new GeneratingInputStream(10_000, "Hello World"); + int bytesCount = processInputStream(inputStream); + assertThat(bytesCount).isEqualTo(10_000); + inputStream.close(); + } + + int processInputStream(InputStream inputStream) throws IOException { + int count = 0; + while(inputStream.read() != -1) { + count++; + } + return count; + } +} diff --git a/core-java-modules/core-java-io-4/src/test/resources/mockinginputstreams/msg.txt b/core-java-modules/core-java-io-4/src/test/resources/mockinginputstreams/msg.txt new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/resources/mockinginputstreams/msg.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/core-java-modules/core-java-jndi/pom.xml b/core-java-modules/core-java-jndi/pom.xml index 68b7f9361f..23a2fe3bfb 100644 --- a/core-java-modules/core-java-jndi/pom.xml +++ b/core-java-modules/core-java-jndi/pom.xml @@ -64,7 +64,6 @@ 5.0.9.RELEASE - 1.4.199 2.0.0.AM26 1.8 1.8 diff --git a/core-java-modules/core-java-lang-5/README.md b/core-java-modules/core-java-lang-5/README.md index de76f63411..f1408abe96 100644 --- a/core-java-modules/core-java-lang-5/README.md +++ b/core-java-modules/core-java-lang-5/README.md @@ -8,3 +8,5 @@ This module contains articles about core features in the Java language - [Advantages and Disadvantages of Using Java Wildcard Imports](https://www.baeldung.com/java-wildcard-imports) - [Toggle a Boolean Variable in Java](https://www.baeldung.com/java-toggle-boolean) - [Handle Classes With the Same Name in Java](https://www.baeldung.com/java-classes-same-name) +- [Variable Instantiation on Declaration vs. on Constructor in Java](https://www.baeldung.com/java-variable-instantiation-declaration-vs-constructor) +- [Infinity in Java](https://www.baeldung.com/java-infinity) diff --git a/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/infinity/DoubleInfinityUnitTest.java b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/infinity/DoubleInfinityUnitTest.java new file mode 100644 index 0000000000..79416c713e --- /dev/null +++ b/core-java-modules/core-java-lang-5/src/test/java/com/baeldung/infinity/DoubleInfinityUnitTest.java @@ -0,0 +1,81 @@ +package com.baeldung.infinity; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DoubleInfinityUnitTest { + + @Test + void givenInfinities_whenOperatingWithThem_thenNaNOrInfinity() { + Double positiveInfinity = Double.POSITIVE_INFINITY; + Double negativeInfinity = Double.NEGATIVE_INFINITY; + + assertEquals(Double.NaN, (positiveInfinity + negativeInfinity)); + assertEquals(Double.NaN, (positiveInfinity / negativeInfinity)); + assertEquals(Double.POSITIVE_INFINITY, (positiveInfinity - negativeInfinity)); + assertEquals(Double.NEGATIVE_INFINITY, (negativeInfinity - positiveInfinity)); + assertEquals(Double.NEGATIVE_INFINITY, (positiveInfinity * negativeInfinity)); + } + + @Test + void givenInfinityAndPositiveNumber_whenOperatingWithThem_thenInfinity() { + Double positiveInfinity = Double.POSITIVE_INFINITY; + Double negativeInfinity = Double.NEGATIVE_INFINITY; + double positiveNumber = 10.0; + + assertEquals(Double.POSITIVE_INFINITY, (positiveInfinity + positiveNumber)); + assertEquals(Double.NEGATIVE_INFINITY, (negativeInfinity + positiveNumber)); + + assertEquals(Double.POSITIVE_INFINITY, (positiveInfinity - positiveNumber)); + assertEquals(Double.NEGATIVE_INFINITY, (negativeInfinity - positiveNumber)); + + assertEquals(Double.POSITIVE_INFINITY, (positiveInfinity * positiveNumber)); + assertEquals(Double.NEGATIVE_INFINITY, (negativeInfinity * positiveNumber)); + + assertEquals(Double.POSITIVE_INFINITY, (positiveInfinity / positiveNumber)); + assertEquals(Double.NEGATIVE_INFINITY, (negativeInfinity / positiveNumber)); + + assertEquals(Double.NEGATIVE_INFINITY, (positiveNumber - positiveInfinity)); + assertEquals(Double.POSITIVE_INFINITY, (positiveNumber - negativeInfinity)); + + assertEquals(0.0, (positiveNumber / positiveInfinity)); + assertEquals(-0.0, (positiveNumber / negativeInfinity)); + } + + @Test + void givenInfinityAndBegativeNumber_whenOperatingWithThem_thenInfinity() { + Double positiveInfinity = Double.POSITIVE_INFINITY; + Double negativeInfinity = Double.NEGATIVE_INFINITY; + double negativeNumber = -10.0; + + assertEquals(Double.POSITIVE_INFINITY, (positiveInfinity + negativeNumber)); + assertEquals(Double.NEGATIVE_INFINITY, (negativeInfinity + negativeNumber)); + + assertEquals(Double.POSITIVE_INFINITY, (positiveInfinity - negativeNumber)); + assertEquals(Double.NEGATIVE_INFINITY, (negativeInfinity - negativeNumber)); + + assertEquals(Double.NEGATIVE_INFINITY, (positiveInfinity * negativeNumber)); + assertEquals(Double.POSITIVE_INFINITY, (negativeInfinity * negativeNumber)); + + assertEquals(Double.NEGATIVE_INFINITY, (positiveInfinity / negativeNumber)); + assertEquals(Double.POSITIVE_INFINITY, (negativeInfinity / negativeNumber)); + + assertEquals(Double.NEGATIVE_INFINITY, (negativeNumber - positiveInfinity)); + assertEquals(Double.POSITIVE_INFINITY, (negativeNumber - negativeInfinity)); + + assertEquals(-0.0, (negativeNumber / positiveInfinity)); + assertEquals(0.0, (negativeNumber / negativeInfinity)); + } + + + @Test + void givenRealNumbers_whenDivisionByZero_thenInfinity() { + double d = 1.0; + + assertEquals(Double.POSITIVE_INFINITY, (d / 0.0)); + assertEquals(Double.NEGATIVE_INFINITY, (d / -0.0)); + assertEquals(Double.NEGATIVE_INFINITY, (-d / 0.0)); + assertEquals(Double.POSITIVE_INFINITY, (-d / -0.0)); + } +} diff --git a/core-java-modules/core-java-lang-math-3/README.md b/core-java-modules/core-java-lang-math-3/README.md index 3c1e1d79ee..d71982786b 100644 --- a/core-java-modules/core-java-lang-math-3/README.md +++ b/core-java-modules/core-java-lang-math-3/README.md @@ -6,6 +6,6 @@ - [Evaluating a Math Expression in Java](https://www.baeldung.com/java-evaluate-math-expression-string) - [Swap Two Variables in Java](https://www.baeldung.com/java-swap-two-variables) -- [Java Program to Find the Roots of a Quadratic Equation](https://www.baeldung.com/roots-quadratic-equation/) +- [Java Program to Find the Roots of a Quadratic Equation](https://www.baeldung.com/roots-quadratic-equation) - [Create a BMI Calculator in Java](https://www.baeldung.com/java-body-mass-index-calculator) - More articles: [[<-- Prev]](/core-java-modules/core-java-lang-math-2) diff --git a/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/standarddeviation/StandardDeviation.java b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/standarddeviation/StandardDeviation.java new file mode 100644 index 0000000000..623f7a96eb --- /dev/null +++ b/core-java-modules/core-java-lang-math-3/src/main/java/com/baeldung/math/standarddeviation/StandardDeviation.java @@ -0,0 +1,35 @@ +package com.baeldung.math.standarddeviation; + +import java.util.Arrays; + +public class StandardDeviation { + + public static double calculateStandardDeviation(double[] array) { + + // get the sum of array + double sum = 0.0; + for (double i : array) { + sum += i; + } + + // get the mean of array + int length = array.length; + double mean = sum / length; + + // calculate the standard deviation + double standardDeviation = 0.0; + for (double num : array) { + standardDeviation += Math.pow(num - mean, 2); + } + + return Math.sqrt(standardDeviation / length); + } + + public static void main(String[] args) { + double[] array = {25, 5, 45, 68, 61, 46, 24, 95}; + System.out.println("List of elements: " + Arrays.toString(array)); + + double standardDeviation = calculateStandardDeviation(array); + System.out.format("Standard Deviation = %.6f", standardDeviation); + } +} diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md index 6c336d2e65..80782645dd 100644 --- a/core-java-modules/core-java-networking-3/README.md +++ b/core-java-modules/core-java-networking-3/README.md @@ -13,4 +13,6 @@ This module contains articles about networking in Java - [Get the IP Address of the Current Machine Using Java](https://www.baeldung.com/java-get-ip-address) - [Get Domain Name From Given URL in Java](https://www.baeldung.com/java-domain-name-from-url) - [Java HttpClient Timeout](https://www.baeldung.com/java-httpclient-timeout) +- [Port Scanning With Java](https://www.baeldung.com/java-port-scanning) +- [Validating URL in Java](https://www.baeldung.com/java-validate-url) - [[<-- Prev]](/core-java-modules/core-java-networking-2) diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml index 91ae7ccc3f..4f373238ee 100644 --- a/core-java-modules/core-java-networking-3/pom.xml +++ b/core-java-modules/core-java-networking-3/pom.xml @@ -58,6 +58,12 @@ guava ${guava.version} + + + commons-validator + commons-validator + ${apache.commons-validator.version} + @@ -90,6 +96,7 @@ 1.32 0.17 1.6.2 + 1.7 \ No newline at end of file diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/urlvalidation/UrlValidation.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/urlvalidation/UrlValidation.java new file mode 100644 index 0000000000..b529448200 --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/urlvalidation/UrlValidation.java @@ -0,0 +1,36 @@ +package com.baeldung.urlvalidation; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; + +import org.apache.commons.validator.routines.UrlValidator; + +public class UrlValidation { + public boolean isValidURLJavaNet(String url) throws MalformedURLException, URISyntaxException { + try { + new URL(url).toURI(); + return true; + } catch (MalformedURLException e) { + return false; + } catch (URISyntaxException e) { + return false; + + } + } + + public boolean invalidUrlAsValidJavaNet(String url) throws MalformedURLException { + try { + new URL(url); + return true; + } catch (MalformedURLException e) { + return false; + } + } + + public boolean isValidURLApache(String url) throws MalformedURLException { + UrlValidator validator = new UrlValidator(); + return validator.isValid(url); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/urlvalidation/UrlValidateUnitTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/urlvalidation/UrlValidateUnitTest.java new file mode 100644 index 0000000000..ef04216a9f --- /dev/null +++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/urlvalidation/UrlValidateUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.urlvalidation; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; + +import java.net.MalformedURLException; +import java.net.URISyntaxException; + +import org.junit.Test; + +import com.baeldung.urlvalidation.UrlValidation; + +public class UrlValidateUnitTest { + + @Test + public void givenValidStringAsURL_whenUsingJDK_shouldReturnTrue() throws MalformedURLException, URISyntaxException { + UrlValidation urlValidator = new UrlValidation(); + assertTrue(urlValidator.isValidURLJavaNet("http://baeldung.com/")); + } + + @Test + public void givenInvalidStringAsURL_whenUsingJDK_shouldReturnFalse() throws MalformedURLException, URISyntaxException { + UrlValidation urlValidator = new UrlValidation(); + assertFalse(urlValidator.isValidURLJavaNet("https://www.baeldung.com/ java-%%$^&& iuyi")); + } + + @Test + public void givenInvalidStringAsURL_whenUsingJDK_shouldReturnTrue() throws MalformedURLException { + UrlValidation urlValidator = new UrlValidation(); + assertTrue(urlValidator.invalidUrlAsValidJavaNet("https://www.baeldung.com/ java-%%$^&& iuyi")); + } + + @Test + public void givenValidStringAsURL_whenUsingApache_shouldReturnTrue() throws MalformedURLException { + UrlValidation urlValidator = new UrlValidation(); + assertTrue(urlValidator.isValidURLApache("http://baeldung.com/")); + } + + @Test + public void givenInvalidStringAsURL_whenUsingApache_shouldReturnFalse() throws MalformedURLException { + UrlValidation urlValidator = new UrlValidation(); + assertFalse(urlValidator.isValidURLApache("https://www.baeldung.com/ java-%%$^&& iuyi")); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-networking-4/README.md b/core-java-modules/core-java-networking-4/README.md new file mode 100644 index 0000000000..355f0c447e --- /dev/null +++ b/core-java-modules/core-java-networking-4/README.md @@ -0,0 +1,2 @@ +## Relevant Articles: +- [Difference Between URI.create() and new URI()](https://www.baeldung.com/java-uri-create-and-new-uri) diff --git a/core-java-modules/core-java-networking-4/pom.xml b/core-java-modules/core-java-networking-4/pom.xml new file mode 100644 index 0000000000..ec7c80c12e --- /dev/null +++ b/core-java-modules/core-java-networking-4/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + core-java-networking-4 + core-java-networking-4 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + core-java-networking-4 + + diff --git a/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/uricreation/UriCreationUnitTest.java b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/uricreation/UriCreationUnitTest.java new file mode 100644 index 0000000000..ce640d9509 --- /dev/null +++ b/core-java-modules/core-java-networking-4/src/test/java/com/baeldung/uricreation/UriCreationUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.uricreation; + +import org.junit.jupiter.api.Test; + +import java.net.URI; +import java.net.URISyntaxException; + +import static org.junit.jupiter.api.Assertions.*; + +public class UriCreationUnitTest { + @Test + void givenValidUriString_whenUsingConstructor_shouldGetExpectedResult() { + try { + URI myUri = new URI("https://www.baeldung.com/articles"); + assertNotNull(myUri); + } catch (URISyntaxException e) { + fail(); + } + } + + @Test + void givenInvalidUriString_whenUsingConstructor_shouldGetExpectedResult() { + assertThrows(URISyntaxException.class, () -> new URI("I am an invalid URI string.")); + } + + @Test + void givenValidUriString_whenUsingCreateMethod_shouldGetExpectedResult() { + URI myUri = URI.create("https://www.baeldung.com/articles"); + assertNotNull(myUri); + } + + @Test + void givenInvalidUriString_whenUsingCreateMethod_shouldGetExpectedResult() { + assertThrows(IllegalArgumentException.class, () -> URI.create("I am an invalid URI string.")); + } +} diff --git a/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/uniquerng/BigUniqueRng.java b/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/uniquerng/BigUniqueRng.java new file mode 100644 index 0000000000..468dce7b17 --- /dev/null +++ b/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/uniquerng/BigUniqueRng.java @@ -0,0 +1,36 @@ +package com.baeldung.uniquerng; + +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.NoSuchElementException; +import java.util.Random; +import java.util.Set; + +public class BigUniqueRng implements Iterator { + + private Random random = new Random(); + private Set generated = new LinkedHashSet<>(); + + public BigUniqueRng(int size, int max) { + while (generated.size() < size) { + Integer next = random.nextInt(max); + generated.add(next); + } + } + + @Override + public Integer next() { + if (!hasNext()) + throw new NoSuchElementException(); + + Iterator iterator = generated.iterator(); + Integer next = iterator.next(); + iterator.remove(); + return next; + } + + @Override + public boolean hasNext() { + return !generated.isEmpty(); + } +} diff --git a/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/uniquerng/UniqueRng.java b/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/uniquerng/UniqueRng.java new file mode 100644 index 0000000000..01741562b3 --- /dev/null +++ b/core-java-modules/core-java-numbers-5/src/main/java/com/baeldung/uniquerng/UniqueRng.java @@ -0,0 +1,42 @@ +package com.baeldung.uniquerng; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +public class UniqueRng implements Iterator { + + private int size; + private List numbers = new ArrayList<>(); + + public UniqueRng(int size, boolean zeroBased) { + this.size = size; + int start = (zeroBased ? 0 : 1); + int limit = (zeroBased ? size - 1 : size); + + for (int i = start; i <= limit; i++) { + numbers.add(i); + } + + Collections.shuffle(numbers); + } + + @Override + public Integer next() { + if (!hasNext()) + throw new NoSuchElementException(); + + return numbers.remove(0); + } + + @Override + public boolean hasNext() { + return !numbers.isEmpty(); + } + + public int getSize() { + return size; + } +} diff --git a/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/uniquerng/RngUtilsUnitTest.java b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/uniquerng/RngUtilsUnitTest.java new file mode 100644 index 0000000000..4680b53a78 --- /dev/null +++ b/core-java-modules/core-java-numbers-5/src/test/java/com/baeldung/uniquerng/RngUtilsUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.uniquerng; + +import static org.junit.Assert.assertEquals; + +import java.util.Random; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import org.junit.Test; + +public class RngUtilsUnitTest { + + @Test + public void whenNUniqueNumRequested_thenNUniqueNumConsumed() { + TreeSet set = new TreeSet<>(); + int n = 5; + UniqueRng rng = new UniqueRng(n, true); + + while (rng.hasNext()) { + set.add(rng.next()); + } + + assertEquals(n, set.size()); + } + + @Test + public void givenYRange_whenNUniqueNumRequested_thenNUniqueNumConsumed() { + TreeSet set = new TreeSet<>(); + int n = 5; + int y = n * 10; + + BigUniqueRng rng = new BigUniqueRng(n, y); + while (rng.hasNext()) { + set.add(rng.next()); + } + + assertEquals(n, set.size()); + } + + @Test + public void givenIntStreamSizeN_whenCollected_thenSetSizeN() { + int n = 5; + int from = -5; + int to = n * 2; + + Random r = new Random(); + Set set = r.ints(from, to) + .distinct() + .limit(n) + .boxed() + .collect(Collectors.toSet()); + + assertEquals(n, set.size()); + } +} diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index 71c28aac30..671ba0077c 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -3,3 +3,6 @@ - [Compare Characters in Java](https://www.baeldung.com/java-compare-characters) - [String Concatenation in Java](https://www.baeldung.com/java-string-concatenation) +- [Capitalize the First Letter of a String in Java](https://www.baeldung.com/java-string-uppercase-first-letter) +- [Convert String to char in Java](https://www.baeldung.com/java-convert-string-to-char) +- [Convert String to String Array](https://www.baeldung.com/java-convert-string-to-string-array) diff --git a/core-java-modules/core-java-string-operations-5/pom.xml b/core-java-modules/core-java-string-operations-5/pom.xml index a0c630cb0f..3f78b8d5d3 100644 --- a/core-java-modules/core-java-string-operations-5/pom.xml +++ b/core-java-modules/core-java-string-operations-5/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-string-operations-5 0.1.0-SNAPSHOT @@ -14,6 +14,13 @@ 0.0.1-SNAPSHOT + + + org.apache.commons + commons-lang3 + ${apache.commons.lang3.version} + + @@ -30,6 +37,7 @@ 11 11 + 3.12.0 \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/capitalizethefirstletter/CapitalizeTheFirstLetterUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/capitalizethefirstletter/CapitalizeTheFirstLetterUnitTest.java new file mode 100644 index 0000000000..865fddd08a --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/capitalizethefirstletter/CapitalizeTheFirstLetterUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.capitalizethefirstletter; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +import java.util.regex.Pattern; + +import static org.junit.jupiter.api.Assertions.*; + +public class CapitalizeTheFirstLetterUnitTest { + private static final String EMPTY_INPUT = ""; + private static final String EMPTY_EXPECTED = ""; + private static final String INPUT = "hi there, Nice to Meet You!"; + private static final String EXPECTED = "Hi there, Nice to Meet You!"; + + @Test + void givenString_whenCapitalizeUsingSubString_shouldGetExpectedResult() { + String output = INPUT.substring(0, 1).toUpperCase() + INPUT.substring(1); + assertEquals(EXPECTED, output); + + assertThrows(IndexOutOfBoundsException.class, () -> EMPTY_INPUT.substring(1)); + + } + + @Test + void givenString_whenCapitalizeUsingRegexReplace_shouldGetExpectedResult() { + String output = Pattern.compile("^.").matcher(INPUT).replaceFirst(m -> m.group().toUpperCase()); + assertEquals(EXPECTED, output); + + String emptyOutput = Pattern.compile("^.").matcher(EMPTY_INPUT).replaceFirst(m -> m.group().toUpperCase()); + assertEquals(EMPTY_EXPECTED, emptyOutput); + } + + @Test + void givenString_whenCapitalizeUsingApacheCommons_shouldGetExpectedResult() { + String output = StringUtils.capitalize(INPUT); + assertEquals(EXPECTED, output); + + String emptyOutput = StringUtils.capitalize(EMPTY_INPUT); + assertEquals(EMPTY_EXPECTED, emptyOutput); + + String nullOutput = StringUtils.capitalize(null); + assertNull(nullOutput); + } +} diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/strtochar/ConvertStringToCharUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/strtochar/ConvertStringToCharUnitTest.java new file mode 100644 index 0000000000..6de41b11dd --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/strtochar/ConvertStringToCharUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.strtochar; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class ConvertStringToCharUnitTest { + private static final String STRING_b = "b"; + private static final String STRING_Baeldung = "Baeldung"; + + @Test + void givenStringWithSingleChar_whenCallingCharAt_thenGetExpectedResult() { + assertEquals('b', STRING_b.charAt(0)); + assertEquals('l', STRING_Baeldung.charAt(3)); + assertThrows(StringIndexOutOfBoundsException.class, () -> "".charAt(0)); + } + + @Test + void givenStringWithMultipleChars_whenCallingCharAt_thenGetExpectedResult() { + assertArrayEquals(new char[] { 'B', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }, STRING_Baeldung.toCharArray()); + assertArrayEquals(new char[] {}, "".toCharArray()); + } + + @Test + void givenStringWithMultipleChars_whenCallingGetChars_thenGetExpectedResult() { + char[] aeld = new char[4]; + STRING_Baeldung.getChars(1, 5, aeld, 0); + assertArrayEquals(new char[] { 'a', 'e', 'l', 'd' }, aeld); + + char[] anotherArray = new char[] { '#', '#', '#', '#', '#', '#' }; + STRING_Baeldung.getChars(1, 5, anotherArray, 1); + assertArrayEquals(new char[] { '#', 'a', 'e', 'l', 'd', '#' }, anotherArray); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/strtostrarray/StringToStringArrayUnitTest.java b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/strtostrarray/StringToStringArrayUnitTest.java new file mode 100644 index 0000000000..c1e31a404e --- /dev/null +++ b/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/strtostrarray/StringToStringArrayUnitTest.java @@ -0,0 +1,49 @@ +package com.baeldung.strtostrarray; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class StringToStringArrayUnitTest { + private static final String INPUT = "Hi there, nice to meet you!"; + private static final String FLIGHT_INPUT = "20221018LH720FRAPEK"; + + @Test + void givenAString_whenConvertToSingletonArray_shouldGetExpectedResult() { + String[] myArray = new String[] { INPUT }; + assertArrayEquals(new String[] { "Hi there, nice to meet you!" }, myArray); + } + + @Test + void givenAString_whenSplitToWordArray_shouldGetExpectedResult() { + String[] myArray = INPUT.split("\\W+"); + assertArrayEquals(new String[] { "Hi", "there", "nice", "to", "meet", "you" }, myArray); + } + + @Test + void givenAString_whenSplitToSentenceArray_shouldGetExpectedResult() { + String[] myArray = INPUT.split("[-,.!;?]\\s*"); + assertArrayEquals(new String[] { "Hi there", "nice to meet you" }, myArray); + } + + @Test + void givenAString_whenSplitToCharArray_shouldGetExpectedResult() { + String[] myArray = INPUT.split(""); + assertArrayEquals(new String[] { + "H", "i", " ", "t", "h", "e", "r", "e", ",", " ", + "n", "i", "c", "e", " ", "t", "o", " ", "m", "e", "e", "t", " ", "y", "o", "u", "!" + }, myArray); + } + + @Test + void givenAString_whenSpecialRuleRequired_shouldGetExpectedResult() { + String dateStr = FLIGHT_INPUT.substring(0, 8); + String flightNo = FLIGHT_INPUT.substring(8, FLIGHT_INPUT.length() - 6); + int airportStart = dateStr.length() + flightNo.length(); + String from = FLIGHT_INPUT.substring(airportStart, airportStart + 3); + String to = FLIGHT_INPUT.substring(airportStart + 3); + + String[] myArray = new String[] { dateStr, flightNo, from, to }; + assertArrayEquals(new String[] { "20221018", "LH720", "FRA", "PEK" }, myArray); + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 9c562e8b28..148f536792 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -34,6 +34,7 @@ core-java-collections-array-list core-java-collections-conversions core-java-collections-conversions-2 + core-java-collections-set-2 core-java-collections-list core-java-collections-list-2 core-java-collections-list-3 @@ -97,6 +98,7 @@ core-java-lang-syntax-2 core-java-networking core-java-networking-2 + core-java-networking-4 core-java-nio core-java-nio-2 core-java-numbers @@ -147,4 +149,4 @@ - \ No newline at end of file + diff --git a/docker-modules/docker-compose/README.md b/docker-modules/docker-compose/README.md index 5ab629e54f..4631630e6a 100644 --- a/docker-modules/docker-compose/README.md +++ b/docker-modules/docker-compose/README.md @@ -5,6 +5,6 @@ - [Communication Between Multiple Docker Compose Projects](https://www.baeldung.com/ops/docker-compose-communication) - [Difference Between links and depends_on in Docker Compose](https://www.baeldung.com/ops/docker-compose-links-depends-on) - [Mounting Multiple Volumes on a Docker Container](https://www.baeldung.com/ops/docker-mounting-multiple-volumes) -- [Rebuild Docker Container in Docker Compose](https://www.baeldung.com/rebuild-docker-container-compose/) +- [Rebuild Docker Container in Docker Compose](https://www.baeldung.com/rebuild-docker-container-compose) - [Assign Static IP to Docker Container and Docker-Compose](https://www.baeldung.com/ops/docker-assign-static-ip-container) - +- [Exclude a Sub-Folder When Adding a Volume to Docker](https://www.baeldung.com/ops/docker-exclude-sub-folder-when-adding-volume) diff --git a/docker-modules/docker-compose/exclude-subfolders/Dockerfile b/docker-modules/docker-compose/exclude-subfolders/Dockerfile new file mode 100644 index 0000000000..9aa1c4ea44 --- /dev/null +++ b/docker-modules/docker-compose/exclude-subfolders/Dockerfile @@ -0,0 +1,7 @@ +FROM node:12.18.1 +ENV NODE_ENV=production +WORKDIR /app +COPY ["package.json", "package-lock.json*", "./"] +RUN npm install --production +COPY . . +CMD [ "node", "server.js" ] \ No newline at end of file diff --git a/docker-modules/docker-compose/exclude-subfolders/docker-compose.yml b/docker-modules/docker-compose/exclude-subfolders/docker-compose.yml new file mode 100644 index 0000000000..51e536ae5c --- /dev/null +++ b/docker-modules/docker-compose/exclude-subfolders/docker-compose.yml @@ -0,0 +1,12 @@ +services: + node-app: + build: . + ports: + - 8080:8080 + volumes: + - .:/app + - my-vol:/app/node_modules/ + +volumes: + my-vol: + driver: local \ No newline at end of file diff --git a/docker-modules/docker-compose/exclude-subfolders/package.json b/docker-modules/docker-compose/exclude-subfolders/package.json new file mode 100644 index 0000000000..118fb33610 --- /dev/null +++ b/docker-modules/docker-compose/exclude-subfolders/package.json @@ -0,0 +1,17 @@ +{ + "name": "app", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ronin-mocks": "^0.1.11", + "ronin-server": "^0.1.3" + } +} diff --git a/docker-modules/docker-compose/exclude-subfolders/server.js b/docker-modules/docker-compose/exclude-subfolders/server.js new file mode 100644 index 0000000000..2ad342e4d4 --- /dev/null +++ b/docker-modules/docker-compose/exclude-subfolders/server.js @@ -0,0 +1,7 @@ +const ronin = require('ronin-server') +const mocks = require('ronin-mocks') + +const server = ronin.server() + +server.use('/', mocks.server(server.Router(), false, true)) +server.start() \ No newline at end of file diff --git a/docker-modules/docker-images/README.md b/docker-modules/docker-images/README.md index 7813ec4279..9ad9f6a3df 100644 --- a/docker-modules/docker-images/README.md +++ b/docker-modules/docker-images/README.md @@ -2,6 +2,6 @@ - [Pushing a Docker Image to a Private Repository](https://www.baeldung.com/ops/docker-push-image-to-private-repository) - [How to Include Files Outside of Docker’s Build Context](https://www.baeldung.com/ops/docker-include-files-outside-build-context) -- [Adding a Comment in a Dockerfile](https://www.baeldung.com/ops/docker-dockerfile-comments/) +- [Adding a Comment in a Dockerfile](https://www.baeldung.com/ops/docker-dockerfile-comments) - [Updating PATH Environment Variable in Dockerfile](https://www.baeldung.com/ops/dockerfile-path-environment-variable) - [Keep Subdirectory Structure in Dockerfile Copy](https://www.baeldung.com/ops/dockerfile-copy-same-subdirectory-structure) diff --git a/graphql-modules/graphql-error-handling/README.md b/graphql-modules/graphql-error-handling/README.md deleted file mode 100644 index 06a2957ac1..0000000000 --- a/graphql-modules/graphql-error-handling/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Error Handling in GraphQL With Spring Boot](https://www.baeldung.com/spring-graphql-error-handling) diff --git a/graphql-modules/graphql-error-handling/pom.xml b/graphql-modules/graphql-error-handling/pom.xml deleted file mode 100644 index 581c5a0f3d..0000000000 --- a/graphql-modules/graphql-error-handling/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - 4.0.0 - graphql-error-handling - 1.0 - graphql-error-handling - jar - - - com.baeldung.graphql - graphql-modules - 1.0.0-SNAPSHOT - - - - - - - org.springframework.boot - spring-boot-dependencies - 2.6.4 - pom - import - - - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-web - - - com.graphql-java - graphql-spring-boot-starter - ${graphql-spring-boot-starter.version} - - - com.graphql-java - graphql-java-tools - ${graphql-java-tools.version} - - - org.projectlombok - lombok - - - com.h2database - h2 - - - org.springframework.boot - spring-boot-test - test - - - com.graphql-java - graphql-spring-boot-starter-test - ${graphql-spring-boot-starter.version} - test - - - org.skyscreamer - jsonassert - test - - - - - 5.0.2 - 5.2.4 - - - \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java b/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java deleted file mode 100644 index 565c9e0a15..0000000000 --- a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.graphql.error.handling; - -import com.baeldung.graphql.error.handling.exception.GraphQLErrorAdapter; -import graphql.ExceptionWhileDataFetching; -import graphql.GraphQLError; -import graphql.servlet.GraphQLErrorHandler; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -@SpringBootApplication -public class GraphQLErrorHandlerApplication { - public static void main(String[] args) { - SpringApplication.run(GraphQLErrorHandlerApplication.class, args); - } - - @Bean - public GraphQLErrorHandler errorHandler() { - return new GraphQLErrorHandler() { - @Override - public List processErrors(List errors) { - List clientErrors = errors.stream() - .filter(this::isClientError) - .collect(Collectors.toList()); - - List serverErrors = errors.stream() - .filter(e -> !isClientError(e)) - .map(GraphQLErrorAdapter::new) - .collect(Collectors.toList()); - - List e = new ArrayList<>(); - e.addAll(clientErrors); - e.addAll(serverErrors); - return e; - } - - private boolean isClientError(GraphQLError error) { - return !(error instanceof ExceptionWhileDataFetching || error instanceof Throwable); - } - }; - } -} diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java b/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java deleted file mode 100644 index 4e7be50ae4..0000000000 --- a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.graphql.error.handling.exception; - -import graphql.ErrorType; -import graphql.GraphQLError; -import graphql.language.SourceLocation; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class AbstractGraphQLException extends RuntimeException implements GraphQLError { - private Map parameters = new HashMap(); - - public AbstractGraphQLException(String message) { - super(message); - } - - public AbstractGraphQLException(String message, Map additionParams) { - this(message); - if (additionParams != null) { - parameters = additionParams; - } - } - - @Override - public String getMessage() { - return super.getMessage(); - } - - @Override - public List getLocations() { - return null; - } - - @Override - public ErrorType getErrorType() { - return null; - } - - @Override - public Map getExtensions() { - return this.parameters; - } -} diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java b/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java deleted file mode 100644 index d982f98db3..0000000000 --- a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/GraphQLErrorAdapter.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.graphql.error.handling.exception; - -import graphql.ErrorType; -import graphql.ExceptionWhileDataFetching; -import graphql.GraphQLError; -import graphql.language.SourceLocation; - -import java.util.List; -import java.util.Map; - -public class GraphQLErrorAdapter implements GraphQLError { - - private GraphQLError error; - - public GraphQLErrorAdapter(GraphQLError error) { - this.error = error; - } - - @Override - public Map getExtensions() { - return error.getExtensions(); - } - - @Override - public List getLocations() { - return error.getLocations(); - } - - @Override - public ErrorType getErrorType() { - return error.getErrorType(); - } - - @Override - public List getPath() { - return error.getPath(); - } - - @Override - public Map toSpecification() { - return error.toSpecification(); - } - - @Override - public String getMessage() { - return (error instanceof ExceptionWhileDataFetching) ? ((ExceptionWhileDataFetching) error).getException().getMessage() : error.getMessage(); - } -} \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java b/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java deleted file mode 100644 index 0d2ad8c597..0000000000 --- a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.graphql.error.handling.exception; - -import java.util.Map; - -public class VehicleNotFoundException extends AbstractGraphQLException { - - public VehicleNotFoundException(String message) { - super(message); - } - - public VehicleNotFoundException(String message, Map params) { - super(message, params); - } -} diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Mutation.java b/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Mutation.java deleted file mode 100644 index 8463ebf8eb..0000000000 --- a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Mutation.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.graphql.error.handling.resolver; - -import com.baeldung.graphql.error.handling.domain.Location; -import com.baeldung.graphql.error.handling.domain.Vehicle; -import com.baeldung.graphql.error.handling.service.InventoryService; -import com.coxautodev.graphql.tools.GraphQLMutationResolver; -import org.springframework.stereotype.Component; - -@Component -public class Mutation implements GraphQLMutationResolver { - private InventoryService inventoryService; - - public Mutation(InventoryService inventoryService) { - this.inventoryService = inventoryService; - } - - public Vehicle addVehicle(String vin, Integer year, String make, String model, String trim, Location location) { - return this.inventoryService.addVehicle(vin, year, make, model, trim, location); - } -} diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Query.java b/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Query.java deleted file mode 100644 index ece018464a..0000000000 --- a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/resolver/Query.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.baeldung.graphql.error.handling.resolver; - -import com.baeldung.graphql.error.handling.domain.Vehicle; -import com.baeldung.graphql.error.handling.service.InventoryService; -import com.coxautodev.graphql.tools.GraphQLQueryResolver; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class Query implements GraphQLQueryResolver { - private final InventoryService inventoryService; - - public Query(InventoryService inventoryService) { - this.inventoryService = inventoryService; - } - - public List searchAll() { - return this.inventoryService.searchAll(); - } - - public List searchByLocation(String zipcode) { - return this.inventoryService.searchByLocation(zipcode); - } - - public Vehicle searchByVin(String vin) { - return this.inventoryService.searchByVin(vin); - } -} diff --git a/graphql-modules/graphql-error-handling/src/main/resources/import.sql b/graphql-modules/graphql-error-handling/src/main/resources/import.sql deleted file mode 100644 index 62907a86c3..0000000000 --- a/graphql-modules/graphql-error-handling/src/main/resources/import.sql +++ /dev/null @@ -1,7 +0,0 @@ -insert into LOCATION values('07092', 'Mountainside', 'NJ'); -insert into LOCATION values ('94118', 'San Francisco', 'CA'); -insert into LOCATION values ('10002', 'New York', 'NY'); - -insert into VEHICLE (vin, year, make, model, trim, fk_location) values('KM8JN72DX7U587496', 2007, 'Hyundai', 'Tucson', null, '07092'); -insert into VEHICLE (vin, year, make, model, trim, fk_location) values('JTKKU4B41C1023346', 2012, 'Toyota', 'Scion', 'Xd', '94118'); -insert into VEHICLE (vin, year, make, model, trim, fk_location) values('1G1JC1444PZ215071', 2000, 'Chevrolet', 'CAVALIER VL', 'RS', '07092'); \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplicationIntegrationTest.java b/graphql-modules/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplicationIntegrationTest.java deleted file mode 100644 index 069a08ce02..0000000000 --- a/graphql-modules/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplicationIntegrationTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.graphql.error.handling; - -import com.graphql.spring.boot.test.GraphQLResponse; -import com.graphql.spring.boot.test.GraphQLTestTemplate; -import org.json.JSONException; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.skyscreamer.jsonassert.JSONAssert; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.context.junit4.SpringRunner; - -import java.io.IOException; - -import static com.baeldung.graphql.error.handling.TestUtils.readFile; -import static java.lang.String.format; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = GraphQLErrorHandlerApplication.class) -public class GraphQLErrorHandlerApplicationIntegrationTest { - - @Autowired - private GraphQLTestTemplate graphQLTestTemplate; - - private static final String GRAPHQL_TEST_REQUEST_PATH = "graphql/request/%s.graphql"; - private static final String GRAPHQL_TEST_RESPONSE_PATH = "graphql/response/%s.json"; - - @Test - public void whenUnknownOperation_thenRespondWithRequestError() throws IOException, JSONException { - String graphqlName = "request_error_unknown_operation"; - GraphQLResponse actualResponse = graphQLTestTemplate.postForResource(format(GRAPHQL_TEST_REQUEST_PATH, graphqlName)); - String expectedResponse = readFile(format(GRAPHQL_TEST_RESPONSE_PATH, graphqlName)); - - JSONAssert.assertEquals(expectedResponse, actualResponse.getRawResponse().getBody(), true); - } - - @Test - public void whenInvalidSyntaxRequest_thenRespondWithRequestError() throws IOException, JSONException { - String graphqlName = "request_error_invalid_request_syntax"; - GraphQLResponse actualResponse = graphQLTestTemplate.postForResource(format(GRAPHQL_TEST_REQUEST_PATH, graphqlName)); - String expectedResponse = readFile(format(GRAPHQL_TEST_RESPONSE_PATH, graphqlName)); - - JSONAssert.assertEquals(expectedResponse, actualResponse.getRawResponse().getBody(), true); - } - - @Test - public void whenRequestAllNonNullField_thenRespondPartialDataWithFieldError() throws IOException, JSONException { - String graphqlName = "field_error_request_non_null_fields_partial_response"; - GraphQLResponse actualResponse = graphQLTestTemplate.postForResource(format(GRAPHQL_TEST_REQUEST_PATH, graphqlName)); - String expectedResponse = readFile(format(GRAPHQL_TEST_RESPONSE_PATH, graphqlName)); - - JSONAssert.assertEquals(expectedResponse, actualResponse.getRawResponse().getBody(), true); - } -} diff --git a/graphql-modules/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/TestUtils.java b/graphql-modules/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/TestUtils.java deleted file mode 100644 index 557f1d9c91..0000000000 --- a/graphql-modules/graphql-error-handling/src/test/java/com/baeldung/graphql/error/handling/TestUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.graphql.error.handling; - -import org.apache.commons.io.IOUtils; -import org.springframework.core.io.ClassPathResource; - -import java.io.IOException; -import java.nio.charset.Charset; - -public class TestUtils { - public static String readFile(String path) throws IOException { - return IOUtils.toString( - new ClassPathResource(path).getInputStream(), Charset.defaultCharset() - ); - } -} diff --git a/graphql-modules/graphql-error-handling/src/test/resources/graphql/request/field_error_request_non_null_fields_partial_response.graphql b/graphql-modules/graphql-error-handling/src/test/resources/graphql/request/field_error_request_non_null_fields_partial_response.graphql deleted file mode 100644 index 17affc50cb..0000000000 --- a/graphql-modules/graphql-error-handling/src/test/resources/graphql/request/field_error_request_non_null_fields_partial_response.graphql +++ /dev/null @@ -1,10 +0,0 @@ -# trim is non null but one of the record has null value for trim -query { - searchAll { - vin - year - make - model - trim - } -} \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/field_error_request_non_null_fields_partial_response.json b/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/field_error_request_non_null_fields_partial_response.json deleted file mode 100644 index 760190128e..0000000000 --- a/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/field_error_request_non_null_fields_partial_response.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "data": { - "searchAll": [ - null, - { - "vin": "JTKKU4B41C1023346", - "year": 2012, - "make": "Toyota", - "model": "Scion", - "trim": "Xd" - }, - { - "vin": "1G1JC1444PZ215071", - "year": 2000, - "make": "Chevrolet", - "model": "CAVALIER VL", - "trim": "RS" - } - ] - }, - "errors": [ - { - "message": "Cannot return null for non-nullable type: 'String' within parent 'Vehicle' (/searchAll[0]/trim)", - "path": [ - "searchAll", - 0, - "trim" - ], - "errorType": "DataFetchingException", - "locations": null, - "extensions": null - } - ] -} \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/request_error_invalid_request_syntax.json b/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/request_error_invalid_request_syntax.json deleted file mode 100644 index 2835b42133..0000000000 --- a/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/request_error_invalid_request_syntax.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "data": null, - "errors": [ - { - "message": "Invalid Syntax", - "locations": [ - { - "line": 5, - "column": 8, - "sourceName": null - } - ], - "errorType": "InvalidSyntax", - "path": null, - "extensions": null - } - ] -} \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/request_error_unknown_operation.json b/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/request_error_unknown_operation.json deleted file mode 100644 index b5872fc80f..0000000000 --- a/graphql-modules/graphql-error-handling/src/test/resources/graphql/response/request_error_unknown_operation.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "data": null, - "errors": [ - { - "errorType": "OperationNotSupported", - "locations": [ - { - "line": 1, - "column": 1, - "sourceName": null - } - ], - "extensions": null, - "message": "Schema is not configured for subscriptions.", - "path": null - } - ] -} \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/test/resources/init_script.sql b/graphql-modules/graphql-error-handling/src/test/resources/init_script.sql deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/graphql-modules/graphql-spqr-boot-starter/README.md b/graphql-modules/graphql-spqr-boot-starter/README.md new file mode 100644 index 0000000000..7089a7a9f1 --- /dev/null +++ b/graphql-modules/graphql-spqr-boot-starter/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Getting Started With GraphQL SPQR and Spring Boot](https://www.baeldung.com/spring-boot-graphql-spqr) diff --git a/graphql-modules/graphql-spqr-boot-starter/pom.xml b/graphql-modules/graphql-spqr-boot-starter/pom.xml new file mode 100644 index 0000000000..6cb1d74329 --- /dev/null +++ b/graphql-modules/graphql-spqr-boot-starter/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + graphql-spqr-boot-starter + 1.0 + graphql-spqr-boot-starter + + + com.baeldung.graphql + graphql-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-webflux + test + + + io.leangen.graphql + graphql-spqr-spring-boot-starter + ${graphql-spqr-spring-boot-starter-version} + + + + + 0.0.6 + + + \ No newline at end of file diff --git a/graphql-modules/graphql-spqr/src/main/java/com/baeldung/SpringBootApp.java b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/SpqrBootStarterApp.java similarity index 69% rename from graphql-modules/graphql-spqr/src/main/java/com/baeldung/SpringBootApp.java rename to graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/SpqrBootStarterApp.java index dc49f6a7e4..a91bb22d76 100644 --- a/graphql-modules/graphql-spqr/src/main/java/com/baeldung/SpringBootApp.java +++ b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/SpqrBootStarterApp.java @@ -4,8 +4,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class SpringBootApp { +public class SpqrBootStarterApp { public static void main(String[] args) { - SpringApplication.run(SpringBootApp.class, args); + SpringApplication.run(SpqrBootStarterApp.class, args); } } diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/Book.java b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/Book.java similarity index 97% rename from spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/Book.java rename to graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/Book.java index c6ff9e515a..405eadca84 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/Book.java +++ b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/Book.java @@ -1,4 +1,4 @@ -package com.baeldung.sprq; +package com.baeldung.spqr; import java.util.Objects; diff --git a/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/BookService.java b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/BookService.java new file mode 100644 index 0000000000..fd63c10dfe --- /dev/null +++ b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/BookService.java @@ -0,0 +1,59 @@ +package com.baeldung.spqr; + +import io.leangen.graphql.annotations.GraphQLArgument; +import io.leangen.graphql.annotations.GraphQLMutation; +import io.leangen.graphql.annotations.GraphQLQuery; +import io.leangen.graphql.spqr.spring.annotations.GraphQLApi; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +@Service +@GraphQLApi +public class BookService implements IBookService { + + private static final Set BOOKS_DATA = initializeData(); + + @GraphQLQuery(name = "getBookWithTitle") + public Book getBookWithTitle(@GraphQLArgument(name = "title") String title) { + return BOOKS_DATA.stream() + .filter(book -> book.getTitle().equals(title)) + .findFirst() + .orElse(null); + } + + @GraphQLQuery(name = "getAllBooks", description = "Get all books") + public List getAllBooks() { + return new ArrayList<>(BOOKS_DATA); + } + + @GraphQLMutation(name = "addBook") + public Book addBook(@GraphQLArgument(name = "newBook") Book book) { + BOOKS_DATA.add(book); + return book; + } + + @GraphQLMutation(name = "updateBook") + public Book updateBook(@GraphQLArgument(name = "modifiedBook") Book book) { + BOOKS_DATA.removeIf(b -> Objects.equals(b.getId(), book.getId())); + BOOKS_DATA.add(book); + return book; + } + + @GraphQLMutation(name = "deleteBook") + public boolean deleteBook(@GraphQLArgument(name = "book") Book book) { + return BOOKS_DATA.remove(book); + } + + private static Set initializeData() { + Book book = new Book(1, "J.R.R. Tolkien", "The Lord of the Rings"); + Set books = new HashSet<>(); + books.add(book); + return books; + } + +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/IBookService.java b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/IBookService.java similarity index 88% rename from spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/IBookService.java rename to graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/IBookService.java index 1c1257c178..fa92494745 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/IBookService.java +++ b/graphql-modules/graphql-spqr-boot-starter/src/main/java/com/baeldung/spqr/IBookService.java @@ -1,4 +1,4 @@ -package com.baeldung.sprq; +package com.baeldung.spqr; import java.util.List; @@ -12,4 +12,4 @@ public interface IBookService { Book updateBook(Book book); boolean deleteBook(Book book); -} \ No newline at end of file +} diff --git a/graphql-modules/graphql-spqr-boot-starter/src/test/java/com/baeldung/spqr/SpqrBootStarterAppIntegrationTest.java b/graphql-modules/graphql-spqr-boot-starter/src/test/java/com/baeldung/spqr/SpqrBootStarterAppIntegrationTest.java new file mode 100644 index 0000000000..ee49711276 --- /dev/null +++ b/graphql-modules/graphql-spqr-boot-starter/src/test/java/com/baeldung/spqr/SpqrBootStarterAppIntegrationTest.java @@ -0,0 +1,62 @@ +package com.baeldung.spqr; + +import com.baeldung.SpqrBootStarterApp; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; +import reactor.core.publisher.Mono; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpqrBootStarterApp.class) +class SpqrBootStarterAppIntegrationTest { + + private static final String GRAPHQL_PATH = "/graphql"; + + @Autowired + private WebTestClient webTestClient; + + @Test + void whenGetAllBooks_thenValidResponseReturned() { + String getAllBooksQuery = "{getAllBooks{ id title author }}"; + + webTestClient.post() + .uri(GRAPHQL_PATH) + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(toJSON(getAllBooksQuery)), String.class) + .exchange() + .expectStatus().isOk() + .expectBody() + .jsonPath("$.data.getAllBooks").isNotEmpty(); + } + + @Test + void whenAddBook_thenValidResponseReturned() { + String addBookMutation = "mutation { addBook(newBook: {id: 123, author: \"J. K. Rowling\", " + + "title: \"Harry Potter and Philosopher's Stone\"}) { id author title } }"; + + webTestClient.post() + .uri(GRAPHQL_PATH) + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(toJSON(addBookMutation)), String.class) + .exchange() + .expectStatus().isOk() + .expectBody() + .jsonPath("$.data.addBook.id").isEqualTo("123") + .jsonPath("$.data.addBook.title").isEqualTo("Harry Potter and Philosopher's Stone") + .jsonPath("$.data.addBook.author").isEqualTo("J. K. Rowling"); + } + + private static String toJSON(String query) { + try { + return new JSONObject().put("query", query).toString(); + } catch (JSONException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/graphql-modules/graphql-spqr-boot-starter/src/test/java/com/baeldung/spqr/SpringContextTest.java b/graphql-modules/graphql-spqr-boot-starter/src/test/java/com/baeldung/spqr/SpringContextTest.java new file mode 100644 index 0000000000..b3a4b3f2f6 --- /dev/null +++ b/graphql-modules/graphql-spqr-boot-starter/src/test/java/com/baeldung/spqr/SpringContextTest.java @@ -0,0 +1,13 @@ +package com.baeldung.spqr; + +import com.baeldung.SpqrBootStarterApp; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = SpqrBootStarterApp.class) +class SpringContextTest { + + @Test + void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/graphql-modules/graphql-spqr/pom.xml b/graphql-modules/graphql-spqr/pom.xml index 3496be8e29..d845d1ac8a 100644 --- a/graphql-modules/graphql-spqr/pom.xml +++ b/graphql-modules/graphql-spqr/pom.xml @@ -13,19 +13,6 @@ 1.0.0-SNAPSHOT - - - - - org.springframework.boot - spring-boot-dependencies - 2.6.4 - pom - import - - - - org.springframework.boot @@ -33,13 +20,24 @@ io.leangen.graphql - graphql-spqr-spring-boot-starter - ${graphql-spqr-spring-boot-starter-version} + spqr + ${spqr-version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-webflux + test - 0.0.6 + 0.11.2 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookResolver.java b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/BookResolver.java similarity index 97% rename from spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookResolver.java rename to graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/BookResolver.java index 747d52f0af..1b9cd1b3b3 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookResolver.java +++ b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/BookResolver.java @@ -1,4 +1,4 @@ -package com.baeldung.sprq; +package com.baeldung.spqr; import io.leangen.graphql.annotations.GraphQLArgument; import io.leangen.graphql.annotations.GraphQLMutation; diff --git a/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java index 2e9c6d8367..60069f0307 100644 --- a/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java +++ b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/BookService.java @@ -1,51 +1,53 @@ package com.baeldung.spqr; -import io.leangen.graphql.annotations.GraphQLArgument; -import io.leangen.graphql.annotations.GraphQLMutation; -import io.leangen.graphql.annotations.GraphQLQuery; -import io.leangen.graphql.spqr.spring.annotations.GraphQLApi; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; @Service -@GraphQLApi public class BookService implements IBookService { - Set books = new HashSet<>(); + private static final Set BOOKS_DATA = initializeData(); - @GraphQLQuery(name = "getBookWithTitle") - public Book getBookWithTitle(@GraphQLArgument(name = "title") String title) { - return books.stream() - .filter(book -> book.getTitle() - .equals(title)) + @Override + public Book getBookWithTitle(String title) { + return BOOKS_DATA.stream() + .filter(book -> book.getTitle().equals(title)) .findFirst() .orElse(null); } - @GraphQLQuery(name = "getAllBooks", description = "Get all books") + @Override public List getAllBooks() { - return books.stream().collect(Collectors.toList()); + return new ArrayList<>(BOOKS_DATA); } - @GraphQLMutation(name = "addBook") - public Book addBook(@GraphQLArgument(name = "newBook") Book book) { - books.add(book); + @Override + public Book addBook(Book book) { + BOOKS_DATA.add(book); return book; } - @GraphQLMutation(name = "updateBook") - public Book updateBook(@GraphQLArgument(name = "modifiedBook") Book book) { - books.remove(book); - books.add(book); + @Override + public Book updateBook(Book book) { + BOOKS_DATA.removeIf(b -> Objects.equals(b.getId(), book.getId())); + BOOKS_DATA.add(book); return book; } - @GraphQLMutation(name = "deleteBook") - public boolean deleteBook(@GraphQLArgument(name = "book") Book book) { - return books.remove(book); + @Override + public boolean deleteBook(Book book) { + return BOOKS_DATA.remove(book); } -} \ No newline at end of file + + private static Set initializeData() { + Book book = new Book(1, "J.R.R. Tolkien", "The Lord of the Rings"); + Set books = new HashSet<>(); + books.add(book); + return books; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/GraphqlController.java b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/GraphqlController.java similarity index 83% rename from spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/GraphqlController.java rename to graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/GraphqlController.java index b62bdbd6a8..f2257b6dd9 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/GraphqlController.java +++ b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/GraphqlController.java @@ -1,4 +1,4 @@ -package com.baeldung.sprq; +package com.baeldung.spqr; import graphql.ExecutionResult; import graphql.GraphQL; @@ -21,9 +21,10 @@ public class GraphqlController { @Autowired public GraphqlController(BookResolver bookResolver) { - GraphQLSchema schema = new GraphQLSchemaGenerator().withBasePackages("com.baeldung") - .withOperationsFromSingleton(bookResolver) - .generate(); + GraphQLSchema schema = new GraphQLSchemaGenerator() + .withBasePackages("com.baeldung") + .withOperationsFromSingleton(bookResolver) + .generate(); this.graphQL = new GraphQL.Builder(schema).build(); } diff --git a/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java index fa92494745..708415d754 100644 --- a/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java +++ b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/IBookService.java @@ -12,4 +12,4 @@ public interface IBookService { Book updateBook(Book book); boolean deleteBook(Book book); -} +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/SpqrApp.java b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/SpqrApp.java similarity index 54% rename from spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/SpqrApp.java rename to graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/SpqrApp.java index ec471aa8eb..83d81b43b9 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/SpqrApp.java +++ b/graphql-modules/graphql-spqr/src/main/java/com/baeldung/spqr/SpqrApp.java @@ -1,12 +1,9 @@ -package com.baeldung.sprq; +package com.baeldung.spqr; -import org.jobrunr.autoconfigure.JobRunrAutoConfiguration; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -@EnableAutoConfiguration(exclude = { JobRunrAutoConfiguration.class}) public class SpqrApp { public static void main(String[] args) { diff --git a/graphql-modules/graphql-spqr/src/test/java/com/baeldung/spqr/SpqrAppIntegrationTest.java b/graphql-modules/graphql-spqr/src/test/java/com/baeldung/spqr/SpqrAppIntegrationTest.java new file mode 100644 index 0000000000..b7b3d4404b --- /dev/null +++ b/graphql-modules/graphql-spqr/src/test/java/com/baeldung/spqr/SpqrAppIntegrationTest.java @@ -0,0 +1,61 @@ +package com.baeldung.spqr; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; +import reactor.core.publisher.Mono; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpqrApp.class) +class SpqrAppIntegrationTest { + + private static final String GRAPHQL_PATH = "/graphql"; + + @Autowired + private WebTestClient webTestClient; + + @Test + void whenGetAllBooks_thenValidResponseReturned() { + String getAllBooksQuery = "{getAllBooks{ id title author }}"; + + webTestClient.post() + .uri(GRAPHQL_PATH) + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(toJSON(getAllBooksQuery)), String.class) + .exchange() + .expectStatus().isOk() + .expectBody() + .jsonPath("$.getAllBooks").isNotEmpty(); + } + + @Test + void whenAddBook_thenValidResponseReturned() { + String addBookMutation = "mutation { addBook(newBook: {id: 123, author: \"J. K. Rowling\", " + + "title: \"Harry Potter and Philosopher's Stone\"}) { id author title } }"; + + webTestClient.post() + .uri(GRAPHQL_PATH) + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(toJSON(addBookMutation)), String.class) + .exchange() + .expectStatus().isOk() + .expectBody() + .jsonPath("$.addBook.id").isEqualTo("123") + .jsonPath("$.addBook.title").isEqualTo("Harry Potter and Philosopher's Stone") + .jsonPath("$.addBook.author").isEqualTo("J. K. Rowling"); + } + + private static String toJSON(String query) { + try { + return new JSONObject().put("query", query).toString(); + } catch (JSONException e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/graphql-modules/graphql-spqr/src/test/java/com/baeldung/spqr/SpringContextTest.java b/graphql-modules/graphql-spqr/src/test/java/com/baeldung/spqr/SpringContextTest.java new file mode 100644 index 0000000000..2271ecbdcc --- /dev/null +++ b/graphql-modules/graphql-spqr/src/test/java/com/baeldung/spqr/SpringContextTest.java @@ -0,0 +1,12 @@ +package com.baeldung.spqr; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = SpqrApp.class) +class SpringContextTest { + + @Test + void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/graphql-modules/pom.xml b/graphql-modules/pom.xml index 95af87843d..28b075a819 100644 --- a/graphql-modules/pom.xml +++ b/graphql-modules/pom.xml @@ -11,16 +11,28 @@ com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 + parent-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-dependencies + 2.6.4 + pom + import + + + + graphql-dgs - graphql-error-handling graphql-java graphql-spqr + graphql-spqr-boot-starter - \ No newline at end of file + diff --git a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java index 43e21100ea..18345d40ab 100644 --- a/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java +++ b/jackson-modules/jackson-conversions/src/test/java/com/baeldung/jackson/enums/deserialization/DefaultEnumDeserializationUnitTest.java @@ -1,20 +1,33 @@ package com.baeldung.jackson.enums.deserialization; import static org.junit.jupiter.api.Assertions.assertEquals; + import java.io.IOException; import org.junit.Test; -import com.fasterxml.jackson.core.JsonParseException; + +import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; public class DefaultEnumDeserializationUnitTest { @Test - public void givenEnum_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException { + public void givenEnum_whenDeserializingJson_thenCorrectRepresentation() throws IOException { String json = "{\"distance\":\"KILOMETER\"}"; City city = new ObjectMapper().readValue(json, City.class); - + assertEquals(Distance.KILOMETER, city.getDistance()); } + @Test + public void givenEnum_whenDeserializingJsonWithMapperFeature_thenCorrectRepresentation() throws IOException { + String json = "{\"distance\":\"KiLoMeTeR\"}"; + ObjectMapper objectMapper = JsonMapper.builder() + .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS) + .build(); + City city = objectMapper.readValue(json, City.class); + + assertEquals(Distance.KILOMETER, city.getDistance()); + } } diff --git a/libraries-7/README.md b/libraries-7/README.md new file mode 100644 index 0000000000..6f0a7d2505 --- /dev/null +++ b/libraries-7/README.md @@ -0,0 +1,12 @@ +## Libraries-7 + +This module contains articles about various Java libraries. +These are small libraries that are relatively easy to use and do not require any separate module of their own. + +The code examples related to different libraries are each in their own module. + +Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases. + +### Relevant articles +- [Guide to Simple Binary Encoding](https://www.baeldung.com/java-sbe) +- More articles [[<-- prev]](/libraries-6) diff --git a/libraries-7/pom.xml b/libraries-7/pom.xml new file mode 100644 index 0000000000..9bc6d2cf52 --- /dev/null +++ b/libraries-7/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + libraries-7 + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + org.agrona + agrona + 1.17.1 + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + generate-sources + + java + + + + + false + true + uk.co.real_logic.sbe.SbeTool + + + sbe.output.dir + ${project.build.directory}/generated-sources/java + + + + ${project.basedir}/src/main/resources/schema.xml + + ${project.build.directory}/generated-sources/java + + + + uk.co.real-logic + sbe-tool + 1.27.0 + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/java/ + + + + + + + + + diff --git a/libraries-7/src/main/java/com/baeldung/sbe/MarketData.java b/libraries-7/src/main/java/com/baeldung/sbe/MarketData.java new file mode 100644 index 0000000000..2aaa30608d --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/sbe/MarketData.java @@ -0,0 +1,98 @@ +package com.baeldung.sbe; + +import java.util.StringJoiner; + +import com.baeldung.sbe.stub.Currency; +import com.baeldung.sbe.stub.Market; + +public class MarketData { + + private final int amount; + private final double price; + private final Market market; + private final Currency currency; + private final String symbol; + + public MarketData(int amount, double price, Market market, Currency currency, String symbol) { + this.amount = amount; + this.price = price; + this.market = market; + this.currency = currency; + this.symbol = symbol; + } + + public static class Builder { + private int amount; + + public Builder amount(int amount) { + this.amount = amount; + return this; + } + + private double price; + + public Builder price(double price) { + this.price = price; + return this; + } + + private Market market; + + public Builder market(Market market) { + this.market = market; + return this; + } + + private Currency currency; + + public Builder currency(Currency currency) { + this.currency = currency; + return this; + } + + private String symbol; + + public Builder symbol(String symbol) { + this.symbol = symbol; + return this; + } + + public MarketData build() { + return new MarketData(amount, price, market, currency, symbol); + } + } + + public static Builder builder() { + return new Builder(); + } + + public int getAmount() { + return amount; + } + + public double getPrice() { + return price; + } + + public Market getMarket() { + return market; + } + + public Currency getCurrency() { + return currency; + } + + public String getSymbol() { + return symbol; + } + + @Override + public String toString() { + return new StringJoiner(", ", MarketData.class.getSimpleName() + "[", "]").add("amount=" + amount) + .add("price=" + price) + .add("market=" + market) + .add("currency=" + currency) + .add("symbol='" + symbol + "'") + .toString(); + } +} diff --git a/libraries-7/src/main/java/com/baeldung/sbe/MarketDataSource.java b/libraries-7/src/main/java/com/baeldung/sbe/MarketDataSource.java new file mode 100644 index 0000000000..3cf7339f08 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/sbe/MarketDataSource.java @@ -0,0 +1,48 @@ +package com.baeldung.sbe; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.LinkedList; + +import com.baeldung.sbe.stub.Currency; +import com.baeldung.sbe.stub.Market; + +public class MarketDataSource implements Iterator { + + private final LinkedList dataQueue = new LinkedList<>(); + + public MarketDataSource() { + // adding some test data into queue + this.dataQueue.addAll(Arrays.asList(MarketData.builder() + .amount(1) + .market(Market.NASDAQ) + .symbol("AAPL") + .price(134.12) + .currency(Currency.USD) + .build(), MarketData.builder() + .amount(2) + .market(Market.NYSE) + .symbol("IBM") + .price(128.99) + .currency(Currency.USD) + .build(), MarketData.builder() + .amount(1) + .market(Market.NASDAQ) + .symbol("AXP") + .price(34.87) + .currency(Currency.EUR) + .build())); + } + + @Override + public boolean hasNext() { + return !this.dataQueue.isEmpty(); + } + + @Override + public MarketData next() { + final MarketData data = this.dataQueue.pop(); + this.dataQueue.add(data); + return data; + } +} diff --git a/libraries-7/src/main/java/com/baeldung/sbe/MarketDataStreamServer.java b/libraries-7/src/main/java/com/baeldung/sbe/MarketDataStreamServer.java new file mode 100644 index 0000000000..a8b5809658 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/sbe/MarketDataStreamServer.java @@ -0,0 +1,92 @@ +package com.baeldung.sbe; + +import java.nio.ByteBuffer; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MarketDataStreamServer { + + private static final Logger log = LoggerFactory.getLogger(MarketDataStreamServer.class); + + ByteBuffer buffer = ByteBuffer.allocate(128); + + final AtomicLong writePos = new AtomicLong(); + + ScheduledExecutorService writerThread = Executors.newScheduledThreadPool(1); + ScheduledExecutorService readerThreadPool = Executors.newScheduledThreadPool(2); + + private class Client { + + final String name; + final ByteBuffer readOnlyBuffer; + + final AtomicLong readPos = new AtomicLong(); + + Client(String name, ByteBuffer source) { + this.name = name; + this.readOnlyBuffer = source.asReadOnlyBuffer(); + } + + void readTradeData() { + while (readPos.get() < writePos.get()) { + try { + final int pos = this.readOnlyBuffer.position(); + final MarketData data = MarketDataUtil.readAndDecode(this.readOnlyBuffer); + readPos.addAndGet(this.readOnlyBuffer.position() - pos); + log.info(" client: {}, read/write gap: {}, data: {}", name, writePos.get() - readPos.get(), data); + } catch (IndexOutOfBoundsException e) { + this.readOnlyBuffer.clear(); // ring buffer + } catch (Exception e) { + log.error(" cannot read from buffer {}", readOnlyBuffer); + } + } + if (this.readOnlyBuffer.remaining() == 0) { + this.readOnlyBuffer.clear(); // ring buffer + } + } + + void read() { + readerThreadPool.scheduleAtFixedRate(this::readTradeData, 1, 1, TimeUnit.SECONDS); + } + } + + private Client newClient(String name) { + return new Client(name, buffer); + } + + private void writeTradeData(MarketData data) { + try { + final int writtenBytes = MarketDataUtil.encodeAndWrite(buffer, data); + writePos.addAndGet(writtenBytes); + log.info(" buffer size remaining: %{}, data: {}", 100 * buffer.remaining() / buffer.capacity(), data); + } catch (IndexOutOfBoundsException e) { + buffer.clear(); // ring buffer + writeTradeData(data); + } catch (Exception e) { + log.error(" cannot write into buffer {}", buffer); + } + } + + private void run(MarketDataSource source) { + writerThread.scheduleAtFixedRate(() -> { + if (source.hasNext()) { + writeTradeData(source.next()); + } + }, 1, 2, TimeUnit.SECONDS); + } + + public static void main(String[] args) { + MarketDataStreamServer server = new MarketDataStreamServer(); + Client client1 = server.newClient("client1"); + client1.read(); + Client client2 = server.newClient("client2"); + client2.read(); + server.run(new MarketDataSource()); + } + +} diff --git a/libraries-7/src/main/java/com/baeldung/sbe/MarketDataUtil.java b/libraries-7/src/main/java/com/baeldung/sbe/MarketDataUtil.java new file mode 100644 index 0000000000..f85173e786 --- /dev/null +++ b/libraries-7/src/main/java/com/baeldung/sbe/MarketDataUtil.java @@ -0,0 +1,78 @@ +package com.baeldung.sbe; + +import java.math.BigDecimal; +import java.nio.ByteBuffer; + +import org.agrona.concurrent.UnsafeBuffer; + +import com.baeldung.sbe.stub.MessageHeaderDecoder; +import com.baeldung.sbe.stub.MessageHeaderEncoder; +import com.baeldung.sbe.stub.TradeDataDecoder; +import com.baeldung.sbe.stub.TradeDataEncoder; + +public class MarketDataUtil { + + public static int encodeAndWrite(ByteBuffer buffer, MarketData marketData) { + + final int pos = buffer.position(); + + final UnsafeBuffer directBuffer = new UnsafeBuffer(buffer); + final MessageHeaderEncoder headerEncoder = new MessageHeaderEncoder(); + final TradeDataEncoder dataEncoder = new TradeDataEncoder(); + + final BigDecimal priceDecimal = BigDecimal.valueOf(marketData.getPrice()); + final int priceMantis = priceDecimal.scaleByPowerOfTen(priceDecimal.scale()) + .intValue(); + final int priceExponent = priceDecimal.scale() * -1; + + final TradeDataEncoder encoder = dataEncoder.wrapAndApplyHeader(directBuffer, pos, headerEncoder); + encoder.amount(marketData.getAmount()); + encoder.quote() + .market(marketData.getMarket()) + .currency(marketData.getCurrency()) + .symbol(marketData.getSymbol()) + .price() + .mantissa(priceMantis) + .exponent((byte) priceExponent); + + // set position + final int encodedLength = headerEncoder.encodedLength() + encoder.encodedLength(); + buffer.position(pos + encodedLength); + return encodedLength; + } + + public static MarketData readAndDecode(ByteBuffer buffer) { + + final int pos = buffer.position(); + + final UnsafeBuffer directBuffer = new UnsafeBuffer(buffer); + final MessageHeaderDecoder headerDecoder = new MessageHeaderDecoder(); + final TradeDataDecoder dataDecoder = new TradeDataDecoder(); + + dataDecoder.wrapAndApplyHeader(directBuffer, pos, headerDecoder); + + // set position + final int encodedLength = headerDecoder.encodedLength() + dataDecoder.encodedLength(); + buffer.position(pos + encodedLength); + + final double price = BigDecimal.valueOf(dataDecoder.quote() + .price() + .mantissa()) + .scaleByPowerOfTen(dataDecoder.quote() + .price() + .exponent()) + .doubleValue(); + + return MarketData.builder() + .amount(dataDecoder.amount()) + .symbol(dataDecoder.quote() + .symbol()) + .market(dataDecoder.quote() + .market()) + .currency(dataDecoder.quote() + .currency()) + .price(price) + .build(); + } + +} diff --git a/libraries-7/src/main/resources/schema.xml b/libraries-7/src/main/resources/schema.xml new file mode 100644 index 0000000000..010ccd276b --- /dev/null +++ b/libraries-7/src/main/resources/schema.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + 0 + 1 + + + + + + + + 0 + 1 + + + + + + + + + + + + + diff --git a/libraries-7/src/test/java/com/baeldung/test/EncodeDecodeMarketDataUnitTest.java b/libraries-7/src/test/java/com/baeldung/test/EncodeDecodeMarketDataUnitTest.java new file mode 100644 index 0000000000..5c6c5118a9 --- /dev/null +++ b/libraries-7/src/test/java/com/baeldung/test/EncodeDecodeMarketDataUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.test; + +import java.math.BigDecimal; +import java.nio.ByteBuffer; + +import org.agrona.concurrent.UnsafeBuffer; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.baeldung.sbe.MarketData; +import com.baeldung.sbe.stub.Currency; +import com.baeldung.sbe.stub.Market; +import com.baeldung.sbe.stub.MessageHeaderDecoder; +import com.baeldung.sbe.stub.MessageHeaderEncoder; +import com.baeldung.sbe.stub.TradeDataDecoder; +import com.baeldung.sbe.stub.TradeDataEncoder; + +public class EncodeDecodeMarketDataUnitTest { + + private MarketData marketData; + + @BeforeEach + public void setup() { + marketData = new MarketData(2, 128.99, Market.NYSE, Currency.USD, "IBM"); + } + + @Test + public void givenMarketData_whenEncode_thenDecodedValuesMatch() { + // our buffer to write encoded data, initial cap. 128 bytes + UnsafeBuffer buffer = new UnsafeBuffer(ByteBuffer.allocate(128)); + // necessary encoders + MessageHeaderEncoder headerEncoder = new MessageHeaderEncoder(); + TradeDataEncoder dataEncoder = new TradeDataEncoder(); + // we parse price data (double) into two parts: mantis and exponent + BigDecimal priceDecimal = BigDecimal.valueOf(marketData.getPrice()); + int priceMantissa = priceDecimal.scaleByPowerOfTen(priceDecimal.scale()) + .intValue(); + int priceExponent = priceDecimal.scale() * -1; + // encode data + TradeDataEncoder encoder = dataEncoder.wrapAndApplyHeader(buffer, 0, headerEncoder); + encoder.amount(marketData.getAmount()); + encoder.quote() + .market(marketData.getMarket()) + .currency(marketData.getCurrency()) + .symbol(marketData.getSymbol()) + .price() + .mantissa(priceMantissa) + .exponent((byte) priceExponent); + + // necessary decoders + MessageHeaderDecoder headerDecoder = new MessageHeaderDecoder(); + TradeDataDecoder dataDecoder = new TradeDataDecoder(); + // decode data + dataDecoder.wrapAndApplyHeader(buffer, 0, headerDecoder); + // decode price data (from mantissa and exponent) into a double + double price = BigDecimal.valueOf(dataDecoder.quote() + .price() + .mantissa()) + .scaleByPowerOfTen(dataDecoder.quote() + .price() + .exponent()) + .doubleValue(); + // ensure we have the exact same values + Assertions.assertEquals(2, dataDecoder.amount()); + Assertions.assertEquals("IBM", dataDecoder.quote() + .symbol()); + Assertions.assertEquals(Market.NYSE, dataDecoder.quote() + .market()); + Assertions.assertEquals(Currency.USD, dataDecoder.quote() + .currency()); + Assertions.assertEquals(128.99, price); + } + +} diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml index 9bf6c40e19..1e834061ec 100644 --- a/libraries-apache-commons/pom.xml +++ b/libraries-apache-commons/pom.xml @@ -41,7 +41,7 @@ org.apache.commons commons-math3 - ${common-math3.version} + ${commons-math3.version} com.h2database @@ -56,7 +56,7 @@ commons-io commons-io - ${common-io.version} + ${commons-io.version} @@ -66,8 +66,7 @@ 1.2 1.6 3.5.2 - 3.6.1 - 2.5 + 3.6.1 \ No newline at end of file diff --git a/libraries-apache-commons/src/test/resources/employees.sql b/libraries-apache-commons/src/test/resources/employees.sql index c6109724cf..a55243c3dc 100644 --- a/libraries-apache-commons/src/test/resources/employees.sql +++ b/libraries-apache-commons/src/test/resources/employees.sql @@ -21,17 +21,17 @@ CREATE TABLE employee_legacy( ); -INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('John', 'Doe', 10000.10, to_date('01-01-2001','dd-mm-yyyy')); -INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Kevin', 'Smith', 20000.20, to_date('02-02-2002','dd-mm-yyyy')); -INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Kim', 'Smith', 30000.30, to_date('03-03-2003','dd-mm-yyyy')); -INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Stephen', 'Torvalds', 40000.40, to_date('04-04-2004','dd-mm-yyyy')); -INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Christian', 'Reynolds', 50000.50, to_date('05-05-2005','dd-mm-yyyy')); +INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('John', 'Doe', 10000.10, PARSEDATETIME('20010101','yyyyMMdd')); +INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Kevin', 'Smith', 20000.20, PARSEDATETIME('20020202','yyyyMMdd')); +INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Kim', 'Smith', 30000.30, PARSEDATETIME('20030303','yyyyMMdd')); +INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Stephen', 'Torvalds', 40000.40, PARSEDATETIME('20040404','yyyyMMdd')); +INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Christian', 'Reynolds', 50000.50, PARSEDATETIME('20050505','yyyyMMdd')); -INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('John', 'Doe', 10000.10, to_date('01-01-2001','dd-mm-yyyy')); -INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Kevin', 'Smith', 20000.20, to_date('02-02-2002','dd-mm-yyyy')); -INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Kim', 'Smith', 30000.30, to_date('03-03-2003','dd-mm-yyyy')); -INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Stephen', 'Torvalds', 40000.40, to_date('04-04-2004','dd-mm-yyyy')); -INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Christian', 'Reynolds', 50000.50, to_date('05-05-2005','dd-mm-yyyy')); +INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('John', 'Doe', 10000.10, PARSEDATETIME('20010101','yyyyMMdd')); +INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Kevin', 'Smith', 20000.20, PARSEDATETIME('20020202','yyyyMMdd')); +INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Kim', 'Smith', 30000.30, PARSEDATETIME('20030303','yyyyMMdd')); +INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Stephen', 'Torvalds', 40000.40, PARSEDATETIME('20040404','yyyyMMdd')); +INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Christian', 'Reynolds', 50000.50, PARSEDATETIME('20050505','yyyyMMdd')); INSERT INTO email (employeeid,address) VALUES (1, 'john@baeldung.com'); INSERT INTO email (employeeid,address) VALUES (1, 'john@gmail.com'); diff --git a/libraries-data-2/pom.xml b/libraries-data-2/pom.xml index 146e50b2e1..d5322267d0 100644 --- a/libraries-data-2/pom.xml +++ b/libraries-data-2/pom.xml @@ -151,7 +151,6 @@ 0.1.0 1.0.3 9.1.5.Final - 4.3.8.RELEASE 4.0.0 1.1.0 diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index f0f5338560..a6f8730538 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -174,7 +174,7 @@ 2.8.2 1.1.1 1.5.0 - 3.8.4 + 5.2.0 0.15.0 2.2.0 1.6.0.1 diff --git a/libraries-data/src/test/java/com/baeldung/jcache/CacheLoaderIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jcache/CacheLoaderIntegrationTest.java index 8017418eba..510083280d 100644 --- a/libraries-data/src/test/java/com/baeldung/jcache/CacheLoaderIntegrationTest.java +++ b/libraries-data/src/test/java/com/baeldung/jcache/CacheLoaderIntegrationTest.java @@ -16,21 +16,22 @@ import org.junit.Test; public class CacheLoaderIntegrationTest { private static final String CACHE_NAME = "SimpleCache"; + private static final String HAZELCAST_MEMBER_CACHING_PROVIDER = "com.hazelcast.cache.HazelcastMemberCachingProvider"; private Cache cache; @Before public void setup() { // Adding fully qualified class name because of multiple Cache Provider (Ignite and Hazelcast) - CachingProvider cachingProvider = Caching.getCachingProvider("com.hazelcast.cache.HazelcastCachingProvider"); + CachingProvider cachingProvider = Caching.getCachingProvider(HAZELCAST_MEMBER_CACHING_PROVIDER); CacheManager cacheManager = cachingProvider.getCacheManager(); MutableConfiguration config = new MutableConfiguration().setReadThrough(true).setCacheLoaderFactory(new FactoryBuilder.SingletonFactory<>(new SimpleCacheLoader())); - this.cache = cacheManager.createCache("SimpleCache", config); + this.cache = cacheManager.createCache( CACHE_NAME, config ); } @After public void tearDown() { - Caching.getCachingProvider("com.hazelcast.cache.HazelcastCachingProvider").getCacheManager().destroyCache(CACHE_NAME); + Caching.getCachingProvider(HAZELCAST_MEMBER_CACHING_PROVIDER).getCacheManager().destroyCache(CACHE_NAME); } @Test diff --git a/libraries-data/src/test/java/com/baeldung/jcache/EntryProcessorIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jcache/EntryProcessorIntegrationTest.java index fd1e9c29a9..f474ae0d94 100644 --- a/libraries-data/src/test/java/com/baeldung/jcache/EntryProcessorIntegrationTest.java +++ b/libraries-data/src/test/java/com/baeldung/jcache/EntryProcessorIntegrationTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.assertEquals; public class EntryProcessorIntegrationTest { private static final String CACHE_NAME = "MyCache"; - private static final String CACHE_PROVIDER_NAME = "com.hazelcast.cache.HazelcastCachingProvider"; + private static final String CACHE_PROVIDER_NAME = "com.hazelcast.cache.HazelcastMemberCachingProvider"; private Cache cache; diff --git a/libraries-data/src/test/java/com/baeldung/jcache/EventListenerIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jcache/EventListenerIntegrationTest.java index 512a75ec61..a90dcff46d 100644 --- a/libraries-data/src/test/java/com/baeldung/jcache/EventListenerIntegrationTest.java +++ b/libraries-data/src/test/java/com/baeldung/jcache/EventListenerIntegrationTest.java @@ -17,7 +17,7 @@ import static org.junit.Assert.assertEquals; public class EventListenerIntegrationTest { private static final String CACHE_NAME = "MyCache"; - private static final String CACHE_PROVIDER_NAME = "com.hazelcast.cache.HazelcastCachingProvider"; + private static final String CACHE_PROVIDER_NAME = "com.hazelcast.cache.HazelcastMemberCachingProvider"; private Cache cache; private SimpleCacheEntryListener listener; @@ -38,7 +38,7 @@ public class EventListenerIntegrationTest { } @Test - public void whenRunEvent_thenCorrect() throws InterruptedException { + public void whenRunEvent_thenCorrect() { this.listenerConfiguration = new MutableCacheEntryListenerConfiguration<>(FactoryBuilder.factoryOf(this.listener), null, false, true); this.cache.registerCacheEntryListener(this.listenerConfiguration); diff --git a/libraries-data/src/test/java/com/baeldung/jcache/JCacheIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jcache/JCacheIntegrationTest.java index 33521469fa..07b0633483 100644 --- a/libraries-data/src/test/java/com/baeldung/jcache/JCacheIntegrationTest.java +++ b/libraries-data/src/test/java/com/baeldung/jcache/JCacheIntegrationTest.java @@ -14,7 +14,7 @@ public class JCacheIntegrationTest { @Test public void instantiateCache() { - CachingProvider cachingProvider = Caching.getCachingProvider("com.hazelcast.cache.HazelcastCachingProvider"); + CachingProvider cachingProvider = Caching.getCachingProvider("com.hazelcast.cache.HazelcastMemberCachingProvider"); CacheManager cacheManager = cachingProvider.getCacheManager(); MutableConfiguration config = new MutableConfiguration<>(); Cache cache = cacheManager.createCache("simpleCache", config); diff --git a/libraries-files/pom.xml b/libraries-files/pom.xml index 7e21d127bb..72e6c331ee 100644 --- a/libraries-files/pom.xml +++ b/libraries-files/pom.xml @@ -42,7 +42,6 @@ 0.5.4 2.8.0 - 2.13.1 diff --git a/libraries-http/pom.xml b/libraries-http/pom.xml index 0ee5f4b290..0077a5047e 100644 --- a/libraries-http/pom.xml +++ b/libraries-http/pom.xml @@ -110,7 +110,6 @@ 2.8.5 4.5.3 - 4.9.1 1.23.0 2.2.0 diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index 279cb20225..15b454d5c6 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -189,6 +189,7 @@ 2.7.0 0.14.1 1.0.0 + 1.4.200 \ No newline at end of file diff --git a/libraries-testing/src/test/resources/dbunit/schema.sql b/libraries-testing/src/test/resources/dbunit/schema.sql index c2a8d2d630..42aa39c7b3 100644 --- a/libraries-testing/src/test/resources/dbunit/schema.sql +++ b/libraries-testing/src/test/resources/dbunit/schema.sql @@ -1,28 +1,25 @@ CREATE TABLE IF NOT EXISTS CLIENTS ( - `id` int AUTO_INCREMENT NOT NULL, + `id` int PRIMARY KEY AUTO_INCREMENT NOT NULL, `first_name` varchar(100) NOT NULL, - `last_name` varchar(100) NOT NULL, - PRIMARY KEY (`id`) + `last_name` varchar(100) NOT NULL ); CREATE TABLE IF NOT EXISTS ITEMS ( - `id` int AUTO_INCREMENT NOT NULL, + `id` int PRIMARY KEY AUTO_INCREMENT NOT NULL, `title` varchar(100) NOT NULL, `produced` date, - `price` float, - PRIMARY KEY (`id`) + `price` float ); CREATE TABLE IF NOT EXISTS PURCHASES ( - `id` int NOT NULL AUTO_INCREMENT, + `id` int PRIMARY KEY AUTO_INCREMENT NOT NULL, `id_user` int NOT NULL, `id_item` int NOT NULL, `total_price` float NOT NULL, - `quantity` int(11) NOT NULL, - PRIMARY KEY (`id`), + `quantity` int NOT NULL, FOREIGN KEY (`id_user`) REFERENCES CLIENTS (`id`) ON DELETE CASCADE, FOREIGN KEY (`id_item`) REFERENCES ITEMS (`id`) ON DELETE CASCADE ON UPDATE CASCADE ); diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index c3a3f4e0f9..02530055e1 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -113,6 +113,7 @@ 2.1.1 2.17.1 yyyyMMddHHmmss + 1.4.200 \ No newline at end of file diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index 03a6c91598..e4e38b721a 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -88,8 +88,8 @@ 3.3.0 1.0.22.RELEASE - 2.7.2 + 2.7.5 1.9.1 - \ No newline at end of file + diff --git a/patterns-modules/README.md b/patterns-modules/README.md index 86795e7a3f..8cf237defd 100644 --- a/patterns-modules/README.md +++ b/patterns-modules/README.md @@ -1,3 +1,5 @@ ## Patterns Modules This module contains articles about design patterns. + +- [Coupling in Java](https://www.baeldung.com/java-coupling-classes-tight-loose) diff --git a/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserResponseFormatterUnitTest.java b/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserResponseFormatterUnitTest.java index e394cbbf94..1c37766185 100644 --- a/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserResponseFormatterUnitTest.java +++ b/patterns-modules/clean-architecture/src/test/java/com/baeldung/pattern/cleanarchitecture/usercreation/UserResponseFormatterUnitTest.java @@ -2,16 +2,25 @@ package com.baeldung.pattern.cleanarchitecture.usercreation; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.verify; + +import org.mockito.ArgumentCaptor; import org.junit.jupiter.api.Test; import org.springframework.web.server.ResponseStatusException; -import com.baeldung.pattern.cleanarchitecture.usercreation.UserResponseFormatter; -import com.baeldung.pattern.cleanarchitecture.usercreation.UserResponseModel; - class UserResponseFormatterUnitTest { UserResponseFormatter userResponseFormatter = new UserResponseFormatter(); + UserRegisterDsGateway userDsGateway = mock(UserRegisterDsGateway.class); + UserPresenter userPresenter = mock(UserPresenter.class); + UserFactory userFactory = mock(UserFactory.class); + UserInputBoundary userInputBoundary = new UserRegisterInteractor(userDsGateway, userPresenter, userFactory); + ArgumentCaptor userRequestModelArgumentCaptor = ArgumentCaptor.forClass(String.class); @Test void givenDateAnd3HourTime_whenPrepareSuccessView_thenReturnOnly3HourTime() { @@ -23,7 +32,19 @@ class UserResponseFormatterUnitTest { @Test void whenPrepareFailView_thenThrowHttpConflictException() { - assertThatThrownBy(() -> userResponseFormatter.prepareFailView("Invalid password")) - .isInstanceOf(ResponseStatusException.class); + assertThatThrownBy(() -> userResponseFormatter.prepareFailView("Invalid password")).isInstanceOf(ResponseStatusException.class); } -} + + @Test + void whenCreateUser_thenSuccess() { + + UserRequestModel userRequestModel = new UserRequestModel("baeldung", "123456"); + when(userFactory.create(anyString(), anyString())).thenReturn(new CommonUser("baeldung", "123456")); + + userInputBoundary.create(userRequestModel); + + verify(userDsGateway).existsByName(userRequestModelArgumentCaptor.capture()); + String name = userRequestModel.getName(); + assertEquals("baeldung", name); + } +} \ No newline at end of file diff --git a/patterns-modules/coupling/pom.xml b/patterns-modules/coupling/pom.xml new file mode 100644 index 0000000000..9c1a630962 --- /dev/null +++ b/patterns-modules/coupling/pom.xml @@ -0,0 +1,14 @@ + + + + patterns-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + coupling + + \ No newline at end of file diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/CSVExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/CSVExport.java new file mode 100644 index 0000000000..28c06e1831 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/CSVExport.java @@ -0,0 +1,14 @@ +package com.baeldung.loose; + +import java.io.File; +import java.util.List; + +public class CSVExport implements ExportMetadata { + @Override + public File export(List metadata) { + System.out.println("Exporting data..."); + // Export Metadata + File outputCSV = null; + return outputCSV; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/ExportMetadata.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/ExportMetadata.java new file mode 100644 index 0000000000..9a21c679b8 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/ExportMetadata.java @@ -0,0 +1,8 @@ +package com.baeldung.loose; + +import java.io.File; +import java.util.List; + +public interface ExportMetadata { + File export(List metadata); +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/FetchMetadata.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/FetchMetadata.java new file mode 100644 index 0000000000..e9e39f4a65 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/FetchMetadata.java @@ -0,0 +1,7 @@ +package com.baeldung.loose; + +import java.util.List; + +public interface FetchMetadata { + List fetchMetadata(); +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/JSONFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/JSONFetch.java new file mode 100644 index 0000000000..4ae178e4eb --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/JSONFetch.java @@ -0,0 +1,12 @@ +package com.baeldung.loose; + +import java.util.ArrayList; +import java.util.List; + +public class JSONFetch implements FetchMetadata{ + @Override + public List fetchMetadata() { + System.out.println("Fetching some json data"); + return new ArrayList<>(); + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/MetadataCollector.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/MetadataCollector.java new file mode 100644 index 0000000000..4a159fc6ad --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/MetadataCollector.java @@ -0,0 +1,26 @@ +package com.baeldung.loose; + +import java.util.List; + +public class MetadataCollector { + private final FetchMetadata fetchMetadata; + private final ExportMetadata exportMetadata; + + public MetadataCollector(FetchMetadata fetchMetadata, ExportMetadata exportMetadata) { + this.fetchMetadata = fetchMetadata; + this.exportMetadata = exportMetadata; + } + + public void collectMetadata() { + List metadata = fetchMetadata.fetchMetadata(); + exportMetadata.export(metadata); + } + + public FetchMetadata getFetchMetadata() { + return fetchMetadata; + } + + public ExportMetadata getExportMetadata() { + return exportMetadata; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/PDFExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/PDFExport.java new file mode 100644 index 0000000000..2ac3cfe536 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/PDFExport.java @@ -0,0 +1,14 @@ +package com.baeldung.loose; + +import java.io.File; +import java.util.List; + +public class PDFExport implements ExportMetadata { + @Override + public File export(List metadata) { + System.out.println("PDF Export"); + // Some logic + File outputPDF = null; + return outputPDF; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/loose/XMLFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/loose/XMLFetch.java new file mode 100644 index 0000000000..173c5027e4 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/loose/XMLFetch.java @@ -0,0 +1,13 @@ +package com.baeldung.loose; + +import java.util.ArrayList; +import java.util.List; + +public class XMLFetch implements FetchMetadata { + @Override + public List fetchMetadata() { + List metadata = new ArrayList<>(); + // Do some stuff + return metadata; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/CSVExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/CSVExport.java new file mode 100644 index 0000000000..1fe0625d08 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/CSVExport.java @@ -0,0 +1,14 @@ +package com.baeldung.tight; + +import java.io.File; +import java.util.List; + +public class CSVExport { + + public File export(List metadata) { + System.out.println("Exporting data..."); + // Export Metadata + File outputCSV = null; + return outputCSV; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/JSONFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/JSONFetch.java new file mode 100644 index 0000000000..7db44dacf0 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/JSONFetch.java @@ -0,0 +1,12 @@ +package com.baeldung.tight; + +import java.util.ArrayList; +import java.util.List; + +public class JSONFetch { + public List fetchMetadata() { + List metadata = new ArrayList<>(); + // Do some stuff + return metadata; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/MetadataCollector.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/MetadataCollector.java new file mode 100644 index 0000000000..511da537c0 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/MetadataCollector.java @@ -0,0 +1,35 @@ +package com.baeldung.tight; + +import java.util.List; + +public class MetadataCollector { + private XMLFetch xmlFetch = new XMLFetch(); + private JSONFetch jsonFetch = new JSONFetch(); + private CSVExport csvExport = new CSVExport(); + private PDFExport pdfExport = new PDFExport(); + + public void collectMetadata() { + List metadata = xmlFetch.fetchMetadata(); + csvExport.export(metadata); + } + + public void collectMetadata(int inputType, int outputType) { + if (outputType == 1) { + List metadata = null; + if (inputType == 1) { + metadata = xmlFetch.fetchMetadata(); + } else { + metadata = jsonFetch.fetchMetadata(); + } + csvExport.export(metadata); + } else { + List metadata = null; + if (inputType == 1) { + metadata = xmlFetch.fetchMetadata(); + } else { + metadata = jsonFetch.fetchMetadata(); + } + pdfExport.export(metadata); + } + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/PDFExport.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/PDFExport.java new file mode 100644 index 0000000000..d2d0fd4eae --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/PDFExport.java @@ -0,0 +1,13 @@ +package com.baeldung.tight; + +import java.io.File; +import java.util.List; + +public class PDFExport { + public File export(List metadata) { + System.out.println("Exporting data..."); + // Export Metadata + File outputPDF = null; + return outputPDF; + } +} diff --git a/patterns-modules/coupling/src/main/java/com/baeldung/tight/XMLFetch.java b/patterns-modules/coupling/src/main/java/com/baeldung/tight/XMLFetch.java new file mode 100644 index 0000000000..3bb8fa80b0 --- /dev/null +++ b/patterns-modules/coupling/src/main/java/com/baeldung/tight/XMLFetch.java @@ -0,0 +1,12 @@ +package com.baeldung.tight; + +import java.util.ArrayList; +import java.util.List; + +public class XMLFetch { + public List fetchMetadata() { + List metadata = new ArrayList<>(); + // Do some stuff + return metadata; + } +} diff --git a/patterns-modules/coupling/src/test/java/com/baeldung/loose/LooselyCouplingUnitTest.java b/patterns-modules/coupling/src/test/java/com/baeldung/loose/LooselyCouplingUnitTest.java new file mode 100644 index 0000000000..a67d7c0211 --- /dev/null +++ b/patterns-modules/coupling/src/test/java/com/baeldung/loose/LooselyCouplingUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.loose; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class LooselyCouplingUnitTest { + + @Test + public void givenMetadataCollector_thenCollectMetadataXMLAndExportCSV() { + FetchMetadata metadata = new XMLFetch(); + ExportMetadata exportMetadata = new CSVExport(); + MetadataCollector collector = new MetadataCollector(metadata, exportMetadata); + collector.collectMetadata(); + assertTrue(collector.getExportMetadata() instanceof CSVExport); + assertTrue(collector.getFetchMetadata() instanceof XMLFetch); + } + + @Test + public void givenMetadataCollector_thenCollectMetadataUsingJSONAndExportPDF() { + FetchMetadata metadata = new JSONFetch(); + ExportMetadata exportMetadata = new PDFExport(); + MetadataCollector collector = new MetadataCollector(metadata, exportMetadata); + collector.collectMetadata(); + assertTrue(collector.getExportMetadata() instanceof PDFExport); + assertTrue(collector.getFetchMetadata() instanceof JSONFetch); + } + + @Test + public void givenMetadataCollector_thenCollectMetadataUsingXMLAndExportPDF() { + FetchMetadata metadata = new XMLFetch(); + ExportMetadata exportMetadata = new PDFExport(); + MetadataCollector collector = new MetadataCollector(metadata, exportMetadata); + collector.collectMetadata(); + assertTrue(collector.getExportMetadata() instanceof PDFExport); + assertTrue(collector.getFetchMetadata() instanceof XMLFetch); + } +} \ No newline at end of file diff --git a/patterns-modules/coupling/src/test/java/com/baeldung/tight/TightlyCouplingUnitTest.java b/patterns-modules/coupling/src/test/java/com/baeldung/tight/TightlyCouplingUnitTest.java new file mode 100644 index 0000000000..886da0a386 --- /dev/null +++ b/patterns-modules/coupling/src/test/java/com/baeldung/tight/TightlyCouplingUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.tight; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; + +import org.junit.jupiter.api.Test; + +class TightlyCouplingUnitTest { + + @Test + public void givenMetadataCollector_thenCollectMetadata() { + MetadataCollector collector = mock(MetadataCollector.class); + doNothing().when(collector) + .collectMetadata(); + } + + @Test + public void givenMetadataCollectorWithDifferentInput_thenCollectMetadata() { + MetadataCollector collector = new MetadataCollector(); + collector.collectMetadata(1, 1); + } +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-architectural/pom.xml b/patterns-modules/design-patterns-architectural/pom.xml index 8f579ddfa2..80c9b65b41 100644 --- a/patterns-modules/design-patterns-architectural/pom.xml +++ b/patterns-modules/design-patterns-architectural/pom.xml @@ -66,12 +66,12 @@ 5.2.16.Final 6.0.6 - 2.5.3 + 2.7.5 3.3.0 - 2.7.2 + 2.7.5 5.5.14 3.14.0 3.14.0 - \ No newline at end of file + diff --git a/patterns-modules/design-patterns-cloud/pom.xml b/patterns-modules/design-patterns-cloud/pom.xml index c3e2fcfc39..f166a02fba 100644 --- a/patterns-modules/design-patterns-cloud/pom.xml +++ b/patterns-modules/design-patterns-cloud/pom.xml @@ -1,11 +1,23 @@ - 4.0.0 - com.baeldung - design-patterns-cloud - 1.0.0-SNAPSHOT - design-patterns-cloud - pom - \ No newline at end of file + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + design-patterns-cloud + design-patterns-cloud + jar + + + com.baeldung + patterns-modules + 1.0.0-SNAPSHOT + + + + + io.github.resilience4j + resilience4j-retry + 1.7.1 + + + diff --git a/patterns-modules/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java b/patterns-modules/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterUnitTest.java similarity index 96% rename from patterns-modules/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java rename to patterns-modules/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterUnitTest.java index f6b3ebbe45..abfcc71e66 100644 --- a/patterns-modules/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java +++ b/patterns-modules/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterUnitTest.java @@ -14,7 +14,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.function.Function; -import static com.baeldung.backoff.jitter.BackoffWithJitterTest.RetryProperties.*; +import static com.baeldung.backoff.jitter.BackoffWithJitterUnitTest.RetryProperties.*; import static io.github.resilience4j.retry.IntervalFunction.ofExponentialBackoff; import static io.github.resilience4j.retry.IntervalFunction.ofExponentialRandomBackoff; import static java.util.Collections.nCopies; @@ -22,9 +22,9 @@ import static java.util.concurrent.Executors.newFixedThreadPool; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; -public class BackoffWithJitterTest { +public class BackoffWithJitterUnitTest { - static Logger log = LoggerFactory.getLogger(BackoffWithJitterTest.class); + static Logger log = LoggerFactory.getLogger(BackoffWithJitterUnitTest.class); interface PingPongService { diff --git a/patterns-modules/design-patterns-creational/README.md b/patterns-modules/design-patterns-creational/README.md index 026115a6d6..b599955846 100644 --- a/patterns-modules/design-patterns-creational/README.md +++ b/patterns-modules/design-patterns-creational/README.md @@ -8,3 +8,4 @@ - [Automatic Generation of the Builder Pattern with FreeBuilder](https://www.baeldung.com/java-builder-pattern-freebuilder) - [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements) - [Prototype Pattern in Java](https://www.baeldung.com/java-pattern-prototype) +- [Implementing Factory Pattern With Generics in Java](https://www.baeldung.com/java-factory-pattern-generics) diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/DateNotifier.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/DateNotifier.java new file mode 100644 index 0000000000..b48c432a32 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/DateNotifier.java @@ -0,0 +1,11 @@ +package com.baeldung.factorygeneric; + +import java.util.Date; + +public class DateNotifier implements Notifier { + + @Override + public void notify(Date date) { + System.out.println("Notifying: " + date); + } +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Main.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Main.java new file mode 100644 index 0000000000..0b3da9013d --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Main.java @@ -0,0 +1,14 @@ +package com.baeldung.factorygeneric; + +import java.util.Date; + +class Main { + public static void main(String[] args) { + NotifierFactory factory = new NotifierFactory(); + Notifier stringNotifier = factory.getNotifier(String.class); + Notifier dateNotifier = factory.getNotifier(Date.class); + + stringNotifier.notify("Hello world!"); + dateNotifier.notify(new Date()); + } +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Notifier.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Notifier.java new file mode 100644 index 0000000000..bfda24bc15 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Notifier.java @@ -0,0 +1,6 @@ +package com.baeldung.factorygeneric; + +public interface Notifier { + + void notify(T obj); +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/NotifierFactory.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/NotifierFactory.java new file mode 100644 index 0000000000..ff1091d18f --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/NotifierFactory.java @@ -0,0 +1,17 @@ +package com.baeldung.factorygeneric; + +import java.util.Date; + +public class NotifierFactory { + + public Notifier getNotifier(Class c) { + if (c == String.class) { + return Record.STRING.make(); + } + if (c == Date.class) { + return Record.DATE.make(); + } + return null; + } + +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Record.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Record.java new file mode 100644 index 0000000000..1dbe94f2e7 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/Record.java @@ -0,0 +1,20 @@ +package com.baeldung.factorygeneric; + +import java.util.Date; + +public enum Record { + STRING { + @Override + public Notifier make() { + return new StringNotifier(); + } + }, + DATE { + @Override + public Notifier make() { + return new DateNotifier(); + } + }; + + public abstract Notifier make(); +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/StringNotifier.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/StringNotifier.java new file mode 100644 index 0000000000..576085f267 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/factorygeneric/StringNotifier.java @@ -0,0 +1,9 @@ +package com.baeldung.factorygeneric; + +public class StringNotifier implements Notifier { + + @Override + public void notify(String str) { + System.out.println("Notifying: " + str); + } +} diff --git a/patterns-modules/design-patterns-creational/src/test/java/com/baeldung/factorygeneric/FactoryGenericUnitTest.java b/patterns-modules/design-patterns-creational/src/test/java/com/baeldung/factorygeneric/FactoryGenericUnitTest.java new file mode 100644 index 0000000000..6fabfc22dc --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/test/java/com/baeldung/factorygeneric/FactoryGenericUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.factorygeneric; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Date; + +// Unit test for the NotifierFactory class. +public class FactoryGenericUnitTest { + + // Checks that when the factory is asked to provide a string notifier, the object is an actual string notifier. + @Test + public void givenStringNotifier_whenEquals_thenTrue() { + NotifierFactory factory = new NotifierFactory(); + Notifier stringNotifier = factory.getNotifier(String.class); + + assertNotNull(stringNotifier, "The object returned by the factory is null!"); + assertTrue(stringNotifier instanceof Notifier, "The object returned by the factory is not a notifier!"); + } + + // Checks that when the factory is asked to provide a date notifier, the object is an actual date notifier. + @Test + public void givenDateNotifier_whenEquals_thenTrue() { + NotifierFactory factory = new NotifierFactory(); + Notifier dateNotifier = factory.getNotifier(Date.class); + + assertNotNull(dateNotifier, "The object returned by the factory is null!"); + assertTrue(dateNotifier instanceof Notifier, "The object returned by the factory is not a notifier!"); + } + + // Checks that when the factory is asked to provide both a date notifier and a string notifier, the objects returned are different. + @Test + public void givenDateNotifierAndStringNotifier_whenEquals_thenFalse() { + NotifierFactory factory = new NotifierFactory(); + Notifier stringNotifier = factory.getNotifier(String.class); + Notifier dateNotifier = factory.getNotifier(Date.class); + + assertNotNull(stringNotifier, "The object returned by the factory is null!"); + assertNotNull(dateNotifier, "The object returned by the factory is null!"); + assertNotEquals(stringNotifier, dateNotifier, "The string notifier and date notifier objects returned by the factory are actually the same!"); + } + +} diff --git a/patterns-modules/pom.xml b/patterns-modules/pom.xml index 87292dd7eb..4c020734bf 100644 --- a/patterns-modules/pom.xml +++ b/patterns-modules/pom.xml @@ -29,6 +29,7 @@ solid clean-architecture enterprise-patterns + coupling diff --git a/pdf-2/README.md b/pdf-2/README.md new file mode 100644 index 0000000000..531ebb04e5 --- /dev/null +++ b/pdf-2/README.md @@ -0,0 +1,2 @@ +## Relevant articles +- [Editing Existing PDF Files in Java](https://www.baeldung.com/java-edit-existing-pdf) diff --git a/pdf-2/pom.xml b/pdf-2/pom.xml new file mode 100644 index 0000000000..6a15dc7f29 --- /dev/null +++ b/pdf-2/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + pdf-2 + pdf-2 + http://maven.apache.org + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + com.itextpdf + itext7-core + ${itextpdf.core.version} + pom + + + com.itextpdf + cleanup + ${itextpdf.cleanup.version} + + + + + pdf + + + src/main/resources + true + + + + + + 7.2.3 + 3.0.1 + + + \ No newline at end of file diff --git a/pdf-2/src/main/java/com/baeldung/pdfedition/PdfContentRemover.java b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfContentRemover.java new file mode 100644 index 0000000000..62ccdcb51f --- /dev/null +++ b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfContentRemover.java @@ -0,0 +1,43 @@ +package com.baeldung.pdfedition; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import com.itextpdf.kernel.geom.Rectangle; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.pdfcleanup.CleanUpProperties; +import com.itextpdf.pdfcleanup.PdfCleanUpLocation; +import com.itextpdf.pdfcleanup.PdfCleanUpTool; +import com.itextpdf.pdfcleanup.PdfCleaner; +import com.itextpdf.pdfcleanup.autosweep.CompositeCleanupStrategy; +import com.itextpdf.pdfcleanup.autosweep.RegexBasedCleanupStrategy; + +public class PdfContentRemover { + + private static final String SOURCE = "src/main/resources/baeldung-modified.pdf"; + private static final String DESTINATION = "src/main/resources/baeldung-cleaned.pdf"; + + public static void main(String[] args) throws IOException { + PdfReader reader = new PdfReader(SOURCE); + PdfWriter writer = new PdfWriter(DESTINATION); + PdfDocument pdfDocument = new PdfDocument(reader, writer); + removeContentFromDocument(pdfDocument); + pdfDocument.close(); + } + + private static void removeContentFromDocument(PdfDocument pdfDocument) throws IOException { + // 5.1. remove text + CompositeCleanupStrategy strategy = new CompositeCleanupStrategy(); + strategy.add(new RegexBasedCleanupStrategy("Baeldung")); + PdfCleaner.autoSweepCleanUp(pdfDocument, strategy); + + // 5.2. remove other areas + List cleanUpLocations = Arrays.asList(new PdfCleanUpLocation(1, new Rectangle(10, 50, 90, 70)), new PdfCleanUpLocation(2, new Rectangle(35, 400, 100, 35))); + PdfCleanUpTool cleaner = new PdfCleanUpTool(pdfDocument, cleanUpLocations, new CleanUpProperties()); + cleaner.cleanUp(); + } + +} diff --git a/pdf-2/src/main/java/com/baeldung/pdfedition/PdfEditor.java b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfEditor.java new file mode 100644 index 0000000000..cfdf5917b8 --- /dev/null +++ b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfEditor.java @@ -0,0 +1,86 @@ +package com.baeldung.pdfedition; + +import java.io.IOException; +import java.net.MalformedURLException; + +import com.itextpdf.forms.PdfAcroForm; +import com.itextpdf.forms.fields.PdfFormField; +import com.itextpdf.forms.fields.PdfTextFormField; +import com.itextpdf.io.image.ImageData; +import com.itextpdf.io.image.ImageDataFactory; +import com.itextpdf.kernel.geom.Rectangle; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfString; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.kernel.pdf.annot.PdfAnnotation; +import com.itextpdf.kernel.pdf.annot.PdfTextAnnotation; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.Image; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.layout.element.Table; +import com.itextpdf.layout.element.Text; +import com.itextpdf.layout.properties.UnitValue; + +public class PdfEditor { + + private static final String SOURCE = "src/main/resources/baeldung.pdf"; + private static final String DESTINATION = "src/main/resources/baeldung-modified.pdf"; + + public static void main(String[] args) throws IOException { + PdfReader reader = new PdfReader(SOURCE); + PdfWriter writer = new PdfWriter(DESTINATION); + PdfDocument pdfDocument = new PdfDocument(reader, writer); + addContentToDocument(pdfDocument); + } + + private static void addContentToDocument(PdfDocument pdfDocument) throws MalformedURLException { + // 4.1. add form + PdfFormField personal = PdfFormField.createEmptyField(pdfDocument); + personal.setFieldName("information"); + PdfTextFormField name = PdfFormField.createText(pdfDocument, new Rectangle(35, 400, 100, 30), "name", ""); + personal.addKid(name); + PdfAcroForm.getAcroForm(pdfDocument, true) + .addField(personal, pdfDocument.getFirstPage()); + + // 4.2. add new page + pdfDocument.addNewPage(1); + + // 4.3. add annotation + PdfAnnotation ann = new PdfTextAnnotation(new Rectangle(40, 435, 0, 0)).setTitle(new PdfString("name")) + .setContents("Your name"); + pdfDocument.getPage(2) + .addAnnotation(ann); + + // create document form pdf document + Document document = new Document(pdfDocument); + + // 4.4. add an image + ImageData imageData = ImageDataFactory.create("src/main/resources/baeldung.png"); + Image image = new Image(imageData).scaleAbsolute(550, 100) + .setFixedPosition(1, 10, 50); + document.add(image); + + // 4.5. add a paragraph + Text title = new Text("This is a demo").setFontSize(16); + Text author = new Text("Baeldung tutorials."); + Paragraph p = new Paragraph().setFontSize(8) + .add(title) + .add(" from ") + .add(author); + document.add(p); + + // 4.6. add a table + Table table = new Table(UnitValue.createPercentArray(2)); + table.addHeaderCell("#"); + table.addHeaderCell("company"); + table.addCell("name"); + table.addCell("baeldung"); + document.add(table); + + // close the document + // this automatically closes the pdfDocument, which then closes automatically the pdfReader and pdfWriter + document.close(); + } + +} diff --git a/pdf-2/src/main/java/com/baeldung/pdfedition/PdfTextReplacement.java b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfTextReplacement.java new file mode 100644 index 0000000000..e81adff1ec --- /dev/null +++ b/pdf-2/src/main/java/com/baeldung/pdfedition/PdfTextReplacement.java @@ -0,0 +1,45 @@ +package com.baeldung.pdfedition; + +import java.io.IOException; + +import com.itextpdf.kernel.colors.ColorConstants; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfPage; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.kernel.pdf.canvas.PdfCanvas; +import com.itextpdf.kernel.pdf.canvas.parser.listener.IPdfTextLocation; +import com.itextpdf.layout.Canvas; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.pdfcleanup.PdfCleaner; +import com.itextpdf.pdfcleanup.autosweep.CompositeCleanupStrategy; +import com.itextpdf.pdfcleanup.autosweep.RegexBasedCleanupStrategy; + +public class PdfTextReplacement { + + private static final String SOURCE = "src/main/resources/baeldung-modified.pdf"; + private static final String DESTINATION = "src/main/resources/baeldung-fixed.pdf"; + + public static void main(String[] args) throws IOException { + PdfReader reader = new PdfReader(SOURCE); + PdfWriter writer = new PdfWriter(DESTINATION); + PdfDocument pdfDocument = new PdfDocument(reader, writer); + replaceTextContentFromDocument(pdfDocument); + pdfDocument.close(); + } + + private static void replaceTextContentFromDocument(PdfDocument pdfDocument) throws IOException { + CompositeCleanupStrategy strategy = new CompositeCleanupStrategy(); + strategy.add(new RegexBasedCleanupStrategy("Baeldung tutorials").setRedactionColor(ColorConstants.WHITE)); + PdfCleaner.autoSweepCleanUp(pdfDocument, strategy); + + for (IPdfTextLocation location : strategy.getResultantLocations()) { + PdfPage page = pdfDocument.getPage(location.getPageNumber() + 1); + PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), page.getDocument()); + Canvas canvas = new Canvas(pdfCanvas, location.getRectangle()); + canvas.add(new Paragraph("HIDDEN").setFontSize(8) + .setMarginTop(0f)); + } + } + +} diff --git a/pdf-2/src/main/resources/baeldung-cleaned.pdf b/pdf-2/src/main/resources/baeldung-cleaned.pdf new file mode 100644 index 0000000000..fd1f8cba5c Binary files /dev/null and b/pdf-2/src/main/resources/baeldung-cleaned.pdf differ diff --git a/pdf-2/src/main/resources/baeldung-fixed.pdf b/pdf-2/src/main/resources/baeldung-fixed.pdf new file mode 100644 index 0000000000..ccdf9461bd Binary files /dev/null and b/pdf-2/src/main/resources/baeldung-fixed.pdf differ diff --git a/pdf-2/src/main/resources/baeldung-modified.pdf b/pdf-2/src/main/resources/baeldung-modified.pdf new file mode 100644 index 0000000000..7a695620a6 Binary files /dev/null and b/pdf-2/src/main/resources/baeldung-modified.pdf differ diff --git a/pdf-2/src/main/resources/baeldung.pdf b/pdf-2/src/main/resources/baeldung.pdf new file mode 100644 index 0000000000..477fd3fa2d Binary files /dev/null and b/pdf-2/src/main/resources/baeldung.pdf differ diff --git a/pdf-2/src/main/resources/baeldung.png b/pdf-2/src/main/resources/baeldung.png new file mode 100644 index 0000000000..ebbf87ffcf Binary files /dev/null and b/pdf-2/src/main/resources/baeldung.png differ diff --git a/persistence-modules/core-java-persistence-2/pom.xml b/persistence-modules/core-java-persistence-2/pom.xml index b92ee0d899..e07b73e07d 100644 --- a/persistence-modules/core-java-persistence-2/pom.xml +++ b/persistence-modules/core-java-persistence-2/pom.xml @@ -76,6 +76,7 @@ 3.11.11 20220320 07.00.00-MS-GA + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml index 0142e746a1..fda79414fa 100644 --- a/persistence-modules/deltaspike/pom.xml +++ b/persistence-modules/deltaspike/pom.xml @@ -290,6 +290,7 @@ 2.6 1.1.3 1.2.4.Final + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/flyway/pom.xml b/persistence-modules/flyway/pom.xml index 67dd0644bd..18ff9fdb39 100644 --- a/persistence-modules/flyway/pom.xml +++ b/persistence-modules/flyway/pom.xml @@ -64,7 +64,6 @@ 8.5.13 - 2.1.214 \ No newline at end of file diff --git a/persistence-modules/hibernate-annotations/pom.xml b/persistence-modules/hibernate-annotations/pom.xml index 6c02b6c685..310b409a00 100644 --- a/persistence-modules/hibernate-annotations/pom.xml +++ b/persistence-modules/hibernate-annotations/pom.xml @@ -84,7 +84,6 @@ 1.10.6.RELEASE 5.6.7.Final true - 2.1.212 9.0.0.M26 diff --git a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java index 031fa38de0..0724ced56b 100644 --- a/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java +++ b/persistence-modules/hibernate-enterprise/src/main/java/com/baeldung/hibernate/exception/Product.java @@ -3,12 +3,14 @@ package com.baeldung.hibernate.exception; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; +import javax.persistence.Table; @Entity +@Table(name = "PRODUCT") public class Product { private int id; - + private String name; private String description; @@ -20,8 +22,8 @@ public class Product { public void setId(int id) { this.id = id; } - - @Column(nullable=false) + + @Column(nullable = false) public String getName() { return name; } diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java index 3581c81daa..679f786796 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java @@ -25,6 +25,7 @@ import org.hibernate.cfg.Configuration; import org.hibernate.exception.ConstraintViolationException; import org.hibernate.exception.DataException; import org.hibernate.exception.SQLGrammarException; +import org.hibernate.hql.internal.ast.QuerySyntaxException; import org.hibernate.query.NativeQuery; import org.hibernate.tool.schema.spi.CommandAcceptanceException; import org.hibernate.tool.schema.spi.SchemaManagementException; @@ -37,8 +38,7 @@ import org.slf4j.LoggerFactory; public class HibernateExceptionUnitTest { - private static final Logger logger = LoggerFactory - .getLogger(HibernateExceptionUnitTest.class); + private static final Logger logger = LoggerFactory.getLogger(HibernateExceptionUnitTest.class); private SessionFactory sessionFactory; @Before @@ -51,12 +51,10 @@ public class HibernateExceptionUnitTest { private Configuration getConfiguration() { Configuration cfg = new Configuration(); - cfg.setProperty(AvailableSettings.DIALECT, - "org.hibernate.dialect.H2Dialect"); + cfg.setProperty(AvailableSettings.DIALECT, "org.hibernate.dialect.H2Dialect"); cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "none"); cfg.setProperty(AvailableSettings.DRIVER, "org.h2.Driver"); - cfg.setProperty(AvailableSettings.URL, - "jdbc:h2:mem:myexceptiondb2;DB_CLOSE_DELAY=-1"); + cfg.setProperty(AvailableSettings.URL, "jdbc:h2:mem:myexceptiondb2;DB_CLOSE_DELAY=-1"); cfg.setProperty(AvailableSettings.USER, "sa"); cfg.setProperty(AvailableSettings.PASS, ""); return cfg; @@ -68,8 +66,7 @@ public class HibernateExceptionUnitTest { thrown.expectMessage("Unknown entity: java.lang.String"); Session session = sessionFactory.openSession(); - NativeQuery query = session - .createNativeQuery("select name from PRODUCT", String.class); + NativeQuery query = session.createNativeQuery("select name from PRODUCT", String.class); query.getResultList(); } @@ -77,12 +74,21 @@ public class HibernateExceptionUnitTest { @SuppressWarnings("rawtypes") public void whenQueryExecuted_thenOK() { Session session = sessionFactory.openSession(); - NativeQuery query = session - .createNativeQuery("select name from PRODUCT"); + NativeQuery query = session.createNativeQuery("select name from PRODUCT"); List results = query.getResultList(); assertNotNull(results); } + @Test + public void whenQueryExecutedWithInvalidClassName_thenQuerySyntaxException() { + thrown.expectCause(isA(QuerySyntaxException.class)); + thrown.expectMessage("PRODUCT is not mapped [from PRODUCT]"); + + Session session = sessionFactory.openSession(); + List results = session.createQuery("from PRODUCT", Product.class) + .getResultList(); + } + @Test public void givenEntityWithoutId_whenSessionFactoryCreated_thenAnnotationException() { thrown.expect(AnnotationException.class); @@ -111,8 +117,7 @@ public class HibernateExceptionUnitTest { thrown.expectMessage("Halting on error : Error executing DDL"); Configuration cfg = getConfiguration(); - cfg.setProperty(AvailableSettings.DIALECT, - "org.hibernate.dialect.MySQLDialect"); + cfg.setProperty(AvailableSettings.DIALECT, "org.hibernate.dialect.MySQLDialect"); cfg.setProperty(AvailableSettings.HBM2DDL_AUTO, "update"); // This does not work due to hibernate bug @@ -128,8 +133,7 @@ public class HibernateExceptionUnitTest { public void givenMissingTable_whenEntitySaved_thenSQLGrammarException() { thrown.expect(isA(PersistenceException.class)); thrown.expectCause(isA(SQLGrammarException.class)); - thrown - .expectMessage("SQLGrammarException: could not prepare statement"); + thrown.expectMessage("SQLGrammarException: could not prepare statement"); Configuration cfg = getConfiguration(); cfg.addAnnotatedClass(Product.class); @@ -159,12 +163,10 @@ public class HibernateExceptionUnitTest { public void givenMissingTable_whenQueryExecuted_thenSQLGrammarException() { thrown.expect(isA(PersistenceException.class)); thrown.expectCause(isA(SQLGrammarException.class)); - thrown - .expectMessage("SQLGrammarException: could not prepare statement"); + thrown.expectMessage("SQLGrammarException: could not prepare statement"); Session session = sessionFactory.openSession(); - NativeQuery query = session.createNativeQuery( - "select * from NON_EXISTING_TABLE", Product.class); + NativeQuery query = session.createNativeQuery("select * from NON_EXISTING_TABLE", Product.class); query.getResultList(); } @@ -172,8 +174,7 @@ public class HibernateExceptionUnitTest { public void whenDuplicateIdSaved_thenConstraintViolationException() { thrown.expect(isA(PersistenceException.class)); thrown.expectCause(isA(ConstraintViolationException.class)); - thrown.expectMessage( - "ConstraintViolationException: could not execute statement"); + thrown.expectMessage("ConstraintViolationException: could not execute statement"); Session session = null; Transaction transaction = null; @@ -199,8 +200,7 @@ public class HibernateExceptionUnitTest { @Test public void givenNotNullPropertyNotSet_whenEntityIdSaved_thenPropertyValueException() { thrown.expect(isA(PropertyValueException.class)); - thrown.expectMessage( - "not-null property references a null or transient value"); + thrown.expectMessage("not-null property references a null or transient value"); Session session = null; Transaction transaction = null; @@ -225,20 +225,17 @@ public class HibernateExceptionUnitTest { @Test public void givenQueryWithDataTypeMismatch_WhenQueryExecuted_thenDataException() { thrown.expectCause(isA(DataException.class)); - thrown.expectMessage( - "org.hibernate.exception.DataException: could not prepare statement"); + thrown.expectMessage("org.hibernate.exception.DataException: could not prepare statement"); Session session = sessionFactory.openSession(); - NativeQuery query = session.createNativeQuery( - "select * from PRODUCT where id='wrongTypeId'", Product.class); + NativeQuery query = session.createNativeQuery("select * from PRODUCT where id='wrongTypeId'", Product.class); query.getResultList(); } @Test public void givenSessionContainingAnId_whenIdAssociatedAgain_thenNonUniqueObjectException() { thrown.expect(isA(NonUniqueObjectException.class)); - thrown.expectMessage( - "A different object with the same identifier value was already associated with the session"); + thrown.expectMessage("A different object with the same identifier value was already associated with the session"); Session session = null; Transaction transaction = null; @@ -269,8 +266,7 @@ public class HibernateExceptionUnitTest { @Test public void whenDeletingADeletedObject_thenOptimisticLockException() { thrown.expect(isA(OptimisticLockException.class)); - thrown.expectMessage( - "Batch update returned unexpected row count from update"); + thrown.expectMessage("Batch update returned unexpected row count from update"); thrown.expectCause(isA(StaleStateException.class)); Session session = null; @@ -307,8 +303,7 @@ public class HibernateExceptionUnitTest { @Test public void whenUpdatingNonExistingObject_thenStaleStateException() { thrown.expect(isA(OptimisticLockException.class)); - thrown - .expectMessage("Row was updated or deleted by another transaction"); + thrown.expectMessage("Row was updated or deleted by another transaction"); thrown.expectCause(isA(StaleObjectStateException.class)); Session session = null; @@ -390,8 +385,7 @@ public class HibernateExceptionUnitTest { public void givenExistingEntity_whenIdUpdated_thenHibernateException() { thrown.expect(isA(PersistenceException.class)); thrown.expectCause(isA(HibernateException.class)); - thrown.expectMessage( - "identifier of an instance of com.baeldung.hibernate.exception.Product was altered"); + thrown.expectMessage("identifier of an instance of com.baeldung.hibernate.exception.Product was altered"); Session session = null; Transaction transaction = null; diff --git a/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties index 1657c838e3..c16666cbf5 100644 --- a/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties +++ b/persistence-modules/hibernate-enterprise/src/test/resources/hibernate-spatial.properties @@ -1,5 +1,5 @@ hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.url=jdbc:h2:mem:mydb1;MODE=LEGACY;DB_CLOSE_DELAY=-1 hibernate.connection.username=sa hibernate.connection.autocommit=true jdbc.password= diff --git a/persistence-modules/hibernate-exceptions/pom.xml b/persistence-modules/hibernate-exceptions/pom.xml index cabace17b9..efa18e1b72 100644 --- a/persistence-modules/hibernate-exceptions/pom.xml +++ b/persistence-modules/hibernate-exceptions/pom.xml @@ -39,6 +39,7 @@ 2.4.0 2.3.0 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml index 7779a85e79..f742290884 100644 --- a/persistence-modules/hibernate-jpa/pom.xml +++ b/persistence-modules/hibernate-jpa/pom.xml @@ -87,6 +87,7 @@ 8.0.13 2.2.3 2.1.7.RELEASE + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/pom.xml b/persistence-modules/hibernate-mapping-2/pom.xml index 8cec8d5d34..5ecb9e8b73 100644 --- a/persistence-modules/hibernate-mapping-2/pom.xml +++ b/persistence-modules/hibernate-mapping-2/pom.xml @@ -81,6 +81,7 @@ 9.0.0.M26 2.3.0.1 2.3.1 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/pom.xml b/persistence-modules/hibernate-queries/pom.xml index ff5a9fe221..a2949e1513 100644 --- a/persistence-modules/hibernate-queries/pom.xml +++ b/persistence-modules/hibernate-queries/pom.xml @@ -87,6 +87,7 @@ 9.0.0.M26 6.0.6 2.2.3 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 6bec0d4981..8f5ab01f77 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -60,6 +60,7 @@ 5.4.12.Final 6.0.6 2.2.3 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java index 6bd1c24869..3e214d58f9 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java @@ -9,6 +9,7 @@ import javax.persistence.Id; import javax.persistence.Table; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @Entity @@ -74,7 +75,7 @@ public class Customer { } public void deserializeCustomerAttributes() throws IOException { - this.customerAttributes = objectMapper.readValue(customerAttributeJSON, Map.class); + this.customerAttributes = objectMapper.readValue(customerAttributeJSON, new TypeReference>() {}); } } diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java index b1c2d50480..5f3482b36f 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java @@ -1,6 +1,7 @@ package com.baeldung.hibernate.persistjson; import java.io.IOException; +import java.util.HashMap; import java.util.Map; import javax.persistence.AttributeConverter; @@ -10,6 +11,7 @@ import org.slf4j.LoggerFactory; import com.baeldung.hibernate.interceptors.CustomInterceptor; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; public class HashMapConverter implements AttributeConverter, String> { @@ -36,7 +38,7 @@ public class HashMapConverter implements AttributeConverter, Map customerInfo = null; try { - customerInfo = objectMapper.readValue(customerInfoJSON, Map.class); + customerInfo = objectMapper.readValue(customerInfoJSON, new TypeReference>() {}); } catch (final IOException e) { logger.error("JSON reading error", e); } diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml index 884142f821..b736b50dd1 100644 --- a/persistence-modules/java-jpa-2/pom.xml +++ b/persistence-modules/java-jpa-2/pom.xml @@ -137,6 +137,7 @@ 3.3.3 3.0.0 4.3.1 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml index c6930d6291..b9516281de 100644 --- a/persistence-modules/java-jpa-3/pom.xml +++ b/persistence-modules/java-jpa-3/pom.xml @@ -91,6 +91,7 @@ 3.5.1 3.3.3 3.0.0 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index 9a55633773..acdd648e45 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -107,6 +107,7 @@ 2.2 3.3.3 3.0.0 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/java-mongodb-3/pom.xml b/persistence-modules/java-mongodb-3/pom.xml index d9b299b516..6fb8f07276 100644 --- a/persistence-modules/java-mongodb-3/pom.xml +++ b/persistence-modules/java-mongodb-3/pom.xml @@ -22,7 +22,7 @@ - 3.12.1 + 3.12.11 \ No newline at end of file diff --git a/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/filter/FilterOperation.java b/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/filter/FilterOperation.java new file mode 100644 index 0000000000..d674d57878 --- /dev/null +++ b/persistence-modules/java-mongodb-3/src/main/java/com/baeldung/mongo/filter/FilterOperation.java @@ -0,0 +1,134 @@ +package com.baeldung.mongo.filter; + +import com.mongodb.MongoClient; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import org.bson.Document; +import org.bson.conversions.Bson; + +import static com.mongodb.client.model.Filters.*; + +public class FilterOperation { + + private static MongoClient mongoClient; + private static MongoDatabase database; + private static MongoCollection collection; + private static String collectionName; + private static String databaseName; + + public static void setUp() { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + + databaseName = "baeldung"; + collectionName = "user"; + + database = mongoClient.getDatabase(databaseName); + collection = database.getCollection(collectionName); + } + } + + public static void equalsOperator() { + Bson filter = eq("userName", "Jack"); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void notEqualOperator() { + Bson filter = ne("userName", "Jack"); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void greaterThanOperator() { + Bson filter = gt("age", 25); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void lessThanOperator() { + Bson filter = lt("age", 25); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void inOperator() { + Bson filter = in("userName", "Jack", "Lisa"); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void notInOperator() { + Bson filter = nin("userName", "Jack", "Lisa"); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void andOperator() { + Bson filter = and(gt("age", 25), eq("role", "Admin")); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void orOperator() { + Bson filter = or(gt("age", 30), eq("role", "Admin")); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void existsOperator() { + Bson filter = exists("type"); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + public static void regexOperator() { + Bson filter = regex("userName", "a"); + FindIterable documents = collection.find(filter); + + printResult(documents); + } + + private static void printResult(FindIterable documents) { + MongoCursor cursor = documents.iterator(); + while (cursor.hasNext()) { + System.out.println(cursor.next()); + } + } + + public static void main(String args[]) { + + setUp(); + + equalsOperator(); + + notEqualOperator(); + + greaterThanOperator(); + + lessThanOperator(); + + inOperator(); + + notInOperator(); + + andOperator(); + + orOperator(); + + existsOperator(); + + regexOperator(); + } +} diff --git a/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/filter/FilterOperationLiveTest.java b/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/filter/FilterOperationLiveTest.java new file mode 100644 index 0000000000..f2022764f1 --- /dev/null +++ b/persistence-modules/java-mongodb-3/src/test/java/com/baeldung/mongo/filter/FilterOperationLiveTest.java @@ -0,0 +1,153 @@ +package com.baeldung.mongo.filter; + +import com.baeldung.mongo.find.FindOperationLiveTest; +import com.mongodb.MongoClient; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import org.bson.Document; +import org.bson.conversions.Bson; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import static com.mongodb.client.model.Filters.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class FilterOperationLiveTest { + + private static MongoClient mongoClient; + private static MongoDatabase database; + private static MongoCollection collection; + private static final String DATASET_JSON = "/user.json"; + + @BeforeClass + public static void setUp() throws IOException { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + + database = mongoClient.getDatabase("baeldung"); + collection = database.getCollection("user"); + + collection.drop(); + + InputStream is = FindOperationLiveTest.class.getResourceAsStream(DATASET_JSON); + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + reader.lines() + .forEach(line -> collection.insertOne(Document.parse(line))); + reader.close(); + } + } + + @Test + public void givenUserCollection_whenFetchingUsingEqualsOperator_thenFindMatchingDocuments() { + Bson filter = eq("userName", "Jack"); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingNotEqualOperator_thenFindMatchingDocuments() { + Bson filter = ne("userName", "Jack"); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingGreaterThanOperator_thenFindMatchingDocuments() { + Bson filter = gt("age", 25); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingLessThanOperator_thenFindMatchingDocuments() { + Bson filter = lt("age", 25); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingInOperator_thenFindMatchingDocuments() { + Bson filter = in("userName", "Jack", "Lisa"); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingNotInOperator_thenFindMatchingDocuments() { + Bson filter = nin("userName", "Jack", "Lisa"); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingAndOperator_thenFindMatchingDocuments() { + Bson filter = and(gt("age", 25), eq("role", "Admin")); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingOrOperator_thenFindMatchingDocuments() { + Bson filter = or(gt("age", 30), eq("role", "Admin")); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingExistsOperator_thenFindMatchingDocuments() { + Bson filter = exists("type"); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @Test + public void givenUserCollection_whenFetchingUsingRegexOperator_thenFindMatchingDocuments() { + Bson filter = regex("userName", "a"); + FindIterable documents = collection.find(filter); + MongoCursor cursor = documents.iterator(); + + assertNotNull(cursor); + assertTrue(cursor.hasNext()); + } + + @AfterClass + public static void cleanUp() { + mongoClient.close(); + } +} diff --git a/persistence-modules/java-mongodb-3/src/test/resources/user.json b/persistence-modules/java-mongodb-3/src/test/resources/user.json new file mode 100644 index 0000000000..b9ae26a0ca --- /dev/null +++ b/persistence-modules/java-mongodb-3/src/test/resources/user.json @@ -0,0 +1,3 @@ +{"userId":"123","userName":"Jack","age":23,"role":"Admin"} +{"userId":"456","userName":"Lisa","age":27,"role":"Admin","type":"Web"} +{"userId":"789","userName":"Tim","age":31,"role":"Analyst"} \ No newline at end of file diff --git a/persistence-modules/java-mongodb-queries/pom.xml b/persistence-modules/java-mongodb-queries/pom.xml index 8293103859..3b5f4eb93f 100644 --- a/persistence-modules/java-mongodb-queries/pom.xml +++ b/persistence-modules/java-mongodb-queries/pom.xml @@ -6,10 +6,9 @@ java-mongodb-queries - parent-modules com.baeldung + persistence-modules 1.0.0-SNAPSHOT - ../../pom.xml diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index d549f7e2de..bff23cffc1 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -64,6 +64,7 @@ spring-boot-persistence-h2 spring-boot-persistence-mongodb spring-boot-persistence-mongodb-2 + spring-boot-persistence-mongodb-3 spring-data-arangodb spring-data-cassandra spring-data-cassandra-test @@ -73,7 +74,7 @@ spring-data-dynamodb spring-data-eclipselink spring-data-elasticsearch - + spring-data-geode spring-data-jpa-annotations spring-data-jpa-crud @@ -115,4 +116,4 @@ 1.16.3 - \ No newline at end of file + diff --git a/persistence-modules/spring-boot-mysql/README.md b/persistence-modules/spring-boot-mysql/README.md index a5043f965d..fba8c1d98a 100644 --- a/persistence-modules/spring-boot-mysql/README.md +++ b/persistence-modules/spring-boot-mysql/README.md @@ -1,3 +1,4 @@ ## Relevant Articles: - [Setting the MySQL JDBC Timezone Using Spring Boot Configuration](https://www.baeldung.com/mysql-jdbc-timezone-spring-boot) +- [TLS Setup in MySQL and Spring Boot Application](https://www.baeldung.com/spring-boot-mysql-tls) diff --git a/persistence-modules/spring-boot-mysql/mysql-server/convertcerts.sh b/persistence-modules/spring-boot-mysql/mysql-server/convertcerts.sh new file mode 100644 index 0000000000..eb3700e578 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/mysql-server/convertcerts.sh @@ -0,0 +1,7 @@ +# Convert pem to jks file +mkdir certs + +keytool -importcert -alias MySQLCACert.jks -file ./data/ca.pem \ + -keystore ./certs/truststore.jks -storepass mypassword +openssl pkcs12 -export -in ./data/client-cert.pem -inkey ./data/client-key.pem -out ./certs/certificate.p12 -name "certificate" +keytool -importkeystore -srckeystore ./certs/certificate.p12 -srcstoretype pkcs12 -destkeystore ./certs/client-cert.jks \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/mysql-server/createuser_query.sql b/persistence-modules/spring-boot-mysql/mysql-server/createuser_query.sql new file mode 100644 index 0000000000..b7e170eb85 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/mysql-server/createuser_query.sql @@ -0,0 +1,2 @@ +CREATE USER 'test_user'@'%' IDENTIFIED BY 'Password2022' require X509; +GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'%'; \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml new file mode 100644 index 0000000000..ee5bc75bfb --- /dev/null +++ b/persistence-modules/spring-boot-mysql/mysql-server/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3.8' + +services: + mysql-service: + image: "mysql/mysql-server:8.0.30" + container_name: mysql-db + command: [ "mysqld", + "--require_secure_transport=ON", + "--default_authentication_plugin=mysql_native_password", + "--general_log=ON" ] + ports: + - "3306:3306" + volumes: + - type: bind + source: ./data + target: /var/lib/mysql + restart: always + environment: + MYSQL_ROOT_HOST: "%" + MYSQL_ROOT_PASSWORD: "Password2022" + MYSQL_DATABASE: test_db \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index 239378c7b1..6c8266e034 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -42,4 +42,21 @@ 8.0.23 + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.5.RELEASE + + + + repackage + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java new file mode 100644 index 0000000000..28869d0ac1 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/Employee.java @@ -0,0 +1,59 @@ +package com.baeldung.boot.jpa; + + +import javax.persistence.*; +import java.io.Serializable; +import java.time.LocalDate; +import java.util.Date; + +@Entity +public class Employee implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Integer id; + + @Column(name = "emp_name") + private String empName; + + @Column(name = "job_title") + private String jobTitle; + + @Column(name = "emp_doj") + private LocalDate empDoj; + + @Column(name = "created_date") + private Date createdDate = new Date(); + + public Integer getId() { + return id; + } + + public String getEmpName() { + return empName; + } + + public void setEmpName(String empName) { + this.empName = empName; + } + + public String getJobTitle() { + return jobTitle; + } + + public void setJobTitle(String jobTitle) { + this.jobTitle = jobTitle; + } + + public LocalDate getEmpDoj() { + return empDoj; + } + + public void setEmpDoj(LocalDate empDoj) { + this.empDoj = empDoj; + } + + public Date getCreatedDate() { + return createdDate; + } +} diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java new file mode 100644 index 0000000000..ac394476d5 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeController.java @@ -0,0 +1,26 @@ +package com.baeldung.boot.jpa; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.HttpClientErrorException; + +import java.util.Optional; + +@RestController +public class EmployeeController { + + @Autowired + private EmployeeRepository empRepository; + + @GetMapping("/employee/{empId}") + public Employee get(@PathVariable(name = "empId") Integer empId) { + Optional emp = empRepository.findById(empId); + return emp.orElse(null); + } + + @PostMapping("/employee") + public Employee createUser(@RequestBody Employee employee) { + empRepository.save(employee); + return employee; + } +} diff --git a/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeRepository.java b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeRepository.java new file mode 100644 index 0000000000..38ace202d6 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/main/java/com/baeldung/boot/jpa/EmployeeRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.boot.jpa; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.io.Serializable; + +@Repository +public interface EmployeeRepository extends JpaRepository { +} diff --git a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml index f660ab4759..d70c21aad2 100644 --- a/persistence-modules/spring-boot-mysql/src/main/resources/application.yml +++ b/persistence-modules/spring-boot-mysql/src/main/resources/application.yml @@ -1,9 +1,8 @@ spring: - datasource: - url: jdbc:mysql://localhost:3306/test? - username: root - password: - + profiles: + active: "dev2" + main: + banner-mode: "off" jpa: hibernate: ddl-auto: update @@ -11,4 +10,26 @@ spring: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect jdbc: - time_zone: UTC \ No newline at end of file + time_zone: UTC +--- + +spring: + profiles: "dev1" + datasource: + url: jdbc:mysql://localhost:3306/test? + username: root + password: + +--- + +spring: + profiles: "dev2" + datasource: + url: >- + jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_CA& + trustCertificateKeyStoreUrl=file:/Users/saikatchakraborty/tutorials/persistence-modules/spring-boot-mysql/mysql-server/certs/truststore.jks& + trustCertificateKeyStorePassword=mypassword& + clientCertificateKeyStoreUrl=file:/Users/saikatchakraborty/tutorials/persistence-modules/spring-boot-mysql/mysql-server/certs/client-cert.jks& + clientCertificateKeyStorePassword=mypassword + username: test_user + password: Password2022 \ No newline at end of file diff --git a/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java new file mode 100644 index 0000000000..812e6a6b29 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/src/test/java/com/baeldung/boot/jpa/EmployeeControllerUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.boot.jpa; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +import java.time.LocalDate; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WebMvcTest(EmployeeController.class) +public class EmployeeControllerUnitTest { + + @MockBean + private EmployeeRepository employeeRepository; + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Test + public void givenEmployeeId_whenGetEmployeeCalled_ThenReturnEmployee() throws Exception { + Employee employeeExpected = new Employee(); + employeeExpected.setEmpName("Test Emp"); + employeeExpected.setEmpDoj(LocalDate.now()); + employeeExpected.setJobTitle("Manager"); + + when(employeeRepository.findById(1234)).thenReturn(Optional.of(employeeExpected)); + + MvcResult result = mockMvc.perform(get("/employee/1234")) + .andExpect(status().isOk()).andReturn(); + + Employee employee = objectMapper.readValue(result.getResponse().getContentAsString(), Employee.class); + assertEquals(employeeExpected.getEmpName(), employee.getEmpName()); + assertEquals(employeeExpected.getJobTitle(), employee.getJobTitle()); + assertEquals(employeeExpected.getEmpDoj(), employee.getEmpDoj()); + } + + @Test + public void givenEmployee_whenCreateEmployeeCalled_ThenReturnEmployee() throws Exception { + Employee employeeExpected = new Employee(); + employeeExpected.setEmpName("Test Emp"); + employeeExpected.setEmpDoj(LocalDate.now()); + employeeExpected.setJobTitle("Manager"); + + when(employeeRepository.save(employeeExpected)).thenReturn(employeeExpected); + + MvcResult result = mockMvc.perform(post("/employee") + .content(objectMapper.writeValueAsString(employeeExpected)) + .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andReturn(); + + Employee employee = objectMapper.readValue(result.getResponse().getContentAsString(), Employee.class); + assertEquals(employeeExpected.getEmpName(), employee.getEmpName()); + assertEquals(employeeExpected.getJobTitle(), employee.getJobTitle()); + assertEquals(employeeExpected.getEmpDoj(), employee.getEmpDoj()); + } +} diff --git a/persistence-modules/spring-boot-mysql/start_app.sh b/persistence-modules/spring-boot-mysql/start_app.sh new file mode 100644 index 0000000000..2f126a9c88 --- /dev/null +++ b/persistence-modules/spring-boot-mysql/start_app.sh @@ -0,0 +1,13 @@ +export TRUSTSTORE=./mysql-server/certs/truststore.jks +export TRUSTSTORE_PASSWORD=mypassword +export KEYSTORE=./mysql-server/certs/client-cert.jks +export KEYSTORE_PASSWORD=mypassword +export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/test_db?sslMode=VERIFY_CA +export SPRING_DATASOURCE_USERNAME=test_user +export SPRING_DATASOURCE_PASSWORD=Password2022 + +java -Djavax.net.ssl.keyStore=$KEYSTORE \ + -Djavax.net.ssl.keyStorePassword=$KEYSTORE_PASSWORD \ + -Djavax.net.ssl.trustStore=$TRUSTSTORE \ + -Djavax.net.ssl.trustStorePassword=$TRUSTSTORE_PASSWORD \ + -jar ./target/spring-boot-mysql-0.1.0.jar \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-3/README.md b/persistence-modules/spring-boot-persistence-3/README.md index 1dff3c8b5a..ba97a02a9d 100644 --- a/persistence-modules/spring-boot-persistence-3/README.md +++ b/persistence-modules/spring-boot-persistence-3/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: - +- [Patterns for Iterating Over Large Result Sets With Spring Data JPA](https://www.baeldung.com/spring-data-jpa-iterate-large-result-sets) - More articles: [[<-- prev]](../spring-boot-persistence-2) diff --git a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml index 1b8cfbb558..65fce51061 100644 --- a/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml +++ b/persistence-modules/spring-boot-persistence-h2/src/main/resources/application.yaml @@ -3,15 +3,15 @@ spring: console: enabled: true path: /h2-console - console.settings.trace: false - spring.h2.console.settings.web-allow-others: false + settings.trace: false + settings.web-allow-others: false datasource: url: jdbc:h2:mem:mydb username: sa password: password driverClassName: org.h2.Driver jpa: - spring.jpa.database-platform: org.hibernate.dialect.H2Dialect + database-platform: org.hibernate.dialect.H2Dialect properties: hibernate: globally_quoted_identifiers: true diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/README.md b/persistence-modules/spring-boot-persistence-mongodb-2/README.md index a050de8f47..f62fef1a3e 100644 --- a/persistence-modules/spring-boot-persistence-mongodb-2/README.md +++ b/persistence-modules/spring-boot-persistence-mongodb-2/README.md @@ -7,4 +7,4 @@ - [Count Documents Using Spring Data MongoDB Repository](https://www.baeldung.com/spring-data-mongodb-count) - [Spring Data MongoDB – Configure Connection](https://www.baeldung.com/spring-data-mongodb-connection) - [Connect to Multiple Databases Using Spring Data MongoDB](https://www.baeldung.com/mongodb-multiple-databases-spring-data) -- More articles: [[<--prev]](../spring-boot-persistence-mongodb) +- More articles: [[<--prev]](../spring-boot-persistence-mongodb) [[next-->]](../spring-boot-persistence-mongodb-3) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/README.md b/persistence-modules/spring-boot-persistence-mongodb-3/README.md new file mode 100644 index 0000000000..853ce16054 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/README.md @@ -0,0 +1,3 @@ +# Relevant Articles + +- More articles: [[<--prev]](../spring-boot-persistence-mongodb-2) diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml new file mode 100644 index 0000000000..efb988d0a0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + spring-boot-persistence-mongodb-3 + spring-boot-persistence-mongodb-3 + war + This is simple boot application for Spring boot persistence mongodb + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + test + + + + diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/hashmap/SpringBootHashMapApplication.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/hashmap/SpringBootHashMapApplication.java new file mode 100644 index 0000000000..ef1ad8a7b5 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/java/com/baeldung/boot/hashmap/SpringBootHashMapApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.boot.hashmap; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootHashMapApplication { + + public static void main(String... args) { + SpringApplication.run(SpringBootHashMapApplication.class, args); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/resources/application.properties new file mode 100644 index 0000000000..8309c4461f --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=spring-boot-persistence-mongodb-3 diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapIntegrationTest.java new file mode 100644 index 0000000000..bbf425f277 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/java/com/baeldung/boot/hashmap/MongoDbHashMapIntegrationTest.java @@ -0,0 +1,120 @@ +package com.baeldung.boot.hashmap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.bson.Document; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.TestPropertySource; + +import com.mongodb.BasicDBObject; + +@SpringBootTest +@DirtiesContext +@TestPropertySource("/embedded.properties") +class MongoDbHashMapIntegrationTest { + + private static final Map MAP = new HashMap<>(); + private static final Set> MAP_SET = new HashSet<>(); + + @Autowired + private MongoTemplate mongo; + + private void assertHasMongoId(Map saved) { + assertNotNull(saved); + assertNotNull(saved.get("_id")); + } + + @BeforeAll + static void init() { + MAP.put("name", "Document A"); + MAP.put("number", 2); + MAP.put("dynamic", true); + + Map otherMap = new HashMap<>(); + otherMap.put("name", "Other Document"); + otherMap.put("number", 22); + + MAP_SET.add(MAP); + MAP_SET.add(otherMap); + } + + @Test + void whenUsingMap_thenInsertSucceeds() { + Map saved = mongo.insert(MAP, "map-collection"); + + assertHasMongoId(saved); + } + + @Test + void whenMapSet_thenInsertSucceeds() { + Collection> saved = mongo.insert(MAP_SET, "map-set"); + + saved.forEach(this::assertHasMongoId); + assertEquals(2, saved.size()); + } + + @Test + void givenMap_whenDocumentConstructed_thenInsertSucceeds() { + Document document = new Document(MAP); + + Document saved = mongo.insert(document, "doc-collection"); + + assertHasMongoId(saved); + } + + @Test + void givenMap_whenBasicDbObjectConstructed_thenInsertSucceeds() { + BasicDBObject dbObject = new BasicDBObject(MAP); + + BasicDBObject saved = mongo.insert(dbObject, "db-collection"); + + assertHasMongoId(saved); + } + + @Test + void givenObjectList_whenDocumentSetConstructed_thenInsertSucceeds() { + Map> input = new HashMap<>(); + List listOne = new ArrayList<>(); + listOne.add("Doc A"); + listOne.add(1); + + List listTwo = new ArrayList<>(); + listTwo.add("Doc B"); + listTwo.add(2); + + input.put("a", listOne); + input.put("b", listTwo); + + Set docs = input.entrySet() + .stream() + .collect(HashSet::new, (set, entry) -> { + Document document = new Document(); + + document.put("_id", entry.getKey()); + Iterator iterator = entry.getValue() + .iterator(); + document.put("name", iterator.next()); + document.put("number", iterator.next()); + + set.add(document); + }, Set::addAll); + + Collection saved = mongo.insert(docs, "custom-set"); + saved.forEach(this::assertHasMongoId); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties new file mode 100644 index 0000000000..a5b5fb9804 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/embedded.properties @@ -0,0 +1 @@ +spring.mongodb.embedded.version=4.4.9 \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/logback-test.xml b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..8d4771e308 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb-3/src/test/resources/logback-test.xml @@ -0,0 +1,12 @@ + + + + + [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/partialupdate/PartialUpdateUnitTest.java b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/partialupdate/PartialUpdateIntegrationTest.java similarity index 98% rename from persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/partialupdate/PartialUpdateUnitTest.java rename to persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/partialupdate/PartialUpdateIntegrationTest.java index 4a70d409df..32a97ddb33 100644 --- a/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/partialupdate/PartialUpdateUnitTest.java +++ b/persistence-modules/spring-data-jpa-enterprise/src/test/java/com/baeldung/partialupdate/PartialUpdateIntegrationTest.java @@ -17,7 +17,7 @@ import com.baeldung.partialupdate.service.CustomerService; @RunWith(SpringRunner.class) @SpringBootTest(classes = PartialUpdateApplication.class) -public class PartialUpdateUnitTest { +public class PartialUpdateIntegrationTest { @Autowired CustomerService service; diff --git a/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/objectId/User.java b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/objectId/User.java new file mode 100644 index 0000000000..6401759265 --- /dev/null +++ b/persistence-modules/spring-data-mongodb-2/src/main/java/com/baeldung/objectId/User.java @@ -0,0 +1,24 @@ +package com.baeldung.objectId; + +import org.bson.types.ObjectId; + +public class User { + public static final String NAME_FIELD = "name"; + + private final ObjectId id; + private final String name; + + public User(ObjectId id, String name) { + this.id = id; + this.name = name; + } + + public ObjectId getId() { + return id; + } + + public String getName() { + return name; + } +} + diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/SameObjectIdUnitTest.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/SameObjectIdUnitTest.java new file mode 100644 index 0000000000..5856b840af --- /dev/null +++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/SameObjectIdUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.objectId; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.ByteBuffer; +import java.util.Date; + +import org.bson.types.ObjectId; +import org.junit.jupiter.api.Test; + +public class SameObjectIdUnitTest { + + @Test + public void givenSameDateAndCounter_whenComparingObjectIds_thenTheyAreNotEqual() { + Date date = new Date(); + ObjectId objectIdDate = new ObjectId(date); + ObjectId objectIdDateCounter1 = new ObjectId(date, 100); + ObjectId objectIdDateCounter2 = new ObjectId(date, 100); + + assertThat(objectIdDate).isNotEqualTo(objectIdDateCounter1); + assertThat(objectIdDate).isNotEqualTo(objectIdDateCounter2); + + assertThat(objectIdDateCounter1).isEqualTo(objectIdDateCounter2); + } + + @Test + public void givenSameArrayOfBytes_whenComparingObjectIdsCreatedViaDifferentMethods_thenTheObjectIdsAreEqual() { + byte[] bytes = "123456789012".getBytes(); + ObjectId objectIdBytes = new ObjectId(bytes); + + ByteBuffer buffer = ByteBuffer.wrap(bytes); + ObjectId objectIdByteBuffer = new ObjectId(buffer); + + assertThat(objectIdBytes).isEqualTo(objectIdByteBuffer); + } +} diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/SameObjectIdUsedToInsertSameObjectIdUnitTest.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/SameObjectIdUsedToInsertSameObjectIdUnitTest.java new file mode 100644 index 0000000000..690514b715 --- /dev/null +++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/SameObjectIdUsedToInsertSameObjectIdUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.objectId; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.assertj.core.util.Lists; +import org.bson.types.ObjectId; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import com.baeldung.objectId.config.MongoConfig; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = MongoConfig.class) +public class SameObjectIdUsedToInsertSameObjectIdUnitTest { + @Autowired + private MongoTemplate mongoTemplate; + + @BeforeEach + public void setUp() { + mongoTemplate.dropCollection(User.class); + } + + @Test + public void givenUserInDatabase_whenInsertingAnotherUserWithTheSameObjectId_DKEThrownAndInsertRetried() { + //given + String userName = "Kevin"; + User firstUser = new User(ObjectId.get(), userName); + User secondUser = new User(ObjectId.get(), userName); + + mongoTemplate.insert(firstUser); + + //when + try { + mongoTemplate.insert(firstUser); + } catch (DuplicateKeyException dke) { + mongoTemplate.insert(secondUser); + } + + //then + Query query = new Query(); + query.addCriteria(Criteria.where(User.NAME_FIELD) + .is(userName)); + List users = mongoTemplate.find(query, User.class); + + assertThat(users).usingRecursiveComparison() + .isEqualTo(Lists.newArrayList(firstUser, secondUser)); + } +} + + diff --git a/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/config/MongoConfig.java b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/config/MongoConfig.java new file mode 100644 index 0000000000..61df4abb42 --- /dev/null +++ b/persistence-modules/spring-data-mongodb-2/src/test/java/com/baeldung/objectId/config/MongoConfig.java @@ -0,0 +1,42 @@ +package com.baeldung.objectId.config; + +import org.bson.UuidRepresentation; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.util.SocketUtils; + +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; + +import de.flapdoodle.embed.mongo.MongodExecutable; +import de.flapdoodle.embed.mongo.MongodStarter; +import de.flapdoodle.embed.mongo.config.ImmutableMongodConfig; +import de.flapdoodle.embed.mongo.config.MongodConfig; +import de.flapdoodle.embed.mongo.config.Net; +import de.flapdoodle.embed.mongo.distribution.Version; +import de.flapdoodle.embed.process.runtime.Network; + +@Configuration +public class MongoConfig { + private static final String CONNECTION_STRING = "mongodb://%s:%d"; + private static final String HOST = "localhost"; + + @Bean + public MongoTemplate mongoTemplate() throws Exception { + int randomPort = SocketUtils.findAvailableTcpPort(); + + ImmutableMongodConfig mongoDbConfig = MongodConfig.builder() + .version(Version.Main.PRODUCTION) + .net(new Net(HOST, randomPort, Network.localhostIsIPv6())) + .build(); + + MongodStarter starter = MongodStarter.getDefaultInstance(); + MongodExecutable mongodExecutable = starter.prepare(mongoDbConfig); + mongodExecutable.start(); + + return new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, HOST, randomPort)), "mongo_auth"); + } +} diff --git a/persistence-modules/spring-hibernate-3/src/main/resources/persistence-h2.properties b/persistence-modules/spring-hibernate-3/src/main/resources/persistence-h2.properties index d2fcd9545b..4390b1a581 100644 --- a/persistence-modules/spring-hibernate-3/src/main/resources/persistence-h2.properties +++ b/persistence-modules/spring-hibernate-3/src/main/resources/persistence-h2.properties @@ -1,6 +1,6 @@ # jdbc.X jdbc.driverClassName=org.h2.Driver -jdbc.url=jdbc:h2:mem:spring_hibernate3_01;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE +jdbc.url=jdbc:h2:mem:spring_hibernate3_01;MODE=LEGACY;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE jdbc.user=sa jdbc.pass= diff --git a/persistence-modules/spring-jooq/pom.xml b/persistence-modules/spring-jooq/pom.xml index 6a9fb0ef06..7998c9c6dd 100644 --- a/persistence-modules/spring-jooq/pom.xml +++ b/persistence-modules/spring-jooq/pom.xml @@ -199,7 +199,7 @@ 1.0.0 1.5 1.0.0 - 1.4.198 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/spring-jpa-2/README.md b/persistence-modules/spring-jpa-2/README.md index 2eee4015a8..f9f259cdfa 100644 --- a/persistence-modules/spring-jpa-2/README.md +++ b/persistence-modules/spring-jpa-2/README.md @@ -6,5 +6,5 @@ - [Transactions with Spring and JPA](https://www.baeldung.com/transaction-configuration-with-jpa-and-spring) - [The DAO with Spring and Hibernate](https://www.baeldung.com/persistence-layer-with-spring-and-hibernate) - [Simplify the DAO with Spring and Java Generics](https://www.baeldung.com/simplifying-the-data-access-layer-with-spring-and-java-generics) -- [Multitenancy With Spring Data JPA](https://www.baeldung.com/multitenancy-with-spring-data-jpa/) +- [Multitenancy With Spring Data JPA](https://www.baeldung.com/multitenancy-with-spring-data-jpa) - More articles: [[<-- prev]](/spring-jpa) diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml index de42f94856..d0152288d4 100644 --- a/persistence-modules/spring-jpa-2/pom.xml +++ b/persistence-modules/spring-jpa-2/pom.xml @@ -105,6 +105,7 @@ 2.2.6.RELEASE 9.0.0.M26 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index ddc753db86..a08e3f92c8 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -125,6 +125,7 @@ 6.0.15.Final 1.4.01 2.2.5 + 1.4.200 \ No newline at end of file diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml index 65a8581f97..1b2223653b 100644 --- a/persistence-modules/spring-mybatis/pom.xml +++ b/persistence-modules/spring-mybatis/pom.xml @@ -83,7 +83,6 @@ 2.0.6 3.5.2 2.2.0 - 1.4.197 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9b41e7446c..6f214aedc5 100644 --- a/pom.xml +++ b/pom.xml @@ -345,7 +345,6 @@ apache-poi apache-poi-2 apache-rocketmq - apache-spark apache-thrift apache-tika apache-velocity @@ -433,6 +432,7 @@ language-interop libraries-2 libraries-3 + libraries-7 libraries-apache-commons libraries-apache-commons-collections @@ -474,6 +474,7 @@ patterns-modules pdf + pdf-2 performance-tests persistence-modules protobuffer @@ -680,6 +681,8 @@ parent-spring-5 parent-java + apache-spark + image-processing jenkins/plugins @@ -747,7 +750,6 @@ apache-poi apache-poi-2 apache-rocketmq - apache-spark apache-thrift apache-tika apache-velocity @@ -955,9 +957,8 @@ spring-boot-rest spring-caching - spring-caching-2/redis - spring-caching-2/ttl - + spring-caching-2 + spring-cloud-modules @@ -1068,6 +1069,8 @@ parent-spring-5 parent-java + apache-spark + image-processing jenkins/plugins @@ -1348,7 +1351,7 @@ 3.0.0 3.19.0 1.18.24 - 1.4.200 + 2.1.214 31.1-jre 3.2.2 diff --git a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml index 1f5ba2061e..69e1dc3ab0 100644 --- a/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml +++ b/quarkus-modules/quarkus-vs-springboot/spring-project/pom.xml @@ -8,10 +8,10 @@ 0.1-SNAPSHOT - org.springframework.boot - spring-boot-starter-parent - 2.6.9 - + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../../parent-boot-2 @@ -102,12 +102,12 @@ - maven-surefire-plugin - ${surefire-plugin.version} + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} - - **/*IT - + ${maven.compiler.source.version} + ${maven.compiler.target.version} @@ -244,7 +244,8 @@ 3.0.0-M6 -DspringAot=true - -agentlib:native-image-agent=access-filter-file=src/test/resources/access-filter.json,config-merge-dir=target/classes/META-INF/native-image + -agentlib:native-image-agent=access-filter-file=src/test/resources/access-filter.json,config-merge-dir=target/classes/META-INF/native-image + @@ -255,7 +256,9 @@ 11 0.12.1 - 3.0.0-M6 + 3.10.1 + 11 + 11 \ No newline at end of file diff --git a/quarkus-modules/quarkus-vs-springboot/spring-project/src/test/java/com/baeldung/spring_project/StartupIT.java b/quarkus-modules/quarkus-vs-springboot/spring-project/src/test/java/com/baeldung/spring_project/SpringContextTest.java similarity index 95% rename from quarkus-modules/quarkus-vs-springboot/spring-project/src/test/java/com/baeldung/spring_project/StartupIT.java rename to quarkus-modules/quarkus-vs-springboot/spring-project/src/test/java/com/baeldung/spring_project/SpringContextTest.java index 7715fdc1d2..1bb80ec1d4 100644 --- a/quarkus-modules/quarkus-vs-springboot/spring-project/src/test/java/com/baeldung/spring_project/StartupIT.java +++ b/quarkus-modules/quarkus-vs-springboot/spring-project/src/test/java/com/baeldung/spring_project/SpringContextTest.java @@ -15,7 +15,7 @@ import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS; @TestInstance(value = PER_CLASS) @Testcontainers @Disabled -class StartupIT { +class SpringContextTest { @Test void contextLoads() { diff --git a/rabbitmq/README.md b/rabbitmq/README.md index 7fea2e85a0..d91d268b2b 100644 --- a/rabbitmq/README.md +++ b/rabbitmq/README.md @@ -6,4 +6,5 @@ This module contains articles about RabbitMQ. - [Introduction to RabbitMQ](https://www.baeldung.com/rabbitmq) - [Exchanges, Queues, and Bindings in RabbitMQ](https://www.baeldung.com/java-rabbitmq-exchanges-queues-bindings) - [Pub-Sub vs. Message Queues](https://www.baeldung.com/pub-sub-vs-message-queues) +- [Channels and Connections in RabbitMQ](https://www.baeldung.com/java-rabbitmq-channels-connections) diff --git a/rabbitmq/docker-compose.yaml b/rabbitmq/docker-compose.yaml new file mode 100644 index 0000000000..d3dd7a58c3 --- /dev/null +++ b/rabbitmq/docker-compose.yaml @@ -0,0 +1,14 @@ +version: '3.0' +services: + rabbitmq: + image: rabbitmq:3-management + environment: + - RABBITMQ_DEFAULT_USER=guest + - RABBITMQ_DEFAULT_PASS=guest + - RABBITMQ_VM_MEMORY_HIGH_WATERMARK_RELATIVE=0.8 + ports: + - "5672:5672" + - "15672:15672" + volumes: + - ./src/rabbitmq/20-mem.conf:/etc/rabbitmq/conf.d/20-mem.conf + diff --git a/rabbitmq/pom.xml b/rabbitmq/pom.xml index 8befd36ab6..1165f44d4a 100644 --- a/rabbitmq/pom.xml +++ b/rabbitmq/pom.xml @@ -13,6 +13,7 @@ 0.0.1-SNAPSHOT ../parent-boot-2 + @@ -30,7 +31,6 @@ com.rabbitmq amqp-client - ${amqp-client.version} org.springframework.boot @@ -40,10 +40,10 @@ org.springframework.boot spring-boot-starter-amqp + - 5.12.0 2020.0.3 diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java b/rabbitmq/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java new file mode 100644 index 0000000000..1692066bef --- /dev/null +++ b/rabbitmq/src/main/java/com/baeldung/benchmark/ConnectionPerChannelPublisher.java @@ -0,0 +1,97 @@ +package com.baeldung.benchmark; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.LongSummaryStatistics; +import java.util.Random; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.benchmark.Worker.WorkerResult; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +public class ConnectionPerChannelPublisher implements Callable { + + private static final Logger log = LoggerFactory.getLogger(ConnectionPerChannelPublisher.class); + private final ConnectionFactory factory; + private final int workerCount; + private final int iterations; + private final int payloadSize; + + ConnectionPerChannelPublisher(ConnectionFactory factory, int workerCount, int iterations, int payloadSize) { + this.factory = factory; + this.workerCount = workerCount; + this.iterations = iterations; + this.payloadSize = payloadSize; + } + + public static void main(String[] args) { + + if (args.length != 4) { + System.err.println("Usage: java " + ConnectionPerChannelPublisher.class.getName() + " <#channels> <#messages> "); + System.exit(1); + } + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(args[0]); + + int workerCount = Integer.parseInt(args[1]); + int iterations = Integer.parseInt(args[2]); + int payloadSize = Integer.parseInt(args[3]); + + // run the benchmark 10x and get the average throughput + LongSummaryStatistics summary = IntStream.range(0, 9) + .mapToObj(idx -> new ConnectionPerChannelPublisher(factory, workerCount, iterations, payloadSize)) + .map(p -> p.call()) + .collect(Collectors.summarizingLong((l) -> l)); + + log.info("[I66] workers={}, throughput={}", workerCount, (int)Math.floor(summary.getAverage())); + + } + + @Override + public Long call() { + try { + List workers = new ArrayList<>(); + CountDownLatch counter = new CountDownLatch(workerCount); + + for (int i = 0; i < workerCount; i++) { + Connection conn = factory.newConnection(); + workers.add(new Worker("queue_" + i, conn, iterations, counter, payloadSize)); + } + + ExecutorService executor = new ThreadPoolExecutor(workerCount, workerCount, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(workerCount, true)); + long start = System.currentTimeMillis(); + log.info("[I61] Starting {} workers...", workers.size()); + executor.invokeAll(workers); + if (counter.await(5, TimeUnit.MINUTES)) { + long elapsed = System.currentTimeMillis() - start; + log.info("[I59] Tasks completed: #workers={}, #iterations={}, elapsed={}ms, stats={}", workerCount, iterations, elapsed); + return throughput(workerCount, iterations, elapsed); + } else { + throw new RuntimeException("[E61] Timeout waiting workers to complete"); + } + + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + private static long throughput(int workerCount, int iterations, long elapsed) { + return (iterations * workerCount * 1000) / elapsed; + } + +} diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java b/rabbitmq/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java new file mode 100644 index 0000000000..7b44ccb9ea --- /dev/null +++ b/rabbitmq/src/main/java/com/baeldung/benchmark/SharedConnectionPublisher.java @@ -0,0 +1,165 @@ +package com.baeldung.benchmark; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.LongSummaryStatistics; +import java.util.Random; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +public class SharedConnectionPublisher { + + private static final Logger log = LoggerFactory.getLogger(SharedConnectionPublisher.class); + + + public static void main(String[] args) { + + try { + + if ( args.length != 6) { + System.err.println("Usage: java " + SharedConnectionPublisher.class.getName() + " <#channels> <#messages> <#channels/connection> "); + System.exit(1); + } + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(args[0]); + + List workers = new ArrayList<>(); + + int workerCount = Integer.parseInt(args[1]); + int iterations = Integer.parseInt(args[2]); + int payloadSize = Integer.parseInt(args[3]); + int channelsPerConnection = Integer.parseInt(args[4]); + long extraWork = Long.parseLong(args[5]); + + log.info("[I35] Creating {} worker{}...", workerCount, (workerCount > 1)?"s":""); + + CountDownLatch counter = new CountDownLatch(workerCount); + + int connCount = (workerCount + channelsPerConnection-1)/channelsPerConnection; + List connections = new ArrayList<>(connCount); + for( int i =0 ; i< connCount; i++) { + log.info("[I59] Creating connection#{}", i); + connections.add(factory.newConnection()); + } + + for( int i = 0 ; i < workerCount ; i++ ) { + workers.add(new Worker("queue_" + i, connections.get(i % connCount), iterations, counter,payloadSize,extraWork)); + } + + ExecutorService executor = new ThreadPoolExecutor(workerCount, workerCount, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(workerCount, true)); + long start = System.currentTimeMillis(); + log.info("[I61] Starting workers..."); + List> results = executor.invokeAll(workers); + + log.info("[I55] Waiting workers to complete..."); + if( counter.await(5, TimeUnit.MINUTES) ) { + long elapsed = System.currentTimeMillis() - start - (workerCount*iterations*extraWork); + log.info("[I59] Tasks completed: #workers={}, #iterations={}, elapsed={}ms", + workerCount, + iterations, + elapsed); + + LongSummaryStatistics summary = results.stream() + .map(f -> safeGet(f)) + .map(r -> r.elapsed) + .collect(Collectors.summarizingLong((l) -> l)); + + log.info("[I74] stats={}", summary); + log.info("[I79] result: workers={}, throughput={}",workerCount,throughput(workerCount,iterations,elapsed)); + + } + else { + log.error("[E61] Timeout waiting workers to complete"); + } + + } + catch(Exception ex) { + throw new RuntimeException(ex); + } + } + + private static long throughput(int workerCount, int iterations, long elapsed) { + return (iterations*workerCount*1000)/elapsed; + } + + + private static T safeGet(Future f) { + try { + return f.get(); + } + catch(Exception ex) { + throw new RuntimeException(ex); + } + } + + private static class WorkerResult { + public final long elapsed; + WorkerResult(long elapsed) { + this.elapsed = elapsed; + } + } + + + private static class Worker implements Callable { + + private final Connection conn; + private final Channel channel; + private int iterations; + private final CountDownLatch counter; + private final String queue; + private final byte[] payload; + private long extraWork; + + Worker(String queue, Connection conn, int iterations, CountDownLatch counter,int payloadSize,long extraWork) throws IOException { + this.conn = conn; + this.iterations = iterations; + this.counter = counter; + this.queue = queue; + this.extraWork = extraWork; + + channel = conn.createChannel(); + channel.queueDeclare(queue, false, false, true, null); + + this.payload = new byte[payloadSize]; + new Random().nextBytes(payload); + + } + + @Override + public WorkerResult call() throws Exception { + + try { + long start = System.currentTimeMillis(); + for ( int i = 0 ; i < iterations ; i++ ) { + channel.basicPublish("", queue, null,payload); + Thread.sleep(extraWork); + } + + long elapsed = System.currentTimeMillis() - start - (extraWork*iterations); + channel.queueDelete(queue); + return new WorkerResult(elapsed); + } + finally { + counter.countDown(); + } + } + } +} diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java b/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java new file mode 100644 index 0000000000..976a7e1990 --- /dev/null +++ b/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisher.java @@ -0,0 +1,116 @@ +package com.baeldung.benchmark; + +import java.util.ArrayList; +import java.util.List; +import java.util.LongSummaryStatistics; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.benchmark.Worker.WorkerResult; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +public class SingleConnectionPublisher implements Callable { + + private static final Logger log = LoggerFactory.getLogger(SingleConnectionPublisher.class); + + private final ConnectionFactory factory; + private final int workerCount; + private final int iterations; + private final int payloadSize; + + SingleConnectionPublisher(ConnectionFactory factory, int workerCount, int iterations, int payloadSize) { + this.factory = factory; + this.workerCount = workerCount; + this.iterations = iterations; + this.payloadSize = payloadSize; + } + + public static void main(String[] args) { + + if ( args.length != 4) { + System.err.println("Usage: java " + SingleConnectionPublisher.class.getName() + " <#channels> <#messages> "); + System.exit(1); + } + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(args[0]); + + int workerCount = Integer.parseInt(args[1]); + int iterations = Integer.parseInt(args[2]); + int payloadSize = Integer.parseInt(args[3]); + + LongSummaryStatistics summary = IntStream.range(0, 9) + .mapToObj(idx -> new SingleConnectionPublisher(factory, workerCount, iterations, payloadSize)) + .map(p -> p.call()) + .collect(Collectors.summarizingLong((l) -> l)); + + log.info("[I66] workers={}, throughput={}", workerCount, (int)Math.floor(summary.getAverage())); + + } + + @Override + public Long call() { + + try { + + Connection connection = factory.newConnection(); + CountDownLatch counter = new CountDownLatch(workerCount); + List workers = new ArrayList<>(); + + for( int i = 0 ; i < workerCount ; i++ ) { + workers.add(new Worker("queue_" + i, connection, iterations, counter,payloadSize)); + } + + ExecutorService executor = new ThreadPoolExecutor(workerCount, workerCount, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(workerCount, true)); + long start = System.currentTimeMillis(); + log.info("[I61] Starting {} workers...", workers.size()); + List> results = executor.invokeAll(workers); + + if( counter.await(5, TimeUnit.MINUTES) ) { + long elapsed = System.currentTimeMillis() - start; + + LongSummaryStatistics summary = results.stream() + .map(f -> safeGet(f)) + .map(r -> r.elapsed) + .collect(Collectors.summarizingLong((l) -> l)); + + log.info("[I59] Tasks completed: #workers={}, #iterations={}, elapsed={}ms, stats={}", + workerCount, + iterations, + elapsed, summary); + + return throughput(workerCount,iterations,elapsed); + } + else { + throw new RuntimeException("[E61] Timeout waiting workers to complete"); + } + } + catch(Exception ex) { + throw new RuntimeException(ex); + } + } + + private static T safeGet(Future f) { + try { + return f.get(); + } + catch(Exception ex) { + throw new RuntimeException(ex); + } + } + + private static long throughput(int workerCount, int iterations, long elapsed) { + return (iterations*workerCount*1000)/elapsed; + } +} diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java b/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java new file mode 100644 index 0000000000..cd4fe28ce9 --- /dev/null +++ b/rabbitmq/src/main/java/com/baeldung/benchmark/SingleConnectionPublisherNio.java @@ -0,0 +1,151 @@ +package com.baeldung.benchmark; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.LongSummaryStatistics; +import java.util.Random; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + +public class SingleConnectionPublisherNio { + + private static final Logger log = LoggerFactory.getLogger(SingleConnectionPublisherNio.class); + + + public static void main(String[] args) { + + try { + + if ( args.length != 4) { + System.err.println("Usage: java " + SingleConnectionPublisherNio.class.getName() + " <#channels> <#messages> "); + System.exit(1); + } + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(args[0]); + factory.useNio(); + Connection connection = factory.newConnection(); + + List workers = new ArrayList<>(); + + int workerCount = Integer.parseInt(args[1]); + int iterations = Integer.parseInt(args[2]); + int payloadSize = Integer.parseInt(args[3]); + + log.info("[I35] Creating {} worker{}...", workerCount, (workerCount > 1)?"s":""); + + CountDownLatch counter = new CountDownLatch(workerCount); + + for( int i = 0 ; i < workerCount ; i++ ) { + workers.add(new Worker("queue_" + i, connection, iterations, counter,payloadSize)); + } + + ExecutorService executor = new ThreadPoolExecutor(workerCount, workerCount, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<>(workerCount, true)); + long start = System.currentTimeMillis(); + log.info("[I61] Starting workers..."); + List> results = executor.invokeAll(workers); + + log.info("[I55] Waiting workers to complete..."); + if( counter.await(5, TimeUnit.MINUTES) ) { + long elapsed = System.currentTimeMillis() - start; + log.info("[I59] Tasks completed: #workers={}, #iterations={}, elapsed={}ms", + workerCount, + iterations, + elapsed); + + LongSummaryStatistics summary = results.stream() + .map(f -> safeGet(f)) + .map(r -> r.elapsed) + .collect(Collectors.summarizingLong((l) -> l)); + + log.info("[I74] stats={}", summary); + + } + else { + log.error("[E61] Timeout waiting workers to complete"); + } + + } + catch(Exception ex) { + throw new RuntimeException(ex); + } + + } + + private static T safeGet(Future f) { + try { + return f.get(); + } + catch(Exception ex) { + throw new RuntimeException(ex); + } + } + + private static class WorkerResult { + public final long elapsed; + WorkerResult(long elapsed) { + this.elapsed = elapsed; + } + } + + + private static class Worker implements Callable { + + private final Connection conn; + private final Channel channel; + private int iterations; + private final CountDownLatch counter; + private final String queue; + private final byte[] payload; + + Worker(String queue, Connection conn, int iterations, CountDownLatch counter,int payloadSize) throws IOException { + this.conn = conn; + this.iterations = iterations; + this.counter = counter; + this.queue = queue; + + channel = conn.createChannel(); + channel.queueDeclare(queue, false, false, true, null); + + this.payload = new byte[payloadSize]; + new Random().nextBytes(payload); + + } + + @Override + public WorkerResult call() throws Exception { + + try { + long start = System.currentTimeMillis(); + for ( int i = 0 ; i < iterations ; i++ ) { + channel.basicPublish("", queue, null,payload); + } + + long elapsed = System.currentTimeMillis() - start; + channel.queueDelete(queue); + return new WorkerResult(elapsed); + } + finally { + counter.countDown(); + } + } + + } +} diff --git a/rabbitmq/src/main/java/com/baeldung/benchmark/Worker.java b/rabbitmq/src/main/java/com/baeldung/benchmark/Worker.java new file mode 100644 index 0000000000..11584372b8 --- /dev/null +++ b/rabbitmq/src/main/java/com/baeldung/benchmark/Worker.java @@ -0,0 +1,59 @@ +package com.baeldung.benchmark; + +import java.io.IOException; +import java.util.Random; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; + + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; + +public class Worker implements Callable { + + private final Channel channel; + private int iterations; + private final CountDownLatch counter; + private final String queue; + private final byte[] payload; + + Worker(String queue, Connection conn, int iterations, CountDownLatch counter, int payloadSize) throws IOException { + this.iterations = iterations; + this.counter = counter; + this.queue = queue; + + channel = conn.createChannel(); + channel.queueDelete(queue); + channel.queueDeclare(queue, false, false, true, null); + + this.payload = new byte[payloadSize]; + new Random().nextBytes(payload); + + } + + @Override + public WorkerResult call() throws Exception { + + try { + long start = System.currentTimeMillis(); + for (int i = 0; i < iterations; i++) { + channel.basicPublish("", queue, null, payload); + } + + long elapsed = System.currentTimeMillis() - start; + channel.queueDelete(queue); + return new WorkerResult(elapsed); + } finally { + counter.countDown(); + } + } + + + public static class WorkerResult { + public final long elapsed; + + WorkerResult(long elapsed) { + this.elapsed = elapsed; + } + } +} diff --git a/rabbitmq/src/rabbitmq/20-mem.conf b/rabbitmq/src/rabbitmq/20-mem.conf new file mode 100644 index 0000000000..4c73e866b7 --- /dev/null +++ b/rabbitmq/src/rabbitmq/20-mem.conf @@ -0,0 +1,2 @@ +# Memory configuration for Rabbit +vm_memory_high_watermark.relative = 0.8 diff --git a/rabbitmq/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java b/rabbitmq/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java new file mode 100644 index 0000000000..0309912e91 --- /dev/null +++ b/rabbitmq/src/test/java/com/baeldung/benchmark/ConnectionPerChannelPublisherLiveTest.java @@ -0,0 +1,18 @@ +package com.baeldung.benchmark; + +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +class ConnectionPerChannelPublisherLiveTest { + + @Test + void whenConnectionPerChannel_thenRunBenchmark() throws Exception { + // host, workerCount, iterations, payloadSize + Arrays.asList(1,5,10,20,50,100,150).stream() + .forEach(workers -> { + ConnectionPerChannelPublisher.main(new String[]{"192.168.99.100", Integer.toString(workers), "1000", "4096"}); + }); + } + +} diff --git a/rabbitmq/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java b/rabbitmq/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java new file mode 100644 index 0000000000..6c03f90fb0 --- /dev/null +++ b/rabbitmq/src/test/java/com/baeldung/benchmark/SingleConnectionPublisherLiveTest.java @@ -0,0 +1,18 @@ +package com.baeldung.benchmark; + +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +class SingleConnectionPublisherLiveTest { + + @Test + void whenSingleChannel_thenRunBenchmark() throws Exception { + // host, workerCount, iterations, payloadSize + Arrays.asList(1,5,10,20,50,100,150).stream() + .forEach(workers -> { + SingleConnectionPublisher.main(new String[]{"192.168.99.100", Integer.toString(workers), "1000", "4096"}); + }); + } + +} diff --git a/reactor-core/README.md b/reactor-core/README.md index c0d4a3fc3c..dccf1fa85c 100644 --- a/reactor-core/README.md +++ b/reactor-core/README.md @@ -12,3 +12,4 @@ This module contains articles about Reactor Core. - [What Does Mono.defer() Do?](https://www.baeldung.com/java-mono-defer) - [Handling Exceptions in Project Reactor](https://www.baeldung.com/reactor-exceptions) - [Difference Between Flux.create and Flux.generate](https://www.baeldung.com/java-flux-create-generate) +- [Difference Between Flux and Mono](https://www.baeldung.com/java-reactor-flux-vs-mono) diff --git a/rxjava-modules/rxjava-core/src/test/java/com/baeldung/rxjava/RxJavaRetryWithDelayUnitTest.java b/rxjava-modules/rxjava-core/src/test/java/com/baeldung/rxjava/RxJavaRetryWithDelayUnitTest.java new file mode 100644 index 0000000000..c6c8a461a3 --- /dev/null +++ b/rxjava-modules/rxjava-core/src/test/java/com/baeldung/rxjava/RxJavaRetryWithDelayUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.rxjava; +import io.reactivex.Observable; +import org.junit.Test; + +import java.util.concurrent.TimeUnit; + +public class RxJavaRetryWithDelayUnitTest { + + @Test + public void givenObservable_whenSuccess_thenOnNext(){ + Observable.just(remoteCallSuccess()) + .subscribe(success -> { + System.out.println("Success"); + System.out.println(success); + }, err -> { + System.out.println("Error"); + System.out.println(err); + }); + } + + + @Test + public void givenObservable_whenError_thenOnError(){ + Observable.just(remoteCallError()) + .subscribe(success -> { + System.out.println("Success"); + System.out.println(success); + }, err -> { + System.out.println("Error"); + System.out.println(err); + }); + } + + @Test + public void givenError_whenRetry_thenCanDelay(){ + Observable.just(remoteCallError()) + .retryWhen(attempts -> { + return attempts.flatMap(err -> { + if (customChecker(err)) { + return Observable.timer(5000, TimeUnit.MILLISECONDS); + } else { + return Observable.error(err); + } + }); + }); + } + + + private String remoteCallSuccess(){ + return "Success"; + } + + private String remoteCallError(){ + // consider a network call that failed over here. + return "Error"; + } + + private boolean customChecker(Throwable t){ + // this will include custom logic that decides whether resubscription should occur or not + return true; + } +} diff --git a/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml b/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml index c206fc2e55..7f13e5acea 100644 --- a/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml +++ b/security-modules/oauth2-framework-impl/oauth2-authorization-server/pom.xml @@ -66,7 +66,6 @@ - 1.4.199 9080 9443 7.3 diff --git a/spring-5-webflux-2/README.md b/spring-5-webflux-2/README.md index 0222ddbaa4..e64c88c61d 100644 --- a/spring-5-webflux-2/README.md +++ b/spring-5-webflux-2/README.md @@ -3,5 +3,6 @@ This module contains articles about Spring 5 WebFlux ## Relevant articles: - -- [Spring Webflux and @Cacheable Annotation](https://www.baeldung.com/spring-webflux-cacheable) \ No newline at end of file +- [Spring Webflux and @Cacheable Annotation](https://www.baeldung.com/spring-webflux-cacheable) +- [Comparison Between Mono’s doOnNext() and doOnSuccess()](https://www.baeldung.com/mono-doonnext-doonsuccess) +- [How to Access the First Element of a Flux](https://www.baeldung.com/java-flux-first-element) diff --git a/spring-5-webflux-2/src/main/java/caching/Item.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/Item.java similarity index 95% rename from spring-5-webflux-2/src/main/java/caching/Item.java rename to spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/Item.java index 627eeef740..54b7d63f33 100644 --- a/spring-5-webflux-2/src/main/java/caching/Item.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/Item.java @@ -1,4 +1,4 @@ -package caching; +package com.baeldung.webflux.caching; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; diff --git a/spring-5-webflux-2/src/main/java/caching/ItemRepository.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemRepository.java similarity index 85% rename from spring-5-webflux-2/src/main/java/caching/ItemRepository.java rename to spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemRepository.java index d69edaf5df..4f5247aede 100644 --- a/spring-5-webflux-2/src/main/java/caching/ItemRepository.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemRepository.java @@ -1,4 +1,4 @@ -package caching; +package com.baeldung.webflux.caching; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.stereotype.Repository; diff --git a/spring-5-webflux-2/src/main/java/caching/ItemService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemService.java similarity index 96% rename from spring-5-webflux-2/src/main/java/caching/ItemService.java rename to spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemService.java index 85d7005831..7fc3732ba5 100644 --- a/spring-5-webflux-2/src/main/java/caching/ItemService.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/ItemService.java @@ -1,4 +1,4 @@ -package caching; +package com.baeldung.webflux.caching; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; diff --git a/spring-5-webflux-2/src/main/java/caching/SpringWebfluxCachingApplication.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/SpringWebfluxCachingApplication.java similarity index 92% rename from spring-5-webflux-2/src/main/java/caching/SpringWebfluxCachingApplication.java rename to spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/SpringWebfluxCachingApplication.java index df648fe6a3..09ee7f4595 100644 --- a/spring-5-webflux-2/src/main/java/caching/SpringWebfluxCachingApplication.java +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/caching/SpringWebfluxCachingApplication.java @@ -1,4 +1,4 @@ -package caching; +package com.baeldung.webflux.caching; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/model/Payment.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/model/Payment.java new file mode 100644 index 0000000000..f9be73ee44 --- /dev/null +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/model/Payment.java @@ -0,0 +1,10 @@ +package com.baeldung.webflux.model; + + +public class Payment { + private final int amount; + + public Payment(int amount) { + this.amount = amount; + } +} \ No newline at end of file diff --git a/spring-5-webflux-2/src/main/java/com/baeldung/webflux/onsuccess/PaymentService.java b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/onsuccess/PaymentService.java new file mode 100644 index 0000000000..998d47226e --- /dev/null +++ b/spring-5-webflux-2/src/main/java/com/baeldung/webflux/onsuccess/PaymentService.java @@ -0,0 +1,11 @@ +package com.baeldung.webflux.onsuccess; + +import com.baeldung.webflux.model.Payment; + +public class PaymentService { + + public void processPayment(Payment payment) { + System.err.println("Payment processed: " + payment); + } + +} \ No newline at end of file diff --git a/spring-5-webflux-2/src/test/java/caching/MonoFluxResultCachingLiveTest.java b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/caching/MonoFluxResultCachingLiveTest.java similarity index 98% rename from spring-5-webflux-2/src/test/java/caching/MonoFluxResultCachingLiveTest.java rename to spring-5-webflux-2/src/test/java/com/baeldung/webflux/caching/MonoFluxResultCachingLiveTest.java index daf8367209..028a6d33a3 100644 --- a/spring-5-webflux-2/src/test/java/caching/MonoFluxResultCachingLiveTest.java +++ b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/caching/MonoFluxResultCachingLiveTest.java @@ -1,4 +1,4 @@ -package caching; +package com.baeldung.webflux.caching; import org.junit.jupiter.api.Test; @@ -9,6 +9,7 @@ import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.testcontainers.containers.MongoDBContainer; import org.testcontainers.utility.DockerImageName; + import reactor.core.publisher.Mono; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/firstelementofflux/FirstElementOfFluxUnitTest.java b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/firstelementofflux/FirstElementOfFluxUnitTest.java new file mode 100644 index 0000000000..a036011796 --- /dev/null +++ b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/firstelementofflux/FirstElementOfFluxUnitTest.java @@ -0,0 +1,112 @@ +package com.baeldung.webflux.firstelementofflux; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Optional; + +import org.junit.jupiter.api.Test; + +import com.baeldung.webflux.model.Payment; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +public class FirstElementOfFluxUnitTest { + + private Payment paymentOf100 = new Payment(100); + + private Flux fluxOfThreePayments() { + return Flux.just(paymentOf100, new Payment(200), new Payment(300)); + } + + @Test + void givenAPaymentFlux_whenUsingNext_thenGetTheFirstPaymentAsMono() { + Mono firstPayment = fluxOfThreePayments().next(); + + StepVerifier.create(firstPayment) + .expectNext(paymentOf100) + .verifyComplete(); + } + + @Test + void givenAnEmptyFlux_whenUsingNext_thenGetAEnEmptyMono() { + Flux emptyFlux = Flux.empty(); + + Mono firstPayment = emptyFlux.next(); + + StepVerifier.create(firstPayment) + .verifyComplete(); + } + + @Test + void givenAPaymentFlux_whenUsingTake_thenGetTheFirstPaymentAsFlux() { + Flux firstPaymentFlux = fluxOfThreePayments().take(1); + + StepVerifier.create(firstPaymentFlux) + .expectNext(paymentOf100) + .verifyComplete(); + } + + @Test + void givenAEmptyFlux_whenUsingNext_thenGetAnEmptyFlux() { + Flux emptyFlux = Flux.empty(); + + Flux firstPaymentFlux = emptyFlux.take(1); + + StepVerifier.create(firstPaymentFlux) + .verifyComplete(); + } + + @Test + void givenAPaymentFlux_whenUsingElementAt_thenGetTheFirstPaymentAsMono() { + Mono firstPayment = fluxOfThreePayments().elementAt(0); + + StepVerifier.create(firstPayment) + .expectNext(paymentOf100) + .verifyComplete(); + } + + @Test + void givenAEmptyFlux_whenUsingElementAt_thenGetAnEmptyMono() { + Flux emptyFlux = Flux.empty(); + + Mono firstPayment = emptyFlux.elementAt(0); + + StepVerifier.create(firstPayment) + .expectError(IndexOutOfBoundsException.class); + } + + @Test + void givenAPaymentFlux_whenUsingBlockFirst_thenGetTheFirstPayment() { + Payment firstPayment = fluxOfThreePayments().blockFirst(); + + assertThat(firstPayment).isEqualTo(paymentOf100); + } + + @Test + void givenAEmptyFlux_whenUsingElementAt_thenGetNull() { + Flux emptyFlux = Flux.empty(); + + Payment firstPayment = emptyFlux.blockFirst(); + + assertThat(firstPayment).isNull(); + } + + @Test + void givenAPaymentFlux_whenUsingToStream_thenGetTheFirstPaymentAsOptional() { + Optional firstPayment = fluxOfThreePayments().toStream() + .findFirst(); + + assertThat(firstPayment).contains(paymentOf100); + } + + @Test + void givenAnEmptyPaymentFlux_whenUsingToStream_thenGetAnEmptyOptional() { + Flux emptyFlux = Flux.empty(); + + Optional firstPayment = emptyFlux.toStream() + .findFirst(); + + assertThat(firstPayment).isEmpty(); + } +} diff --git a/spring-5-webflux-2/src/test/java/com/baeldung/webflux/onsuccess/MonoOnSuccessVsOnNexUnitTest.java b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/onsuccess/MonoOnSuccessVsOnNexUnitTest.java new file mode 100644 index 0000000000..83552118bd --- /dev/null +++ b/spring-5-webflux-2/src/test/java/com/baeldung/webflux/onsuccess/MonoOnSuccessVsOnNexUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.webflux.onsuccess; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +import com.baeldung.webflux.model.Payment; + +import reactor.core.publisher.Mono; + +class MonoOnSuccessVsOnNexUnitTest { + + @Mock + PaymentService paymentService = mock(PaymentService.class); + + @BeforeEach + void beforeEach() { + reset(paymentService); + } + + @Test + void givenAPaymentMono_whenCallingServiceOnNext_thenCallServiceWithPayment() { + Payment paymentOf100 = new Payment(100); + Mono paymentMono = Mono.just(paymentOf100); + + paymentMono.doOnNext(paymentService::processPayment) + .block(); + + verify(paymentService).processPayment(paymentOf100); + } + + @Test + void givenAnEmptyMono_whenCallingServiceOnNext_thenDoNotCallService() { + Mono emptyMono = Mono.empty(); + + emptyMono.doOnNext(paymentService::processPayment) + .block(); + + verify(paymentService, never()).processPayment(any()); + } + + @Test + void givenAPaymentMono_whenCallingServiceOnSuccess_thenCallServiceWithPayment() { + Payment paymentOf100 = new Payment(100); + Mono paymentMono = Mono.just(paymentOf100); + + paymentMono.doOnSuccess(paymentService::processPayment) + .block(); + + verify(paymentService).processPayment(paymentOf100); + } + + @Test + void givenAnEmptyMono_whenCallingServiceOnSuccess_thenCallServiceWithNull() { + Mono emptyMono = Mono.empty(); + + emptyMono.doOnSuccess(paymentService::processPayment) + .block(); + + verify(paymentService).processPayment(null); + } + +} \ No newline at end of file diff --git a/spring-aop/src/main/resources/logback.xml b/spring-aop/src/main/resources/logback.xml index fe4dfdee56..593b93f2a7 100644 --- a/spring-aop/src/main/resources/logback.xml +++ b/spring-aop/src/main/resources/logback.xml @@ -15,7 +15,7 @@ - + \ No newline at end of file diff --git a/spring-batch/src/main/java/com/baeldung/batch/App.java b/spring-batch/src/main/java/com/baeldung/batch/App.java index 0f888a77b3..c2db446965 100644 --- a/spring-batch/src/main/java/com/baeldung/batch/App.java +++ b/spring-batch/src/main/java/com/baeldung/batch/App.java @@ -8,7 +8,9 @@ import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Profile; +@Profile("spring") public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); diff --git a/spring-batch/src/main/java/com/baeldung/batch/SpringBatchConfig.java b/spring-batch/src/main/java/com/baeldung/batch/SpringBatchConfig.java index e1c52e1582..5546df22fc 100644 --- a/spring-batch/src/main/java/com/baeldung/batch/SpringBatchConfig.java +++ b/spring-batch/src/main/java/com/baeldung/batch/SpringBatchConfig.java @@ -23,12 +23,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Profile; import org.springframework.core.io.Resource; import org.springframework.oxm.Marshaller; import org.springframework.oxm.jaxb.Jaxb2Marshaller; import java.text.ParseException; +@Profile("spring") public class SpringBatchConfig { @Autowired private JobBuilderFactory jobBuilderFactory; diff --git a/spring-batch/src/main/java/com/baeldung/batch/SpringConfig.java b/spring-batch/src/main/java/com/baeldung/batch/SpringConfig.java index 73a07482ce..dc6c242996 100644 --- a/spring-batch/src/main/java/com/baeldung/batch/SpringConfig.java +++ b/spring-batch/src/main/java/com/baeldung/batch/SpringConfig.java @@ -13,6 +13,7 @@ import org.springframework.batch.support.transaction.ResourcelessTransactionMana import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.core.io.Resource; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.jdbc.datasource.init.DataSourceInitializer; @@ -21,6 +22,7 @@ import org.springframework.transaction.PlatformTransactionManager; @Configuration @EnableBatchProcessing +@Profile("spring") public class SpringConfig { @Value("org/springframework/batch/core/schema-drop-sqlite.sql") diff --git a/spring-batch/src/main/java/com/baeldung/batch/springboot/SpringBatchApplication.java b/spring-batch/src/main/java/com/baeldung/batch/springboot/SpringBatchApplication.java new file mode 100644 index 0000000000..a3c6a45197 --- /dev/null +++ b/spring-batch/src/main/java/com/baeldung/batch/springboot/SpringBatchApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.batch.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBatchApplication { + + public static void main(String[] args) { + SpringApplication springApp = new SpringApplication(SpringBatchApplication.class); + springApp.setAdditionalProfiles("spring-boot"); + springApp.run(args); + } + +} diff --git a/spring-batch/src/main/java/com/baeldung/batch/springboot/SpringBootBatchConfig.java b/spring-batch/src/main/java/com/baeldung/batch/springboot/SpringBootBatchConfig.java new file mode 100644 index 0000000000..57531ebc39 --- /dev/null +++ b/spring-batch/src/main/java/com/baeldung/batch/springboot/SpringBootBatchConfig.java @@ -0,0 +1,151 @@ +package com.baeldung.batch.springboot; + +import com.baeldung.batch.model.Transaction; +import com.baeldung.batch.service.*; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.UnexpectedInputException; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.batch.item.xml.StaxEventItemWriter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.core.io.Resource; +import org.springframework.oxm.Marshaller; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; + +import java.text.ParseException; + +@Configuration +@EnableBatchProcessing +@Profile("spring-boot") +public class SpringBootBatchConfig { + @Autowired + private JobBuilderFactory jobBuilderFactory; + + @Autowired + private StepBuilderFactory stepBuilderFactory; + + @Value("input/record.csv") + private Resource inputCsv; + + @Value("input/recordWithInvalidData.csv") + private Resource invalidInputCsv; + + @Value("file:xml/output.xml") + private Resource outputXml; + + public ItemReader itemReader(Resource inputData) throws UnexpectedInputException, ParseException { + FlatFileItemReader reader = new FlatFileItemReader<>(); + DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); + String[] tokens = {"username", "userid", "transactiondate", "amount"}; + tokenizer.setNames(tokens); + reader.setResource(inputData); + DefaultLineMapper lineMapper = new DefaultLineMapper<>(); + lineMapper.setLineTokenizer(tokenizer); + lineMapper.setFieldSetMapper(new RecordFieldSetMapper()); + reader.setLinesToSkip(1); + reader.setLineMapper(lineMapper); + return reader; + } + + @Bean + public ItemProcessor itemProcessor() { + return new CustomItemProcessor(); + } + + @Bean + public ItemProcessor skippingItemProcessor() { + return new SkippingItemProcessor(); + } + + @Bean + public ItemWriter itemWriter3(Marshaller marshaller) { + StaxEventItemWriter itemWriter3 = new StaxEventItemWriter<>(); + itemWriter3.setMarshaller(marshaller); + itemWriter3.setRootTagName("transactionRecord"); + itemWriter3.setResource(outputXml); + return itemWriter3; + } + + @Bean + public Marshaller marshaller3() { + Jaxb2Marshaller marshaller3 = new Jaxb2Marshaller(); + marshaller3.setClassesToBeBound(Transaction.class); + return marshaller3; + } + + @Bean + protected Step step1(@Qualifier("itemProcessor") ItemProcessor processor, ItemWriter itemWriter3) throws ParseException { + return stepBuilderFactory + .get("step1") + . chunk(10) + .reader(itemReader(inputCsv)) + .processor(processor) + .writer(itemWriter3) + .build(); + } + + @Bean(name = "firstBatchJob") + public Job job(@Qualifier("step1") Step step1) { + return jobBuilderFactory.get("firstBatchJob").start(step1).build(); + } + + @Bean + public Step skippingStep(@Qualifier("skippingItemProcessor") ItemProcessor processor, + ItemWriter itemWriter3) throws ParseException { + return stepBuilderFactory + .get("skippingStep") + .chunk(10) + .reader(itemReader(invalidInputCsv)) + .processor(processor) + .writer(itemWriter3) + .faultTolerant() + .skipLimit(2) + .skip(MissingUsernameException.class) + .skip(NegativeAmountException.class) + .build(); + } + + @Bean(name = "skippingBatchJob") + public Job skippingJob(@Qualifier("skippingStep") Step skippingStep) { + return jobBuilderFactory + .get("skippingBatchJob") + .start(skippingStep) + .build(); + } + + @Bean + public Step skipPolicyStep(@Qualifier("skippingItemProcessor") ItemProcessor processor, + ItemWriter itemWriter3) throws ParseException { + return stepBuilderFactory + .get("skipPolicyStep") + .chunk(10) + .reader(itemReader(invalidInputCsv)) + .processor(processor) + .writer(itemWriter3) + .faultTolerant() + .skipPolicy(new CustomSkipPolicy()) + .build(); + } + + @Bean(name = "skipPolicyBatchJob") + public Job skipPolicyBatchJob(@Qualifier("skipPolicyStep") Step skipPolicyStep) { + return jobBuilderFactory + .get("skipPolicyBatchJob") + .start(skipPolicyStep) + .build(); + } + +} diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index eaf12d128c..337504e5e0 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -50,7 +50,6 @@ spring-boot-keycloak-2 spring-boot-libraries spring-boot-libraries-2 - spring-boot-libraries-comparison spring-boot-logging-log4j2 spring-boot-mvc spring-boot-mvc-2 diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingSpringApplication.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingSpringApplication.java new file mode 100644 index 0000000000..df4550d9d5 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingSpringApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.camel.exception; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ExceptionHandlingSpringApplication { + + public static void main(String[] args) { + SpringApplication.run(ExceptionHandlingSpringApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRoute.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRoute.java new file mode 100644 index 0000000000..ce3cfc129b --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRoute.java @@ -0,0 +1,26 @@ +package com.baeldung.camel.exception; + +import java.io.IOException; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +@Component +public class ExceptionHandlingWithDoTryRoute extends RouteBuilder { + + @Override + public void configure() throws Exception { + + from("direct:start-handling-exception") + .routeId("exception-handling-route") + .doTry() + .process(new IllegalArgumentExceptionThrowingProcessor()) + .to("mock:received") + .doCatch(IOException.class, IllegalArgumentException.class) + .to("mock:caught") + .doFinally() + .to("mock:finally") + .end(); + + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRoute.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRoute.java new file mode 100644 index 0000000000..3a438e2402 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRoute.java @@ -0,0 +1,24 @@ +package com.baeldung.camel.exception; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ExceptionHandlingWithExceptionClauseRoute extends RouteBuilder { + + @Autowired + private ExceptionLoggingProcessor exceptionLogger; + + @Override + public void configure() throws Exception { + onException(IllegalArgumentException.class).process(exceptionLogger) + .handled(true) + .to("mock:handled"); + + from("direct:start-exception-clause") + .routeId("exception-clause-route") + .process(new IllegalArgumentExceptionThrowingProcessor()) + .to("mock:received"); + } +} diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionLoggingProcessor.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionLoggingProcessor.java new file mode 100644 index 0000000000..84e4072888 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionLoggingProcessor.java @@ -0,0 +1,30 @@ +package com.baeldung.camel.exception; + +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class ExceptionLoggingProcessor implements Processor { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionLoggingProcessor.class); + + @Override + public void process(Exchange exchange) throws Exception { + Map headersMap = exchange.getIn().getHeaders(); + + if (!headersMap.isEmpty()) { + headersMap.entrySet() + .stream() + .forEach(e -> LOGGER.info("Header key [{}] -||- Header value [{}]", e.getKey(), e.getValue())); + } else { + LOGGER.info("Empty header"); + } + + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionThrowingRoute.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionThrowingRoute.java new file mode 100644 index 0000000000..752aabaf1a --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/ExceptionThrowingRoute.java @@ -0,0 +1,30 @@ +package com.baeldung.camel.exception; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class ExceptionThrowingRoute extends RouteBuilder { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionThrowingRoute.class); + + @Override + public void configure() throws Exception { + + from("direct:start-exception") + .routeId("exception-throwing-route") + .process(new Processor() { + + @Override + public void process(Exchange exchange) throws Exception { + LOGGER.error("Exception Thrown"); + throw new IllegalArgumentException("An exception happened on purpose"); + + } + }).to("mock:received"); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessor.java b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessor.java new file mode 100644 index 0000000000..461a4e6553 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/main/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessor.java @@ -0,0 +1,20 @@ +package com.baeldung.camel.exception; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class IllegalArgumentExceptionThrowingProcessor implements Processor { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionLoggingProcessor.class); + + @Override + public void process(Exchange exchange) throws Exception { + LOGGER.error("Exception Thrown"); + throw new IllegalArgumentException("An exception happened on purpose"); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java new file mode 100644 index 0000000000..23d3b1a392 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithDoTryRouteUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.camel.exception; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@CamelSpringBootTest +class ExceptionHandlingWithDoTryRouteUnitTest { + + @Autowired + private ProducerTemplate template; + + @EndpointInject("mock:caught") + private MockEndpoint mock; + + @Test + void whenSendHeaders_thenExceptionRaisedAndHandledSuccessfully() throws Exception { + mock.expectedMessageCount(1); + + template.sendBodyAndHeader("direct:start-handling-exception", null, "fruit", "Banana"); + + mock.assertIsSatisfied(); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java new file mode 100644 index 0000000000..28d672bd64 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionHandlingWithExceptionClauseRouteUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.camel.exception; + +import org.apache.camel.EndpointInject; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@CamelSpringBootTest +class ExceptionHandlingWithExceptionClauseRouteUnitTest { + + @Autowired + private ProducerTemplate template; + + @EndpointInject("mock:handled") + private MockEndpoint mock; + + @Test + void whenSendHeaders_thenExceptionRaisedAndHandledSuccessfully() throws Exception { + mock.expectedMessageCount(1); + + template.sendBodyAndHeader("direct:start-exception-clause", null, "fruit", "Banana"); + + mock.assertIsSatisfied(); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionThrowingRouteUnitTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionThrowingRouteUnitTest.java new file mode 100644 index 0000000000..6e6944fce8 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/ExceptionThrowingRouteUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.camel.exception; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.ExchangePattern; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@CamelSpringBootTest +class ExceptionThrowingRouteUnitTest { + + @Autowired + private ProducerTemplate template; + + @Test + void whenSendBody_thenExceptionRaisedSuccessfully() { + CamelContext context = template.getCamelContext(); + Exchange exchange = context.getEndpoint("direct:start-exception") + .createExchange(ExchangePattern.InOut); + + exchange.getIn().setBody("Hello Baeldung"); + Exchange out = template.send("direct:start-exception", exchange); + + assertTrue(out.isFailed(), "Should be failed"); + assertTrue(out.getException() instanceof IllegalArgumentException, "Should be IllegalArgumentException"); + assertEquals("An exception happened on purpose", out.getException().getMessage()); + } + +} diff --git a/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java new file mode 100644 index 0000000000..a95abdfd27 --- /dev/null +++ b/spring-boot-modules/spring-boot-camel/src/test/java/com/baeldung/camel/exception/IllegalArgumentExceptionThrowingProcessorUnitTest.java @@ -0,0 +1,16 @@ +package com.baeldung.camel.exception; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class IllegalArgumentExceptionThrowingProcessorUnitTest { + + @Test + void whenProcessed_thenIllegalArgumentExceptionRaisedSuccessfully() { + assertThrows(IllegalArgumentException.class, () -> { + new IllegalArgumentExceptionThrowingProcessor().process(null); + }); + } + +} diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Lion.java similarity index 72% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Lion.java index 6bfdfeb321..030acc2976 100644 --- a/spring-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java +++ b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Lion.java @@ -1,4 +1,4 @@ package com.baeldung.componentscan.filter.aspectj; -public class Loin { +public class Lion { } diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/custom/Elephant.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Elephant.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/custom/Elephant.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Elephant.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Lion.java similarity index 72% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Lion.java index 5deb4af9f3..9f4228442d 100644 --- a/spring-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java +++ b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Lion.java @@ -1,4 +1,4 @@ package com.baeldung.componentscan.filter.custom; -public class Loin { +public class Lion { } diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java similarity index 100% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Lion.java similarity index 72% rename from spring-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java rename to spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Lion.java index 5b7949be38..56d233d92f 100644 --- a/spring-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java +++ b/spring-boot-modules/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Lion.java @@ -1,4 +1,4 @@ package com.baeldung.componentscan.filter.regex; -public class Loin { +public class Lion { } diff --git a/spring-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java similarity index 95% rename from spring-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java rename to spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java index 9eb0b67c21..33667e78e4 100644 --- a/spring-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java +++ b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.componentscan.filter.annotation; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; @@ -13,6 +12,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.test.context.junit4.SpringRunner; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes = ComponentScanAnnotationFilterApp.class) diff --git a/spring-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppUnitTest.java b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppUnitTest.java similarity index 95% rename from spring-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppUnitTest.java rename to spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppUnitTest.java index a85c451299..11283eb177 100644 --- a/spring-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppUnitTest.java +++ b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppUnitTest.java @@ -1,6 +1,5 @@ package com.baeldung.componentscan.filter.aspectj; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; @@ -13,6 +12,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.test.context.junit4.SpringRunner; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes = ComponentScanAspectJFilterApp.class) diff --git a/spring-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java similarity index 96% rename from spring-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java rename to spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java index edd82f435c..98d553d960 100644 --- a/spring-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java +++ b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.componentscan.filter.assignable; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; @@ -13,6 +12,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.test.context.junit4.SpringRunner; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes = ComponentScanAssignableTypeFilterApp.class) diff --git a/spring-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java similarity index 96% rename from spring-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java rename to spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java index 9902a620ad..7047bc5ec9 100644 --- a/spring-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java +++ b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.stream.Collectors; import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes = ComponentScanCustomFilterApp.class) diff --git a/spring-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java similarity index 95% rename from spring-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java rename to spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java index 38d6acd7f8..83d05314af 100644 --- a/spring-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java +++ b/spring-boot-modules/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java @@ -1,6 +1,5 @@ package com.baeldung.componentscan.filter.regex; -import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.List; @@ -13,6 +12,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.test.context.junit4.SpringRunner; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.assertThat; @RunWith(SpringRunner.class) @SpringBootTest(classes = ComponentScanRegexFilterApp.class) diff --git a/spring-boot-modules/spring-boot-graphql/README.md b/spring-boot-modules/spring-boot-graphql/README.md index 8223360597..cee4f7eae1 100644 --- a/spring-boot-modules/spring-boot-graphql/README.md +++ b/spring-boot-modules/spring-boot-graphql/README.md @@ -9,6 +9,9 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Getting Started with GraphQL and Spring Boot](https://www.baeldung.com/spring-graphql) - [Expose GraphQL Field with Different Name](https://www.baeldung.com/graphql-field-name) +- [Error Handling in GraphQL With Spring Boot](https://www.baeldung.com/spring-graphql-error-handling) +- [How to Test GraphQL Using Postman](https://www.baeldung.com/graphql-postman) +- [GraphQL vs REST](https://www.baeldung.com/graphql-vs-rest) ### GraphQL sample queries diff --git a/spring-boot-modules/spring-boot-graphql/pom.xml b/spring-boot-modules/spring-boot-graphql/pom.xml index b89bc42d2f..4130881f0e 100644 --- a/spring-boot-modules/spring-boot-graphql/pom.xml +++ b/spring-boot-modules/spring-boot-graphql/pom.xml @@ -18,6 +18,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-data-jpa + org.springframework.boot spring-boot-starter-graphql @@ -26,11 +30,21 @@ org.projectlombok lombok + + com.h2database + h2 + + org.springframework.boot spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-webflux + test + org.springframework.graphql spring-graphql-test diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java new file mode 100644 index 0000000000..1fc2b623cd --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.graphql.error.handling; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GraphQLErrorHandlerApplication { + public static void main(String[] args) { + System.setProperty("spring.profiles.default", "error-handling"); + SpringApplication.run(GraphQLErrorHandlerApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/controller/VehicleController.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/controller/VehicleController.java new file mode 100644 index 0000000000..21aa1c7d47 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/controller/VehicleController.java @@ -0,0 +1,43 @@ +package com.baeldung.graphql.error.handling.controller; + +import com.baeldung.graphql.error.handling.domain.Location; +import com.baeldung.graphql.error.handling.domain.Vehicle; +import com.baeldung.graphql.error.handling.service.InventoryService; +import org.springframework.graphql.data.method.annotation.Argument; +import org.springframework.graphql.data.method.annotation.MutationMapping; +import org.springframework.graphql.data.method.annotation.QueryMapping; +import org.springframework.stereotype.Controller; + +import java.util.List; + +@Controller +public class VehicleController { + + private final InventoryService inventoryService; + + public VehicleController(InventoryService inventoryService) { + this.inventoryService = inventoryService; + } + + @QueryMapping + public List searchAll() { + return this.inventoryService.searchAll(); + } + + @QueryMapping + public List searchByLocation(@Argument String zipcode) { + return this.inventoryService.searchByLocation(zipcode); + } + + @QueryMapping + public Vehicle searchByVin(@Argument String vin) { + return this.inventoryService.searchByVin(vin); + } + + @MutationMapping + public Vehicle addVehicle(@Argument String vin, @Argument Integer year, + @Argument String make, @Argument String model, @Argument String trim, + @Argument Location location) { + return this.inventoryService.addVehicle(vin, year, make, model, trim, location); + } +} diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java similarity index 100% rename from graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/domain/Location.java diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java similarity index 100% rename from graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/domain/Vehicle.java diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java new file mode 100644 index 0000000000..8c69b3df24 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/AbstractGraphQLException.java @@ -0,0 +1,26 @@ +package com.baeldung.graphql.error.handling.exception; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +public class AbstractGraphQLException extends RuntimeException { + + private Map parameters = new HashMap<>(); + + public AbstractGraphQLException(String message) { + super(message); + } + + public AbstractGraphQLException(String message, Map additionParams) { + this(message); + if (additionParams != null) { + parameters = additionParams; + } + } + + public Map getExtensions() { + return parameters.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } +} diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/CustomExceptionResolver.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/CustomExceptionResolver.java new file mode 100644 index 0000000000..35ee5e75c0 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/CustomExceptionResolver.java @@ -0,0 +1,34 @@ +package com.baeldung.graphql.error.handling.exception; + +import graphql.GraphQLError; +import graphql.GraphqlErrorBuilder; +import graphql.schema.DataFetchingEnvironment; +import org.springframework.graphql.execution.DataFetcherExceptionResolverAdapter; +import org.springframework.graphql.execution.ErrorType; +import org.springframework.stereotype.Component; + +@Component +public class CustomExceptionResolver extends DataFetcherExceptionResolverAdapter { + + @Override + protected GraphQLError resolveToSingleError(Throwable ex, DataFetchingEnvironment env) { + if (ex instanceof VehicleNotFoundException) { + return GraphqlErrorBuilder.newError() + .errorType(ErrorType.NOT_FOUND) + .message(ex.getMessage()) + .path(env.getExecutionStepInfo().getPath()) + .location(env.getField().getSourceLocation()) + .build(); + } else if (ex instanceof AbstractGraphQLException) { + return GraphqlErrorBuilder.newError() + .errorType(ErrorType.INTERNAL_ERROR) + .message(ex.getMessage()) + .path(env.getExecutionStepInfo().getPath()) + .location(env.getField().getSourceLocation()) + .extensions(((AbstractGraphQLException) ex).getExtensions()) + .build(); + } else { + return null; + } + } +} diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java similarity index 100% rename from graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/InvalidInputException.java diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java similarity index 100% rename from graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleAlreadyPresentException.java diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java new file mode 100644 index 0000000000..95e0b03048 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/exception/VehicleNotFoundException.java @@ -0,0 +1,9 @@ +package com.baeldung.graphql.error.handling.exception; + +public class VehicleNotFoundException extends RuntimeException { + + public VehicleNotFoundException(String message) { + super(message); + } + +} diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java similarity index 100% rename from graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/repository/InventoryRepository.java diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java similarity index 100% rename from graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/repository/LocationRepository.java diff --git a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java similarity index 83% rename from graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java index 7064b08760..9b8d3716d6 100644 --- a/graphql-modules/graphql-error-handling/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/error/handling/service/InventoryService.java @@ -15,8 +15,8 @@ import java.util.*; @Service public class InventoryService { - private InventoryRepository inventoryRepository; - private LocationRepository locationRepository; + private final InventoryRepository inventoryRepository; + private final LocationRepository locationRepository; public InventoryService(InventoryRepository inventoryRepository, LocationRepository locationRepository) { this.inventoryRepository = inventoryRepository; @@ -29,7 +29,7 @@ public class InventoryService { if (existingVehicle.isPresent()) { Map params = new HashMap<>(); params.put("vin", vin); - throw new VehicleAlreadyPresentException("Failed to add vehicle. Vehicle with vin " + vin + " already present.", params); + throw new VehicleAlreadyPresentException("Failed to add vehicle. Vehicle with vin already present.", params); } Vehicle vehicle = Vehicle.builder() .vin(vin) @@ -58,10 +58,7 @@ public class InventoryService { } public Vehicle searchByVin(String vin) { - return this.inventoryRepository.findById(vin).orElseThrow(() -> { - Map params = new HashMap<>(); - params.put("vin", vin); - return new VehicleNotFoundException("Vehicle with vin " + vin + " not found.", params); - }); + return this.inventoryRepository.findById(vin) + .orElseThrow(() -> new VehicleNotFoundException("Vehicle with vin: " + vin + " not found.")); } } diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/Author.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/Author.java similarity index 78% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/Author.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/Author.java index e4597504af..acad5ca858 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/Author.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/Author.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import lombok.Data; diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/AuthorController.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/AuthorController.java similarity index 92% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/AuthorController.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/AuthorController.java index bbc1466f8a..656b2ca927 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/AuthorController.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/AuthorController.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import org.springframework.graphql.data.method.annotation.SchemaMapping; import org.springframework.stereotype.Controller; diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/AuthorDao.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/AuthorDao.java similarity index 91% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/AuthorDao.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/AuthorDao.java index 37946e57dd..5b602a43de 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/AuthorDao.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/AuthorDao.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import java.util.List; diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/GraphqlApplication.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/GraphqlApplication.java similarity index 66% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/GraphqlApplication.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/GraphqlApplication.java index 34bdeebe7b..3910b4331b 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/GraphqlApplication.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/GraphqlApplication.java @@ -1,12 +1,16 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; @SpringBootApplication -@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class}) +@EnableAutoConfiguration(exclude = { + SecurityAutoConfiguration.class, + HibernateJpaAutoConfiguration.class +}) public class GraphqlApplication { public static void main(String[] args) { diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/GraphqlConfiguration.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/GraphqlConfiguration.java similarity index 97% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/GraphqlConfiguration.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/GraphqlConfiguration.java index 30cb71c43c..01cb3713eb 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/GraphqlConfiguration.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/GraphqlConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/Post.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/Post.java similarity index 83% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/Post.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/Post.java index 65f189162a..64045c240b 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/Post.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/Post.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import lombok.Data; diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/PostController.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/PostController.java similarity index 97% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/PostController.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/PostController.java index 2df17bf5f6..770d274a47 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/PostController.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/PostController.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.MutationMapping; diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/PostDao.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/PostDao.java similarity index 94% rename from spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/PostDao.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/PostDao.java index a0724efaad..3a27508230 100644 --- a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/PostDao.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphql/intro/PostDao.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import java.util.List; import java.util.stream.Collectors; diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/GraphqlVsRestApplication.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/GraphqlVsRestApplication.java similarity index 64% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/GraphqlVsRestApplication.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/GraphqlVsRestApplication.java index 29a3ef1e0f..b4bb31c86c 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/GraphqlVsRestApplication.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/GraphqlVsRestApplication.java @@ -1,18 +1,20 @@ package com.baeldung.graphqlvsrest; -import com.baeldung.graphqlvsrest.configuration.GraphqlConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -import org.springframework.context.annotation.Import; @SpringBootApplication -@Import(GraphqlConfiguration.class) -@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class}) +@EnableAutoConfiguration(exclude = { + SecurityAutoConfiguration.class, + HibernateJpaAutoConfiguration.class +}) public class GraphqlVsRestApplication { public static void main(String[] args) { + System.setProperty("spring.profiles.default", "rest-vs-graphql"); SpringApplication.run(GraphqlVsRestApplication.class, args); } diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/configuration/GraphqlConfiguration.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/configuration/GraphqlConfiguration.java new file mode 100644 index 0000000000..aab94aaed6 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/configuration/GraphqlConfiguration.java @@ -0,0 +1,8 @@ +package com.baeldung.graphqlvsrest.configuration; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class GraphqlConfiguration { + +} diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/controller/OrderController.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/OrderController.java similarity index 66% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/controller/OrderController.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/OrderController.java index 14f0468bbd..960b3dd279 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/controller/OrderController.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/OrderController.java @@ -1,13 +1,12 @@ package com.baeldung.graphqlvsrest.controller; import com.baeldung.graphqlvsrest.entity.Order; -import com.baeldung.graphqlvsrest.entity.Product; -import com.baeldung.graphqlvsrest.model.ProductModel; import com.baeldung.graphqlvsrest.repository.OrderRepository; -import com.baeldung.graphqlvsrest.repository.ProductRepository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; import java.util.List; diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/controller/ProductController.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/ProductController.java similarity index 58% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/controller/ProductController.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/ProductController.java index 2fdee8765a..490db1070f 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/controller/ProductController.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/ProductController.java @@ -5,7 +5,13 @@ import com.baeldung.graphqlvsrest.model.ProductModel; import com.baeldung.graphqlvsrest.repository.ProductRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -17,22 +23,22 @@ public class ProductController { ProductRepository productRepository; @GetMapping - public List getProducts(Pageable pageable){ + public List getProducts(Pageable pageable) { return productRepository.getProducts(pageable.getPageSize(), pageable.getPageNumber()); } @GetMapping("/{product-id}") - public Product getProducts(@PathVariable("product-id") Integer productId){ + public Product getProduct(@PathVariable("product-id") Integer productId) { return productRepository.getProduct(productId); } @PostMapping - public Product save(@RequestBody ProductModel productModel){ + public Product save(@RequestBody ProductModel productModel) { return productRepository.save(productModel); } @PutMapping("/{product-id}") - public Product update(@PathVariable("product-id") Integer productId, @RequestBody ProductModel productModel){ + public Product update(@PathVariable("product-id") Integer productId, @RequestBody ProductModel productModel) { return productRepository.update(productId, productModel); } } diff --git a/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/ProductGraphQLController.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/ProductGraphQLController.java new file mode 100644 index 0000000000..a73f9ec135 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/controller/ProductGraphQLController.java @@ -0,0 +1,51 @@ +package com.baeldung.graphqlvsrest.controller; + +import com.baeldung.graphqlvsrest.entity.Order; +import com.baeldung.graphqlvsrest.entity.Product; +import com.baeldung.graphqlvsrest.model.ProductModel; +import com.baeldung.graphqlvsrest.repository.OrderRepository; +import com.baeldung.graphqlvsrest.repository.ProductRepository; +import org.springframework.graphql.data.method.annotation.Argument; +import org.springframework.graphql.data.method.annotation.MutationMapping; +import org.springframework.graphql.data.method.annotation.QueryMapping; +import org.springframework.graphql.data.method.annotation.SchemaMapping; +import org.springframework.stereotype.Controller; + +import java.util.List; + +@Controller +public class ProductGraphQLController { + + private final ProductRepository productRepository; + + private final OrderRepository orderRepository; + + public ProductGraphQLController(ProductRepository productRepository, OrderRepository orderRepository) { + this.productRepository = productRepository; + this.orderRepository = orderRepository; + } + + @QueryMapping + public List products(@Argument int size, @Argument int page) { + return productRepository.getProducts(size, page); + } + + @QueryMapping + public Product product(@Argument int id) { + return productRepository.getProduct(id); + } + + @MutationMapping + public Product saveProduct(@Argument ProductModel product) { + return productRepository.save(product); + } + + @MutationMapping + public Product updateProduct(@Argument Integer id, @Argument ProductModel product) { + return productRepository.update(id, product); + } + @SchemaMapping(typeName="Product", field="orders") + public List getOrders(Product product) { + return orderRepository.getOrdersByProduct(product.getId()); + } +} diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/entity/Order.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/entity/Order.java similarity index 50% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/entity/Order.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/entity/Order.java index 89606e9897..0891d1fdee 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/entity/Order.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/entity/Order.java @@ -2,11 +2,11 @@ package com.baeldung.graphqlvsrest.entity; public class Order { private Integer id; - private Integer product_id; - private String customer_uuid; + private Integer productId; + private String customerId; private String status; private String address; - private String creation_date; + private String creationDate; public Integer getId() { return id; @@ -16,12 +16,12 @@ public class Order { this.id = id; } - public Integer getProduct_id() { - return product_id; + public Integer getProductId() { + return productId; } - public void setProduct_id(Integer product_id) { - this.product_id = product_id; + public void setProductId(Integer productId) { + this.productId = productId; } public String getStatus() { @@ -32,12 +32,12 @@ public class Order { this.status = status; } - public String getCustomer_uuid() { - return customer_uuid; + public String getCustomerId() { + return customerId; } - public void setCustomer_uuid(String customer_uuid) { - this.customer_uuid = customer_uuid; + public void setCustomerId(String customerId) { + this.customerId = customerId; } public String getAddress() { @@ -48,11 +48,11 @@ public class Order { this.address = address; } - public String getCreation_date() { - return creation_date; + public String getCreationDate() { + return creationDate; } - public void setCreation_date(String creation_date) { - this.creation_date = creation_date; + public void setCreationDate(String creationDate) { + this.creationDate = creationDate; } } diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/entity/Product.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/entity/Product.java similarity index 70% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/entity/Product.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/entity/Product.java index 2da9244c92..66c64fa2c3 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/entity/Product.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/entity/Product.java @@ -11,10 +11,10 @@ public class Product { private String status; private String currency; private Double price; - private List image_url; - private List video_url; + private List imageUrls; + private List videoUrls; private Integer stock; - private Float average_rating; + private Float averageRating; public Product(Integer id, ProductModel productModel) { this.id = id; @@ -23,9 +23,9 @@ public class Product { this.currency = productModel.getCurrency(); this.price = productModel.getPrice(); this.stock = productModel.getStock(); - this.image_url = productModel.getImage_url(); - this.video_url = productModel.getVideo_url(); - this.average_rating = 0F; + this.imageUrls = productModel.getImageUrls(); + this.videoUrls = productModel.getVideoUrls(); + this.averageRating = 0F; this.status = productModel.getStatus(); } @@ -81,20 +81,20 @@ public class Product { this.price = price; } - public List getImage_url() { - return image_url; + public List getImageUrls() { + return imageUrls; } - public void setImage_url(List image_url) { - this.image_url = image_url; + public void setImageUrls(List imageUrls) { + this.imageUrls = imageUrls; } - public List getVideo_url() { - return video_url; + public List getVideoUrls() { + return videoUrls; } - public void setVideo_url(List video_url) { - this.video_url = video_url; + public void setVideoUrls(List videoUrls) { + this.videoUrls = videoUrls; } public Integer getStock() { @@ -105,11 +105,11 @@ public class Product { this.stock = stock; } - public Float getAverage_rating() { - return average_rating; + public Float getAverageRating() { + return averageRating; } - public void setAverage_rating(Float average_rating) { - this.average_rating = average_rating; + public void setAverageRating(Float averageRating) { + this.averageRating = averageRating; } } diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/model/ProductModel.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/model/ProductModel.java similarity index 76% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/model/ProductModel.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/model/ProductModel.java index db7a3ba54e..d5f6d91ed7 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/model/ProductModel.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/model/ProductModel.java @@ -8,8 +8,8 @@ public class ProductModel { private String status; private String currency; private Double price; - private List image_url; - private List video_url; + private List imageUrls; + private List videoUrls; private Integer stock; public String getName() { @@ -52,20 +52,20 @@ public class ProductModel { this.price = price; } - public List getImage_url() { - return image_url; + public List getImageUrls() { + return imageUrls; } - public void setImage_url(List image_url) { - this.image_url = image_url; + public void setImageUrls(List imageUrls) { + this.imageUrls = imageUrls; } - public List getVideo_url() { - return video_url; + public List getVideoUrls() { + return videoUrls; } - public void setVideo_url(List video_url) { - this.video_url = video_url; + public void setVideoUrls(List videoUrls) { + this.videoUrls = videoUrls; } public Integer getStock() { @@ -84,8 +84,8 @@ public class ProductModel { ", status='" + status + '\'' + ", currency='" + currency + '\'' + ", price=" + price + - ", image_url=" + image_url + - ", video_url=" + video_url + + ", imageUrls=" + imageUrls + + ", videoUrls=" + videoUrls + ", stock=" + stock + '}'; } diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/OrderRepository.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/OrderRepository.java similarity index 67% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/OrderRepository.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/OrderRepository.java index 92cc288426..bf4557baa7 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/OrderRepository.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/OrderRepository.java @@ -1,8 +1,6 @@ package com.baeldung.graphqlvsrest.repository; import com.baeldung.graphqlvsrest.entity.Order; -import com.baeldung.graphqlvsrest.entity.Product; -import com.baeldung.graphqlvsrest.model.ProductModel; import java.util.List; diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/ProductRepository.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/ProductRepository.java similarity index 100% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/ProductRepository.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/ProductRepository.java diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/impl/OrderRepositoryImpl.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/impl/OrderRepositoryImpl.java similarity index 56% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/impl/OrderRepositoryImpl.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/impl/OrderRepositoryImpl.java index e4f316c865..6b1972c723 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/impl/OrderRepositoryImpl.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/impl/OrderRepositoryImpl.java @@ -13,24 +13,25 @@ import java.util.stream.Collectors; @Repository public class OrderRepositoryImpl implements OrderRepository { - private static List orderList = new ArrayList<>(); + private static final List ORDER_LIST = new ArrayList<>(); public OrderRepositoryImpl() { - for (int i = 1; i <= 100; i++){ + for (int i = 1; i <= 100; i++) { Order order = new Order(); order.setId(i); - order.setProduct_id(i%10); - order.setAddress(UUID.randomUUID().toString()); - order.setCustomer_uuid(UUID.randomUUID().toString()); - order.setCreation_date(new Date(System.currentTimeMillis()).toString()); + order.setProductId(i % 10); + order.setAddress(i + " A Street"); + order.setCustomerId(UUID.randomUUID().toString()); + order.setCreationDate(new Date(System.currentTimeMillis()).toString()); order.setStatus("Delivered"); - orderList.add(order); + ORDER_LIST.add(order); } } - @Override public List getOrdersByProduct(Integer productId) { - return orderList.stream().filter(order -> order.getProduct_id().equals(productId)).collect(Collectors.toList()); + return ORDER_LIST.stream() + .filter(order -> order.getProductId().equals(productId)) + .collect(Collectors.toList()); } } diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/impl/ProductRepositoryImpl.java b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/impl/ProductRepositoryImpl.java similarity index 63% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/impl/ProductRepositoryImpl.java rename to spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/impl/ProductRepositoryImpl.java index 845472faea..b7ba322b43 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/repository/impl/ProductRepositoryImpl.java +++ b/spring-boot-modules/spring-boot-graphql/src/main/java/com/baeldung/graphqlvsrest/repository/impl/ProductRepositoryImpl.java @@ -6,68 +6,75 @@ import com.baeldung.graphqlvsrest.repository.ProductRepository; import org.springframework.stereotype.Repository; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import static java.util.Collections.singletonList; + @Repository public class ProductRepositoryImpl implements ProductRepository { - private static List productList = new ArrayList<>(); + private static final List PRODUCT_LIST = new ArrayList<>(); public ProductRepositoryImpl() { - for (int i = 1; i <= 10; i++){ + for (int i = 1; i <= 10; i++) { Product product = new Product(); product.setId(i); product.setName(String.format("Product %d", i)); product.setDescription(String.format("Product %d description", i)); product.setCurrency(String.format("Product %d currency", i)); - product.setPrice(Double.valueOf(i^2)); + product.setPrice((double) (i ^ 2)); product.setStock(10); - product.setAverage_rating(0F); - product.setImage_url(Arrays.asList(String.format("www.baeldung.com/imageurl/%d", i))); - product.setVideo_url(Arrays.asList(String.format("www.baeldung.com/videourl/%d", i))); - productList.add(product); + product.setAverageRating(0F); + product.setImageUrls(singletonList(String.format("www.baeldung.com/imageurl/%d", i))); + product.setVideoUrls(singletonList(String.format("www.baeldung.com/videourl/%d", i))); + + PRODUCT_LIST.add(product); } } @Override public List getProducts(Integer pageSize, Integer pageNumber) { - return productList.stream().skip(pageSize*pageNumber).limit(pageSize).collect(Collectors.toList()); + return PRODUCT_LIST.stream() + .skip((long) pageSize * pageNumber) + .limit(pageSize) + .collect(Collectors.toList()); } @Override public Product getProduct(Integer id) { - return productList.stream().filter(product -> product.getId().equals(id)).findFirst().orElse(null); + return PRODUCT_LIST.stream() + .filter(product -> product.getId().equals(id)) + .findFirst().orElse(null); } @Override public Product save(ProductModel productModel) { - Product product = new Product(productList.size()+1, productModel); - productList.add(product); + Product product = new Product(PRODUCT_LIST.size() + 1, productModel); + PRODUCT_LIST.add(product); return product; } @Override public Product update(Integer productId, ProductModel productModel) { - Product product = getProduct(productId); - if (product != null){ + Product product = getProduct(productId); + if (product != null) { update(product, productModel); } return product; } - private void update(Product product, ProductModel productModel){ + private void update(Product product, ProductModel productModel) { if (productModel != null) { - System.out.println(productModel.toString()); + System.out.println(productModel); Optional.ofNullable(productModel.getName()).ifPresent(product::setName); Optional.ofNullable(productModel.getDescription()).ifPresent(product::setDescription); Optional.ofNullable(productModel.getCurrency()).ifPresent(product::setCurrency); - Optional.ofNullable(productModel.getImage_url()).ifPresent(product::setImage_url); + Optional.ofNullable(productModel.getImageUrls()).ifPresent(product::setImageUrls); Optional.ofNullable(productModel.getStock()).ifPresent(product::setStock); Optional.ofNullable(productModel.getStatus()).ifPresent(product::setStatus); - Optional.ofNullable(productModel.getVideo_url()).ifPresent(product::setVideo_url); + Optional.ofNullable(productModel.getVideoUrls()).ifPresent(product::setVideoUrls); Optional.ofNullable(productModel.getPrice()).ifPresent(product::setPrice); } } diff --git a/graphql-modules/graphql-error-handling/src/main/resources/application.yml b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-error-handling.yml similarity index 65% rename from graphql-modules/graphql-error-handling/src/main/resources/application.yml rename to spring-boot-modules/spring-boot-graphql/src/main/resources/application-error-handling.yml index 155e133a62..298eeb16c1 100644 --- a/graphql-modules/graphql-error-handling/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-error-handling.yml @@ -1,23 +1,24 @@ -graphql: - servlet: - mapping: /graphql +server: + port: 8081 spring: + graphql: + schema: + locations: classpath:error-handling/graphql/ datasource: url: "jdbc:h2:mem:graphqldb" driverClassName: "org.h2.Driver" username: sa password: - initialization-mode: always platform: h2 - jpa: show-sql: true properties: hibernate: dialect: org.hibernate.dialect.H2Dialect ddl-auto: none + globally_quoted_identifiers: true h2: - console.enabled: true \ No newline at end of file + console.enabled: true diff --git a/spring-boot-modules/spring-boot-graphql/src/main/resources/application-rest-vs-graphql.yml b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-rest-vs-graphql.yml new file mode 100644 index 0000000000..58069ddd72 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/application-rest-vs-graphql.yml @@ -0,0 +1,11 @@ +server: + port: 8081 + +spring: + graphql: + schema: + locations: classpath:graphql-vs-rest/ + + jackson: + parser: + allow-unquoted-control-chars: true \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/main/resources/graphql/inventory.graphqls b/spring-boot-modules/spring-boot-graphql/src/main/resources/error-handling/graphql/inventory.graphqls similarity index 100% rename from graphql-modules/graphql-error-handling/src/main/resources/graphql/inventory.graphqls rename to spring-boot-modules/spring-boot-graphql/src/main/resources/error-handling/graphql/inventory.graphqls diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/resources/graphql/schema.graphqls b/spring-boot-modules/spring-boot-graphql/src/main/resources/graphql-vs-rest/schema.graphqls similarity index 77% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/resources/graphql/schema.graphqls rename to spring-boot-modules/spring-boot-graphql/src/main/resources/graphql-vs-rest/schema.graphqls index 2709510d72..520f26648c 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/resources/graphql/schema.graphqls +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/graphql-vs-rest/schema.graphqls @@ -5,20 +5,20 @@ type Product { status: String currency: String! price: Float - image_url: [String] - video_url: [String] + imageUrls: [String] + videoUrls: [String] stock: Int - average_rating: Float + averageRating: Float orders:[Order] } type Order{ id:ID - product_id:Int - customer_uuid:String + productId:Int + customerId:String address:String status:String - creation_date:String + creationDate:String } input ProductModel { @@ -27,8 +27,8 @@ input ProductModel { status: String currency: String! price: Float - image_url: [String] - video_url: [String] + imageUrls: [String] + videoUrls: [String] stock: Int } @@ -38,8 +38,8 @@ input ProductUpdateModel { status: String currency: String price: Float - image_url: [String] - video_url: [String] + imageUrls: [String] + videoUrls: [String] stock: Int } diff --git a/spring-boot-modules/spring-boot-graphql/src/main/resources/import.sql b/spring-boot-modules/spring-boot-graphql/src/main/resources/import.sql new file mode 100644 index 0000000000..647d17a76d --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/main/resources/import.sql @@ -0,0 +1,7 @@ +insert into "location" values('07092', 'Mountainside', 'NJ'); +insert into "location" values ('94118', 'San Francisco', 'CA'); +insert into "location" values ('10002', 'New York', 'NY'); + +insert into "vehicle" ("vin", "year", "make", "model", "trim", "fk_location") values('KM8JN72DX7U587496', 2007, 'Hyundai', 'Tucson', null, '07092'); +insert into "vehicle" ("vin", "year", "make", "model", "trim", "fk_location") values('JTKKU4B41C1023346', 2012, 'Toyota', 'Scion', 'Xd', '94118'); +insert into "vehicle" ("vin", "year", "make", "model", "trim", "fk_location") values('1G1JC1444PZ215071', 2000, 'Chevrolet', 'CAVALIER VL', 'RS', '07092'); \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerIntegrationTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerIntegrationTest.java new file mode 100644 index 0000000000..b9b88e921b --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/error/handling/GraphQLErrorHandlerIntegrationTest.java @@ -0,0 +1,90 @@ +package com.baeldung.graphql.error.handling; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.graphql.test.tester.HttpGraphQlTester; +import org.springframework.test.context.ActiveProfiles; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static graphql.ErrorType.NullValueInNonNullableField; +import static org.springframework.graphql.execution.ErrorType.INTERNAL_ERROR; +import static org.springframework.graphql.execution.ErrorType.NOT_FOUND; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = GraphQLErrorHandlerApplication.class) +@ActiveProfiles("error-handling") +public class GraphQLErrorHandlerIntegrationTest { + + private static final String GRAPHQL_TEST_REQUEST_PATH = "src/test/resources/graphql-files/request/%s_request.graphql"; + private static final String GRAPHQL_TEST_RESPONSE_PATH = "src/test/resources/graphql-files/response/%s_response.json"; + + @Autowired + private HttpGraphQlTester graphQlTester; + + @Test + void whenMandatoryFieldNull_thenRespondWithResponseError() throws IOException { + String nonNullFieldScenario = "non_null_field"; + + graphQlTester.document(fileToRequest(nonNullFieldScenario)) + .execute() + .errors() + .expect(error -> error.getErrorType() == NullValueInNonNullableField) + .verify() + .path("$.data") + .matchesJson(fileToResponse(nonNullFieldScenario)); + } + + @Test + void whenUnhandledException_thenRespondWithGenericError() throws IOException { + String unhandledExceptionScenario = "unhandled_exception"; + + graphQlTester.document(fileToRequest(unhandledExceptionScenario)) + .execute() + .errors() + .expect(error -> error.getErrorType() == INTERNAL_ERROR) + .verify() + .path("$.data") + .valueIsNull(); + } + + @Test + void whenHandledException_thenRespondWithCustomErrorDetails() throws IOException { + String handledExceptionScenario = "handled_exception"; + + graphQlTester.document(fileToRequest(handledExceptionScenario)) + .execute() + .errors() + .expect(error -> error.getErrorType() == NOT_FOUND + && "Vehicle with vin: 123 not found.".equals(error.getMessage())) + .verify() + .path("$.data") + .matchesJson("{\n" + + " \"searchByVin\": null\n" + + " }"); + } + + @Test + void whenNoException_thenRespondWithNoError() throws IOException { + String noExceptionScenario = "no_exception"; + + graphQlTester.document(fileToRequest(noExceptionScenario)) + .execute() + .path("$.data") + .matchesJson(fileToResponse(noExceptionScenario)); + } + + private static String fileToRequest(String fileName) throws IOException { + Path path = Paths.get(String.format(GRAPHQL_TEST_REQUEST_PATH, fileName)); + return new String(Files.readAllBytes(path)); + } + + private static String fileToResponse(String fileName) throws IOException { + Path path = Paths.get(String.format(GRAPHQL_TEST_RESPONSE_PATH, fileName)); + return new String(Files.readAllBytes(path)); + } +} diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/PostControllerIntegrationTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/PostControllerIntegrationTest.java similarity index 97% rename from spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/PostControllerIntegrationTest.java rename to spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/PostControllerIntegrationTest.java index 1cb008b7be..bccf5099bd 100644 --- a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/PostControllerIntegrationTest.java +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/PostControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; import lombok.SneakyThrows; import org.junit.jupiter.api.Test; diff --git a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/SpringContextTest.java b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java similarity index 75% rename from spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/SpringContextTest.java rename to spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java index 2b8ce5f35d..87bebf644c 100644 --- a/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/SpringContextTest.java +++ b/spring-boot-modules/spring-boot-graphql/src/test/java/com/baeldung/graphql/intro/SpringContextTest.java @@ -1,5 +1,6 @@ -package com.baeldung.graphql; +package com.baeldung.graphql.intro; +import com.baeldung.graphql.intro.GraphqlApplication; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/graphql-modules/graphql-error-handling/src/test/resources/graphql/request/request_error_invalid_request_syntax.graphql b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/handled_exception_request.graphql similarity index 71% rename from graphql-modules/graphql-error-handling/src/test/resources/graphql/request/request_error_invalid_request_syntax.graphql rename to spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/handled_exception_request.graphql index 98920eb17a..1564a6dafb 100644 --- a/graphql-modules/graphql-error-handling/src/test/resources/graphql/request/request_error_invalid_request_syntax.graphql +++ b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/handled_exception_request.graphql @@ -1,9 +1,10 @@ query { - searchByVin(vin: "error) { + searchByVin(vin: "123"){ vin year make model trim } -} \ No newline at end of file +} + diff --git a/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/no_exception_request.graphql b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/no_exception_request.graphql new file mode 100644 index 0000000000..756dca44eb --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/no_exception_request.graphql @@ -0,0 +1,8 @@ +query { + searchByVin(vin: "KM8JN72DX7U587496"){ + vin + year + make + model + } +} \ No newline at end of file diff --git a/graphql-modules/graphql-error-handling/src/test/resources/graphql/request/request_error_unknown_operation.graphql b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/non_null_field_request.graphql similarity index 59% rename from graphql-modules/graphql-error-handling/src/test/resources/graphql/request/request_error_unknown_operation.graphql rename to spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/non_null_field_request.graphql index fb6c3d1039..ca2fe1cc8d 100644 --- a/graphql-modules/graphql-error-handling/src/test/resources/graphql/request/request_error_unknown_operation.graphql +++ b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/non_null_field_request.graphql @@ -1,9 +1,10 @@ -subscription { - searchByVin(vin: "75024") { +query { + searchAll { vin year make model trim } -} \ No newline at end of file +} + diff --git a/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/unhandled_exception_request.graphql b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/unhandled_exception_request.graphql new file mode 100644 index 0000000000..8571f4b31c --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/request/unhandled_exception_request.graphql @@ -0,0 +1,10 @@ +query { + searchByLocation(zipcode: "123"){ + vin + year + make + model + trim + } +} + diff --git a/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/response/no_exception_response.json b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/response/no_exception_response.json new file mode 100644 index 0000000000..7bbff5f1be --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/response/no_exception_response.json @@ -0,0 +1,8 @@ +{ + "searchByVin": { + "vin": "KM8JN72DX7U587496", + "year": 2007, + "make": "Hyundai", + "model": "Tucson" + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/response/non_null_field_response.json b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/response/non_null_field_response.json new file mode 100644 index 0000000000..0369c64463 --- /dev/null +++ b/spring-boot-modules/spring-boot-graphql/src/test/resources/graphql-files/response/non_null_field_response.json @@ -0,0 +1,19 @@ +{ + "searchAll": [ + null, + { + "vin": "JTKKU4B41C1023346", + "year": 2012, + "make": "Toyota", + "model": "Scion", + "trim": "Xd" + }, + { + "vin": "1G1JC1444PZ215071", + "year": 2000, + "make": "Chevrolet", + "model": "CAVALIER VL", + "trim": "RS" + } + ] +} diff --git a/spring-boot-modules/spring-boot-groovy/README.md b/spring-boot-modules/spring-boot-groovy/README.md index 73edafb9c0..0897cc92bc 100644 --- a/spring-boot-modules/spring-boot-groovy/README.md +++ b/spring-boot-modules/spring-boot-groovy/README.md @@ -6,4 +6,5 @@ This module contains articles about Spring with Groovy ### Relevant Articles: - [Building a Simple Web Application with Spring Boot and Groovy](https://www.baeldung.com/spring-boot-groovy-web-app) -- [Groovy Bean Definitions](https://www.baeldung.com/spring-groovy-beans) \ No newline at end of file +- [Groovy Bean Definitions](https://www.baeldung.com/spring-groovy-beans) +- [Using Groovy in Spring](https://www.baeldung.com/groovy/spring-using-groovy) diff --git a/spring-boot-modules/spring-boot-groovy/pom.xml b/spring-boot-modules/spring-boot-groovy/pom.xml index 820bb0fd7a..ab1fef6865 100644 --- a/spring-boot-modules/spring-boot-groovy/pom.xml +++ b/spring-boot-modules/spring-boot-groovy/pom.xml @@ -27,6 +27,7 @@ org.codehaus.groovy groovy + ${groovy.version} org.springframework.boot @@ -70,6 +71,7 @@ com.baeldung.springwithgroovy.SpringBootGroovyApplication + 3.0.13 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/GroovyBeanBuilder.groovy b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/GroovyBeanBuilder.groovy new file mode 100644 index 0000000000..ca4e07d302 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/GroovyBeanBuilder.groovy @@ -0,0 +1,23 @@ +package com.baeldung.springgroovyconfig + + +beans { + + // Declares a simple bean with a constructor argument + companyBean(Company, name: 'ABC Inc'); + + // The same bean can be declared using a simpler syntax: beanName(type, constructor-args) + company String, 'XYZ Inc' + + // Declares an employee object with setters referencing the previous bean + employee(Employee) { + firstName = 'Lakshmi' + lastName = 'Priya' + + // References to other beans can be done in both the ways + company = company // or vendor = ref('company') + } + + // Allows import of other configuration files, both XML and Groovy + importBeans('classpath:xml-bean-config.xml') +} diff --git a/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/NotificationService.groovy b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/NotificationService.groovy new file mode 100644 index 0000000000..5c4ad09276 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/NotificationService.groovy @@ -0,0 +1,7 @@ +package com.baeldung.springgroovyconfig; + +interface NotificationService { + + String getMessage(); + +} diff --git a/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/NotificationServiceImpl.groovy b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/NotificationServiceImpl.groovy new file mode 100644 index 0000000000..ae3f0a6b58 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/NotificationServiceImpl.groovy @@ -0,0 +1,6 @@ +package com.baeldung.springgroovyconfig; + +class NotificationServiceImpl implements NotificationService { + + String message; +} diff --git a/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/SpringGroovyConfiguration.groovy b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/SpringGroovyConfiguration.groovy new file mode 100644 index 0000000000..54d40e1692 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/groovy/com/baeldung/springgroovyconfig/SpringGroovyConfiguration.groovy @@ -0,0 +1,25 @@ +package com.baeldung.springgroovyconfig + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class SpringGroovyConfiguration { + + public static void main(String[] args) { } + + @Bean + List fruits() { + [ + 'Apple', + 'Orange', + 'Banana', + 'Grapes' + ] + } + + @Bean + Map rankings() { + [1: 'Gold', 2: 'Silver', 3: 'Bronze'] + } +} diff --git a/spring-boot-modules/spring-boot-groovy/src/main/java/com/baeldung/springgroovyconfig/Company.java b/spring-boot-modules/spring-boot-groovy/src/main/java/com/baeldung/springgroovyconfig/Company.java new file mode 100644 index 0000000000..477c2c13cb --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/java/com/baeldung/springgroovyconfig/Company.java @@ -0,0 +1,41 @@ +package com.baeldung.springgroovyconfig; + +public class Company { + + private String name; + private String contact; + private String type; + + public Company() { + } + + public Company(String name) { + super(); + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getContact() { + return contact; + } + + public void setContact(String contact) { + this.contact = contact; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/spring-boot-modules/spring-boot-groovy/src/main/java/com/baeldung/springgroovyconfig/Employee.java b/spring-boot-modules/spring-boot-groovy/src/main/java/com/baeldung/springgroovyconfig/Employee.java new file mode 100644 index 0000000000..3a90f98268 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/java/com/baeldung/springgroovyconfig/Employee.java @@ -0,0 +1,32 @@ +package com.baeldung.springgroovyconfig; + +public class Employee { + + private String firstName; + private String lastName; + private Company company; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Company getCompany() { + return company; + } + + public void setCompany(Company company) { + this.company = company; + } +} diff --git a/spring-boot-modules/spring-boot-groovy/src/main/resources/StringJoiner.groovy b/spring-boot-modules/spring-boot-groovy/src/main/resources/StringJoiner.groovy new file mode 100644 index 0000000000..51afa9bc06 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/resources/StringJoiner.groovy @@ -0,0 +1,7 @@ +class StringJoiner { + + String join(String arg1, String arg2) { + arg1 + arg2; + } + +} diff --git a/spring-boot-modules/spring-boot-groovy/src/main/resources/StringJoinerScript.groovy b/spring-boot-modules/spring-boot-groovy/src/main/resources/StringJoinerScript.groovy new file mode 100644 index 0000000000..224f5fb9a8 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/resources/StringJoinerScript.groovy @@ -0,0 +1 @@ +arg1 + arg2; diff --git a/spring-boot-modules/spring-boot-groovy/src/main/resources/groovy-xml-config.xml b/spring-boot-modules/spring-boot-groovy/src/main/resources/groovy-xml-config.xml new file mode 100644 index 0000000000..475bd582e7 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/main/resources/groovy-xml-config.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + package com.baeldung.springgroovyconfig; + import com.baeldung.springgroovyconfig.NotificationService; + + class Notifier implements NotificationService { + String message + } + + + + + + \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-groovy/src/test/java/com/baeldung/springgroovyconfig/SpringGroovyConfigUnitTest.java b/spring-boot-modules/spring-boot-groovy/src/test/java/com/baeldung/springgroovyconfig/SpringGroovyConfigUnitTest.java new file mode 100644 index 0000000000..3059773d59 --- /dev/null +++ b/spring-boot-modules/spring-boot-groovy/src/test/java/com/baeldung/springgroovyconfig/SpringGroovyConfigUnitTest.java @@ -0,0 +1,144 @@ +package com.baeldung.springgroovyconfig; + +import static org.assertj.core.api.Assertions.fail; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.BeansException; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.GenericGroovyApplicationContext; +import org.springframework.util.ResourceUtils; + +import groovy.lang.Binding; +import groovy.lang.GroovyObject; +import groovy.util.GroovyScriptEngine; + +class SpringGroovyConfigUnitTest { + + private static final String FILE_NAME = "GroovyBeanBuilder.groovy"; + private static final String FILE_PATH = "src/main/groovy/com/baeldung/springgroovyconfig/"; + + @Test + void givenGroovyConfigFile_whenCalledWithBeanName_thenReturnCompanyBean() { + try (GenericGroovyApplicationContext ctx = new GenericGroovyApplicationContext()) { + ctx.load("file:" + getPath(FILE_PATH) + FILE_NAME); + ctx.refresh(); + + Company company = (Company) ctx.getBean("companyBean"); + + assertEquals("ABC Inc", company.getName()); + } catch (BeansException | IllegalStateException e) { + fail(e.getMessage()); + } + } + + @Test + void givenGroovyConfigFile_whenCalledWithRefBean_thenReturnEmployeeBean() { + try (GenericGroovyApplicationContext ctx = new GenericGroovyApplicationContext()) { + ctx.load("file:" + getPath(FILE_PATH) + FILE_NAME); + ctx.refresh(); + + Employee employee = ctx.getBean(Employee.class); + + assertEquals("Lakshmi", employee.getFirstName()); + assertEquals("Priya", employee.getLastName()); + assertEquals("XYZ Inc", employee.getCompany() + .getName()); + } catch (BeansException | IllegalStateException e) { + fail(e.getMessage()); + } + } + + @SuppressWarnings("unchecked") + @Test + void givenGroovyFileWithSpringAnnotations_whenCalledWithBeanName_thenReturnValidBean() { + + try (AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();) { + ctx.register(SpringGroovyConfiguration.class); + ctx.refresh(); + + List fruits = (List) ctx.getBean("fruits"); + + assertNotNull(fruits); + assertTrue(fruits.size() == 4); + assertEquals("Apple", fruits.get(0)); + } catch (BeansException | IllegalStateException e) { + fail(e.getMessage()); + } + } + + @Test + void givenGroovyBeanConfiguredInXml_whenCalledWithBeanName_thenReturnValidBean() { + try (ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("groovy-xml-config.xml")) { + ctx.refresh(); + + NotificationService notifier = (NotificationService) ctx.getBean("notification"); + + assertEquals("Hello", notifier.getMessage()); + } catch (BeansException | IllegalStateException e) { + fail(e.getMessage()); + } + } + + @Test + void givenGroovyBeanConfiguredAsInlineScript_whenCalledWithBeanName_thenReturnValidBean() { + try (ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("groovy-xml-config.xml")) { + ctx.refresh(); + + NotificationService notifier = (NotificationService) ctx.getBean("notifier"); + + assertEquals("Have a nice day!", notifier.getMessage()); + } catch (BeansException | IllegalStateException e) { + fail(e.getMessage()); + } + } + + @SuppressWarnings("unchecked") + @Test + void givenGroovyScript_whenCalledWithScriptEngine_thenReturnsResult() { + try { + GroovyScriptEngine engine = new GroovyScriptEngine(ResourceUtils.getFile("file:src/main/resources/") + .getAbsolutePath(), this.getClass().getClassLoader()); + Class joinerClass = engine.loadScriptByName("StringJoiner.groovy"); + GroovyObject joiner = joinerClass.getDeclaredConstructor() + .newInstance(); + Object result = joiner.invokeMethod("join", new Object[] { "Mr.", "Bob" }); + + assertEquals("Mr.Bob", result.toString()); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + @Test + void givenGroovyScript_whenCalledWithBindingObject_thenReturnsResult() { + try { + GroovyScriptEngine engine = new GroovyScriptEngine(ResourceUtils.getFile("file:src/main/resources/") + .getAbsolutePath(), this.getClass().getClassLoader()); + Binding binding = new Binding(); + binding.setVariable("arg1", "Mr."); + binding.setVariable("arg2", "Bob"); + Object result = engine.run("StringJoinerScript.groovy", binding); + + assertEquals("Mr.Bob", result.toString()); + } catch (Exception e) { + fail(e.getMessage()); + } + } + + private String getPath(String filePath) { + String pathPart = new File(".").getAbsolutePath(); + pathPart = pathPart.replace(".", ""); + pathPart = pathPart.replace("\\", "/"); + pathPart = pathPart + filePath; + + return pathPart; + } + +} diff --git a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java index 619fd63662..791293de9e 100644 --- a/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java +++ b/spring-boot-modules/spring-boot-keycloak-2/src/main/java/com/baeldung/disablingkeycloak/DisableSecurityConfiguration.java @@ -1,20 +1,23 @@ package com.baeldung.disablingkeycloak; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration @ConditionalOnProperty(name = "keycloak.enabled", havingValue = "false") -public class DisableSecurityConfiguration extends WebSecurityConfigurerAdapter { +public class DisableSecurityConfiguration { - @Override - protected void configure(final HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf() .disable() .authorizeRequests() .anyRequest() .permitAll(); + return http.build(); } + } diff --git a/spring-boot-modules/spring-boot-keycloak/README.md b/spring-boot-modules/spring-boot-keycloak/README.md index cde11df0fa..e95ada0e05 100644 --- a/spring-boot-modules/spring-boot-keycloak/README.md +++ b/spring-boot-modules/spring-boot-keycloak/README.md @@ -3,7 +3,7 @@ This module contains articles about Keycloak in Spring Boot projects. ## Relevant articles: -- [A Quick Guide to Using Keycloak with Spring Boot](https://www.baeldung.com/spring-boot-keycloak) +- [A Quick Guide to Using Keycloak With Spring Boot](https://www.baeldung.com/spring-boot-keycloak) - [Custom User Attributes with Keycloak](https://www.baeldung.com/keycloak-custom-user-attributes) - [Customizing the Login Page for Keycloak](https://www.baeldung.com/keycloak-custom-login-page) - [Keycloak User Self-Registration](https://www.baeldung.com/keycloak-user-registration) diff --git a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java index 88f829e567..c39e37cfaa 100644 --- a/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java +++ b/spring-boot-modules/spring-boot-keycloak/src/main/java/com/baeldung/keycloak/SecurityConfig.java @@ -4,14 +4,14 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.session.SessionRegistryImpl; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; @Configuration @EnableWebSecurity -class SecurityConfig extends WebSecurityConfigurerAdapter { +class SecurityConfig { private final KeycloakLogoutHandler keycloakLogoutHandler; @@ -24,18 +24,18 @@ class SecurityConfig extends WebSecurityConfigurerAdapter { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/customers*", "/users*") - .hasRole("USER") - .anyRequest() - .permitAll(); + .antMatchers("/customers*", "/users*") + .hasRole("USER") + .anyRequest() + .permitAll(); http.oauth2Login() - .and() - .logout() - .addLogoutHandler(keycloakLogoutHandler) - .logoutSuccessUrl("/"); + .and() + .logout() + .addLogoutHandler(keycloakLogoutHandler) + .logoutSuccessUrl("/"); + return http.build(); } - } diff --git a/spring-boot-modules/spring-boot-libraries-2/README.md b/spring-boot-modules/spring-boot-libraries-2/README.md index a516ddbf52..9dd58745fc 100644 --- a/spring-boot-modules/spring-boot-libraries-2/README.md +++ b/spring-boot-modules/spring-boot-libraries-2/README.md @@ -8,7 +8,6 @@ This module contains articles about various Spring Boot libraries - [Open API Server Implementation Using OpenAPI Generator](https://www.baeldung.com/java-openapi-generator-server) - [An Introduction to Kong](https://www.baeldung.com/kong) - [Getting Started With GraphQL SPQR and Spring Boot](https://www.baeldung.com/spring-boot-graphql-spqr) -- [How to Test GraphQL Using Postman](https://www.baeldung.com/graphql-postman) - [Scanning Java Annotations At Runtime](https://www.baeldung.com/java-scan-annotations-runtime) - +- [Guide to Resilience4j With Spring Boot](https://www.baeldung.com/spring-boot-resilience4j) More articles: [[prev -->]](/spring-boot-modules/spring-boot-libraries) diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml index de4e879089..0a2171c200 100644 --- a/spring-boot-modules/spring-boot-libraries-2/pom.xml +++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml @@ -16,6 +16,15 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-actuator + ch.qos.logback logback-classic @@ -57,11 +66,6 @@ ${awaitility.version} test - - io.leangen.graphql - spqr - 0.11.2 - org.reflections reflections @@ -72,6 +76,20 @@ jandex 2.4.3.Final + + + io.github.resilience4j + resilience4j-spring-boot2 + 1.7.0 + + + + + com.github.tomakehurst + wiremock-jre8 + 2.34.0 + test + diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ApiExceptionHandler.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ApiExceptionHandler.java new file mode 100644 index 0000000000..d4527ef407 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ApiExceptionHandler.java @@ -0,0 +1,35 @@ +package com.baeldung.resilientapp; + +import java.util.concurrent.TimeoutException; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; + +import io.github.resilience4j.bulkhead.BulkheadFullException; +import io.github.resilience4j.circuitbreaker.CallNotPermittedException; +import io.github.resilience4j.ratelimiter.RequestNotPermitted; + +@ControllerAdvice +public class ApiExceptionHandler { + @ExceptionHandler({ CallNotPermittedException.class }) + @ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE) + public void handleCallNotPermittedException() { + } + + @ExceptionHandler({ TimeoutException.class }) + @ResponseStatus(HttpStatus.REQUEST_TIMEOUT) + public void handleTimeoutException() { + } + + @ExceptionHandler({ BulkheadFullException.class }) + @ResponseStatus(HttpStatus.BANDWIDTH_LIMIT_EXCEEDED) + public void handleBulkheadFullException() { + } + + @ExceptionHandler({ RequestNotPermitted.class }) + @ResponseStatus(HttpStatus.TOO_MANY_REQUESTS) + public void handleRequestNotPermitted() { + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ExternalAPICaller.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ExternalAPICaller.java new file mode 100644 index 0000000000..d091633adb --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ExternalAPICaller.java @@ -0,0 +1,28 @@ +package com.baeldung.resilientapp; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +@Component +public class ExternalAPICaller { + private final RestTemplate restTemplate; + + @Autowired + public ExternalAPICaller(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + public String callApi() { + return restTemplate.getForObject("/api/external", String.class); + } + + public String callApiWithDelay() { + String result = restTemplate.getForObject("/api/external", String.class); + try { + Thread.sleep(5000); + } catch (InterruptedException ignore) { + } + return result; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ExternalApiCallerConfig.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ExternalApiCallerConfig.java new file mode 100644 index 0000000000..6f5820237e --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ExternalApiCallerConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.resilientapp; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class ExternalApiCallerConfig { +@Bean +public RestTemplate restTemplate() { + return new RestTemplateBuilder().rootUri("http://localhost:9090") + .build(); +} +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ResilientApp.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ResilientApp.java new file mode 100644 index 0000000000..55d4fe1f18 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ResilientApp.java @@ -0,0 +1,14 @@ +package com.baeldung.resilientapp; + +import org.jobrunr.autoconfigure.JobRunrAutoConfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(exclude = { JobRunrAutoConfiguration.class}) +public class ResilientApp { + + public static void main(String[] args) { + SpringApplication.run(ResilientApp.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ResilientAppController.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ResilientAppController.java new file mode 100644 index 0000000000..0b99f7cec0 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/resilientapp/ResilientAppController.java @@ -0,0 +1,62 @@ +package com.baeldung.resilientapp; + +import java.util.concurrent.CompletableFuture; + +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import io.github.resilience4j.bulkhead.annotation.Bulkhead; +import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; +import io.github.resilience4j.ratelimiter.annotation.RateLimiter; +import io.github.resilience4j.retry.annotation.Retry; +import io.github.resilience4j.timelimiter.annotation.TimeLimiter; + +@RestController +@RequestMapping("/api/") +public class ResilientAppController { + + private final ExternalAPICaller externalAPICaller; + + @Autowired + public ResilientAppController(ExternalAPICaller externalApi) { + this.externalAPICaller = externalApi; + } + + @GetMapping("/circuit-breaker") + @CircuitBreaker(name = "CircuitBreakerService") + public String circuitBreakerApi() { + return externalAPICaller.callApi(); + } + + @GetMapping("/retry") + @Retry(name = "retryApi", fallbackMethod = "fallbackAfterRetry") + public String retryApi() { + return externalAPICaller.callApi(); + } + + @GetMapping("/time-limiter") + @TimeLimiter(name = "timeLimiterApi") + public CompletableFuture timeLimiterApi() { + return CompletableFuture.supplyAsync(externalAPICaller::callApiWithDelay); + } + + @GetMapping("/bulkhead") + @Bulkhead(name = "bulkheadApi") + public String bulkheadApi() { + return externalAPICaller.callApi(); + } + + @GetMapping("/rate-limiter") + @RateLimiter(name = "rateLimiterApi") + public String rateLimitApi() { + return externalAPICaller.callApi(); + } + + public String fallbackAfterRetry(Exception ex) { + return "all retries have exhausted"; + } + +} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookService.java deleted file mode 100644 index 6dbfe9c6f9..0000000000 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/sprq/BookService.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.sprq; - -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -@Service -public class BookService implements IBookService { - - Set books = new HashSet<>(); - - @Override - public Book getBookWithTitle(String title) { - return books.stream() - .filter(book -> book.getTitle() - .equals(title)) - .findFirst() - .orElse(null); - } - - @Override - public List getAllBooks() { - return books.stream() - .collect(Collectors.toList()); - } - - @Override - public Book addBook(Book book) { - books.add(book); - return book; - } - - @Override - public Book updateBook(Book book) { - books.remove(book); - books.add(book); - return book; - } - - @Override - public boolean deleteBook(Book book) { - return books.remove(book); - } -} diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties index 0fea0163f1..a18eda349a 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/resources/application.properties @@ -1,3 +1,50 @@ org.jobrunr.background-job-server.enabled=true org.jobrunr.dashboard.enabled=true org.jobrunr.dashboard.port=0 + +logging.level.root=INFO + +management.health.circuitbreakers.enabled=true +management.health.ratelimiters.enabled=true + +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=always + +spring.jackson.serialization.indent-output=true + + +resilience4j.circuitbreaker.instances.CircuitBreakerService.failure-rate-threshold=50 +resilience4j.circuitbreaker.instances.CircuitBreakerService.minimum-number-of-calls=5 +resilience4j.circuitbreaker.instances.CircuitBreakerService.automatic-transition-from-open-to-half-open-enabled=true +resilience4j.circuitbreaker.instances.CircuitBreakerService.wait-duration-in-open-state=5s +resilience4j.circuitbreaker.instances.CircuitBreakerService.permitted-number-of-calls-in-half-open-state=3 +resilience4j.circuitbreaker.instances.CircuitBreakerService.sliding-window-size=10 +resilience4j.circuitbreaker.instances.CircuitBreakerService.sliding-window-type=count_based + +resilience4j.circuitbreaker.metrics.enabled=true +resilience4j.circuitbreaker.metrics.legacy.enabled=true +resilience4j.circuitbreaker.instances.CircuitBreakerService.register-health-indicator=true +resilience4j.circuitbreaker.instances.CircuitBreakerService.event-consumer-buffer-size=10 + + +resilience4j.retry.instances.retryApi.max-attempts=3 +resilience4j.retry.instances.retryApi.wait-duration=1s +resilience4j.retry.metrics.legacy.enabled=true +resilience4j.retry.metrics.enabled=true + +resilience4j.timelimiter.metrics.enabled=true +resilience4j.timelimiter.instances.timeLimiterApi.timeout-duration=2s +resilience4j.timelimiter.instances.timeLimiterApi.cancel-running-future=true + +resilience4j.bulkhead.metrics.enabled=true +resilience4j.bulkhead.instances.bulkheadApi.max-concurrent-calls=3 +resilience4j.bulkhead.instances.bulkheadApi.max-wait-duration=1 + +resilience4j.ratelimiter.metrics.enabled=true +resilience4j.ratelimiter.instances.rateLimiterApi.register-health-indicator=true +resilience4j.ratelimiter.instances.rateLimiterApi.limit-for-period=5 +resilience4j.ratelimiter.instances.rateLimiterApi.limit-refresh-period=60s +resilience4j.ratelimiter.instances.rateLimiterApi.timeout-duration=0s +resilience4j.ratelimiter.instances.rateLimiterApi.allow-health-indicator-to-fail=true +resilience4j.ratelimiter.instances.rateLimiterApi.subscribe-for-events=true +resilience4j.ratelimiter.instances.rateLimiterApi.event-consumer-buffer-size=50 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/resilientapp/ResilientAppControllerManualTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/resilientapp/ResilientAppControllerManualTest.java new file mode 100644 index 0000000000..de86a2477b --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/resilientapp/ResilientAppControllerManualTest.java @@ -0,0 +1,136 @@ +package com.baeldung.resilientapp; + +import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.ok; +import static com.github.tomakehurst.wiremock.client.WireMock.serverError; + +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import static org.springframework.http.HttpStatus.BANDWIDTH_LIMIT_EXCEEDED; +import static org.springframework.http.HttpStatus.OK; +import static org.springframework.http.HttpStatus.TOO_MANY_REQUESTS; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import java.util.stream.IntStream; + +import org.junit.Assert; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import com.github.tomakehurst.wiremock.junit5.WireMockExtension; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +// test marked as manual because there are multiple test methods calling the same API and the order is not guaranteed +class ResilientAppControllerManualTest { + + @RegisterExtension + static WireMockExtension EXTERNAL_SERVICE = WireMockExtension.newInstance() + .options(WireMockConfiguration.wireMockConfig() + .port(9090)) + .build(); + + @Autowired + private TestRestTemplate restTemplate; + + @Test + public void testCircuitBreaker() { + EXTERNAL_SERVICE.stubFor(WireMock.get("/api/external") + .willReturn(serverError())); + + IntStream.rangeClosed(1, 5) + .forEach(i -> { + ResponseEntity response = restTemplate.getForEntity("/api/circuit-breaker", String.class); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + }); + + IntStream.rangeClosed(1, 5) + .forEach(i -> { + ResponseEntity response = restTemplate.getForEntity("/api/circuit-breaker", String.class); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); + }); + + EXTERNAL_SERVICE.verify(5, getRequestedFor(urlEqualTo("/api/external"))); + } + + @Test + public void testRetry() { + EXTERNAL_SERVICE.stubFor(WireMock.get("/api/external") + .willReturn(ok())); + ResponseEntity response1 = restTemplate.getForEntity("/api/retry", String.class); + EXTERNAL_SERVICE.verify(1, getRequestedFor(urlEqualTo("/api/external"))); + + EXTERNAL_SERVICE.resetRequests(); + + EXTERNAL_SERVICE.stubFor(WireMock.get("/api/external") + .willReturn(serverError())); + ResponseEntity response2 = restTemplate.getForEntity("/api/retry", String.class); + Assert.assertEquals(response2.getBody(), "all retries have exhausted"); + EXTERNAL_SERVICE.verify(3, getRequestedFor(urlEqualTo("/api/external"))); + } + + @Test + public void testBulkhead() { + EXTERNAL_SERVICE.stubFor(WireMock.get("/api/external") + .willReturn(ok())); + Map responseStatusCount = new ConcurrentHashMap<>(); + + IntStream.rangeClosed(1, 5) + .parallel() + .forEach(i -> { + ResponseEntity response = restTemplate.getForEntity("/api/bulkhead", String.class); + int statusCode = response.getStatusCodeValue(); + responseStatusCount.put(statusCode, responseStatusCount.getOrDefault(statusCode, 0) + 1); + }); + + assertEquals(2, responseStatusCount.keySet() + .size()); + assertTrue(responseStatusCount.containsKey(BANDWIDTH_LIMIT_EXCEEDED.value())); + assertTrue(responseStatusCount.containsKey(OK.value())); + EXTERNAL_SERVICE.verify(3, getRequestedFor(urlEqualTo("/api/external"))); + } + + @Test + public void testTimeLimiter() { + EXTERNAL_SERVICE.stubFor(WireMock.get("/api/external") + .willReturn(ok())); + ResponseEntity response = restTemplate.getForEntity("/api/time-limiter", String.class); + + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.REQUEST_TIMEOUT); + EXTERNAL_SERVICE.verify(1, getRequestedFor(urlEqualTo("/api/external"))); + } + + @Test + public void testRatelimiter() { + EXTERNAL_SERVICE.stubFor(WireMock.get("/api/external") + .willReturn(ok())); + Map responseStatusCount = new ConcurrentHashMap<>(); + + IntStream.rangeClosed(1, 50) + .parallel() + .forEach(i -> { + ResponseEntity response = restTemplate.getForEntity("/api/rate-limiter", String.class); + int statusCode = response.getStatusCodeValue(); + responseStatusCount.put(statusCode, responseStatusCount.getOrDefault(statusCode, 0) + 1); + }); + + assertEquals(2, responseStatusCount.keySet() + .size()); + assertTrue(responseStatusCount.containsKey(TOO_MANY_REQUESTS.value())); + assertTrue(responseStatusCount.containsKey(OK.value())); + EXTERNAL_SERVICE.verify(5, getRequestedFor(urlEqualTo("/api/external"))); + } +} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java deleted file mode 100644 index 1060ce0427..0000000000 --- a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/sprq/GraphqlControllerIntegrationTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.baeldung.sprq; - -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpqrApp.class) -@AutoConfigureMockMvc -public class GraphqlControllerIntegrationTest { - - @Autowired - private MockMvc mockMvc; - - @Autowired - BookService bookService; - - private static final String GRAPHQL_PATH = "/graphql"; - - @Test - @Ignore("spqr lib is not compatible with Boot 2.7.x, related code needs be moved or upgraded to Boot 2.7.x") - public void givenNoBooks_whenReadAll_thenStatusIsOk() throws Exception { - - String getAllBooksQuery = "{ getAllBooks {id author title } }"; - - this.mockMvc.perform(post(GRAPHQL_PATH).content(toJSON(getAllBooksQuery)) - .contentType( - MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.getAllBooks").isEmpty()); - } - - @Test - @Ignore("spqr lib is not compatible with Boot 2.7.x, related code needs be moved or upgraded to Boot 2.7.x") - public void whenAddBook_thenStatusIsOk() throws Exception { - - String addBookMutation = "mutation { addBook(newBook: {id: 123, author: \"J.R.R. Tolkien\", " - + "title: \"The Lord of the Rings\"}) { id author title } }"; - - this.mockMvc.perform(post(GRAPHQL_PATH).content(toJSON(addBookMutation)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.addBook.id").value("123")) - .andExpect(jsonPath("$.addBook.author").value("J.R.R. Tolkien")) - .andExpect(jsonPath("$.addBook.title").value("The Lord of the Rings")); - } - - private String toJSON(String query) throws JSONException { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("query", query); - return jsonObject.toString(); - } -} \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-comparison/README.md b/spring-boot-modules/spring-boot-libraries-comparison/README.md deleted file mode 100644 index d373f91b3b..0000000000 --- a/spring-boot-modules/spring-boot-libraries-comparison/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## Spring Boot Libraries - -This module contains articles about various Spring Boot libraries Comparison - -### Relevant Articles: - -- [GraphQL vs REST](https://www.baeldung.com/graphql-vs-rest) diff --git a/spring-boot-modules/spring-boot-libraries-comparison/pom.xml b/spring-boot-modules/spring-boot-libraries-comparison/pom.xml deleted file mode 100644 index 59d0e75be3..0000000000 --- a/spring-boot-modules/spring-boot-libraries-comparison/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - spring-boot-libraries-comparison - - - com.baeldung.spring-boot-modules - spring-boot-modules - 1.0.0-SNAPSHOT - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.data - spring-data-jpa - - - com.graphql-java - graphql-spring-boot-starter - ${graphql-spring-boot-starter.version} - - - com.graphql-java - graphql-java-tools - ${graphql-java-tools.version} - - - com.graphql-java - graphiql-spring-boot-starter - ${graphql-spring-boot-starter.version} - - - - - - 5.0.2 - 5.2.4 - - - \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/configuration/GraphqlConfiguration.java b/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/configuration/GraphqlConfiguration.java deleted file mode 100644 index c100a03143..0000000000 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/configuration/GraphqlConfiguration.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.graphqlvsrest.configuration; - -import com.baeldung.graphqlvsrest.repository.OrderRepository; -import com.baeldung.graphqlvsrest.resolver.Mutation; -import com.baeldung.graphqlvsrest.resolver.ProductResolver; -import com.baeldung.graphqlvsrest.resolver.Query; -import com.baeldung.graphqlvsrest.repository.ProductRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class GraphqlConfiguration { - - @Autowired - ProductRepository productRepository; - - @Autowired - OrderRepository orderRepository; - - @Bean - public Query query() { - return new Query(productRepository); - } - - @Bean - public ProductResolver productResolver(){ - return new ProductResolver(orderRepository); - } - - @Bean - public Mutation mutation() { - return new Mutation(productRepository); - } -} diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/Mutation.java b/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/Mutation.java deleted file mode 100644 index 3d643f97e6..0000000000 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/Mutation.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.graphqlvsrest.resolver; - -import com.baeldung.graphqlvsrest.entity.Product; -import com.baeldung.graphqlvsrest.model.ProductModel; -import com.baeldung.graphqlvsrest.repository.ProductRepository; -import com.coxautodev.graphql.tools.GraphQLMutationResolver; - -public class Mutation implements GraphQLMutationResolver { - - private ProductRepository productRepository; - public Mutation(ProductRepository productRepository){ - this.productRepository = productRepository; - } - - public Product saveProduct(ProductModel productModel) { - return productRepository.save(productModel); - } - - public Product updateProduct(Integer productId, ProductModel productModel) { - return productRepository.update(productId, productModel); - } -} diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/ProductResolver.java b/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/ProductResolver.java deleted file mode 100644 index f20b8d5920..0000000000 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/ProductResolver.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.graphqlvsrest.resolver; - -import com.baeldung.graphqlvsrest.entity.Order; -import com.baeldung.graphqlvsrest.entity.Product; -import com.baeldung.graphqlvsrest.repository.OrderRepository; -import com.coxautodev.graphql.tools.GraphQLResolver; - -import java.util.List; - -public class ProductResolver implements GraphQLResolver { - private OrderRepository orderRepository; - public ProductResolver(OrderRepository orderRepository){ - this.orderRepository = orderRepository; - } - public List getOrders(Product product){ - return orderRepository.getOrdersByProduct(product.getId()); - } -} diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/Query.java b/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/Query.java deleted file mode 100644 index 0d218261b2..0000000000 --- a/spring-boot-modules/spring-boot-libraries-comparison/src/main/java/com/baeldung/graphqlvsrest/resolver/Query.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.baeldung.graphqlvsrest.resolver; - -import com.baeldung.graphqlvsrest.entity.Order; -import com.baeldung.graphqlvsrest.entity.Product; -import com.baeldung.graphqlvsrest.repository.OrderRepository; -import com.baeldung.graphqlvsrest.repository.ProductRepository; -import com.coxautodev.graphql.tools.GraphQLQueryResolver; - -import java.util.List; - -public class Query implements GraphQLQueryResolver { - - private ProductRepository productRepository; - public Query(ProductRepository productRepository){ - this.productRepository = productRepository; - } - - public List getProducts(int pageSize, int pageNumber) { - return productRepository.getProducts(pageSize, pageNumber); - } - - public Product getProduct(int id) { - return productRepository.getProduct(id); - } - - -} diff --git a/spring-boot-modules/spring-boot-mvc-4/README.md b/spring-boot-modules/spring-boot-mvc-4/README.md index a7a341deee..c80a66c197 100644 --- a/spring-boot-modules/spring-boot-mvc-4/README.md +++ b/spring-boot-modules/spring-boot-mvc-4/README.md @@ -10,3 +10,4 @@ This module contains articles about Spring Web MVC in Spring Boot projects. - [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) - [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) - [Hide a Request Field in Swagger API](https://www.baeldung.com/spring-swagger-hide-field) +- [Uploading a File and JSON Data in Postman](https://www.baeldung.com/postman-upload-file-json) diff --git a/spring-boot-modules/spring-boot-properties-3/README.md b/spring-boot-modules/spring-boot-properties-3/README.md index 1bd6724885..77c6815649 100644 --- a/spring-boot-modules/spring-boot-properties-3/README.md +++ b/spring-boot-modules/spring-boot-properties-3/README.md @@ -8,4 +8,5 @@ - [How to Define a Map in YAML for a POJO?](https://www.baeldung.com/yaml-map-pojo) - [Using application.yml vs application.properties in Spring Boot](https://www.baeldung.com/spring-boot-yaml-vs-properties) - [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) -- [IntelliJ – Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties) \ No newline at end of file +- [IntelliJ – Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties) +- [Log Properties in a Spring Boot Application](https://www.baeldung.com/spring-boot-log-properties) diff --git a/spring-boot-modules/spring-boot-properties-3/pom.xml b/spring-boot-modules/spring-boot-properties-3/pom.xml index d72c410d9b..3de85c7175 100644 --- a/spring-boot-modules/spring-boot-properties-3/pom.xml +++ b/spring-boot-modules/spring-boot-properties-3/pom.xml @@ -19,6 +19,10 @@ org.springframework.boot spring-boot-starter + + org.springframework.boot + spring-boot-starter-actuator + org.springframework.boot spring-boot-starter-test diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/AppContextRefreshedEventPropertiesPrinter.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/AppContextRefreshedEventPropertiesPrinter.java new file mode 100644 index 0000000000..342371be45 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/AppContextRefreshedEventPropertiesPrinter.java @@ -0,0 +1,55 @@ +package com.baeldung.properties.log; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.stereotype.Component; + +import java.util.Collection; + +@Component +public class AppContextRefreshedEventPropertiesPrinter { + private static final Logger LOGGER = LoggerFactory.getLogger(AppContextRefreshedEventPropertiesPrinter.class); + + @EventListener + public void handleContextRefreshed(ContextRefreshedEvent event) { + printAllActiveProperties((ConfigurableEnvironment) event.getApplicationContext().getEnvironment()); + + printAllApplicationProperties((ConfigurableEnvironment) event.getApplicationContext().getEnvironment()); + } + + private void printAllActiveProperties(ConfigurableEnvironment env) { + + LOGGER.info("************************* ALL PROPERTIES(EVENT) ******************************"); + + env.getPropertySources() + .stream() + .filter(ps -> ps instanceof MapPropertySource) + .map(ps -> ((MapPropertySource) ps).getSource().keySet()) + .flatMap(Collection::stream) + .distinct() + .sorted() + .forEach(key -> LOGGER.info("{}={}", key, env.getProperty(key))); + + LOGGER.info("******************************************************************************"); + } + + private void printAllApplicationProperties(ConfigurableEnvironment env) { + + LOGGER.info("************************* APP PROPERTIES(EVENT) ******************************"); + + env.getPropertySources() + .stream() + .filter(ps -> ps instanceof MapPropertySource && ps.getName().contains("application.properties")) + .map(ps -> ((MapPropertySource) ps).getSource().keySet()) + .flatMap(Collection::stream) + .distinct() + .sorted() + .forEach(key -> LOGGER.info("{}={}", key, env.getProperty(key))); + + LOGGER.info("******************************************************************************"); + } +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java new file mode 100644 index 0000000000..321593b31b --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/EnvironmentPropertiesPrinter.java @@ -0,0 +1,29 @@ +package com.baeldung.properties.log; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +@Component +public class EnvironmentPropertiesPrinter { + private static final Logger LOGGER = LoggerFactory.getLogger(EnvironmentPropertiesPrinter.class); + private final Environment env; + + public EnvironmentPropertiesPrinter(Environment env) { + this.env = env; + } + + @PostConstruct + public void logApplicationProperties() { + LOGGER.info("************************* PROPERTIES(ENVIRONMENT) ******************************"); + + LOGGER.info("{}={}", "bael.property", env.getProperty("bael.property")); + LOGGER.info("{}={}", "app.name", env.getProperty("app.name")); + LOGGER.info("{}={}", "app.description", env.getProperty("app.description")); + + LOGGER.info("******************************************************************************"); + } +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/LogPropertiesDemoApplication.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/LogPropertiesDemoApplication.java new file mode 100644 index 0000000000..642a03edd6 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/properties/log/LogPropertiesDemoApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.properties.log; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LogPropertiesDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(LogPropertiesDemoApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml index 0f048ffa14..2e28da5ad3 100644 --- a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml +++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.yml @@ -55,3 +55,9 @@ application: uk: 14 fr: 42 us: 10 +--- +management: + endpoints: + web: + exposure: + include: env, health \ No newline at end of file diff --git a/spring-caching-2/README.md b/spring-caching-2/README.md index d781602280..9041e40302 100644 --- a/spring-caching-2/README.md +++ b/spring-caching-2/README.md @@ -1 +1,3 @@ +## Relevant articles - [Spring Boot Cache with Redis](https://www.baeldung.com/spring-boot-redis-cache) +- [Setting Time-To-Live Value for Caching](https://www.baeldung.com/spring-setting-ttl-value-cache) diff --git a/spring-caching-2/pom.xml b/spring-caching-2/pom.xml index 5f982fbad2..0a07820fc4 100644 --- a/spring-caching-2/pom.xml +++ b/spring-caching-2/pom.xml @@ -63,16 +63,4 @@ 0.7.3 - - - - resources - ${project.build.outputDirectory} - - application.properties - - - - - \ No newline at end of file diff --git a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java b/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java index abc2b18521..6e2b91b6ae 100755 --- a/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java +++ b/spring-caching-2/src/main/java/com/baeldung/caching/ttl/service/HotelService.java @@ -27,7 +27,7 @@ public class HotelService { } @CacheEvict(value = "hotels", allEntries = true) - @Scheduled(fixedRateString = "43200") + @Scheduled(fixedRateString = "${caching.spring.hotelListTTL}") public void emptyHotelsCache() { logger.info("emptying Hotels cache"); } diff --git a/spring-cloud-modules/spring-cloud-config/spring-cloud-config-server/src/main/java/com/baeldung/spring/cloud/config/server/SecurityConfiguration.java b/spring-cloud-modules/spring-cloud-config/spring-cloud-config-server/src/main/java/com/baeldung/spring/cloud/config/server/SecurityConfiguration.java index b50184f296..428a8f23c6 100644 --- a/spring-cloud-modules/spring-cloud-config/spring-cloud-config-server/src/main/java/com/baeldung/spring/cloud/config/server/SecurityConfiguration.java +++ b/spring-cloud-modules/spring-cloud-config/spring-cloud-config-server/src/main/java/com/baeldung/spring/cloud/config/server/SecurityConfiguration.java @@ -1,18 +1,22 @@ package com.baeldung.spring.cloud.config.server; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { - @Override - public void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf() - .ignoringAntMatchers("/encrypt/**") - .ignoringAntMatchers("/decrypt/**"); - - super.configure(http); + .ignoringAntMatchers("/encrypt/**") + .ignoringAntMatchers("/decrypt/**"); + http.authorizeRequests((requests) -> requests.anyRequest() + .authenticated()); + http.formLogin(); + http.httpBasic(); + return http.build(); } } diff --git a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductControllerUnitTest.java b/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductControllerUnitTest.java index bfc0c3d281..f6ec7c3310 100644 --- a/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductControllerUnitTest.java +++ b/spring-cloud-modules/spring-cloud-openfeign/src/test/java/com/baeldung/cloud/openfeign/defaulterrorhandling/controller/ProductControllerUnitTest.java @@ -19,6 +19,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; @RunWith(SpringRunner.class) @WebMvcTest(ProductController.class) @@ -36,9 +37,9 @@ public class ProductControllerUnitTest { @Before public void startWireMockServer() { - wireMockServer = new WireMockServer(8084); - configureFor("localhost", 8084); + wireMockServer = new WireMockServer(options().dynamicPort()); wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); } @After diff --git a/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestUnitTest.java b/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestManualTest.java similarity index 93% rename from spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestUnitTest.java rename to spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestManualTest.java index 76a0d764e1..e7a3d0fc1a 100644 --- a/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestUnitTest.java +++ b/spring-core-5/src/test/java/com/baeldung/concurrentrequest/ConcurrentRequestManualTest.java @@ -15,9 +15,12 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultMatcher; +/** + * Test need to pause the main thread for up to 60 seconds + */ @SpringBootTest @AutoConfigureMockMvc -public class ConcurrentRequestUnitTest { +public class ConcurrentRequestManualTest { @Autowired private MockMvc mockMvc; diff --git a/spring-core-6/pom.xml b/spring-core-6/pom.xml index ffa9d51098..6f99aa6207 100644 --- a/spring-core-6/pom.xml +++ b/spring-core-6/pom.xml @@ -82,7 +82,7 @@ UTF-8 11 11 - 2.7.2 + 2.7.5 - \ No newline at end of file + diff --git a/spring-credhub/pom.xml b/spring-credhub/pom.xml new file mode 100644 index 0000000000..57fbe5c9d6 --- /dev/null +++ b/spring-credhub/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.baeldung.spring-credhub + spring-credhub + 1.0-SNAPSHOT + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + + + org.springframework.credhub + spring-credhub-starter + 2.2.0 + + + com.google.code.gson + gson + + + + + 8 + 8 + UTF-8 + + + \ No newline at end of file diff --git a/spring-credhub/src/main/java/com/baeldung/OrderApplication.java b/spring-credhub/src/main/java/com/baeldung/OrderApplication.java new file mode 100644 index 0000000000..94d34c18bb --- /dev/null +++ b/spring-credhub/src/main/java/com/baeldung/OrderApplication.java @@ -0,0 +1,7 @@ +package com.baeldung; + +public class OrderApplication { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/spring-credhub/src/main/java/com/baeldung/controller/CredentialController.java b/spring-credhub/src/main/java/com/baeldung/controller/CredentialController.java new file mode 100644 index 0000000000..8da2b98dfd --- /dev/null +++ b/spring-credhub/src/main/java/com/baeldung/controller/CredentialController.java @@ -0,0 +1,55 @@ +package com.baeldung.controller; + +import com.baeldung.model.Credential; +import com.baeldung.service.CredentialService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.credhub.support.CredentialPermission; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CredentialController { + @Autowired + CredentialService credentialService; + + @PostMapping("/credentials") + public ResponseEntity generatePassword(@RequestBody String credentialName) { + return new ResponseEntity<>(credentialService.generatePassword(credentialName), HttpStatus.OK); + } + + @PutMapping("/credentials") + public ResponseEntity writeJSONCredential(@RequestBody Credential secret) { + return new ResponseEntity<>(credentialService.writeCredential(secret), HttpStatus.OK); + } + + @PostMapping("/credentials/rotate") + public ResponseEntity rotatePassword(@RequestBody String credentialName) { + return new ResponseEntity<>(credentialService.rotatePassword(credentialName), HttpStatus.OK); + } + + @DeleteMapping("/credentials") + public ResponseEntity deletePassword(@RequestBody String credentialName) { + return new ResponseEntity<>(credentialService.deletePassword(credentialName), HttpStatus.OK); + } + + @GetMapping("/credentials") + public ResponseEntity getPassword(@RequestBody String credentialName) { + return new ResponseEntity<>(credentialService.getPassword(credentialName), HttpStatus.OK); + } + + @PostMapping("/permissions") + public ResponseEntity addPermission(@RequestBody String credentialName) { + return new ResponseEntity<>(credentialService.addCredentialPermission(credentialName), HttpStatus.OK); + } + + @GetMapping("/permissions") + public ResponseEntity getPermission(@RequestBody String credentialName) { + return new ResponseEntity<>(credentialService.getCredentialPermission(credentialName), HttpStatus.OK); + } +} diff --git a/spring-credhub/src/main/java/com/baeldung/controller/OrderController.java b/spring-credhub/src/main/java/com/baeldung/controller/OrderController.java new file mode 100644 index 0000000000..d839cd291b --- /dev/null +++ b/spring-credhub/src/main/java/com/baeldung/controller/OrderController.java @@ -0,0 +1,56 @@ +package com.baeldung.controller; + +import static java.time.LocalDate.now; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.baeldung.model.Order; +import com.baeldung.service.CredentialService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/orders") +public class OrderController { + + @Autowired + CredentialService credentialService; + + public OrderController(CredentialService credentialService) { + this.credentialService = credentialService; + } + + @GetMapping + public ResponseEntity> getAllOrders() { + try { + String apiKey = credentialService.getPassword("api_key"); + return new ResponseEntity<>(getOrderList(apiKey), HttpStatus.OK); + } catch (Exception e) { + return new ResponseEntity<>(HttpStatus.FORBIDDEN); + } + } + + private List getOrderList(String apiKey) throws Exception { + if (!credentialMatch(apiKey)) + throw new Exception(); + Order order = new Order(); + order.setId(123L); + order.setCustomerName("Craig"); + order.setOrderDate(now()); + List orderList = new ArrayList<>(); + orderList.add(order); + return orderList; + } + + private boolean credentialMatch(String credValue) { + //logic to check credValue + return true; + } +} + diff --git a/spring-credhub/src/main/java/com/baeldung/model/Credential.java b/spring-credhub/src/main/java/com/baeldung/model/Credential.java new file mode 100644 index 0000000000..c7fa25b261 --- /dev/null +++ b/spring-credhub/src/main/java/com/baeldung/model/Credential.java @@ -0,0 +1,14 @@ +package com.baeldung.model; + +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Credential { + Map value; + String type; + String name; +} diff --git a/spring-credhub/src/main/java/com/baeldung/model/Order.java b/spring-credhub/src/main/java/com/baeldung/model/Order.java new file mode 100644 index 0000000000..31f40956ca --- /dev/null +++ b/spring-credhub/src/main/java/com/baeldung/model/Order.java @@ -0,0 +1,15 @@ +package com.baeldung.model; + +import java.time.LocalDate; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Order { + + private Long id; + private String customerName; + private LocalDate orderDate; +} diff --git a/spring-credhub/src/main/java/com/baeldung/service/CredentialService.java b/spring-credhub/src/main/java/com/baeldung/service/CredentialService.java new file mode 100644 index 0000000000..75a11cdb9a --- /dev/null +++ b/spring-credhub/src/main/java/com/baeldung/service/CredentialService.java @@ -0,0 +1,195 @@ +package com.baeldung.service; + +import java.util.Map; +import java.util.UUID; + +import org.springframework.credhub.core.CredHubOperations; +import org.springframework.credhub.core.credential.CredHubCredentialOperations; +import org.springframework.credhub.core.permissionV2.CredHubPermissionV2Operations; +import org.springframework.credhub.support.CredentialDetails; +import org.springframework.credhub.support.CredentialPermission; +import org.springframework.credhub.support.CredentialRequest; +import org.springframework.credhub.support.SimpleCredentialName; +import org.springframework.credhub.support.certificate.CertificateCredential; +import org.springframework.credhub.support.certificate.CertificateCredentialRequest; +import org.springframework.credhub.support.json.JsonCredentialRequest; +import org.springframework.credhub.support.password.PasswordCredential; +import org.springframework.credhub.support.password.PasswordCredentialRequest; +import org.springframework.credhub.support.password.PasswordParameters; +import org.springframework.credhub.support.password.PasswordParametersRequest; +import org.springframework.credhub.support.permissions.Operation; +import org.springframework.credhub.support.permissions.Permission; +import org.springframework.credhub.support.rsa.RsaCredential; +import org.springframework.credhub.support.rsa.RsaCredentialRequest; +import org.springframework.credhub.support.ssh.SshCredential; +import org.springframework.credhub.support.ssh.SshCredentialRequest; +import org.springframework.credhub.support.user.UserCredential; +import org.springframework.credhub.support.user.UserCredentialRequest; +import org.springframework.credhub.support.value.ValueCredential; +import org.springframework.credhub.support.value.ValueCredentialRequest; + +import com.baeldung.model.Credential; + +public class CredentialService { + + private final CredHubCredentialOperations credentialOperations; + private final CredHubPermissionV2Operations permissionOperations; + + public CredentialService(CredHubOperations credHubOperations) { + this.credentialOperations = credHubOperations.credentials(); + this.permissionOperations = credHubOperations.permissionsV2(); + } + + public String generatePassword(String name) { + try { + SimpleCredentialName credentialName = new SimpleCredentialName(name); + PasswordParameters parameters = PasswordParameters.builder() + .length(24) + .excludeUpper(false) + .excludeLower(false) + .includeSpecial(true) + .excludeNumber(false) + .build(); + + CredentialDetails generatedCred = credentialOperations.generate(PasswordParametersRequest.builder() + .name(credentialName) + .parameters(parameters) + .build()); + + return generatedCred.getValue() + .getPassword(); + } catch (Exception e) { + return null; + } + } + + public String writeCredential(Credential credential) { + try { + SimpleCredentialName credentialName = new SimpleCredentialName(credential.getName()); + CredentialRequest request = null; + Map value = credential.getValue(); + switch (credential.getType()) { + case "value": + ValueCredential valueCredential = new ValueCredential((String) value.get("value")); + request = ValueCredentialRequest.builder() + .name(credentialName) + .value(valueCredential) + .build(); + break; + + case "json": + request = JsonCredentialRequest.builder() + .name(credentialName) + .value(value) + .build(); + break; + + case "user": + UserCredential userCredential = new UserCredential((String) value.get("username"), (String) value.get("password")); + request = UserCredentialRequest.builder() + .name(credentialName) + .value(userCredential) + .build(); + break; + + case "password": + PasswordCredential passwordCredential = new PasswordCredential((String) value.get("password")); + request = PasswordCredentialRequest.builder() + .name(credentialName) + .value(passwordCredential) + .build(); + break; + + case "certificate": + CertificateCredential certificateCredential = new CertificateCredential((String) value.get("certificate"), (String) value.get("certificate_authority"), (String) value.get("private_key")); + request = CertificateCredentialRequest.builder() + .name(credentialName) + .value(certificateCredential) + .build(); + break; + + case "rsa": + RsaCredential rsaCredential = new RsaCredential((String) value.get("public_key"), (String) value.get("private_key")); + request = RsaCredentialRequest.builder() + .name(credentialName) + .value(rsaCredential) + .build(); + break; + + case "ssh": + SshCredential sshCredential = new SshCredential((String) value.get("public_key"), (String) value.get("private_key")); + request = SshCredentialRequest.builder() + .name(credentialName) + .value(sshCredential) + .build(); + break; + + default: + } + if (request != null) { + credentialOperations.write(request); + } + return "Credential:" + credentialName + " written successfully!"; + } catch (Exception e) { + return "Error! Unable to write credential"; + } + } + + public String rotatePassword(String name) { + try { + SimpleCredentialName credentialName = new SimpleCredentialName(name); + CredentialDetails oldPassword = credentialOperations.getByName(credentialName, PasswordCredential.class); + CredentialDetails newPassword = credentialOperations.regenerate(credentialName, PasswordCredential.class); + + return "Credential:" + credentialName + " re-generated successfully!"; + } catch (Exception e) { + return "Error! Unable to re-generate credential"; + } + } + + public String deletePassword(String name) { + try { + SimpleCredentialName credentialName = new SimpleCredentialName(name); + credentialOperations.deleteByName(credentialName); + return "Credential:" + credentialName + " deleted successfully!"; + } catch (Exception e) { + return "Error! Unable to delete credential"; + } + } + + public String getPassword(String name) { + try { + SimpleCredentialName credentialName = new SimpleCredentialName(name); + return credentialOperations.getByName(credentialName, PasswordCredential.class) + .getValue() + .getPassword(); + } catch (Exception e) { + return null; + } + } + + public CredentialPermission addCredentialPermission(String name) { + SimpleCredentialName credentialName = new SimpleCredentialName(name); + try { + Permission permission = Permission.builder() + .app(UUID.randomUUID() + .toString()) + .operations(Operation.READ, Operation.WRITE) + .user("u101") + .build(); + CredentialPermission credentialPermission = permissionOperations.addPermissions(credentialName, permission); + return credentialPermission; + } catch (Exception e) { + return null; + } + } + + public CredentialPermission getCredentialPermission(String name) { + try { + return permissionOperations.getPermissions(name); + } catch (Exception e) { + return null; + } + } +} + diff --git a/spring-credhub/src/main/resources/application.yml b/spring-credhub/src/main/resources/application.yml new file mode 100644 index 0000000000..cd2519e4c5 --- /dev/null +++ b/spring-credhub/src/main/resources/application.yml @@ -0,0 +1,9 @@ +management: + endpoints: + web: + exposure: + include: "*" + +spring: + credhub: + url: \ No newline at end of file diff --git a/spring-credhub/src/test/java/com/baeldung/controller/CredentialServiceUnitTest.java b/spring-credhub/src/test/java/com/baeldung/controller/CredentialServiceUnitTest.java new file mode 100644 index 0000000000..cc785cabda --- /dev/null +++ b/spring-credhub/src/test/java/com/baeldung/controller/CredentialServiceUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.controller; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.assertj.core.util.DateUtil; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.credhub.support.CredentialPermission; +import org.springframework.credhub.support.permissions.Operation; + +import com.baeldung.model.Credential; +import com.baeldung.service.CredentialService; + +@Ignore +@ExtendWith(MockitoExtension.class) +public class CredentialServiceUnitTest { + + @InjectMocks + private CredentialService credentialService; + + @Test + public void whenGeneratePassword_thenReturnNewPassword() { + String orderApiKey = credentialService.generatePassword("order_api_key"); + assertFalse(orderApiKey.isEmpty()); + } + + @Test + public void whenWriteCredential_thenReturnSuccess() { + Map value = new HashMap<>(); + value.put("end_date", DateUtil.now()); + value.put("start_date", DateUtil.yesterday()); + + Credential credential = new Credential(); + credential.setName("order_config_json"); + credential.setType("json"); + credential.setValue(value); + + String result = credentialService.writeCredential(credential); + assertThat(result).isEqualTo("Credential:order_config_json written successfully!"); + } + + @Test + public void whenRotatePassword_thenRegenerateNewPassword() { + String orderApiKey = credentialService.rotatePassword("order_api_key"); + assertThat(orderApiKey).isEqualTo("Credential:order_api_key re-generated successfully!"); + } + + @Test + public void whenRevokePassword_thenDeletePassword() { + String orderApiKey = credentialService.deletePassword("order_api_key"); + assertThat(orderApiKey).isEqualTo("Credential:order_api_key deleted successfully!"); + } + + @Test + public void whenRetrieveExistingCredential_thenReturnCredentialValue() { + String orderConfigJson = credentialService.getPassword("order_config_json"); + assertFalse(orderConfigJson.isEmpty()); + } + + @Test + public void whenCredentialPermissionCreated_thenAddToCredential() { + CredentialPermission orderConfig = credentialService.addCredentialPermission("order_config_json"); + List operations = orderConfig.getPermission() + .getOperations(); + String identity = orderConfig.getPermission() + .getActor() + .getIdentity(); + + CredentialPermission newOrderConfig = credentialService.getCredentialPermission("order_config_json"); + List newOperations = newOrderConfig.getPermission() + .getOperations(); + String newIdentity = newOrderConfig.getPermission() + .getActor() + .getIdentity(); + + assertThat(operations.size() == newOperations.size() && operations.containsAll(newOperations) && newOperations.containsAll(operations)); + assertThat(identity).isEqualTo(newIdentity); + } +} diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java b/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java deleted file mode 100644 index 7ec076abc7..0000000000 --- a/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.componentscan.filter.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface Animal { -} diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java b/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java deleted file mode 100644 index 7849e4e10a..0000000000 --- a/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.componentscan.filter.annotation; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; - -@Configuration -@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Animal.class)) -public class ComponentScanAnnotationFilterApp { - - public static void main(String[] args) { - } -} diff --git a/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java b/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java deleted file mode 100644 index 758775a737..0000000000 --- a/spring-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.componentscan.filter.annotation; - -@Animal -public class Elephant { -} diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index f5aaa93ff7..2e0e242a56 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -119,7 +119,6 @@ 1.4.7 1.1.1 2.10 - 1.4.197 \ No newline at end of file diff --git a/spring-jenkins-pipeline/README.md b/spring-jenkins-pipeline/README.md index d0eb726143..e179997c71 100644 --- a/spring-jenkins-pipeline/README.md +++ b/spring-jenkins-pipeline/README.md @@ -25,5 +25,3 @@ $ mvn spring-boot:run -Dserver.port=8989 ``` Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) - -Enjoy it :) diff --git a/spring-jinq/src/main/resources/application.properties b/spring-jinq/src/main/resources/application.properties index c0271c65da..fce0dd5c6b 100644 --- a/spring-jinq/src/main/resources/application.properties +++ b/spring-jinq/src/main/resources/application.properties @@ -6,3 +6,4 @@ spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true spring.jpa.properties.hibernate.globally_quoted_identifiers=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-reactive-modules/README.md b/spring-reactive-modules/README.md index 100f15ae49..3522efec17 100644 --- a/spring-reactive-modules/README.md +++ b/spring-reactive-modules/README.md @@ -1,3 +1,4 @@ ## Spring Reactive -This module contains modules about Spring Reactive \ No newline at end of file +This module contains modules about Spring Reactive +- [How to Resolve Spring Webflux DataBufferLimitException](https://www.baeldung.com/spring-webflux-databufferlimitexception) diff --git a/spring-reactive-modules/pom.xml b/spring-reactive-modules/pom.xml index d7f1ae2ed9..595ae9e211 100644 --- a/spring-reactive-modules/pom.xml +++ b/spring-reactive-modules/pom.xml @@ -22,9 +22,11 @@ spring-5-reactive-2 spring-5-reactive-3 spring-5-reactive-client + spring-5-reactive-client-2 spring-5-reactive-oauth spring-5-reactive-security spring-reactive + spring-reactive-exceptions @@ -60,4 +62,4 @@ - \ No newline at end of file + diff --git a/spring-reactive-modules/spring-5-reactive-client-2/README.md b/spring-reactive-modules/spring-5-reactive-client-2/README.md new file mode 100644 index 0000000000..067a87a9d5 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/README.md @@ -0,0 +1,10 @@ +## Spring REST Example Project + +This module contains articles about reactive Spring 5 WebClient + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles +- [Limiting the Requests per Second With WebClient](https://www.baeldung.com/spring-webclient-limit-requests-per-second) +- More articles: [[<-- prev]](../spring-5-reactive-client) diff --git a/spring-reactive-modules/spring-5-reactive-client-2/pom.xml b/spring-reactive-modules/spring-5-reactive-client-2/pom.xml new file mode 100644 index 0000000000..23921f3df6 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/pom.xml @@ -0,0 +1,146 @@ + + + 4.0.0 + spring-5-reactive-client-2 + spring-5-reactive-client-2 + jar + spring 5 sample project about new features + + + com.baeldung.spring.reactive + spring-reactive-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + org.projectreactor + reactor-spring + ${reactor-spring.version} + + + javax.json.bind + javax.json.bind-api + + + io.github.resilience4j + resilience4j-reactor + ${resilience4j.version} + + + io.github.resilience4j + resilience4j-ratelimiter + ${resilience4j.version} + + + com.google.guava + guava + ${guava.version} + + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.springframework + spring-test + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.mockito + mockito-junit-jupiter + test + + + io.projectreactor + reactor-test + test + + + org.eclipse.jetty + jetty-reactive-httpclient + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + + integration-lite-first + + + + org.apache.maven.plugins + maven-surefire-plugin + + + ${project.basedir}/src/test/resources/logback-test.xml + + + + + + + + integration-lite-second + + + + org.apache.maven.plugins + maven-surefire-plugin + + + ${project.basedir}/src/test/resources/logback-test.xml + + + + + + + + + + 1.0.1.RELEASE + 1.1.6 + 3.2.10.RELEASE + 1.7.1 + + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/LimitRequestsApp.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/LimitRequestsApp.java new file mode 100644 index 0000000000..682746f684 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/LimitRequestsApp.java @@ -0,0 +1,12 @@ +package com.baeldung.limitrequests; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LimitRequestsApp { + + public static void main(String[] args) { + SpringApplication.run(LimitRequestsApp.class, args); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/DelayElements.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/DelayElements.java new file mode 100644 index 0000000000..36488edcf9 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/DelayElements.java @@ -0,0 +1,33 @@ +package com.baeldung.limitrequests.client; + +import java.time.Duration; + +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.limitrequests.client.utils.Client; +import com.baeldung.limitrequests.client.utils.RandomConsumer; + +import reactor.core.publisher.Flux; + +public class DelayElements { + + private DelayElements() { + } + + public static Flux fetch(WebClient client, int requests, int delay) { + String clientId = Client.id(requests, DelayElements.class, delay); + + return Flux.range(1, requests) + .log() + .delayElements(Duration.ofMillis(delay)) + .flatMap(i -> RandomConsumer.get(client, clientId)); + } + + public static void main(String[] args) { + String baseUrl = args[0]; + WebClient client = WebClient.create(baseUrl); + + fetch(client, 12, 1050).doOnNext(System.out::println) + .blockLast(); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/GuavaRateLimit.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/GuavaRateLimit.java new file mode 100644 index 0000000000..b0aa8d547f --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/GuavaRateLimit.java @@ -0,0 +1,37 @@ +package com.baeldung.limitrequests.client; + +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.limitrequests.client.utils.Client; +import com.baeldung.limitrequests.client.utils.RandomConsumer; +import com.google.common.util.concurrent.RateLimiter; + +import reactor.core.publisher.Flux; + +public class GuavaRateLimit { + + private GuavaRateLimit() { + } + + public static Flux fetch(WebClient client, int requests, double limit) { + String clientId = Client.id(requests, GuavaRateLimit.class, limit); + + RateLimiter limiter = RateLimiter.create(limit); + + return Flux.range(1, requests) + .log() + .flatMap(i -> { + limiter.acquire(); + + return RandomConsumer.get(client, clientId); + }); + } + + public static void main(String[] args) throws InterruptedException { + String baseUrl = args[0]; + WebClient client = WebClient.create(baseUrl); + + fetch(client, 20, 2).doOnNext(System.out::println) + .blockLast(); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/LimitConcurrency.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/LimitConcurrency.java new file mode 100644 index 0000000000..f95195b5f3 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/LimitConcurrency.java @@ -0,0 +1,30 @@ +package com.baeldung.limitrequests.client; + +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.limitrequests.client.utils.Client; +import com.baeldung.limitrequests.client.utils.RandomConsumer; + +import reactor.core.publisher.Flux; + +public class LimitConcurrency { + + private LimitConcurrency() { + } + + public static Flux fetch(WebClient client, int requests, int concurrency) { + String clientId = Client.id(requests, LimitConcurrency.class.getSimpleName(), concurrency); + + return Flux.range(1, requests) + .log() + .flatMap(i -> RandomConsumer.get(client, clientId), concurrency); + } + + public static void main(String[] args) throws InterruptedException { + String baseUrl = args[0]; + WebClient client = WebClient.create(baseUrl); + + fetch(client, 12, 5).doOnNext(System.out::println) + .blockLast(); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/Resilience4jRateLimit.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/Resilience4jRateLimit.java new file mode 100644 index 0000000000..d25c422d03 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/Resilience4jRateLimit.java @@ -0,0 +1,42 @@ +package com.baeldung.limitrequests.client; + +import java.time.Duration; + +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.limitrequests.client.utils.Client; +import com.baeldung.limitrequests.client.utils.RandomConsumer; + +import io.github.resilience4j.ratelimiter.RateLimiter; +import io.github.resilience4j.ratelimiter.RateLimiterConfig; +import io.github.resilience4j.reactor.ratelimiter.operator.RateLimiterOperator; +import reactor.core.publisher.Flux; + +public class Resilience4jRateLimit { + + private Resilience4jRateLimit() { + } + + public static Flux fetch(WebClient client, int requests, int concurrency, int interval) { + RateLimiter limiter = RateLimiter.of("my-rate-limiter", RateLimiterConfig.custom() + .limitRefreshPeriod(Duration.ofMillis(interval)) + .limitForPeriod(concurrency) + .timeoutDuration(Duration.ofMillis((long) interval * concurrency)) + .build()); + + String clientId = Client.id(requests, Resilience4jRateLimit.class, concurrency, interval); + + return Flux.range(1, requests) + .log() + .flatMap(i -> RandomConsumer. get(client, clientId) + .transformDeferred(RateLimiterOperator.of(limiter))); + } + + public static void main(String[] args) { + String baseUrl = args[0]; + WebClient client = WebClient.create(baseUrl); + + fetch(client, 10, 5, 2500).doOnNext(System.out::println) + .blockLast(); + } +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/ZipWithInterval.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/ZipWithInterval.java new file mode 100644 index 0000000000..326154df22 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/ZipWithInterval.java @@ -0,0 +1,33 @@ +package com.baeldung.limitrequests.client; + +import java.time.Duration; + +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.limitrequests.client.utils.Client; +import com.baeldung.limitrequests.client.utils.RandomConsumer; + +import reactor.core.publisher.Flux; + +public class ZipWithInterval { + + private ZipWithInterval() { + } + + public static Flux fetch(WebClient client, int requests, int delay) { + String clientId = Client.id(requests, ZipWithInterval.class, delay); + + return Flux.range(1, requests) + .log() + .zipWith(Flux.interval(Duration.ofMillis(delay))) + .flatMap(i -> RandomConsumer.get(client, clientId)); + } + + public static void main(String[] args) { + String baseUrl = args[0]; + WebClient client = WebClient.create(baseUrl); + + fetch(client, 15, 1100).doOnNext(System.out::println) + .blockLast(); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/utils/Client.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/utils/Client.java new file mode 100644 index 0000000000..31cda42ce5 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/utils/Client.java @@ -0,0 +1,16 @@ +package com.baeldung.limitrequests.client.utils; + +public interface Client { + + String SEPARATOR = ":"; + + static String id(Object... args) { + StringBuilder builder = new StringBuilder(); + for (Object object : args) { + builder.append(":") + .append(object.toString()); + } + return builder.toString() + .replaceFirst(SEPARATOR, ""); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/utils/RandomConsumer.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/utils/RandomConsumer.java new file mode 100644 index 0000000000..3deb8a162e --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/client/utils/RandomConsumer.java @@ -0,0 +1,19 @@ +package com.baeldung.limitrequests.client.utils; + +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.limitrequests.server.RandomController; + +import reactor.core.publisher.Mono; + +public interface RandomConsumer { + + static Mono get(WebClient client, String id) { + return client.get() + .header(RandomController.CLIENT_ID_HEADER, id) + .retrieve() + .bodyToMono(new ParameterizedTypeReference() { + }); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/server/Concurrency.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/server/Concurrency.java new file mode 100644 index 0000000000..277d0562b9 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/server/Concurrency.java @@ -0,0 +1,38 @@ +package com.baeldung.limitrequests.server; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.IntSupplier; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Concurrency { + + public static final int MAX_CONCURRENT_REQUESTS = 5; + private static final Logger logger = LoggerFactory.getLogger(Concurrency.class); + private static final Map CONCURRENT_REQUESTS = new HashMap<>(); + + private Concurrency() { + } + + public static int protect(String clientId, IntSupplier supplier) throws InterruptedException { + AtomicInteger counter = CONCURRENT_REQUESTS.computeIfAbsent(clientId, k -> new AtomicInteger(0)); + + try { + int n = counter.incrementAndGet(); + if (n > MAX_CONCURRENT_REQUESTS) { + String message = String.format("%s - %d max concurrent requests reached [%d]. try again later", clientId, MAX_CONCURRENT_REQUESTS, n); + throw new UnsupportedOperationException(message); + } + + logger.info("{} - {}", clientId, n); + TimeUnit.SECONDS.sleep(2); + return supplier.getAsInt(); + } finally { + counter.decrementAndGet(); + } + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/server/RandomController.java b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/server/RandomController.java new file mode 100644 index 0000000000..9fc1c82ec8 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/java/com/baeldung/limitrequests/server/RandomController.java @@ -0,0 +1,21 @@ +package com.baeldung.limitrequests.server; + +import java.util.Random; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/random") +public class RandomController { + + public static final String CLIENT_ID_HEADER = "client-id"; + private static final Random RANDOM = new Random(); + + @GetMapping + Integer getRandom(@RequestHeader(CLIENT_ID_HEADER) String clientId) throws InterruptedException { + return Concurrency.protect(clientId, () -> RANDOM.nextInt(50)); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/application.properties b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/application.properties new file mode 100644 index 0000000000..05033054b1 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/application.properties @@ -0,0 +1,5 @@ +logging.level.root=INFO + +server.port=8081 + +logging.level.reactor.netty.http.client.HttpClient=DEBUG \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/logback.xml b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7072369b8d --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + # Pattern of log message for console appender + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/test/java/com/baeldung/limitrequests/RandomControllerLiveTest.java b/spring-reactive-modules/spring-5-reactive-client-2/src/test/java/com/baeldung/limitrequests/RandomControllerLiveTest.java new file mode 100644 index 0000000000..e8debd24d0 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/test/java/com/baeldung/limitrequests/RandomControllerLiveTest.java @@ -0,0 +1,113 @@ +package com.baeldung.limitrequests; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClientResponseException.InternalServerError; + +import com.baeldung.limitrequests.client.DelayElements; +import com.baeldung.limitrequests.client.GuavaRateLimit; +import com.baeldung.limitrequests.client.LimitConcurrency; +import com.baeldung.limitrequests.client.Resilience4jRateLimit; +import com.baeldung.limitrequests.client.ZipWithInterval; +import com.baeldung.limitrequests.server.Concurrency; + +class RandomControllerLiveTest { + + private static final int MAX_CONCURRENT_REQUESTS = Concurrency.MAX_CONCURRENT_REQUESTS; + private static final int TOTAL_REQUESTS = 10; + + private WebClient client = WebClient.create("http://localhost:8081/random"); + + @Test + void givenEnoughDelay_whenZipWithInterval_thenNoExceptionThrown() { + int delay = MAX_CONCURRENT_REQUESTS * 100; + + assertDoesNotThrow(() -> { + ZipWithInterval.fetch(client, TOTAL_REQUESTS, delay) + .doOnNext(System.out::println) + .blockLast(); + }); + } + + @Test + void givenSmallDelay_whenZipWithInterval_thenExceptionThrown() { + int delay = 100; + + assertThrows(InternalServerError.class, () -> { + ZipWithInterval.fetch(client, TOTAL_REQUESTS, delay) + .doOnNext(System.out::println) + .blockLast(); + }); + } + + @Test + void givenEnoughDelay_whenDelayElements_thenNoExceptionThrown() { + int delay = MAX_CONCURRENT_REQUESTS * 100; + + assertDoesNotThrow(() -> { + DelayElements.fetch(client, TOTAL_REQUESTS, delay) + .doOnNext(System.out::println) + .blockLast(); + }); + } + + @Test + void givenSmallDelay_whenDelayElements_thenExceptionThrown() { + int delay = 100; + + assertThrows(InternalServerError.class, () -> { + DelayElements.fetch(client, TOTAL_REQUESTS, delay) + .doOnNext(System.out::println) + .blockLast(); + }); + } + + @Test + void givenLimitInsideServerRange_whenLimitedConcurrency_thenNoExceptionThrown() { + int limit = MAX_CONCURRENT_REQUESTS; + + assertDoesNotThrow(() -> { + LimitConcurrency.fetch(client, TOTAL_REQUESTS, limit) + .doOnNext(System.out::println) + .blockLast(); + }); + } + + @Test + void givenLimitOutsideServerRange_whenLimitedConcurrency_thenExceptionThrown() { + int limit = MAX_CONCURRENT_REQUESTS + TOTAL_REQUESTS; + + assertThrows(InternalServerError.class, () -> { + LimitConcurrency.fetch(client, TOTAL_REQUESTS, limit) + .doOnNext(System.out::println) + .blockLast(); + }); + } + + @Test + void givenLongInterval_whenRateLimited_thenNoExceptionThrown() { + int interval = MAX_CONCURRENT_REQUESTS * 500; + + int limit = MAX_CONCURRENT_REQUESTS; + + assertDoesNotThrow(() -> { + Resilience4jRateLimit.fetch(client, TOTAL_REQUESTS, limit, interval) + .doOnNext(System.out::println) + .blockLast(); + }); + } + + @Test + void givenShortLimit_whenUsingGuavaRateLimiter_thenNoExceptionThrown() { + double limit = MAX_CONCURRENT_REQUESTS / 2; + + assertDoesNotThrow(() -> { + GuavaRateLimit.fetch(client, TOTAL_REQUESTS, limit) + .doOnNext(System.out::println) + .blockLast(); + }); + } +} diff --git a/spring-reactive-modules/spring-5-reactive-client-2/src/test/resources/logback-test.xml b/spring-reactive-modules/spring-5-reactive-client-2/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..42cb0865c5 --- /dev/null +++ b/spring-reactive-modules/spring-5-reactive-client-2/src/test/resources/logback-test.xml @@ -0,0 +1,20 @@ + + + + + # Pattern of log message for console appender + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-reactive-modules/spring-5-reactive-client/README.md b/spring-reactive-modules/spring-5-reactive-client/README.md index 5a93e0b13e..f1793070b3 100644 --- a/spring-reactive-modules/spring-5-reactive-client/README.md +++ b/spring-reactive-modules/spring-5-reactive-client/README.md @@ -13,3 +13,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Get List of JSON Objects with WebClient](https://www.baeldung.com/spring-webclient-json-list) - [Upload a File with WebClient](https://www.baeldung.com/spring-webclient-upload-file) - [How to Get Response Body When Testing the Status Code in WebFlux WebClient](https://www.baeldung.com/spring-webclient-get-response-body) +- More articles: [[next -->]](../spring-5-reactive-client-2) diff --git a/spring-reactive-modules/spring-reactive-exceptions/.gitignore b/spring-reactive-modules/spring-reactive-exceptions/.gitignore new file mode 100644 index 0000000000..549e00a2a9 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/spring-reactive-modules/spring-reactive-exceptions/pom.xml b/spring-reactive-modules/spring-reactive-exceptions/pom.xml new file mode 100644 index 0000000000..c42400affc --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + com.baeldung.spring.reactive + spring-reactive-modules + 1.0.0-SNAPSHOT + + + spring-reactive-exceptions + 0.0.1-SNAPSHOT + spring-reactive-exceptions + A module to hold demo examples related to exception in Spring Reactive + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + io.projectreactor + reactor-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/SpringReactiveExceptionsApplication.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/SpringReactiveExceptionsApplication.java new file mode 100644 index 0000000000..634b5770ba --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/SpringReactiveExceptionsApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.reactive.springreactiveexceptions; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringReactiveExceptionsApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringReactiveExceptionsApplication.class, args); + } + +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/client/DemoSelfClient.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/client/DemoSelfClient.java new file mode 100644 index 0000000000..b136a981af --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/client/DemoSelfClient.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.client; + +import com.baeldung.spring.reactive.springreactiveexceptions.model.Users; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; + +@Service +public class DemoSelfClient { + + @Autowired + @Qualifier("webClient") + private WebClient webClient; + @Autowired + private ObjectMapper objectMapper; + + public Mono fetch() { + return webClient + .post() + .uri("/1.0/process") + .body(BodyInserters.fromPublisher(readRequestBody(), Users.class)) + .exchangeToMono(clientResponse -> clientResponse.bodyToMono(Users.class)); + } + + private Mono readRequestBody() { + return Mono + .fromCallable(() -> objectMapper.readValue(new ClassPathResource("390KB.json") + .getURL(), Users.class)) + .subscribeOn(Schedulers.boundedElastic()); + } +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/BeanConfiguration.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/BeanConfiguration.java new file mode 100644 index 0000000000..e525ed07c6 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/BeanConfiguration.java @@ -0,0 +1,34 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; + +@Configuration +public class BeanConfiguration { + @Value("${host:http://localhost:8080}") + private String host; + + @Bean("webClient") + public WebClient getSelfWebClient(WebClient.Builder builder) { + return builder + .baseUrl(host) + .build(); + } + + @Bean("progWebClient") + public WebClient getProgSelfWebClient() { + return WebClient + .builder() + .baseUrl(host) + .exchangeStrategies(ExchangeStrategies + .builder() + .codecs(codecs -> codecs + .defaultCodecs() + .maxInMemorySize(500 * 1024)) + .build()) + .build(); + } +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/Router.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/Router.java new file mode 100644 index 0000000000..fd24d29649 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/Router.java @@ -0,0 +1,27 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.config; + +import com.baeldung.spring.reactive.springreactiveexceptions.handler.DataProcessingHandler; +import com.baeldung.spring.reactive.springreactiveexceptions.handler.TriggerHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; + +@Configuration +public class Router { + @Autowired + private DataProcessingHandler dataProcessingHandler; + @Autowired + private TriggerHandler triggerHandler; + + @Bean + public RouterFunction getRoutes() { + return RouterFunctions + .route() + .POST("/1.0/process", dataProcessingHandler) + .POST("/1.0/trigger", triggerHandler) + .build(); + } +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/WebFluxConfiguration.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/WebFluxConfiguration.java new file mode 100644 index 0000000000..bf38295270 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/config/WebFluxConfiguration.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.http.codec.ServerCodecConfigurer; +import org.springframework.web.reactive.config.WebFluxConfigurer; + +@Configuration +public class WebFluxConfiguration implements WebFluxConfigurer { + @Override + public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { + configurer.defaultCodecs().maxInMemorySize(500 * 1024); + } +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/handler/DataProcessingHandler.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/handler/DataProcessingHandler.java new file mode 100644 index 0000000000..ca1053ec4b --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/handler/DataProcessingHandler.java @@ -0,0 +1,19 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.handler; + +import com.baeldung.spring.reactive.springreactiveexceptions.model.Users; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +@Component +public class DataProcessingHandler implements HandlerFunction { + @Override + public Mono handle(ServerRequest request) { + return ServerResponse + .ok() + .body(request + .bodyToMono(Users.class), Users.class); + } +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/handler/TriggerHandler.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/handler/TriggerHandler.java new file mode 100644 index 0000000000..aa9870b8a6 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/handler/TriggerHandler.java @@ -0,0 +1,23 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.handler; + +import com.baeldung.spring.reactive.springreactiveexceptions.client.DemoSelfClient; +import com.baeldung.spring.reactive.springreactiveexceptions.model.Users; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.HandlerFunction; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +@Component +public class TriggerHandler implements HandlerFunction { + @Autowired + private DemoSelfClient demoSelfClient; + + @Override + public Mono handle(ServerRequest request) { + return ServerResponse + .ok() + .body(demoSelfClient.fetch(), Users.class); + } +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/Friend.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/Friend.java new file mode 100644 index 0000000000..7212c87080 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/Friend.java @@ -0,0 +1,9 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.model; + +import lombok.Data; + +@Data +public class Friend { + private Integer id; + private String name; +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/User.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/User.java new file mode 100644 index 0000000000..a7e2a57339 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/User.java @@ -0,0 +1,31 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class User { + private String _id; + private String index; + private String guid; + private Boolean isActive; + private String balance; + private String picture; + private Integer age; + private String eyeColor; + private String name; + private String gender; + private String company; + private String email; + private String phone; + private String address; + private String about; + private String registered; + private Integer latitude; + private Integer longitude; + private List tags; + private List friends; + private String greeting; + private String favouriteFruit; +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/Users.java b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/Users.java new file mode 100644 index 0000000000..5a86cf8fec --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/java/com/baeldung/spring/reactive/springreactiveexceptions/model/Users.java @@ -0,0 +1,10 @@ +package com.baeldung.spring.reactive.springreactiveexceptions.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class Users { + private List users; +} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/390KB.json b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/390KB.json new file mode 100644 index 0000000000..2c96ffd0ce --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/390KB.json @@ -0,0 +1,12964 @@ +{ + "users": [ + { + "_id": "63443d4bae3f1e925aedba7e", + "index": 0, + "guid": "7bfb9da7-c854-493e-9439-7ebf591e6e27", + "isActive": true, + "balance": "$2,645.20", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Price Johns", + "gender": "male", + "company": "MATRIXITY", + "email": "pricejohns@matrixity.com", + "phone": "+1 (837) 441-2135", + "address": "351 Kathleen Court, Needmore, Massachusetts, 2146", + "about": "Nostrud quis irure elit exercitation eu. Nulla nisi ullamco qui in Lorem non labore. Excepteur incididunt cupidatat ipsum sunt officia velit.\r\n", + "registered": "2016-04-05T10:01:54 -06:-30", + "latitude": -68.604778, + "longitude": -136.192694, + "tags": [ + "culpa", + "esse", + "duis", + "eiusmod", + "ipsum", + "consectetur", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Yvonne Strong" + }, + { + "id": 1, + "name": "Shelia Waller" + }, + { + "id": 2, + "name": "Booker Holland" + } + ], + "greeting": "Hello, Price Johns! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4be96420c85b4beff4", + "index": 1, + "guid": "14e08767-a7ff-4312-8f38-8ee7c4dd2c4b", + "isActive": true, + "balance": "$2,654.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Larsen Mays", + "gender": "male", + "company": "ZOLAR", + "email": "larsenmays@zolar.com", + "phone": "+1 (869) 462-2003", + "address": "210 Seaview Avenue, Cornucopia, Palau, 2688", + "about": "Fugiat mollit ullamco officia sint labore. Exercitation adipisicing nulla reprehenderit ad. Amet cupidatat sit dolore deserunt sit quis irure. Anim culpa deserunt velit consequat nostrud culpa voluptate. Et nulla culpa adipisicing occaecat fugiat cillum ipsum fugiat ullamco velit nisi nostrud magna. Ipsum proident mollit eiusmod ipsum proident ullamco mollit non minim ullamco quis. Nulla voluptate elit elit excepteur ut exercitation in qui irure sit sit minim aliqua.\r\n", + "registered": "2016-08-16T08:00:49 -06:-30", + "latitude": 70.122077, + "longitude": -111.638749, + "tags": [ + "eiusmod", + "tempor", + "excepteur", + "enim", + "fugiat", + "magna", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Walton Henderson" + }, + { + "id": 1, + "name": "Lea Lee" + }, + { + "id": 2, + "name": "Albert Hernandez" + } + ], + "greeting": "Hello, Larsen Mays! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6bd5ab914697bc77", + "index": 2, + "guid": "a3477ba1-9519-4aec-8aaa-41c126a3f3fe", + "isActive": false, + "balance": "$3,390.88", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Imelda Carter", + "gender": "female", + "company": "EXOSPACE", + "email": "imeldacarter@exospace.com", + "phone": "+1 (967) 410-3353", + "address": "841 Livingston Street, Coral, Alaska, 1916", + "about": "Ipsum consequat dolor ullamco qui in aliquip pariatur ex veniam. Ut non mollit elit ipsum cillum nisi deserunt velit aliquip do tempor sint reprehenderit commodo. Minim sint incididunt ullamco veniam Lorem dolore cupidatat do eiusmod deserunt cupidatat irure.\r\n", + "registered": "2020-07-13T08:58:41 -06:-30", + "latitude": 44.631197, + "longitude": -173.456226, + "tags": [ + "est", + "nostrud", + "id", + "officia", + "et", + "sint", + "deserunt" + ], + "friends": [ + { + "id": 0, + "name": "Riley William" + }, + { + "id": 1, + "name": "Minerva Flores" + }, + { + "id": 2, + "name": "Bethany Aguirre" + } + ], + "greeting": "Hello, Imelda Carter! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4beede6d7271fb367b", + "index": 3, + "guid": "b289cb4b-c395-46d7-8b59-dd4ebc3c04c4", + "isActive": true, + "balance": "$2,681.00", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Janelle Reese", + "gender": "female", + "company": "GRONK", + "email": "janellereese@gronk.com", + "phone": "+1 (993) 453-2465", + "address": "560 Campus Place, Cleary, Oklahoma, 914", + "about": "In irure sit est ea amet labore. Consectetur pariatur sint excepteur nisi amet cupidatat incididunt. Officia enim voluptate cupidatat ullamco laboris commodo amet. Qui eu fugiat anim reprehenderit adipisicing qui irure cillum ea id proident ut ea elit. Aute deserunt nulla et velit eu.\r\n", + "registered": "2014-05-13T06:18:22 -06:-30", + "latitude": 71.574351, + "longitude": -172.635689, + "tags": [ + "proident", + "ad", + "laborum", + "sint", + "veniam", + "eiusmod", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Mercado Wilkerson" + }, + { + "id": 1, + "name": "Robinson Slater" + }, + { + "id": 2, + "name": "Eaton Fuller" + } + ], + "greeting": "Hello, Janelle Reese! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6beb097542281479", + "index": 4, + "guid": "a6983d63-6368-4db2-8ca8-d57bcf633be9", + "isActive": true, + "balance": "$1,438.44", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Curtis Sosa", + "gender": "male", + "company": "ZAYA", + "email": "curtissosa@zaya.com", + "phone": "+1 (810) 569-2812", + "address": "566 Hicks Street, Saddlebrooke, New Mexico, 4564", + "about": "Amet qui est est veniam tempor magna anim excepteur velit commodo quis. Commodo laboris aliqua ad ipsum cupidatat laborum qui ut Lorem aliqua reprehenderit sint. Aliquip laboris laborum exercitation magna quis. Laboris proident id pariatur consectetur dolor proident. Dolor in cupidatat pariatur ipsum ad id elit. Velit eiusmod Lorem quis qui reprehenderit labore dolore et incididunt dolor. Laborum quis duis anim excepteur sint labore reprehenderit est quis aute.\r\n", + "registered": "2015-06-25T12:28:21 -06:-30", + "latitude": 42.264845, + "longitude": -15.130883, + "tags": [ + "esse", + "elit", + "excepteur", + "aliquip", + "sunt", + "eiusmod", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Isabella Tyler" + }, + { + "id": 1, + "name": "Edna Farrell" + }, + { + "id": 2, + "name": "Beach Murray" + } + ], + "greeting": "Hello, Curtis Sosa! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3d7da6d4614baa40", + "index": 5, + "guid": "fa82f51d-0c22-493f-8380-9773b13fea3f", + "isActive": false, + "balance": "$2,121.54", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Vasquez Gonzales", + "gender": "male", + "company": "PLASMOSIS", + "email": "vasquezgonzales@plasmosis.com", + "phone": "+1 (996) 533-3358", + "address": "795 Rockaway Parkway, Bonanza, Wyoming, 8239", + "about": "Dolor eiusmod Lorem aliqua Lorem incididunt culpa do ullamco velit amet veniam non dolore cupidatat. Deserunt reprehenderit anim Lorem enim id consectetur minim amet velit sint cupidatat ullamco. Lorem do magna officia officia ipsum ullamco excepteur. Culpa ad enim veniam officia esse do in Lorem.\r\n", + "registered": "2021-01-14T06:08:29 -06:-30", + "latitude": -40.674626, + "longitude": -73.729646, + "tags": [ + "quis", + "veniam", + "amet", + "ipsum", + "laboris", + "pariatur", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Sims Langley" + }, + { + "id": 1, + "name": "Andrews Frye" + }, + { + "id": 2, + "name": "Melisa Johnson" + } + ], + "greeting": "Hello, Vasquez Gonzales! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b015fd0647f9f8079", + "index": 6, + "guid": "9caa1e50-9dc3-4c6d-a1d4-b04ce2eea5d3", + "isActive": false, + "balance": "$1,949.87", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "green", + "name": "Camacho Anderson", + "gender": "male", + "company": "FANGOLD", + "email": "camachoanderson@fangold.com", + "phone": "+1 (966) 535-2658", + "address": "234 Bushwick Avenue, Bartley, Rhode Island, 8229", + "about": "Ut quis id id excepteur. Esse tempor eu amet occaecat sunt ad irure duis id exercitation. Consectetur anim esse eiusmod cillum. Excepteur et ea aliquip consectetur. Ut aliquip dolore elit irure ut laboris nostrud non magna. Nostrud cillum nulla sint officia amet amet in eu ex.\r\n", + "registered": "2021-10-12T03:18:30 -06:-30", + "latitude": -41.638296, + "longitude": 87.818231, + "tags": [ + "cupidatat", + "esse", + "amet", + "do", + "eu", + "tempor", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Christy Whitfield" + }, + { + "id": 1, + "name": "Bette Gilbert" + }, + { + "id": 2, + "name": "Peterson Bentley" + } + ], + "greeting": "Hello, Camacho Anderson! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bc75570fd76462df9", + "index": 7, + "guid": "c96e51aa-d3a6-4383-ab29-afe0eba5b536", + "isActive": true, + "balance": "$3,005.84", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "blue", + "name": "Freda Blanchard", + "gender": "female", + "company": "PETICULAR", + "email": "fredablanchard@peticular.com", + "phone": "+1 (963) 509-3043", + "address": "981 Mill Road, Smock, West Virginia, 4952", + "about": "Ea eu nisi in occaecat non. Velit ea labore duis quis pariatur ipsum. Consectetur ad incididunt magna eiusmod voluptate laborum proident excepteur dolore duis tempor tempor do. Excepteur amet eiusmod eiusmod id nostrud minim commodo esse anim. Cupidatat sit incididunt cupidatat sunt occaecat in dolor cupidatat veniam dolore fugiat nulla. Ad ex Lorem occaecat cupidatat sit id ex cupidatat fugiat officia exercitation dolore ipsum do. Adipisicing consectetur laboris anim sunt est duis ullamco aliquip.\r\n", + "registered": "2020-01-29T02:21:04 -06:-30", + "latitude": 86.468975, + "longitude": 161.052521, + "tags": [ + "sint", + "sint", + "laboris", + "consectetur", + "occaecat", + "consectetur", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Kramer Cox" + }, + { + "id": 1, + "name": "Myra Robles" + }, + { + "id": 2, + "name": "Sanford Koch" + } + ], + "greeting": "Hello, Freda Blanchard! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b2ce2eb4cdb203780", + "index": 8, + "guid": "e94c471c-c25c-4960-9646-fe384ea9256d", + "isActive": false, + "balance": "$1,705.47", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Dickerson Navarro", + "gender": "male", + "company": "EXTRAGEN", + "email": "dickersonnavarro@extragen.com", + "phone": "+1 (963) 540-3791", + "address": "765 Kensington Walk, Waukeenah, Nevada, 7197", + "about": "Commodo consectetur do tempor Lorem. Consectetur aliqua est eu cupidatat est anim magna fugiat consequat exercitation. Ipsum commodo labore id enim eu velit excepteur minim est. Sit ex consequat labore officia nisi excepteur sint amet. Deserunt consequat eu dolore non nostrud exercitation. Id et fugiat commodo minim ea proident labore sunt laborum tempor. Culpa commodo quis quis id quis eu sunt.\r\n", + "registered": "2022-01-07T03:07:31 -06:-30", + "latitude": -76.21971, + "longitude": 86.923368, + "tags": [ + "sunt", + "enim", + "ad", + "laborum", + "excepteur", + "ex", + "laborum" + ], + "friends": [ + { + "id": 0, + "name": "Denise Kidd" + }, + { + "id": 1, + "name": "Roy Kemp" + }, + { + "id": 2, + "name": "Toni Duncan" + } + ], + "greeting": "Hello, Dickerson Navarro! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b2e7f67cf6ace2c83", + "index": 9, + "guid": "6f31ca8b-50f1-43a3-9ecc-8766c6cbbf87", + "isActive": true, + "balance": "$1,441.58", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Margarita Hicks", + "gender": "female", + "company": "SYNTAC", + "email": "margaritahicks@syntac.com", + "phone": "+1 (813) 472-2651", + "address": "680 Baughman Place, Wolcott, Delaware, 6890", + "about": "Dolore Lorem elit enim culpa occaecat commodo aliquip eiusmod. Lorem commodo laborum eiusmod sint aliquip aliqua est irure. Sit aute laboris incididunt dolore sunt nostrud est ullamco consequat. Proident veniam commodo proident laboris anim Lorem qui cupidatat veniam magna nostrud minim veniam. Pariatur aliqua amet officia in exercitation duis magna minim id consequat. Consectetur amet pariatur quis ullamco anim veniam commodo tempor commodo. Excepteur nulla ullamco labore id voluptate voluptate nostrud laborum mollit sit.\r\n", + "registered": "2019-04-09T09:41:14 -06:-30", + "latitude": 36.582562, + "longitude": -127.728853, + "tags": [ + "nisi", + "qui", + "duis", + "dolore", + "amet", + "elit", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Sasha Rivers" + }, + { + "id": 1, + "name": "Mendoza Norton" + }, + { + "id": 2, + "name": "Goodwin Ellis" + } + ], + "greeting": "Hello, Margarita Hicks! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4b218933a8e5fa09", + "index": 10, + "guid": "8ed6df40-42ed-4c76-a646-462396997e39", + "isActive": false, + "balance": "$3,355.36", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Horton Benjamin", + "gender": "male", + "company": "COREPAN", + "email": "hortonbenjamin@corepan.com", + "phone": "+1 (942) 520-2346", + "address": "133 Commercial Street, Mooresburg, Federated States Of Micronesia, 1881", + "about": "Dolore amet ex irure ex consectetur nostrud quis cillum eiusmod non est quis est. Cupidatat Lorem id nostrud sit magna. Duis ullamco magna magna cupidatat. Do dolor veniam sit do adipisicing ea incididunt. Velit commodo et voluptate sunt laborum. Lorem est eu consectetur consequat voluptate cupidatat laboris ipsum duis occaecat labore veniam. Sunt exercitation anim ut proident aute id aliqua minim ipsum esse eu.\r\n", + "registered": "2016-08-24T08:36:35 -06:-30", + "latitude": 73.768619, + "longitude": -171.225031, + "tags": [ + "deserunt", + "commodo", + "ad", + "eu", + "nostrud", + "incididunt", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Lynette Whitehead" + }, + { + "id": 1, + "name": "Isabel Underwood" + }, + { + "id": 2, + "name": "Olson Mullins" + } + ], + "greeting": "Hello, Horton Benjamin! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5eb76b5dc535c03e", + "index": 11, + "guid": "03110dbe-8d27-4a11-87b8-413819cd12ce", + "isActive": true, + "balance": "$3,277.96", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Verna Joyner", + "gender": "female", + "company": "AVENETRO", + "email": "vernajoyner@avenetro.com", + "phone": "+1 (826) 484-2360", + "address": "536 Gem Street, Skyland, Pennsylvania, 5473", + "about": "Occaecat commodo eiusmod irure veniam Lorem ullamco officia ea nulla cillum magna. Sit adipisicing dolore mollit laboris commodo ullamco consequat excepteur mollit. Anim qui eu sunt culpa non do minim magna proident consequat ullamco. Quis ipsum laborum mollit fugiat elit proident voluptate. Magna amet dolor nisi velit in aliqua et adipisicing proident. Velit elit dolore laboris proident excepteur. Ex officia tempor incididunt exercitation ad ullamco.\r\n", + "registered": "2016-07-16T04:43:04 -06:-30", + "latitude": 48.847133, + "longitude": -46.254124, + "tags": [ + "nisi", + "esse", + "aliqua", + "minim", + "consectetur", + "irure", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Santos Tate" + }, + { + "id": 1, + "name": "Zamora Garrett" + }, + { + "id": 2, + "name": "Shawna Bradford" + } + ], + "greeting": "Hello, Verna Joyner! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b93db26d017bffe61", + "index": 12, + "guid": "17d1af4f-2d89-4920-b2e1-a6c9f2bf7aa2", + "isActive": true, + "balance": "$3,824.28", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Carrillo Vance", + "gender": "male", + "company": "URBANSHEE", + "email": "carrillovance@urbanshee.com", + "phone": "+1 (843) 553-2322", + "address": "112 Milford Street, Yonah, Connecticut, 8288", + "about": "Magna ut duis veniam labore aliquip magna exercitation id enim consequat aliqua nostrud incididunt. Amet eu ad occaecat culpa esse deserunt ut nisi dolor veniam magna proident. Qui labore id ipsum consectetur nostrud culpa tempor est. Labore deserunt occaecat magna pariatur minim elit ipsum sint laborum sunt dolore ipsum.\r\n", + "registered": "2014-09-05T04:35:06 -06:-30", + "latitude": 58.651506, + "longitude": -58.186488, + "tags": [ + "in", + "est", + "mollit", + "mollit", + "aliqua", + "incididunt", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Hicks Larsen" + }, + { + "id": 1, + "name": "Christian Cameron" + }, + { + "id": 2, + "name": "Sylvia Mclaughlin" + } + ], + "greeting": "Hello, Carrillo Vance! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3474c267b4f031e0", + "index": 13, + "guid": "1fb2fc56-e685-404e-870e-8eaf07a3b8d3", + "isActive": false, + "balance": "$1,180.65", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Hensley Pickett", + "gender": "male", + "company": "GINKOGENE", + "email": "hensleypickett@ginkogene.com", + "phone": "+1 (894) 588-3009", + "address": "867 Whitney Avenue, Mappsville, Louisiana, 7724", + "about": "Velit consequat dolor fugiat reprehenderit veniam duis deserunt excepteur aute enim cupidatat minim culpa. Sunt laboris proident aute fugiat ad laborum ut anim. Ex esse pariatur occaecat sunt. Commodo nostrud do velit excepteur mollit qui aliqua excepteur reprehenderit tempor nisi id. Consectetur in dolore proident ipsum dolore. Qui commodo anim occaecat tempor ea qui ullamco veniam incididunt consequat eiusmod cupidatat adipisicing consectetur. Culpa minim qui id occaecat dolore ea laboris ea anim.\r\n", + "registered": "2017-03-07T12:48:14 -06:-30", + "latitude": -29.279572, + "longitude": -42.015693, + "tags": [ + "sit", + "fugiat", + "et", + "aliquip", + "quis", + "eiusmod", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Elizabeth Justice" + }, + { + "id": 1, + "name": "Madge Hutchinson" + }, + { + "id": 2, + "name": "Coleman Olsen" + } + ], + "greeting": "Hello, Hensley Pickett! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b741053d06d29996e", + "index": 14, + "guid": "1bdea636-cf4d-4067-9c6c-1be5ff80a14f", + "isActive": false, + "balance": "$3,436.05", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Carver Robertson", + "gender": "male", + "company": "XTH", + "email": "carverrobertson@xth.com", + "phone": "+1 (819) 451-2871", + "address": "687 River Street, Chloride, Vermont, 4583", + "about": "Consequat nulla velit sit pariatur Lorem officia esse id fugiat aliqua dolore. Commodo voluptate est magna consequat labore esse non aliquip enim Lorem aliqua ad. Consectetur occaecat commodo sit enim aute reprehenderit aute dolore mollit. Minim incididunt nostrud duis excepteur laboris. Ad fugiat do sit laborum. Ea laborum reprehenderit do excepteur culpa ipsum dolor sit proident consequat excepteur. Et consectetur commodo proident ut aliquip in ipsum.\r\n", + "registered": "2016-11-05T05:01:40 -06:-30", + "latitude": 20.817123, + "longitude": -138.801192, + "tags": [ + "fugiat", + "ad", + "ipsum", + "dolor", + "sint", + "Lorem", + "ullamco" + ], + "friends": [ + { + "id": 0, + "name": "Fields Contreras" + }, + { + "id": 1, + "name": "Klein Price" + }, + { + "id": 2, + "name": "Waller Conner" + } + ], + "greeting": "Hello, Carver Robertson! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b41e06ae9aa9781fc", + "index": 15, + "guid": "2b809770-22fc-44c3-a893-34b472ac2b30", + "isActive": true, + "balance": "$3,590.55", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Sonia Warner", + "gender": "female", + "company": "MIRACULA", + "email": "soniawarner@miracula.com", + "phone": "+1 (877) 506-3532", + "address": "615 Highland Boulevard, Rockbridge, Iowa, 471", + "about": "Incididunt nisi tempor esse deserunt incididunt laboris. Cillum anim Lorem irure veniam dolore laborum ex est proident esse ullamco id. Magna deserunt anim ad sit irure reprehenderit deserunt laboris.\r\n", + "registered": "2016-12-08T05:22:40 -06:-30", + "latitude": 83.753462, + "longitude": 156.776418, + "tags": [ + "eiusmod", + "deserunt", + "ad", + "quis", + "cillum", + "adipisicing", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Bonita Blair" + }, + { + "id": 1, + "name": "Elvira Bender" + }, + { + "id": 2, + "name": "Jimenez Booth" + } + ], + "greeting": "Hello, Sonia Warner! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bebaba7e507efb45f", + "index": 16, + "guid": "888ad204-ae7c-43d5-9f61-d31f2b02e36a", + "isActive": false, + "balance": "$3,230.62", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Mueller Hopper", + "gender": "male", + "company": "ZAJ", + "email": "muellerhopper@zaj.com", + "phone": "+1 (804) 506-3818", + "address": "669 Nixon Court, Flintville, Virginia, 4478", + "about": "Lorem elit veniam cupidatat commodo excepteur sunt voluptate enim culpa aliquip. Et et esse ipsum esse veniam nulla sunt et laborum reprehenderit ex amet. Duis deserunt labore veniam non sint incididunt est ad tempor cupidatat eiusmod aute eiusmod do. Do Lorem quis officia eu esse aliquip laboris duis sit id reprehenderit labore in.\r\n", + "registered": "2018-04-16T09:09:54 -06:-30", + "latitude": 33.256867, + "longitude": 31.264741, + "tags": [ + "dolore", + "eiusmod", + "ex", + "exercitation", + "esse", + "magna", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Kitty House" + }, + { + "id": 1, + "name": "Hood Cleveland" + }, + { + "id": 2, + "name": "Rios Taylor" + } + ], + "greeting": "Hello, Mueller Hopper! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b39b147cc07190bcc", + "index": 17, + "guid": "2733503e-3ef2-4cb2-a512-6a5217147141", + "isActive": false, + "balance": "$1,498.41", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Moon Crane", + "gender": "male", + "company": "COMCUR", + "email": "mooncrane@comcur.com", + "phone": "+1 (981) 527-2449", + "address": "799 Garden Place, Eagleville, Maine, 943", + "about": "Commodo aliquip enim esse id. Est irure qui veniam anim consequat laboris exercitation eu reprehenderit ut sint exercitation sunt. Irure ex deserunt mollit qui incididunt elit ea. Magna pariatur sit in ullamco esse.\r\n", + "registered": "2015-06-16T04:27:21 -06:-30", + "latitude": -55.544403, + "longitude": -165.853342, + "tags": [ + "officia", + "aliqua", + "deserunt", + "et", + "cupidatat", + "aute", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Karyn Howard" + }, + { + "id": 1, + "name": "Tabatha Hart" + }, + { + "id": 2, + "name": "Kelly Walls" + } + ], + "greeting": "Hello, Moon Crane! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b19367847ff1494ef", + "index": 18, + "guid": "7ca1780c-12cb-4265-a684-589688b5ba1c", + "isActive": true, + "balance": "$2,763.82", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Lelia Howe", + "gender": "female", + "company": "VELITY", + "email": "leliahowe@velity.com", + "phone": "+1 (897) 538-3179", + "address": "496 Bedford Avenue, Leola, Nebraska, 1185", + "about": "Ex elit mollit incididunt occaecat reprehenderit commodo nulla occaecat cupidatat. Ipsum et consectetur irure consectetur amet qui aliquip aliquip nulla elit. Ipsum id et non ea consequat sit excepteur veniam ipsum. Minim reprehenderit dolor sunt sunt ea veniam duis exercitation velit. Mollit Lorem aute officia qui ea laborum voluptate proident quis aliquip laborum laborum.\r\n", + "registered": "2014-04-04T09:36:19 -06:-30", + "latitude": -25.082308, + "longitude": -7.046394, + "tags": [ + "fugiat", + "minim", + "reprehenderit", + "ipsum", + "qui", + "ut", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Sheryl Kerr" + }, + { + "id": 1, + "name": "Bobbie Pacheco" + }, + { + "id": 2, + "name": "Dudley Lyons" + } + ], + "greeting": "Hello, Lelia Howe! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb8f1e2dea508a15f", + "index": 19, + "guid": "c722388e-cf0b-4583-8785-332762d15110", + "isActive": false, + "balance": "$3,499.15", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "brown", + "name": "Knight Carrillo", + "gender": "male", + "company": "DOGNOST", + "email": "knightcarrillo@dognost.com", + "phone": "+1 (937) 584-3188", + "address": "746 Haring Street, Rew, Mississippi, 3223", + "about": "Deserunt adipisicing esse fugiat proident est consequat exercitation fugiat mollit sint. Et commodo eu aute sit tempor nulla aliquip cillum dolore esse ex sit cupidatat nostrud. Deserunt ad occaecat exercitation non aute ullamco voluptate commodo Lorem dolore. Minim dolore minim minim sit ea aliqua. Ipsum eu culpa non non fugiat anim sit aute. Quis ad fugiat eiusmod amet sit ullamco.\r\n", + "registered": "2021-11-08T04:10:22 -06:-30", + "latitude": 33.461108, + "longitude": -47.549984, + "tags": [ + "irure", + "aute", + "eiusmod", + "quis", + "ipsum", + "occaecat", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Compton Huffman" + }, + { + "id": 1, + "name": "Williamson Rich" + }, + { + "id": 2, + "name": "Pugh Grimes" + } + ], + "greeting": "Hello, Knight Carrillo! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b26bb5c17ec8ddd00", + "index": 20, + "guid": "0d33a292-a21f-48df-9cb7-b29e6b875360", + "isActive": true, + "balance": "$2,540.94", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Case Mcgowan", + "gender": "male", + "company": "EVENTAGE", + "email": "casemcgowan@eventage.com", + "phone": "+1 (809) 524-3645", + "address": "536 Landis Court, Cuylerville, Indiana, 1947", + "about": "Ipsum sint ea mollit est eiusmod non ipsum id. Ipsum aute commodo eiusmod eiusmod irure voluptate. Do exercitation duis voluptate duis amet.\r\n", + "registered": "2015-03-05T01:21:59 -06:-30", + "latitude": 37.498988, + "longitude": -120.157698, + "tags": [ + "dolor", + "commodo", + "laborum", + "reprehenderit", + "amet", + "elit", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Edwards Mcknight" + }, + { + "id": 1, + "name": "Karina Terrell" + }, + { + "id": 2, + "name": "Underwood Weeks" + } + ], + "greeting": "Hello, Case Mcgowan! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b655f9ea76a17b85f", + "index": 21, + "guid": "f2889040-82ac-4583-b0fe-60531f9cad19", + "isActive": true, + "balance": "$2,115.73", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Stevenson Gay", + "gender": "male", + "company": "FROSNEX", + "email": "stevensongay@frosnex.com", + "phone": "+1 (852) 455-3703", + "address": "986 Jackson Place, Golconda, Guam, 9547", + "about": "Do aliqua veniam sunt ad. Duis magna veniam consequat labore elit consectetur enim excepteur cupidatat ex culpa sunt minim pariatur. Cupidatat nostrud fugiat laborum id culpa aute reprehenderit laboris. Non reprehenderit aliqua ipsum tempor ipsum dolor dolor. Consequat velit aute non veniam in sit qui ad commodo eu.\r\n", + "registered": "2020-01-10T02:28:15 -06:-30", + "latitude": 84.795211, + "longitude": -94.418547, + "tags": [ + "est", + "reprehenderit", + "proident", + "culpa", + "aliquip", + "culpa", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Waters Quinn" + }, + { + "id": 1, + "name": "Frederick Armstrong" + }, + { + "id": 2, + "name": "Ollie Kirk" + } + ], + "greeting": "Hello, Stevenson Gay! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b48b730b4cbbc481e", + "index": 22, + "guid": "cfdc0cc9-a3d9-4eb6-8de3-1541398ec257", + "isActive": false, + "balance": "$3,829.72", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Lynda Bennett", + "gender": "female", + "company": "REALMO", + "email": "lyndabennett@realmo.com", + "phone": "+1 (978) 414-3468", + "address": "358 Judge Street, Salvo, Kentucky, 5638", + "about": "Labore sit culpa labore laboris ad. Ut ex quis officia sunt occaecat ut amet do dolore velit occaecat velit. Labore ullamco enim ipsum eu velit et reprehenderit cillum culpa. Irure nostrud laboris voluptate magna sint ad magna incididunt duis labore consequat quis ea. Cupidatat velit aute velit nisi incididunt ex eu deserunt.\r\n", + "registered": "2016-08-03T12:03:17 -06:-30", + "latitude": -9.204697, + "longitude": 67.521738, + "tags": [ + "in", + "laboris", + "nostrud", + "proident", + "proident", + "cillum", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Lauri Hawkins" + }, + { + "id": 1, + "name": "Shirley Duran" + }, + { + "id": 2, + "name": "Weber Landry" + } + ], + "greeting": "Hello, Lynda Bennett! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b581f4eb6074caf04", + "index": 23, + "guid": "1ea1e000-20e7-4d41-be63-eb129b7e67c7", + "isActive": true, + "balance": "$3,462.01", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Luisa Christian", + "gender": "female", + "company": "ISOLOGIX", + "email": "luisachristian@isologix.com", + "phone": "+1 (871) 420-3518", + "address": "775 Branton Street, Manila, Puerto Rico, 8387", + "about": "Non elit aliqua laborum id cillum aute esse consectetur qui magna pariatur sit. Cillum ullamco occaecat sunt consequat. Enim commodo dolor esse reprehenderit laboris velit incididunt aliqua. Ipsum cillum eiusmod occaecat anim consequat Lorem nulla officia proident eu qui. Eu ad eu incididunt dolore veniam cupidatat anim ipsum minim consequat ea dolore do duis. Excepteur voluptate deserunt incididunt esse excepteur sunt commodo laborum non laborum officia.\r\n", + "registered": "2017-05-14T11:16:26 -06:-30", + "latitude": -71.990969, + "longitude": 4.677642, + "tags": [ + "minim", + "eu", + "labore", + "enim", + "fugiat", + "nostrud", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Lisa Gallagher" + }, + { + "id": 1, + "name": "Tracy Morin" + }, + { + "id": 2, + "name": "Isabelle Gonzalez" + } + ], + "greeting": "Hello, Luisa Christian! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b0e2fe23b7612c3f3", + "index": 24, + "guid": "d17f0ea0-33d1-4cbb-939b-c0f1e08b2192", + "isActive": false, + "balance": "$3,145.76", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Leigh Cochran", + "gender": "female", + "company": "ECOLIGHT", + "email": "leighcochran@ecolight.com", + "phone": "+1 (975) 417-2460", + "address": "544 Fiske Place, Englevale, North Carolina, 8327", + "about": "Est nulla ipsum nostrud nisi eiusmod ullamco Lorem sunt. Excepteur ullamco occaecat ad excepteur ullamco anim adipisicing Lorem. Voluptate excepteur ea eu culpa id.\r\n", + "registered": "2015-12-09T01:26:44 -06:-30", + "latitude": -53.756932, + "longitude": -129.044373, + "tags": [ + "cillum", + "incididunt", + "enim", + "consequat", + "et", + "magna", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Marci Cooper" + }, + { + "id": 1, + "name": "Tanisha Sutton" + }, + { + "id": 2, + "name": "Stanton Riddle" + } + ], + "greeting": "Hello, Leigh Cochran! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b824c5c3d2891aa4d", + "index": 25, + "guid": "de1cf650-8e74-4f7b-ab8f-5846390f995f", + "isActive": false, + "balance": "$1,841.33", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Jeanne Thomas", + "gender": "female", + "company": "VIOCULAR", + "email": "jeannethomas@viocular.com", + "phone": "+1 (846) 511-3434", + "address": "947 Atkins Avenue, Tooleville, Tennessee, 323", + "about": "Aute in incididunt cillum ullamco. Et ex ut aliqua incididunt pariatur cillum incididunt sint reprehenderit est et. Eiusmod ea nisi consequat esse minim id eu incididunt consequat. Magna culpa sint ea Lorem nulla et est quis duis ullamco amet laboris cupidatat. Ullamco sit mollit in commodo laboris velit consectetur anim.\r\n", + "registered": "2022-03-19T02:55:43 -06:-30", + "latitude": 31.857097, + "longitude": -52.19617, + "tags": [ + "tempor", + "esse", + "aliquip", + "Lorem", + "consequat", + "excepteur", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Pickett Dale" + }, + { + "id": 1, + "name": "Nettie Burris" + }, + { + "id": 2, + "name": "Michele Chase" + } + ], + "greeting": "Hello, Jeanne Thomas! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0c53a1aa32d2c1ab", + "index": 26, + "guid": "f6b5121f-a98d-46b9-a4de-87cded8e024a", + "isActive": false, + "balance": "$2,568.06", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "green", + "name": "Etta Bradshaw", + "gender": "female", + "company": "GEEKNET", + "email": "ettabradshaw@geeknet.com", + "phone": "+1 (921) 492-2289", + "address": "328 Autumn Avenue, Roberts, Arkansas, 4158", + "about": "Elit voluptate ullamco ut eu in ex qui eiusmod. Ullamco quis veniam culpa mollit ut aliquip nostrud occaecat. Nulla eu reprehenderit eu adipisicing ut incididunt dolore eiusmod aute cupidatat deserunt do esse sint. In pariatur id id elit velit velit occaecat Lorem duis ut sunt. Duis nulla qui in velit veniam culpa Lorem et ipsum Lorem irure est id do. Fugiat et non sit consequat nulla consectetur id. Sint tempor pariatur est ullamco ea est deserunt do ipsum consectetur ex.\r\n", + "registered": "2022-06-04T05:56:28 -06:-30", + "latitude": 29.981543, + "longitude": -106.183512, + "tags": [ + "id", + "voluptate", + "non", + "nostrud", + "id", + "eu", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Lyons Little" + }, + { + "id": 1, + "name": "Beulah Bradley" + }, + { + "id": 2, + "name": "Wilkins Allison" + } + ], + "greeting": "Hello, Etta Bradshaw! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bc87b94db85818a42", + "index": 27, + "guid": "567cd9f3-21e9-4177-91ba-cfb709449b5b", + "isActive": false, + "balance": "$3,988.18", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Bush Branch", + "gender": "male", + "company": "VORTEXACO", + "email": "bushbranch@vortexaco.com", + "phone": "+1 (987) 584-2311", + "address": "668 Crescent Street, Glenbrook, Virgin Islands, 7131", + "about": "Ad in ipsum id id. Aliqua ut aute non pariatur do et consectetur. Adipisicing culpa qui et est dolore velit deserunt. Cillum sit ea mollit sunt irure sint voluptate reprehenderit ut adipisicing non ipsum.\r\n", + "registered": "2015-10-31T04:54:08 -06:-30", + "latitude": -58.639, + "longitude": -103.346193, + "tags": [ + "sunt", + "commodo", + "qui", + "pariatur", + "Lorem", + "eiusmod", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Patel Blake" + }, + { + "id": 1, + "name": "Sherri Massey" + }, + { + "id": 2, + "name": "Lancaster Blankenship" + } + ], + "greeting": "Hello, Bush Branch! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b4c49ce1c72b7c24f", + "index": 28, + "guid": "7c554c9e-72e9-42ab-9a8e-11b7e1279c80", + "isActive": false, + "balance": "$2,555.19", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Good Brooks", + "gender": "male", + "company": "ZENSURE", + "email": "goodbrooks@zensure.com", + "phone": "+1 (827) 510-2780", + "address": "701 Marconi Place, Tolu, Oregon, 1690", + "about": "Duis laboris velit mollit sit ea culpa magna anim consequat adipisicing aliqua aute reprehenderit ad. Exercitation dolore dolor Lorem deserunt aute laborum culpa reprehenderit. Nostrud esse excepteur incididunt velit sint quis velit eiusmod. Aliquip culpa anim culpa nulla est. Velit do sint nulla magna aute incididunt aliquip nisi dolor veniam et Lorem tempor reprehenderit. Nulla amet ipsum elit nostrud laborum eiusmod velit minim sunt voluptate ea ut laboris tempor.\r\n", + "registered": "2016-09-26T11:24:23 -06:-30", + "latitude": 15.325138, + "longitude": -18.405977, + "tags": [ + "qui", + "nulla", + "labore", + "dolor", + "laboris", + "deserunt", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Salinas Cooke" + }, + { + "id": 1, + "name": "Cecile Shelton" + }, + { + "id": 2, + "name": "Stacie Jefferson" + } + ], + "greeting": "Hello, Good Brooks! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb95ffc5a9d9a400b", + "index": 29, + "guid": "6d26f62d-1c5a-4369-9c9d-d519326c3da5", + "isActive": false, + "balance": "$2,589.18", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Sharron Downs", + "gender": "female", + "company": "SNIPS", + "email": "sharrondowns@snips.com", + "phone": "+1 (858) 508-3860", + "address": "997 Cornelia Street, Southview, District Of Columbia, 2514", + "about": "Deserunt Lorem excepteur enim tempor cillum dolore anim esse. Elit enim do mollit ullamco incididunt esse ex quis eiusmod sunt eu id excepteur. Aute pariatur cupidatat in sit quis Lorem.\r\n", + "registered": "2020-10-18T04:04:40 -06:-30", + "latitude": 17.483556, + "longitude": 2.541913, + "tags": [ + "ipsum", + "quis", + "dolor", + "voluptate", + "culpa", + "adipisicing", + "laborum" + ], + "friends": [ + { + "id": 0, + "name": "Collins Roy" + }, + { + "id": 1, + "name": "Wilkinson Matthews" + }, + { + "id": 2, + "name": "Katharine Riggs" + } + ], + "greeting": "Hello, Sharron Downs! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b85d7653f2787238e", + "index": 30, + "guid": "50fb5354-6a78-4499-a2d4-22a917d7c306", + "isActive": false, + "balance": "$2,498.97", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Mcfarland Baxter", + "gender": "male", + "company": "COMBOT", + "email": "mcfarlandbaxter@combot.com", + "phone": "+1 (855) 492-3484", + "address": "828 Sandford Street, Savannah, Florida, 4860", + "about": "Veniam incididunt cillum non ad id nulla ea. Do ullamco ex pariatur sunt cillum occaecat fugiat non do irure consequat. Excepteur fugiat laboris ad exercitation voluptate culpa quis deserunt. Sit cupidatat Lorem do non. Non ea quis do dolore laboris dolor ipsum reprehenderit aliqua nostrud ea. Do qui ullamco sunt amet officia nostrud reprehenderit id nulla dolor laborum proident ut.\r\n", + "registered": "2020-05-06T06:35:32 -06:-30", + "latitude": -26.206898, + "longitude": -63.521805, + "tags": [ + "irure", + "fugiat", + "aliqua", + "irure", + "adipisicing", + "ipsum", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Janna Chapman" + }, + { + "id": 1, + "name": "Larson Lindsay" + }, + { + "id": 2, + "name": "Felicia Small" + } + ], + "greeting": "Hello, Mcfarland Baxter! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3ed4042be762f1dc", + "index": 31, + "guid": "41aa5096-9ad5-4618-ba1c-6dddc0c19dcd", + "isActive": true, + "balance": "$2,291.49", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Joyner Kline", + "gender": "male", + "company": "EMOLTRA", + "email": "joynerkline@emoltra.com", + "phone": "+1 (939) 527-2963", + "address": "714 Delmonico Place, Cade, Washington, 5618", + "about": "Irure consequat ea Lorem irure anim proident labore commodo. Esse dolore ex aute laboris mollit velit labore eu sit magna tempor aliquip reprehenderit deserunt. Fugiat ad aliquip consectetur aliqua exercitation.\r\n", + "registered": "2015-07-04T01:18:38 -06:-30", + "latitude": 79.90948, + "longitude": -4.642726, + "tags": [ + "qui", + "deserunt", + "qui", + "labore", + "tempor", + "deserunt", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Robyn Stout" + }, + { + "id": 1, + "name": "Hurst Soto" + }, + { + "id": 2, + "name": "Guy Osborn" + } + ], + "greeting": "Hello, Joyner Kline! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b0923fed831396b87", + "index": 32, + "guid": "db2c0bf2-da5f-4e33-835f-ec579dfe9520", + "isActive": true, + "balance": "$1,836.06", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Lester White", + "gender": "male", + "company": "PORTICO", + "email": "lesterwhite@portico.com", + "phone": "+1 (832) 523-3866", + "address": "729 Kane Street, Longoria, Montana, 1272", + "about": "Laborum eiusmod culpa enim et anim nisi amet labore consequat nulla est nulla excepteur. Nostrud nisi magna nisi ad enim aute. Adipisicing fugiat do consequat aliquip. Sint deserunt minim nisi consectetur aliqua incididunt tempor do id. Aute ad esse exercitation nostrud non ipsum consectetur aute. Voluptate minim deserunt est qui sint ea dolor in et tempor occaecat dolor.\r\n", + "registered": "2014-06-23T01:50:39 -06:-30", + "latitude": 30.624387, + "longitude": 122.292614, + "tags": [ + "irure", + "nostrud", + "aute", + "elit", + "irure", + "nulla", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Amy Winters" + }, + { + "id": 1, + "name": "Belinda Colon" + }, + { + "id": 2, + "name": "Sheila Good" + } + ], + "greeting": "Hello, Lester White! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bbadb62d2ce47ca13", + "index": 33, + "guid": "63fba9c2-0198-4d36-bc87-81be57de0a76", + "isActive": false, + "balance": "$2,831.54", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Mcintosh Jarvis", + "gender": "male", + "company": "ENVIRE", + "email": "mcintoshjarvis@envire.com", + "phone": "+1 (817) 581-3021", + "address": "590 Calyer Street, Yettem, Hawaii, 7776", + "about": "Dolore ex dolore anim ex velit. Elit consequat sint anim velit proident deserunt excepteur. Aute anim dolor consequat ut nulla irure aliqua. Irure proident id adipisicing commodo ut. Lorem qui amet ullamco id minim Lorem fugiat occaecat et exercitation aliquip cillum anim et. Voluptate nisi culpa commodo aute amet pariatur deserunt cillum. Id pariatur irure enim nulla esse sit labore cillum exercitation consectetur ex consectetur nisi culpa.\r\n", + "registered": "2020-07-16T05:30:46 -06:-30", + "latitude": 25.919285, + "longitude": -160.561921, + "tags": [ + "ea", + "excepteur", + "exercitation", + "laborum", + "deserunt", + "dolor", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Warner Bright" + }, + { + "id": 1, + "name": "Leila Conley" + }, + { + "id": 2, + "name": "Sawyer Lewis" + } + ], + "greeting": "Hello, Mcintosh Jarvis! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3045da10511460d4", + "index": 34, + "guid": "d23884cb-9191-472e-b1f2-48ce02b5be79", + "isActive": false, + "balance": "$3,793.59", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "green", + "name": "Anna French", + "gender": "female", + "company": "QUINTITY", + "email": "annafrench@quintity.com", + "phone": "+1 (856) 484-3922", + "address": "565 Norman Avenue, Woodlands, Michigan, 2915", + "about": "Labore pariatur minim consequat commodo occaecat sunt eu pariatur dolore minim sint velit amet consectetur. Laborum cupidatat anim elit duis sunt occaecat irure Lorem officia incididunt qui ut. Id consectetur dolore proident culpa Lorem magna exercitation nisi reprehenderit esse aute. Proident id veniam quis in sunt nostrud duis proident minim dolore. Eu labore commodo nulla amet consequat sunt ex Lorem voluptate. Minim exercitation sunt mollit ad do do eu ex. Excepteur sint elit ex labore.\r\n", + "registered": "2017-09-04T06:29:57 -06:-30", + "latitude": -36.165862, + "longitude": 28.596927, + "tags": [ + "nulla", + "quis", + "minim", + "irure", + "cillum", + "ullamco", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Vilma Harris" + }, + { + "id": 1, + "name": "Perkins Woodard" + }, + { + "id": 2, + "name": "Stewart Glenn" + } + ], + "greeting": "Hello, Anna French! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b51a4666139c1a11d", + "index": 35, + "guid": "a74d00e8-7bdf-4fa2-8783-9d20aee69083", + "isActive": true, + "balance": "$1,441.54", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Araceli Fuentes", + "gender": "female", + "company": "ENQUILITY", + "email": "aracelifuentes@enquility.com", + "phone": "+1 (884) 585-2706", + "address": "290 Herkimer Place, Maplewood, Maryland, 4835", + "about": "Irure consequat nulla nostrud incididunt nostrud anim exercitation pariatur dolore irure consectetur ipsum et et. Nostrud tempor veniam voluptate sunt deserunt consectetur. Minim anim sit sit labore. Excepteur id deserunt ad Lorem amet quis irure reprehenderit velit do deserunt tempor consectetur. Excepteur nostrud deserunt velit pariatur. In duis et consequat duis.\r\n", + "registered": "2018-08-10T12:25:05 -06:-30", + "latitude": 78.411466, + "longitude": -170.825111, + "tags": [ + "anim", + "nulla", + "culpa", + "irure", + "cillum", + "consequat", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Merle Hill" + }, + { + "id": 1, + "name": "Dorsey Conway" + }, + { + "id": 2, + "name": "Terry Thompson" + } + ], + "greeting": "Hello, Araceli Fuentes! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bd0e74b3f4c67aafc", + "index": 36, + "guid": "658d3be4-797a-46d5-93bc-a3d34a5bd2ac", + "isActive": true, + "balance": "$1,474.78", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Davidson Reed", + "gender": "male", + "company": "DRAGBOT", + "email": "davidsonreed@dragbot.com", + "phone": "+1 (881) 405-3382", + "address": "954 Union Avenue, Riceville, American Samoa, 2316", + "about": "Minim dolore excepteur deserunt pariatur ullamco Lorem dolore incididunt. Velit nostrud id reprehenderit ea excepteur minim ut tempor dolor in. Consectetur voluptate elit tempor excepteur adipisicing deserunt id cillum. Minim ipsum aute veniam excepteur nostrud. Ex adipisicing commodo eiusmod deserunt laborum fugiat.\r\n", + "registered": "2017-10-21T02:49:54 -06:-30", + "latitude": -40.01866, + "longitude": -57.986635, + "tags": [ + "tempor", + "laborum", + "voluptate", + "in", + "officia", + "nulla", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Bertha Nielsen" + }, + { + "id": 1, + "name": "Callahan Delgado" + }, + { + "id": 2, + "name": "Susanne Greene" + } + ], + "greeting": "Hello, Davidson Reed! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b70fc726b20c7f849", + "index": 37, + "guid": "b438aa34-7a91-4fb4-b29b-8c3195e5fa1e", + "isActive": true, + "balance": "$2,510.00", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Elba Padilla", + "gender": "female", + "company": "COMTRAK", + "email": "elbapadilla@comtrak.com", + "phone": "+1 (902) 582-2685", + "address": "973 Clark Street, Nettie, Illinois, 9848", + "about": "Ea id elit in nisi ea dolore aliquip sunt ex. Commodo pariatur deserunt non deserunt incididunt velit laboris tempor Lorem. Officia culpa nostrud et voluptate consequat. Mollit pariatur laboris deserunt consequat. Irure laboris sunt nisi qui sint veniam duis tempor in enim culpa qui. Reprehenderit aute anim in ullamco cupidatat est et fugiat consectetur esse esse.\r\n", + "registered": "2019-12-14T10:47:08 -06:-30", + "latitude": -22.947915, + "longitude": -164.792779, + "tags": [ + "est", + "mollit", + "commodo", + "eiusmod", + "voluptate", + "in", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Leblanc Chang" + }, + { + "id": 1, + "name": "Cheri Hurley" + }, + { + "id": 2, + "name": "Boyle Malone" + } + ], + "greeting": "Hello, Elba Padilla! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bc3081f4c3c5bc68d", + "index": 38, + "guid": "08e4a576-3a62-446b-b4a2-93fd336d1f33", + "isActive": true, + "balance": "$3,962.27", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Cecilia Steele", + "gender": "female", + "company": "FLEXIGEN", + "email": "ceciliasteele@flexigen.com", + "phone": "+1 (858) 535-3831", + "address": "331 Church Lane, Kempton, Missouri, 4904", + "about": "Nostrud minim eiusmod deserunt laborum nulla. Nostrud nisi laborum adipisicing mollit. Ullamco et ea deserunt occaecat tempor. Magna sit anim irure laboris aliqua exercitation labore. Est eiusmod laborum sunt aliquip tempor ex officia est sunt ipsum proident qui ea. Ullamco mollit officia ut id sint. Officia anim dolor sint consequat adipisicing consectetur duis voluptate occaecat aute nulla cillum.\r\n", + "registered": "2017-05-13T11:38:59 -06:-30", + "latitude": -37.578303, + "longitude": 61.403511, + "tags": [ + "quis", + "eu", + "consequat", + "eiusmod", + "sint", + "pariatur", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Claudette Carlson" + }, + { + "id": 1, + "name": "Tami Snider" + }, + { + "id": 2, + "name": "Cindy Obrien" + } + ], + "greeting": "Hello, Cecilia Steele! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b29b1bdc8641d5d29", + "index": 39, + "guid": "cfd10cb6-f690-439d-ab95-9f4d9b4c95f2", + "isActive": true, + "balance": "$3,996.49", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Barnes Richards", + "gender": "male", + "company": "QUALITERN", + "email": "barnesrichards@qualitern.com", + "phone": "+1 (982) 446-2321", + "address": "895 Olive Street, Inkerman, Idaho, 259", + "about": "In laborum do fugiat qui elit veniam. Eiusmod laboris nostrud laborum adipisicing aute. Adipisicing commodo culpa amet occaecat quis fugiat officia pariatur aliqua deserunt nisi ullamco sint cillum. Ad elit ea cillum voluptate est tempor fugiat.\r\n", + "registered": "2021-08-22T12:49:06 -06:-30", + "latitude": 58.708759, + "longitude": -63.558425, + "tags": [ + "commodo", + "ex", + "adipisicing", + "irure", + "excepteur", + "et", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Jennie Rojas" + }, + { + "id": 1, + "name": "Montgomery Pena" + }, + { + "id": 2, + "name": "Marie Kim" + } + ], + "greeting": "Hello, Barnes Richards! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b8247b0f9b2031d6d", + "index": 40, + "guid": "49e23448-29d5-432c-9c44-0b38af10b09f", + "isActive": true, + "balance": "$1,079.34", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "green", + "name": "Martina Waters", + "gender": "female", + "company": "SHOPABOUT", + "email": "martinawaters@shopabout.com", + "phone": "+1 (891) 516-3219", + "address": "965 Anchorage Place, Matthews, South Carolina, 8111", + "about": "Ut voluptate pariatur dolore aute ullamco sunt ullamco labore quis adipisicing officia irure laborum. Deserunt nulla id eiusmod laborum do est eiusmod culpa do. Ad ut nulla mollit labore non pariatur fugiat. Incididunt cillum consectetur exercitation culpa nisi proident. Non labore pariatur sit cupidatat nostrud cupidatat mollit.\r\n", + "registered": "2022-08-29T03:50:07 -06:-30", + "latitude": -67.707555, + "longitude": -178.651134, + "tags": [ + "minim", + "qui", + "id", + "enim", + "tempor", + "mollit", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Ladonna Tran" + }, + { + "id": 1, + "name": "Frost Reyes" + }, + { + "id": 2, + "name": "Brock Rutledge" + } + ], + "greeting": "Hello, Martina Waters! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd6058ee4e132feaf", + "index": 41, + "guid": "3597967c-8416-4a94-9ffb-540a971a8997", + "isActive": false, + "balance": "$1,243.44", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "blue", + "name": "Espinoza Dunn", + "gender": "male", + "company": "LETPRO", + "email": "espinozadunn@letpro.com", + "phone": "+1 (808) 503-2938", + "address": "146 Louisa Street, Centerville, Colorado, 3106", + "about": "Cillum deserunt in enim sit ipsum. Ad ullamco eu occaecat Lorem officia irure sunt Lorem non dolore laborum. Minim aute consequat ut aliquip.\r\n", + "registered": "2014-09-04T07:19:53 -06:-30", + "latitude": 56.269222, + "longitude": 13.610313, + "tags": [ + "enim", + "consequat", + "labore", + "aliqua", + "officia", + "occaecat", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Sutton Huff" + }, + { + "id": 1, + "name": "Doyle Luna" + }, + { + "id": 2, + "name": "Salazar Farley" + } + ], + "greeting": "Hello, Espinoza Dunn! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcd252fb1e4b20c43", + "index": 42, + "guid": "04756133-ae29-4984-9aa1-ef8dfa0573c3", + "isActive": true, + "balance": "$2,383.23", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Marta Huber", + "gender": "female", + "company": "PARLEYNET", + "email": "martahuber@parleynet.com", + "phone": "+1 (932) 509-3213", + "address": "515 Vernon Avenue, Blairstown, New Hampshire, 5358", + "about": "Officia irure ipsum nulla fugiat irure ad dolor adipisicing nulla ad. Cillum sit duis ad consequat labore non cupidatat duis sint excepteur consectetur duis. Commodo culpa magna est laboris magna qui duis eiusmod. Voluptate ullamco dolore sit culpa esse cillum nisi nisi quis sunt. Deserunt consectetur et fugiat eiusmod pariatur mollit sunt mollit laborum. Cillum adipisicing ad esse sit occaecat fugiat irure sint eu fugiat nisi aliquip. Elit ullamco eiusmod voluptate anim.\r\n", + "registered": "2014-12-09T03:09:09 -06:-30", + "latitude": 67.533387, + "longitude": -164.116649, + "tags": [ + "amet", + "elit", + "dolor", + "voluptate", + "anim", + "aute", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Slater Stevens" + }, + { + "id": 1, + "name": "Claudine Clay" + }, + { + "id": 2, + "name": "Phoebe Hughes" + } + ], + "greeting": "Hello, Marta Huber! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf32d2e481fb5f191", + "index": 43, + "guid": "e3350b34-2bf2-4bae-996e-94f61fa414b0", + "isActive": true, + "balance": "$3,396.41", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Carmella Carver", + "gender": "female", + "company": "ELEMANTRA", + "email": "carmellacarver@elemantra.com", + "phone": "+1 (846) 431-2240", + "address": "316 Provost Street, Aguila, Minnesota, 9376", + "about": "Deserunt dolor est duis qui nulla elit pariatur voluptate commodo. Laborum qui nulla ea velit occaecat est consectetur ullamco in occaecat. Amet ut anim occaecat ea non enim laborum fugiat occaecat.\r\n", + "registered": "2014-03-29T10:33:46 -06:-30", + "latitude": -12.677283, + "longitude": -47.250558, + "tags": [ + "ex", + "fugiat", + "officia", + "reprehenderit", + "amet", + "do", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "April Guzman" + }, + { + "id": 1, + "name": "Roach Browning" + }, + { + "id": 2, + "name": "Guthrie Nixon" + } + ], + "greeting": "Hello, Carmella Carver! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b12cbc90ec8138d7e", + "index": 44, + "guid": "423d394f-0a14-4396-ae34-05f49a644c3b", + "isActive": false, + "balance": "$3,738.98", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Quinn Mcdaniel", + "gender": "male", + "company": "ENTROFLEX", + "email": "quinnmcdaniel@entroflex.com", + "phone": "+1 (868) 476-3813", + "address": "313 School Lane, Southmont, Utah, 3777", + "about": "Laboris nulla magna excepteur velit anim velit ad velit et esse sint. Ipsum occaecat non exercitation dolore qui qui velit. Lorem ea eiusmod aliquip magna labore cillum ut magna nulla et dolore voluptate et. Incididunt incididunt magna nostrud cillum sit exercitation nostrud qui. Sint proident Lorem magna non magna voluptate mollit ut anim.\r\n", + "registered": "2014-10-16T12:43:25 -06:-30", + "latitude": 88.967585, + "longitude": 46.497285, + "tags": [ + "ea", + "laboris", + "duis", + "minim", + "nulla", + "magna", + "ipsum" + ], + "friends": [ + { + "id": 0, + "name": "Cox Young" + }, + { + "id": 1, + "name": "Corine Miles" + }, + { + "id": 2, + "name": "Brewer Blackwell" + } + ], + "greeting": "Hello, Quinn Mcdaniel! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1e83671dbf71d538", + "index": 45, + "guid": "58053c1c-7d3e-4a89-a5c2-b295a6750b8b", + "isActive": false, + "balance": "$3,355.18", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Simmons Hamilton", + "gender": "male", + "company": "BITREX", + "email": "simmonshamilton@bitrex.com", + "phone": "+1 (943) 432-2418", + "address": "557 Highland Avenue, Dupuyer, South Dakota, 1515", + "about": "Magna velit labore eu reprehenderit dolor magna amet esse. Lorem ad commodo ad labore Lorem amet ea proident ut pariatur. Cillum amet in reprehenderit dolor non enim in nostrud. Voluptate pariatur voluptate nisi consectetur sit esse occaecat magna.\r\n", + "registered": "2022-08-13T09:12:27 -06:-30", + "latitude": -41.924385, + "longitude": 42.716179, + "tags": [ + "ex", + "aute", + "aliquip", + "amet", + "aliquip", + "velit", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Terrie Meyer" + }, + { + "id": 1, + "name": "Middleton Church" + }, + { + "id": 2, + "name": "Roth Mcclure" + } + ], + "greeting": "Hello, Simmons Hamilton! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5284acb0ee916fb8", + "index": 46, + "guid": "56f2acb8-e172-4bab-8a64-02b8a5221a56", + "isActive": false, + "balance": "$3,584.87", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Puckett Spears", + "gender": "male", + "company": "ARTIQ", + "email": "puckettspears@artiq.com", + "phone": "+1 (861) 532-3908", + "address": "361 Post Court, Durham, Arizona, 3894", + "about": "Ex est dolore minim amet qui sit esse eiusmod non fugiat excepteur labore fugiat. Cillum veniam nostrud reprehenderit sint dolor laboris elit minim ullamco quis nisi cillum. Incididunt nulla irure proident esse. Labore non labore occaecat deserunt dolore cillum dolor fugiat ipsum anim. Sint occaecat proident sint est sit occaecat minim nisi mollit exercitation velit eu. Minim nisi irure et commodo elit id deserunt anim consectetur id aliqua. Pariatur irure aliqua ex officia.\r\n", + "registered": "2016-05-08T11:34:12 -06:-30", + "latitude": -18.021937, + "longitude": 54.146913, + "tags": [ + "ad", + "officia", + "amet", + "commodo", + "sunt", + "culpa", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Lorie Spencer" + }, + { + "id": 1, + "name": "King Goodwin" + }, + { + "id": 2, + "name": "Elisa Neal" + } + ], + "greeting": "Hello, Puckett Spears! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bc75ca6b2c9f2b102", + "index": 47, + "guid": "552e50cb-05f2-49a0-8117-bb8a747cc4b2", + "isActive": false, + "balance": "$3,924.07", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Corina Nichols", + "gender": "female", + "company": "CHILLIUM", + "email": "corinanichols@chillium.com", + "phone": "+1 (938) 540-2421", + "address": "465 Bevy Court, Herald, Marshall Islands, 1260", + "about": "Cillum magna fugiat aliqua enim amet. Officia qui sunt reprehenderit dolore qui. Occaecat non ex excepteur ea ipsum adipisicing nisi sunt deserunt irure nostrud. Sit proident ad nostrud dolore. Et ullamco sit cupidatat aliqua eu proident sit ut.\r\n", + "registered": "2020-09-09T10:49:18 -06:-30", + "latitude": 14.324555, + "longitude": 107.922118, + "tags": [ + "incididunt", + "cillum", + "consectetur", + "reprehenderit", + "nisi", + "duis", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Avery Smith" + }, + { + "id": 1, + "name": "Boyer Lambert" + }, + { + "id": 2, + "name": "Teresa Cortez" + } + ], + "greeting": "Hello, Corina Nichols! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b9b04f32fa90752db", + "index": 48, + "guid": "b81437a8-1a59-4b2f-ba28-fc925649e540", + "isActive": false, + "balance": "$1,504.05", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Mayra Haley", + "gender": "female", + "company": "MEDESIGN", + "email": "mayrahaley@medesign.com", + "phone": "+1 (933) 513-3522", + "address": "151 Schenck Avenue, Newry, Ohio, 3444", + "about": "Laboris ea dolor incididunt ut cupidatat non nulla eu velit sint ullamco velit ipsum magna. Cupidatat duis sint nulla fugiat aute velit sit anim ipsum et irure. Veniam cillum mollit fugiat occaecat velit. Anim duis in adipisicing aliqua mollit nostrud velit adipisicing sit duis reprehenderit ut.\r\n", + "registered": "2022-02-04T09:22:31 -06:-30", + "latitude": -19.433024, + "longitude": 120.942537, + "tags": [ + "fugiat", + "exercitation", + "cupidatat", + "culpa", + "velit", + "in", + "enim" + ], + "friends": [ + { + "id": 0, + "name": "Adrienne Valencia" + }, + { + "id": 1, + "name": "Ruby Cohen" + }, + { + "id": 2, + "name": "Imogene Atkinson" + } + ], + "greeting": "Hello, Mayra Haley! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b56679f4ee4a91d55", + "index": 49, + "guid": "fb42f586-5f33-4a85-bca0-8d007626b03e", + "isActive": true, + "balance": "$3,548.04", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Marquita Velasquez", + "gender": "female", + "company": "SAVVY", + "email": "marquitavelasquez@savvy.com", + "phone": "+1 (959) 599-2120", + "address": "981 Gelston Avenue, Jackpot, Alabama, 6833", + "about": "Ad consectetur deserunt laborum esse. Dolore ipsum occaecat do pariatur sit non adipisicing sint duis labore ipsum mollit sunt. Labore mollit duis ex occaecat laborum reprehenderit velit nulla non voluptate veniam. Duis excepteur proident laboris fugiat. Laboris eu irure consequat dolore ex cillum commodo in enim aliqua laborum esse exercitation eu.\r\n", + "registered": "2021-01-05T06:04:29 -06:-30", + "latitude": -41.068786, + "longitude": -98.425755, + "tags": [ + "fugiat", + "labore", + "nisi", + "anim", + "quis", + "elit", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Phyllis Hardy" + }, + { + "id": 1, + "name": "Gaines Hubbard" + }, + { + "id": 2, + "name": "Jenkins Vaughan" + } + ], + "greeting": "Hello, Marquita Velasquez! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b622957bd157d494e", + "index": 50, + "guid": "ffb4fb67-de5e-42ea-9a32-d1450bf986e6", + "isActive": true, + "balance": "$3,787.66", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Dena Walters", + "gender": "female", + "company": "NORSUL", + "email": "denawalters@norsul.com", + "phone": "+1 (925) 520-2689", + "address": "754 Rockaway Avenue, Williston, Georgia, 1970", + "about": "Sit irure irure ipsum esse qui. Velit adipisicing nulla aliquip officia ipsum. Eu ex consequat minim irure aliquip consectetur ullamco anim dolor. Esse deserunt duis enim occaecat officia minim exercitation irure est laborum nulla fugiat fugiat est. Et do exercitation do nulla ut. Culpa incididunt non non cillum id occaecat in fugiat mollit. Velit pariatur laboris consectetur eu duis incididunt incididunt dolor amet elit quis.\r\n", + "registered": "2014-07-13T03:00:44 -06:-30", + "latitude": 57.083288, + "longitude": 95.521837, + "tags": [ + "deserunt", + "eu", + "duis", + "nulla", + "dolor", + "ut", + "nostrud" + ], + "friends": [ + { + "id": 0, + "name": "Liliana Mayo" + }, + { + "id": 1, + "name": "Nichole Ellison" + }, + { + "id": 2, + "name": "Munoz Cain" + } + ], + "greeting": "Hello, Dena Walters! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b44d834e4bc590ef8", + "index": 51, + "guid": "997e1b15-d11a-4240-8b11-3ab114bdcbbc", + "isActive": false, + "balance": "$1,799.75", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "Joann Christensen", + "gender": "female", + "company": "HARMONEY", + "email": "joannchristensen@harmoney.com", + "phone": "+1 (911) 526-3508", + "address": "188 Allen Avenue, Cartwright, California, 2021", + "about": "Labore tempor ullamco non deserunt laboris nulla sunt reprehenderit. Irure consequat voluptate aliqua fugiat commodo do amet fugiat consectetur minim ex laboris nisi tempor. Amet ea ea culpa enim reprehenderit cupidatat do. Qui dolore velit nulla et sunt cupidatat pariatur non velit duis. Excepteur labore cupidatat qui velit sunt dolore. Labore ipsum non cillum mollit ipsum est ullamco aliqua nulla fugiat velit excepteur. Velit sit ad exercitation eiusmod fugiat dolore consequat eu est cupidatat.\r\n", + "registered": "2016-07-15T04:11:15 -06:-30", + "latitude": 45.243152, + "longitude": -168.689941, + "tags": [ + "proident", + "excepteur", + "eu", + "non", + "nulla", + "nisi", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Bettye Bryant" + }, + { + "id": 1, + "name": "Lara Garrison" + }, + { + "id": 2, + "name": "Deann Velez" + } + ], + "greeting": "Hello, Joann Christensen! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcd410cab9d0e648d", + "index": 52, + "guid": "1f98c763-23ec-4f31-a82d-d27b30819534", + "isActive": true, + "balance": "$3,483.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Sharp Mejia", + "gender": "male", + "company": "SPLINX", + "email": "sharpmejia@splinx.com", + "phone": "+1 (925) 494-3490", + "address": "825 Tapscott Avenue, Terlingua, Northern Mariana Islands, 5101", + "about": "Irure consequat quis irure magna et nulla occaecat ad voluptate reprehenderit. Exercitation culpa incididunt mollit ipsum aliquip est fugiat ex laborum anim. Esse veniam ad sunt eiusmod eu consectetur voluptate veniam cupidatat aute nisi. Ipsum tempor deserunt et eu culpa eu duis. Lorem aliquip sint exercitation dolore pariatur ipsum laborum esse proident quis eiusmod proident culpa nisi. Ut fugiat Lorem ad ex dolore tempor commodo dolore qui. Aliqua aliquip culpa adipisicing proident pariatur ipsum consequat proident qui qui in esse.\r\n", + "registered": "2018-03-03T04:45:51 -06:-30", + "latitude": -42.196655, + "longitude": 68.752722, + "tags": [ + "quis", + "qui", + "minim", + "enim", + "officia", + "in", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Fanny Alexander" + }, + { + "id": 1, + "name": "Wright Flowers" + }, + { + "id": 2, + "name": "Le Mcintosh" + } + ], + "greeting": "Hello, Sharp Mejia! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4c8925501d9a76ce", + "index": 53, + "guid": "4bb4522c-5e45-477f-a24c-d802d4cc228c", + "isActive": true, + "balance": "$1,785.24", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Shelby Acosta", + "gender": "female", + "company": "INSURITY", + "email": "shelbyacosta@insurity.com", + "phone": "+1 (847) 494-2798", + "address": "541 Oxford Street, Evergreen, Kansas, 9161", + "about": "Eiusmod ad eu id cupidatat commodo incididunt non deserunt proident voluptate mollit ut elit est. Fugiat anim laboris ea ad commodo sint tempor proident eu voluptate ad ullamco. Nostrud aliqua exercitation labore laborum minim minim id irure. Esse eu et qui non exercitation sit ad mollit in. Ex nulla ad exercitation occaecat dolor velit dolore aliquip ut voluptate ullamco. Id elit excepteur occaecat sit sunt sit deserunt duis excepteur ea dolore.\r\n", + "registered": "2020-08-10T10:52:20 -06:-30", + "latitude": -84.378509, + "longitude": -159.174996, + "tags": [ + "occaecat", + "voluptate", + "consequat", + "eiusmod", + "minim", + "nisi", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Willis Battle" + }, + { + "id": 1, + "name": "Riggs Daugherty" + }, + { + "id": 2, + "name": "Copeland Salinas" + } + ], + "greeting": "Hello, Shelby Acosta! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0f5be85ff1e7a8ab", + "index": 54, + "guid": "65fdceb7-969b-4f66-ac38-0e85d7d2571e", + "isActive": false, + "balance": "$2,590.80", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Deana Gamble", + "gender": "female", + "company": "GUSHKOOL", + "email": "deanagamble@gushkool.com", + "phone": "+1 (927) 599-3793", + "address": "903 Bragg Street, Valle, North Dakota, 527", + "about": "Duis dolore aute proident consequat aute velit esse cupidatat fugiat voluptate nulla ut ad anim. Officia tempor et aliqua Lorem. Consequat esse laborum consectetur non. Sunt excepteur qui cillum Lorem ex excepteur est anim sint.\r\n", + "registered": "2021-04-04T05:24:49 -06:-30", + "latitude": 75.105091, + "longitude": -41.656537, + "tags": [ + "enim", + "reprehenderit", + "aliqua", + "quis", + "ea", + "dolor", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Summers Carr" + }, + { + "id": 1, + "name": "Ball Conrad" + }, + { + "id": 2, + "name": "Dona Macdonald" + } + ], + "greeting": "Hello, Deana Gamble! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b32244bf04b771f30", + "index": 55, + "guid": "f8d8ea35-d451-4874-bcee-85868acc4a6e", + "isActive": true, + "balance": "$2,365.99", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Bobbi Combs", + "gender": "female", + "company": "CONFRENZY", + "email": "bobbicombs@confrenzy.com", + "phone": "+1 (965) 502-3575", + "address": "985 Dank Court, Naomi, New York, 6184", + "about": "Culpa ea eiusmod incididunt amet tempor magna. Duis velit mollit non amet laboris dolor deserunt deserunt. Est id exercitation incididunt anim nostrud qui. Voluptate voluptate adipisicing aute qui fugiat qui cupidatat non laborum quis in incididunt. Amet esse laboris exercitation nisi velit ad exercitation deserunt. Ex irure proident ad elit veniam culpa ullamco aliqua. Consectetur et anim laborum occaecat cupidatat eiusmod.\r\n", + "registered": "2022-08-28T07:22:17 -06:-30", + "latitude": -23.765704, + "longitude": -7.275231, + "tags": [ + "ut", + "Lorem", + "reprehenderit", + "proident", + "pariatur", + "eu", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Juana Moody" + }, + { + "id": 1, + "name": "Kathleen Dalton" + }, + { + "id": 2, + "name": "Melba Sloan" + } + ], + "greeting": "Hello, Bobbi Combs! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1116844792798d33", + "index": 56, + "guid": "40d24855-d04c-487d-ba0d-056b0ab591f1", + "isActive": true, + "balance": "$3,186.81", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Mejia Rose", + "gender": "male", + "company": "AQUAFIRE", + "email": "mejiarose@aquafire.com", + "phone": "+1 (914) 416-3136", + "address": "864 Elliott Place, Northridge, New Jersey, 5944", + "about": "Commodo Lorem magna officia labore irure aliquip pariatur veniam officia qui ullamco. Esse esse ex occaecat aute eiusmod mollit ut velit qui esse non proident. Tempor minim ea amet ex ipsum eiusmod ad consectetur aliquip enim. Commodo officia adipisicing occaecat occaecat eu pariatur deserunt. Culpa irure do nostrud fugiat laboris minim culpa sit ea nulla.\r\n", + "registered": "2015-12-17T06:25:20 -06:-30", + "latitude": 16.406022, + "longitude": 99.706138, + "tags": [ + "id", + "magna", + "consequat", + "occaecat", + "sit", + "laborum", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Ratliff Hendricks" + }, + { + "id": 1, + "name": "Blanche Mckay" + }, + { + "id": 2, + "name": "Amber Beard" + } + ], + "greeting": "Hello, Mejia Rose! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b9ee4349c86ade33d", + "index": 57, + "guid": "f067e0d0-e5ac-423a-ac28-d46e4ad28038", + "isActive": true, + "balance": "$1,240.25", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Francis Crawford", + "gender": "male", + "company": "TURNABOUT", + "email": "franciscrawford@turnabout.com", + "phone": "+1 (831) 504-2711", + "address": "990 Fanchon Place, Echo, Texas, 6988", + "about": "Amet culpa qui minim nisi nisi exercitation pariatur. Amet velit laborum dolore dolor. Cupidatat sint consectetur laboris nisi et laboris et sint cillum officia magna. Duis aliqua aliqua exercitation eiusmod duis nisi in incididunt deserunt commodo sunt excepteur.\r\n", + "registered": "2014-06-23T08:24:46 -06:-30", + "latitude": 4.63859, + "longitude": -1.583364, + "tags": [ + "deserunt", + "velit", + "occaecat", + "voluptate", + "labore", + "laborum", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Laura Edwards" + }, + { + "id": 1, + "name": "Jamie Murphy" + }, + { + "id": 2, + "name": "Phelps Newman" + } + ], + "greeting": "Hello, Francis Crawford! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b90c9e2ca26f660c9", + "index": 58, + "guid": "711e6575-ef25-41ef-8421-584e93842155", + "isActive": false, + "balance": "$3,093.52", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Willa Dudley", + "gender": "female", + "company": "SONGLINES", + "email": "willadudley@songlines.com", + "phone": "+1 (989) 600-2196", + "address": "916 Morgan Avenue, Waiohinu, Massachusetts, 677", + "about": "Ea proident dolor veniam quis non non aliqua nostrud consectetur nulla incididunt non aliqua. Deserunt id ipsum consectetur excepteur cillum ex ullamco fugiat occaecat consequat consequat. Magna fugiat nostrud fugiat qui amet ut aliquip. Aute laborum labore dolore magna sit deserunt dolor nisi consectetur. Est consectetur ut laboris quis enim id veniam aliqua consequat minim ipsum. Ea excepteur quis dolore aliquip sint non laborum sint laborum consequat ea officia. Non aliqua consequat esse aute veniam culpa eu qui cillum.\r\n", + "registered": "2015-01-17T05:07:09 -06:-30", + "latitude": 1.559747, + "longitude": -80.201662, + "tags": [ + "et", + "nulla", + "irure", + "consectetur", + "aute", + "ad", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Casey Patel" + }, + { + "id": 1, + "name": "Ferrell Woods" + }, + { + "id": 2, + "name": "Antoinette Nicholson" + } + ], + "greeting": "Hello, Willa Dudley! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b27c7cee351d55395", + "index": 59, + "guid": "348b8db9-0f38-4528-a8f0-55e3c4511e9d", + "isActive": true, + "balance": "$2,211.41", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Hendricks Wiggins", + "gender": "male", + "company": "MICRONAUT", + "email": "hendrickswiggins@micronaut.com", + "phone": "+1 (891) 433-3512", + "address": "254 Whitty Lane, Lowgap, Palau, 5435", + "about": "Eu laborum incididunt qui laboris. Commodo ea cupidatat adipisicing id et cupidatat culpa consectetur veniam. Sunt in sit Lorem sint qui.\r\n", + "registered": "2014-11-20T09:22:53 -06:-30", + "latitude": -7.306816, + "longitude": -132.641404, + "tags": [ + "veniam", + "quis", + "deserunt", + "ullamco", + "est", + "cillum", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Alvarado Merritt" + }, + { + "id": 1, + "name": "Dillon Owens" + }, + { + "id": 2, + "name": "Garrett Shepherd" + } + ], + "greeting": "Hello, Hendricks Wiggins! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb4aabdac5660ac1f", + "index": 60, + "guid": "d5234a1c-caa5-4c39-86a7-28271a19e807", + "isActive": true, + "balance": "$1,757.07", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "blue", + "name": "Lara Wong", + "gender": "female", + "company": "NAXDIS", + "email": "larawong@naxdis.com", + "phone": "+1 (813) 592-2083", + "address": "904 Rogers Avenue, Ripley, Alaska, 6830", + "about": "Reprehenderit tempor commodo enim consectetur anim laboris officia id. Labore do nulla laboris id velit veniam esse est do sit velit reprehenderit qui. Cillum veniam incididunt ullamco aliquip dolor est nostrud labore anim fugiat ad commodo fugiat. Esse irure ullamco quis adipisicing tempor ad ipsum cupidatat ex anim. Culpa anim incididunt eiusmod sint ullamco cillum. Commodo culpa sit incididunt reprehenderit in et deserunt quis occaecat ad occaecat fugiat.\r\n", + "registered": "2015-08-06T10:19:44 -06:-30", + "latitude": 57.236077, + "longitude": 123.540623, + "tags": [ + "ea", + "eiusmod", + "aliquip", + "velit", + "cupidatat", + "esse", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Britney Sparks" + }, + { + "id": 1, + "name": "Rachel Wynn" + }, + { + "id": 2, + "name": "Goldie Shaffer" + } + ], + "greeting": "Hello, Lara Wong! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b255d3b78009fbae1", + "index": 61, + "guid": "ff8ec544-9a67-4a03-b909-c75d89c05538", + "isActive": false, + "balance": "$3,391.44", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Neva Stanton", + "gender": "female", + "company": "QOT", + "email": "nevastanton@qot.com", + "phone": "+1 (914) 426-2121", + "address": "258 Tehama Street, Cresaptown, Oklahoma, 7285", + "about": "Nostrud magna ipsum duis dolore nulla veniam tempor veniam commodo. Nulla laborum ipsum qui anim nisi Lorem eu deserunt ex. Nulla quis culpa ipsum duis amet ut mollit labore anim aute esse fugiat. Magna enim ullamco aute deserunt esse. Pariatur consectetur culpa labore commodo fugiat. Deserunt qui nulla nulla tempor nostrud veniam voluptate consequat reprehenderit in dolore.\r\n", + "registered": "2018-05-24T07:19:49 -06:-30", + "latitude": 11.676929, + "longitude": -3.912016, + "tags": [ + "ullamco", + "ullamco", + "excepteur", + "sit", + "ad", + "deserunt", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Hunt Hines" + }, + { + "id": 1, + "name": "Hays Rasmussen" + }, + { + "id": 2, + "name": "Lana Hurst" + } + ], + "greeting": "Hello, Neva Stanton! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba574389ad1f63f87", + "index": 62, + "guid": "68b71d45-fbc6-413a-9946-adb946fe599d", + "isActive": false, + "balance": "$3,061.92", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Jackie Torres", + "gender": "female", + "company": "MAGNAFONE", + "email": "jackietorres@magnafone.com", + "phone": "+1 (939) 421-3993", + "address": "894 Llama Court, Jamestown, New Mexico, 9532", + "about": "Sunt Lorem cillum veniam minim id mollit ex excepteur amet cillum sint. Aute proident non ex laboris mollit sint nulla laboris exercitation laboris occaecat non. Duis non ea laborum sint officia dolor anim mollit commodo ut incididunt excepteur proident qui. Sit ea elit nulla esse aute cillum fugiat ullamco. Cillum nulla fugiat eiusmod dolor ipsum velit cupidatat irure occaecat culpa officia.\r\n", + "registered": "2018-11-16T08:17:01 -06:-30", + "latitude": 57.443768, + "longitude": 82.395954, + "tags": [ + "magna", + "culpa", + "adipisicing", + "consectetur", + "do", + "tempor", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Lillian Clements" + }, + { + "id": 1, + "name": "Bradley Vazquez" + }, + { + "id": 2, + "name": "Davenport Gibson" + } + ], + "greeting": "Hello, Jackie Torres! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b69fb41d97fb750e8", + "index": 63, + "guid": "cc2025b1-2ce4-46e0-bce1-c3adde80227b", + "isActive": true, + "balance": "$1,021.52", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Boyd Nieves", + "gender": "male", + "company": "MOLTONIC", + "email": "boydnieves@moltonic.com", + "phone": "+1 (995) 411-3423", + "address": "661 Hubbard Street, Maury, Wyoming, 6014", + "about": "Enim enim magna do laboris adipisicing nulla deserunt nisi reprehenderit id reprehenderit magna. Labore ipsum consectetur cillum do proident mollit do. Laborum adipisicing laborum tempor ut id pariatur esse dolor. Eiusmod velit aliquip magna elit eu ad incididunt est. Ea dolor officia id occaecat.\r\n", + "registered": "2021-04-19T07:11:12 -06:-30", + "latitude": -53.086107, + "longitude": -101.568354, + "tags": [ + "sint", + "non", + "est", + "excepteur", + "elit", + "aliqua", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Celia Valentine" + }, + { + "id": 1, + "name": "Virgie Barlow" + }, + { + "id": 2, + "name": "Deanna Mcleod" + } + ], + "greeting": "Hello, Boyd Nieves! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb683a300334f9c01", + "index": 64, + "guid": "30b38c75-3a52-4de0-a263-7fe18b77eba9", + "isActive": false, + "balance": "$3,916.98", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Hutchinson Cherry", + "gender": "male", + "company": "MEDIFAX", + "email": "hutchinsoncherry@medifax.com", + "phone": "+1 (965) 577-3370", + "address": "743 Harman Street, Munjor, Rhode Island, 3945", + "about": "Culpa commodo quis culpa in cillum do labore id eiusmod reprehenderit non. Laborum ex Lorem esse elit tempor non veniam elit enim minim exercitation. Ad magna adipisicing est enim sunt velit laboris commodo anim. Ut esse nostrud cillum sint labore qui aliquip duis amet labore voluptate sint laborum incididunt. Ullamco irure nostrud sunt tempor nostrud officia voluptate officia. Ut proident occaecat nisi elit velit aliquip duis. Adipisicing officia amet aute sint fugiat voluptate minim esse laboris.\r\n", + "registered": "2021-05-30T09:59:22 -06:-30", + "latitude": -60.497861, + "longitude": -168.538086, + "tags": [ + "exercitation", + "mollit", + "eiusmod", + "fugiat", + "pariatur", + "id", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "June Vega" + }, + { + "id": 1, + "name": "Welch Petty" + }, + { + "id": 2, + "name": "Roman Hendrix" + } + ], + "greeting": "Hello, Hutchinson Cherry! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b96a75f366f9739e3", + "index": 65, + "guid": "13de6382-0a6b-4e19-81de-3aa13202364b", + "isActive": false, + "balance": "$2,219.97", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Vargas Pruitt", + "gender": "male", + "company": "INTERODEO", + "email": "vargaspruitt@interodeo.com", + "phone": "+1 (897) 487-2745", + "address": "206 Grand Avenue, Rivers, West Virginia, 670", + "about": "Eiusmod commodo mollit est tempor aliquip et officia. Ipsum eiusmod esse tempor qui laboris velit voluptate elit. Elit occaecat officia do pariatur est dolore officia. Elit aliquip ex tempor sit ea adipisicing consectetur proident. Incididunt tempor sunt mollit proident reprehenderit irure aute dolore ad cupidatat.\r\n", + "registered": "2016-09-21T05:36:01 -06:-30", + "latitude": 66.610572, + "longitude": 135.534487, + "tags": [ + "voluptate", + "ad", + "cupidatat", + "esse", + "nostrud", + "laborum", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Melva Raymond" + }, + { + "id": 1, + "name": "Simone Foley" + }, + { + "id": 2, + "name": "Hilary Buckley" + } + ], + "greeting": "Hello, Vargas Pruitt! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb7bffdac3fd83b2c", + "index": 66, + "guid": "e031020e-5768-4bb0-9a7e-4eca659eb8f3", + "isActive": true, + "balance": "$3,371.46", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Angelique Graham", + "gender": "female", + "company": "BIOLIVE", + "email": "angeliquegraham@biolive.com", + "phone": "+1 (885) 547-3531", + "address": "465 Kingston Avenue, Movico, Nevada, 5897", + "about": "Commodo sit commodo eu ex sunt ipsum ullamco veniam laborum dolor. Ad aute ut eiusmod nisi reprehenderit veniam do. Tempor irure magna sunt minim nostrud dolore anim ut ex anim. In duis cupidatat elit velit amet nostrud id. Esse nisi excepteur sunt officia do. Adipisicing ipsum duis id id velit magna fugiat.\r\n", + "registered": "2022-07-03T06:21:38 -06:-30", + "latitude": 85.445641, + "longitude": -122.527508, + "tags": [ + "nisi", + "ea", + "nostrud", + "esse", + "sit", + "eiusmod", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Linda Brady" + }, + { + "id": 1, + "name": "Holloway Robbins" + }, + { + "id": 2, + "name": "Hinton Mitchell" + } + ], + "greeting": "Hello, Angelique Graham! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bc6485a1008ddde5e", + "index": 67, + "guid": "545b712c-0952-4344-b05d-9e94f87e289e", + "isActive": true, + "balance": "$3,064.35", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Moss Harrison", + "gender": "male", + "company": "PEARLESEX", + "email": "mossharrison@pearlesex.com", + "phone": "+1 (964) 587-3901", + "address": "828 Lafayette Walk, Chautauqua, Delaware, 5386", + "about": "Aliqua est id ad sit esse aliquip dolor veniam ut commodo velit laborum aliquip. Tempor adipisicing id et ex reprehenderit Lorem exercitation deserunt nulla fugiat irure. Ipsum magna occaecat amet amet ea ea sit officia sunt mollit id fugiat fugiat enim. Consequat non duis deserunt ad sit. Reprehenderit eiusmod qui minim laboris cupidatat id proident laboris anim duis velit esse. Amet esse ullamco anim pariatur velit dolore nisi nostrud proident. Veniam consequat occaecat ad proident.\r\n", + "registered": "2018-09-05T10:09:14 -06:-30", + "latitude": 32.908686, + "longitude": 59.333663, + "tags": [ + "officia", + "non", + "occaecat", + "sit", + "aliquip", + "culpa", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Haley Delaney" + }, + { + "id": 1, + "name": "Fuentes Jacobs" + }, + { + "id": 2, + "name": "Bradshaw Douglas" + } + ], + "greeting": "Hello, Moss Harrison! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1106be51be4abc01", + "index": 68, + "guid": "4bfa9ec6-bed9-445c-8fa1-4067d502ef5c", + "isActive": true, + "balance": "$1,596.54", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "blue", + "name": "Bessie Howell", + "gender": "female", + "company": "NETAGY", + "email": "bessiehowell@netagy.com", + "phone": "+1 (873) 578-3217", + "address": "166 Evergreen Avenue, Independence, Federated States Of Micronesia, 7022", + "about": "Pariatur amet ipsum exercitation laboris voluptate sunt aliqua do officia commodo reprehenderit. In dolor reprehenderit est culpa cillum. In nulla qui cupidatat duis.\r\n", + "registered": "2015-11-14T01:16:49 -06:-30", + "latitude": -83.68502, + "longitude": 154.694831, + "tags": [ + "nisi", + "esse", + "in", + "ex", + "deserunt", + "nulla", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "James Hayes" + }, + { + "id": 1, + "name": "Abby Hogan" + }, + { + "id": 2, + "name": "Nunez Parrish" + } + ], + "greeting": "Hello, Bessie Howell! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b66e9717ee7db1fd7", + "index": 69, + "guid": "c85a9576-f28d-4c54-b0ea-daaebd3022e6", + "isActive": true, + "balance": "$3,879.16", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Patrica Park", + "gender": "female", + "company": "GEEKFARM", + "email": "patricapark@geekfarm.com", + "phone": "+1 (818) 454-3796", + "address": "820 Emerald Street, Vienna, Pennsylvania, 6610", + "about": "In in sint sit ut mollit non fugiat nisi minim. Magna duis nulla eu esse est adipisicing magna. Aliquip ipsum cupidatat cillum ex exercitation labore.\r\n", + "registered": "2020-07-05T02:04:55 -06:-30", + "latitude": -44.698147, + "longitude": -150.377689, + "tags": [ + "ullamco", + "Lorem", + "sunt", + "ipsum", + "id", + "eiusmod", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Townsend Griffith" + }, + { + "id": 1, + "name": "Reeves Williamson" + }, + { + "id": 2, + "name": "Church Frederick" + } + ], + "greeting": "Hello, Patrica Park! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b99a7a0cf7fd01a36", + "index": 70, + "guid": "3aa54350-b18c-4ef0-9d79-c197d5709170", + "isActive": true, + "balance": "$1,806.05", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Valarie Herman", + "gender": "female", + "company": "DARWINIUM", + "email": "valarieherman@darwinium.com", + "phone": "+1 (819) 456-3732", + "address": "555 Scott Avenue, Cetronia, Connecticut, 6539", + "about": "Cupidatat nulla consequat et incididunt. Et dolor laboris id aliquip qui ullamco et fugiat mollit. Eu eu non ipsum nisi non elit Lorem laborum esse commodo reprehenderit. Amet nisi dolore dolor aliqua aliqua anim cupidatat excepteur occaecat exercitation laborum id laboris. Consequat minim Lorem qui do reprehenderit aliquip deserunt fugiat ea qui irure velit id.\r\n", + "registered": "2017-10-21T03:32:27 -06:-30", + "latitude": -82.652206, + "longitude": -80.792422, + "tags": [ + "labore", + "dolor", + "id", + "incididunt", + "excepteur", + "pariatur", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Moreno Hickman" + }, + { + "id": 1, + "name": "Krista Hoover" + }, + { + "id": 2, + "name": "Lucinda Owen" + } + ], + "greeting": "Hello, Valarie Herman! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdd4b2e5b66d4a1f7", + "index": 71, + "guid": "acad3ea5-a534-4fe3-8e0d-3a966a1a6256", + "isActive": true, + "balance": "$1,964.05", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Walters Craft", + "gender": "male", + "company": "MELBACOR", + "email": "walterscraft@melbacor.com", + "phone": "+1 (991) 446-3101", + "address": "292 Wilson Street, Bynum, Louisiana, 1613", + "about": "Amet ullamco irure quis duis irure esse veniam incididunt eu officia culpa. Id occaecat deserunt labore mollit Lorem aliquip occaecat pariatur reprehenderit dolore minim. Nostrud incididunt pariatur consectetur adipisicing velit Lorem quis exercitation laboris ullamco enim enim dolore. Amet veniam qui enim proident ut excepteur duis elit tempor laboris ad. Commodo labore eiusmod culpa dolor ex velit officia laboris eu. Cillum reprehenderit excepteur commodo id eu nisi.\r\n", + "registered": "2018-07-07T09:27:26 -06:-30", + "latitude": -87.145278, + "longitude": -5.832754, + "tags": [ + "exercitation", + "officia", + "ullamco", + "consequat", + "deserunt", + "aute", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Helen Ortega" + }, + { + "id": 1, + "name": "Wells Chan" + }, + { + "id": 2, + "name": "Rochelle Bass" + } + ], + "greeting": "Hello, Walters Craft! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b2d58e7cf82ccb708", + "index": 72, + "guid": "73506eff-96b8-46ba-bb11-4e86607c6240", + "isActive": false, + "balance": "$3,774.91", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Mckay Skinner", + "gender": "male", + "company": "XERONK", + "email": "mckayskinner@xeronk.com", + "phone": "+1 (815) 479-2514", + "address": "972 Atlantic Avenue, Floris, Vermont, 7656", + "about": "Aliqua consectetur cupidatat incididunt culpa minim incididunt ad cillum eu aliqua minim. Eiusmod velit dolor eu anim aliquip reprehenderit. Commodo do id consectetur sint sint ad. Ex occaecat enim aliquip nulla quis. Irure ipsum mollit deserunt in aliqua occaecat laborum reprehenderit aute. Adipisicing dolore cillum pariatur laboris elit dolor quis ea. Esse consectetur culpa aliquip proident.\r\n", + "registered": "2021-06-25T06:56:48 -06:-30", + "latitude": -34.015489, + "longitude": -32.113854, + "tags": [ + "culpa", + "excepteur", + "aliqua", + "est", + "ex", + "eiusmod", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Small Knight" + }, + { + "id": 1, + "name": "Durham Daniels" + }, + { + "id": 2, + "name": "Daphne Johnston" + } + ], + "greeting": "Hello, Mckay Skinner! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1db44eda61967e54", + "index": 73, + "guid": "f11d6d81-cb9e-4cae-a8d4-d208aa6f5945", + "isActive": false, + "balance": "$2,088.36", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "blue", + "name": "Yvette Calderon", + "gender": "female", + "company": "SLAX", + "email": "yvettecalderon@slax.com", + "phone": "+1 (842) 452-3630", + "address": "443 Stratford Road, Steinhatchee, Iowa, 3210", + "about": "Ea proident ad cupidatat amet elit eiusmod nisi duis sunt nostrud non do. Et dolor occaecat voluptate enim deserunt Lorem mollit Lorem est occaecat amet officia et. Ut nisi cupidatat labore mollit consequat voluptate nulla pariatur in incididunt officia in. Sint qui nisi amet eiusmod ad ad pariatur pariatur ut. Deserunt nisi qui mollit irure commodo cillum duis do nulla consectetur cupidatat elit cupidatat aliquip. Commodo ullamco exercitation officia laboris.\r\n", + "registered": "2020-06-01T04:00:27 -06:-30", + "latitude": 25.360169, + "longitude": -24.374867, + "tags": [ + "minim", + "ad", + "irure", + "officia", + "elit", + "ex", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Paul Oneill" + }, + { + "id": 1, + "name": "Sears Moss" + }, + { + "id": 2, + "name": "Kristi Collier" + } + ], + "greeting": "Hello, Yvette Calderon! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b03d85028e09e53ea", + "index": 74, + "guid": "2a17b7da-cecd-41cb-b696-f127410fd249", + "isActive": true, + "balance": "$3,258.69", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Wilder Pugh", + "gender": "male", + "company": "ROOFORIA", + "email": "wilderpugh@rooforia.com", + "phone": "+1 (873) 540-2851", + "address": "519 Goodwin Place, Matheny, Virginia, 1825", + "about": "Voluptate excepteur esse Lorem adipisicing magna magna consectetur non reprehenderit exercitation. Veniam culpa excepteur excepteur fugiat aliquip Lorem est exercitation ad adipisicing pariatur et dolore commodo. Reprehenderit quis sit irure nisi exercitation voluptate enim adipisicing. Quis pariatur eu ex elit nisi sunt. Ipsum amet quis do labore sunt. Dolore commodo commodo voluptate ea commodo voluptate do voluptate voluptate eu eiusmod minim laborum. Non laboris incididunt tempor labore irure excepteur veniam sit anim laborum.\r\n", + "registered": "2018-08-09T04:26:22 -06:-30", + "latitude": 80.369731, + "longitude": 162.492365, + "tags": [ + "ea", + "enim", + "occaecat", + "magna", + "sunt", + "officia", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Kristin English" + }, + { + "id": 1, + "name": "Laverne Bernard" + }, + { + "id": 2, + "name": "Castaneda Harrell" + } + ], + "greeting": "Hello, Wilder Pugh! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5e66a5455327aca9", + "index": 75, + "guid": "56a980c4-07b9-46a8-85d8-b2e2175e7f08", + "isActive": true, + "balance": "$2,135.68", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Kristy Mckee", + "gender": "female", + "company": "KOZGENE", + "email": "kristymckee@kozgene.com", + "phone": "+1 (863) 438-3357", + "address": "135 Ross Street, Spokane, Maine, 9715", + "about": "Sunt exercitation nulla proident consectetur ut ullamco ex sunt commodo. Ullamco aliqua reprehenderit anim consequat nostrud ea laborum fugiat aute fugiat nisi nulla id commodo. Aliquip amet consectetur reprehenderit nisi quis fugiat amet veniam fugiat magna elit pariatur consequat. Ut cillum do occaecat tempor cupidatat in velit ex. Lorem culpa occaecat commodo deserunt officia aliquip ea laborum excepteur adipisicing in sunt. Pariatur incididunt veniam excepteur officia deserunt exercitation cupidatat cillum sit cupidatat nisi nulla exercitation esse.\r\n", + "registered": "2019-06-21T09:08:22 -06:-30", + "latitude": 21.236258, + "longitude": 143.539334, + "tags": [ + "amet", + "anim", + "fugiat", + "consectetur", + "sit", + "magna", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Hobbs Giles" + }, + { + "id": 1, + "name": "Cole Ford" + }, + { + "id": 2, + "name": "Cotton Prince" + } + ], + "greeting": "Hello, Kristy Mckee! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb4203c6db3601117", + "index": 76, + "guid": "f3685137-3f63-4fde-a389-8da9e372fd00", + "isActive": true, + "balance": "$2,747.45", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Donovan Harrington", + "gender": "male", + "company": "BALOOBA", + "email": "donovanharrington@balooba.com", + "phone": "+1 (924) 466-3082", + "address": "247 Hornell Loop, Grandview, Nebraska, 8176", + "about": "Eiusmod commodo eiusmod exercitation officia in nostrud aliqua aliqua. Est id aliqua amet deserunt ut incididunt et ad esse sunt et. Laborum veniam commodo amet cupidatat minim culpa eiusmod culpa aliqua occaecat excepteur sunt. Non non nulla quis Lorem ut sint in elit elit fugiat.\r\n", + "registered": "2021-06-22T02:30:05 -06:-30", + "latitude": -55.278471, + "longitude": -34.229513, + "tags": [ + "eiusmod", + "nulla", + "deserunt", + "esse", + "aliqua", + "sint", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Lloyd Gomez" + }, + { + "id": 1, + "name": "Hahn Key" + }, + { + "id": 2, + "name": "Hardin Crosby" + } + ], + "greeting": "Hello, Donovan Harrington! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b982197fe8ec62c26", + "index": 77, + "guid": "a72ebc08-5099-44f5-8db8-1eba8c389748", + "isActive": false, + "balance": "$3,063.72", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Genevieve Wilson", + "gender": "female", + "company": "OPTICOM", + "email": "genevievewilson@opticom.com", + "phone": "+1 (814) 586-3212", + "address": "633 Ditmars Street, Grayhawk, Mississippi, 6879", + "about": "Do deserunt nisi fugiat nisi velit incididunt eiusmod mollit do. Non pariatur in Lorem nulla sint occaecat tempor fugiat adipisicing nostrud. Dolor magna ut velit occaecat id aliquip nostrud cupidatat id adipisicing nisi. Nisi consequat cillum aute et mollit cupidatat nulla. Exercitation veniam dolore labore mollit ea.\r\n", + "registered": "2022-03-20T06:00:01 -06:-30", + "latitude": 57.975507, + "longitude": -79.051632, + "tags": [ + "aute", + "nostrud", + "quis", + "ullamco", + "cillum", + "aute", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Luann Jennings" + }, + { + "id": 1, + "name": "Sheree Marks" + }, + { + "id": 2, + "name": "Vickie Booker" + } + ], + "greeting": "Hello, Genevieve Wilson! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb674187ae1f0eec2", + "index": 78, + "guid": "d80c826b-cc8c-40fa-8725-5684784c991c", + "isActive": false, + "balance": "$2,765.52", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Pennington Wolfe", + "gender": "male", + "company": "ENDIPINE", + "email": "penningtonwolfe@endipine.com", + "phone": "+1 (988) 501-3882", + "address": "986 Townsend Street, Soudan, Indiana, 8656", + "about": "Culpa voluptate nisi officia excepteur. Fugiat officia sit ex et consectetur voluptate occaecat Lorem id non est pariatur quis. Ad incididunt exercitation ullamco ut. Laboris cupidatat proident aliquip officia exercitation amet consequat proident labore dolore nostrud aliqua.\r\n", + "registered": "2022-09-15T08:09:33 -06:-30", + "latitude": 85.451876, + "longitude": 115.690105, + "tags": [ + "dolor", + "tempor", + "proident", + "cupidatat", + "dolor", + "reprehenderit", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Maggie Cruz" + }, + { + "id": 1, + "name": "Cantrell Brock" + }, + { + "id": 2, + "name": "Nadine Maldonado" + } + ], + "greeting": "Hello, Pennington Wolfe! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b68659f6acc85b8d8", + "index": 79, + "guid": "b5e19798-9da1-4ee8-bb41-3b1561dee20b", + "isActive": false, + "balance": "$2,290.55", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Brittney Hall", + "gender": "female", + "company": "CYTREX", + "email": "brittneyhall@cytrex.com", + "phone": "+1 (921) 551-2209", + "address": "134 Lois Avenue, Duryea, Guam, 7141", + "about": "Exercitation commodo ex esse sunt culpa aliqua qui do occaecat commodo nostrud laborum. Occaecat ex dolore pariatur enim ullamco. Ex aute commodo ea eiusmod eiusmod id irure dolor sunt eiusmod velit nulla.\r\n", + "registered": "2014-05-03T02:35:04 -06:-30", + "latitude": -27.866824, + "longitude": 47.69654, + "tags": [ + "elit", + "excepteur", + "eiusmod", + "officia", + "sunt", + "ut", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Pittman Caldwell" + }, + { + "id": 1, + "name": "Meghan Graves" + }, + { + "id": 2, + "name": "Mcleod Bailey" + } + ], + "greeting": "Hello, Brittney Hall! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8a48c51b103f0d28", + "index": 80, + "guid": "479bef54-0b68-4139-a563-2b40f5914a7f", + "isActive": true, + "balance": "$1,627.83", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "blue", + "name": "Emilia Henry", + "gender": "female", + "company": "TEMORAK", + "email": "emiliahenry@temorak.com", + "phone": "+1 (938) 517-2822", + "address": "219 Harbor Court, Alamo, Kentucky, 1764", + "about": "Incididunt incididunt ex dolore aliqua sint voluptate id officia culpa deserunt Lorem consequat et. Duis sunt adipisicing aute proident officia non ut laborum laboris exercitation sint. Ex non ea laboris elit cillum excepteur amet labore excepteur labore in dolore id. Magna dolore dolor do dolor excepteur elit. Id adipisicing enim nisi cupidatat proident aliqua dolore eu exercitation. Excepteur mollit excepteur deserunt ex deserunt nostrud ad anim nisi laboris esse in tempor culpa. Eu ipsum amet adipisicing id ea et cupidatat quis amet labore culpa elit.\r\n", + "registered": "2016-08-03T08:48:10 -06:-30", + "latitude": -81.693306, + "longitude": 89.40721, + "tags": [ + "mollit", + "exercitation", + "consequat", + "reprehenderit", + "cillum", + "consectetur", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Cynthia Cross" + }, + { + "id": 1, + "name": "Janie Barber" + }, + { + "id": 2, + "name": "Esmeralda Cantrell" + } + ], + "greeting": "Hello, Emilia Henry! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8ccc7b8fdf91529d", + "index": 81, + "guid": "a08774d1-9cfd-46ea-91af-53ab3503ed8a", + "isActive": true, + "balance": "$2,165.61", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "green", + "name": "Yolanda Watts", + "gender": "female", + "company": "MYOPIUM", + "email": "yolandawatts@myopium.com", + "phone": "+1 (957) 583-3850", + "address": "253 Montgomery Place, Shasta, Puerto Rico, 8257", + "about": "Lorem eu dolor voluptate adipisicing consequat aute officia culpa labore aliquip aliquip do deserunt culpa. Culpa nisi ullamco qui irure ut sit reprehenderit eu anim labore est. Nostrud sint deserunt eu sit elit dolore esse dolore.\r\n", + "registered": "2021-12-20T02:15:24 -06:-30", + "latitude": -46.757823, + "longitude": 49.982148, + "tags": [ + "Lorem", + "tempor", + "excepteur", + "reprehenderit", + "dolore", + "sit", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Evangelina Adams" + }, + { + "id": 1, + "name": "Angelia Oneil" + }, + { + "id": 2, + "name": "Montoya Sweet" + } + ], + "greeting": "Hello, Yolanda Watts! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9e090496e2636c88", + "index": 82, + "guid": "2efaa222-b168-4aaa-aae2-1118d267ba3b", + "isActive": false, + "balance": "$1,220.00", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Stein Pittman", + "gender": "male", + "company": "RUBADUB", + "email": "steinpittman@rubadub.com", + "phone": "+1 (854) 568-2405", + "address": "578 Hoyt Street, Gordon, North Carolina, 6858", + "about": "Fugiat laborum consequat occaecat esse ad do deserunt esse. Ex proident aliquip nisi fugiat culpa incididunt. Id anim aliquip esse amet exercitation consectetur deserunt consequat. Officia labore ad ut labore magna et nisi proident non fugiat laborum proident cillum irure. Magna voluptate nisi magna sit. Reprehenderit elit aute ullamco irure ea aliquip. Eiusmod excepteur amet amet eu.\r\n", + "registered": "2017-03-06T04:41:57 -06:-30", + "latitude": 19.111825, + "longitude": 76.475806, + "tags": [ + "dolore", + "pariatur", + "ullamco", + "qui", + "dolor", + "id", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Stafford Noble" + }, + { + "id": 1, + "name": "Kelley Newton" + }, + { + "id": 2, + "name": "Mccormick Diaz" + } + ], + "greeting": "Hello, Stein Pittman! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b53cdb9e922d99694", + "index": 83, + "guid": "d40edfeb-fae0-4bb2-b939-2172d2913191", + "isActive": false, + "balance": "$3,870.09", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Alberta Hayden", + "gender": "female", + "company": "ZORROMOP", + "email": "albertahayden@zorromop.com", + "phone": "+1 (989) 470-3922", + "address": "776 Arlington Place, Verdi, Tennessee, 7608", + "about": "Cupidatat eu fugiat laborum ea veniam sint commodo aliquip ex sit ullamco ad. Sunt ea laboris non nulla ut culpa sunt. Sunt deserunt aute culpa aute voluptate fugiat magna reprehenderit id veniam labore magna amet. Cupidatat veniam magna sit Lorem commodo elit ad quis. Ea officia eiusmod aliqua tempor cillum amet tempor. Nulla voluptate laboris non do exercitation.\r\n", + "registered": "2019-12-05T07:48:37 -06:-30", + "latitude": -68.87937, + "longitude": -41.485886, + "tags": [ + "nostrud", + "officia", + "occaecat", + "ad", + "enim", + "amet", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Vaughn Alvarez" + }, + { + "id": 1, + "name": "Laurel Bonner" + }, + { + "id": 2, + "name": "Vazquez Faulkner" + } + ], + "greeting": "Hello, Alberta Hayden! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdd8caf3ad70edee4", + "index": 84, + "guid": "4a75a33b-aa4b-417a-8fa4-8e75a97cb6c9", + "isActive": true, + "balance": "$3,159.86", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Deloris Barton", + "gender": "female", + "company": "GALLAXIA", + "email": "delorisbarton@gallaxia.com", + "phone": "+1 (844) 502-2651", + "address": "107 Farragut Place, Boomer, Arkansas, 1885", + "about": "Culpa pariatur cillum amet fugiat reprehenderit aliquip sunt dolor do. Aliquip deserunt sit et eu ad ad non et incididunt aute Lorem fugiat adipisicing. Tempor deserunt cupidatat ad minim pariatur sit non.\r\n", + "registered": "2016-12-28T04:38:01 -06:-30", + "latitude": -26.843318, + "longitude": 99.597793, + "tags": [ + "amet", + "aliqua", + "irure", + "ipsum", + "est", + "commodo", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Jeannine Jackson" + }, + { + "id": 1, + "name": "Guerra Beck" + }, + { + "id": 2, + "name": "Marilyn Larson" + } + ], + "greeting": "Hello, Deloris Barton! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b62d159f710b4c0e3", + "index": 85, + "guid": "6e8fb3c4-ae04-4fa4-92e5-fa6d006e9d02", + "isActive": true, + "balance": "$2,363.44", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Hansen Puckett", + "gender": "male", + "company": "OULU", + "email": "hansenpuckett@oulu.com", + "phone": "+1 (891) 544-3549", + "address": "812 Moffat Street, Rossmore, Virgin Islands, 4364", + "about": "Proident eiusmod et eiusmod deserunt non reprehenderit sit ipsum id culpa id dolor in. Ipsum culpa duis sunt consectetur aliquip voluptate deserunt ex eiusmod pariatur. Duis cupidatat aliqua mollit ex do exercitation. Aliqua in do nulla ullamco pariatur excepteur dolor ut aute dolore.\r\n", + "registered": "2020-12-13T03:20:42 -06:-30", + "latitude": 34.068887, + "longitude": 48.028786, + "tags": [ + "dolor", + "nulla", + "labore", + "minim", + "ad", + "quis", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Sophie Sharpe" + }, + { + "id": 1, + "name": "Mara Cote" + }, + { + "id": 2, + "name": "Hodge Love" + } + ], + "greeting": "Hello, Hansen Puckett! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b4c8c674dd2582b54", + "index": 86, + "guid": "13101809-f8c0-4dd6-b338-7cd3ae6d5c1f", + "isActive": false, + "balance": "$1,153.25", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Marcella Dickerson", + "gender": "female", + "company": "EXIAND", + "email": "marcelladickerson@exiand.com", + "phone": "+1 (979) 465-3355", + "address": "345 Hart Street, Chemung, Oregon, 8340", + "about": "Pariatur velit sit enim ea consectetur ut qui aute occaecat dolore sunt. Anim non duis do in labore ex ullamco proident sint exercitation labore. Eiusmod eu Lorem et laborum eiusmod nostrud consequat ullamco sunt voluptate cillum. Anim quis excepteur nulla consectetur reprehenderit et. Id aliqua officia tempor dolor amet est ipsum cillum magna irure nulla eu cillum. Occaecat nisi non magna velit fugiat pariatur adipisicing eu et fugiat do amet.\r\n", + "registered": "2020-05-15T08:03:11 -06:-30", + "latitude": 85.891872, + "longitude": -163.51097, + "tags": [ + "exercitation", + "aute", + "veniam", + "officia", + "ut", + "enim", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Daugherty Fitzpatrick" + }, + { + "id": 1, + "name": "Gentry Carson" + }, + { + "id": 2, + "name": "Bowen Hewitt" + } + ], + "greeting": "Hello, Marcella Dickerson! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb5992a3bbb63dc74", + "index": 87, + "guid": "18e49198-8021-460f-a585-65cc6158cd7e", + "isActive": false, + "balance": "$2,312.75", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Mia Mcmahon", + "gender": "female", + "company": "LUNCHPOD", + "email": "miamcmahon@lunchpod.com", + "phone": "+1 (841) 551-3800", + "address": "799 Rochester Avenue, Emison, District Of Columbia, 4047", + "about": "Occaecat adipisicing ullamco amet Lorem id. Non id laboris eu proident consequat. Labore minim qui sit dolor. Ipsum irure consectetur ipsum aliquip occaecat irure sit deserunt laboris consectetur velit excepteur esse sint. Do nulla cillum consectetur est proident est nisi aliqua excepteur sunt. Sit tempor voluptate nisi cillum. Occaecat tempor nisi irure labore deserunt.\r\n", + "registered": "2019-04-27T06:22:48 -06:-30", + "latitude": 61.546343, + "longitude": 122.820222, + "tags": [ + "officia", + "commodo", + "nostrud", + "enim", + "exercitation", + "culpa", + "ullamco" + ], + "friends": [ + { + "id": 0, + "name": "Lowery Mueller" + }, + { + "id": 1, + "name": "Violet Solomon" + }, + { + "id": 2, + "name": "Villarreal Pollard" + } + ], + "greeting": "Hello, Mia Mcmahon! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b06bb6fd610424b7a", + "index": 88, + "guid": "21fc3c7d-d4c4-4e2a-8589-c5d1e1516aa3", + "isActive": true, + "balance": "$2,021.00", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Dejesus Morton", + "gender": "male", + "company": "QUILTIGEN", + "email": "dejesusmorton@quiltigen.com", + "phone": "+1 (829) 465-2063", + "address": "172 Degraw Street, Loretto, Florida, 2010", + "about": "Duis nisi culpa nulla ullamco sunt reprehenderit fugiat reprehenderit fugiat deserunt ea. Anim mollit velit reprehenderit laborum enim. Ut sint mollit magna laborum aute duis adipisicing aute excepteur magna elit duis veniam. Pariatur cupidatat et nostrud id veniam laborum. Magna ex ut velit est aliquip proident mollit aliquip magna irure sint occaecat cillum pariatur. Voluptate aliqua officia culpa adipisicing eiusmod consectetur mollit. Laboris deserunt in nulla irure pariatur cillum consectetur.\r\n", + "registered": "2020-05-01T01:25:55 -06:-30", + "latitude": -1.866305, + "longitude": -6.012451, + "tags": [ + "nostrud", + "aliquip", + "proident", + "velit", + "duis", + "aute", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Aimee Boyle" + }, + { + "id": 1, + "name": "Wooten Mccarty" + }, + { + "id": 2, + "name": "Hallie Briggs" + } + ], + "greeting": "Hello, Dejesus Morton! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bbcf421156a68e7e8", + "index": 89, + "guid": "bfc881c8-8048-4586-bdbe-c91c78b3c455", + "isActive": true, + "balance": "$1,302.04", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Lucile Schwartz", + "gender": "female", + "company": "DREAMIA", + "email": "lucileschwartz@dreamia.com", + "phone": "+1 (950) 534-2353", + "address": "878 Kaufman Place, Foscoe, Washington, 6215", + "about": "Quis labore eu dolor incididunt Lorem culpa anim sit cupidatat deserunt do consequat. Est proident esse labore consequat amet nostrud quis. Eu Lorem esse sunt dolor duis voluptate eu consectetur incididunt. Eu consectetur dolore duis aliquip incididunt aliquip velit fugiat ut aliquip enim veniam. Qui sit magna ad et incididunt sit cillum ipsum magna in tempor anim.\r\n", + "registered": "2022-09-01T07:19:29 -06:-30", + "latitude": -40.486237, + "longitude": -18.36649, + "tags": [ + "ex", + "amet", + "velit", + "enim", + "anim", + "eiusmod", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Odonnell Hatfield" + }, + { + "id": 1, + "name": "Gilda Terry" + }, + { + "id": 2, + "name": "Morris Cardenas" + } + ], + "greeting": "Hello, Lucile Schwartz! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8d98ef634436424c", + "index": 90, + "guid": "d9cb4ec5-07ba-4a6a-a159-85ab2ea477a5", + "isActive": true, + "balance": "$1,121.84", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Brooke Mcbride", + "gender": "female", + "company": "PREMIANT", + "email": "brookemcbride@premiant.com", + "phone": "+1 (994) 412-2826", + "address": "339 Eckford Street, Juarez, Montana, 5785", + "about": "Voluptate qui velit Lorem commodo veniam ex id nisi et occaecat nostrud cillum. Consequat proident ex eu dolor elit proident sint voluptate nostrud culpa qui incididunt consectetur ad. Magna consequat velit culpa minim adipisicing occaecat deserunt. Eu esse in minim officia.\r\n", + "registered": "2018-10-31T07:06:16 -06:-30", + "latitude": -68.444539, + "longitude": -161.153615, + "tags": [ + "commodo", + "esse", + "voluptate", + "adipisicing", + "proident", + "ipsum", + "laborum" + ], + "friends": [ + { + "id": 0, + "name": "Vonda Banks" + }, + { + "id": 1, + "name": "Sykes Donaldson" + }, + { + "id": 2, + "name": "Candice Juarez" + } + ], + "greeting": "Hello, Brooke Mcbride! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b6e5ac0b3547b717e", + "index": 91, + "guid": "a8e8839e-355e-4427-8011-2c635f55a117", + "isActive": false, + "balance": "$3,312.81", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Fannie Myers", + "gender": "female", + "company": "PODUNK", + "email": "fanniemyers@podunk.com", + "phone": "+1 (886) 410-3487", + "address": "808 Clinton Avenue, Venice, Hawaii, 4168", + "about": "Labore labore nisi labore minim sit culpa sit ad duis aliquip est elit. Ut dolor id non anim aliqua velit cupidatat est consequat. Excepteur ad laborum enim laboris. Culpa exercitation quis nisi ipsum ad esse exercitation incididunt est ex ipsum. Do ea elit exercitation ea ad aliquip. Ea esse exercitation laborum anim deserunt excepteur reprehenderit in ad nulla excepteur exercitation. Consequat aliqua id quis aliqua velit velit et.\r\n", + "registered": "2021-06-14T10:49:01 -06:-30", + "latitude": -19.702803, + "longitude": 53.757481, + "tags": [ + "ea", + "id", + "consequat", + "sit", + "officia", + "sint", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Sofia Schneider" + }, + { + "id": 1, + "name": "Ruthie Hampton" + }, + { + "id": 2, + "name": "Kimberly Mccullough" + } + ], + "greeting": "Hello, Fannie Myers! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba55fa338b2cdc05b", + "index": 92, + "guid": "e91a7cd7-84f6-4d38-9ca5-b59696152c07", + "isActive": false, + "balance": "$1,271.79", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Addie Roach", + "gender": "female", + "company": "OVIUM", + "email": "addieroach@ovium.com", + "phone": "+1 (851) 504-2518", + "address": "282 Clifford Place, Coalmont, Michigan, 6442", + "about": "Sunt laborum ad anim tempor occaecat incididunt pariatur ad exercitation est enim do incididunt. Fugiat reprehenderit labore tempor reprehenderit Lorem quis eu ut ad est sit nulla aute labore. Lorem enim magna minim voluptate adipisicing deserunt Lorem voluptate dolore voluptate fugiat.\r\n", + "registered": "2021-05-29T10:30:35 -06:-30", + "latitude": 73.247658, + "longitude": -17.246293, + "tags": [ + "adipisicing", + "et", + "dolore", + "nisi", + "aliqua", + "duis", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Nelson Dotson" + }, + { + "id": 1, + "name": "Noreen Evans" + }, + { + "id": 2, + "name": "Campos Mcfarland" + } + ], + "greeting": "Hello, Addie Roach! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b83347be051429d83", + "index": 93, + "guid": "376fde7f-fe99-4fb5-a28f-3424385c78de", + "isActive": false, + "balance": "$1,845.63", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Castro Pope", + "gender": "male", + "company": "GLUKGLUK", + "email": "castropope@glukgluk.com", + "phone": "+1 (920) 504-2165", + "address": "253 Doone Court, Abrams, Maryland, 2313", + "about": "In anim aliquip laboris sint. Nisi id laborum consectetur nostrud velit dolore id aliquip sit. Anim sit deserunt ea eiusmod ad pariatur in magna veniam cupidatat occaecat.\r\n", + "registered": "2014-07-01T12:13:31 -06:-30", + "latitude": -64.29148, + "longitude": 2.44483, + "tags": [ + "laborum", + "tempor", + "sunt", + "magna", + "consequat", + "commodo", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Poole Lancaster" + }, + { + "id": 1, + "name": "Jeannette Chambers" + }, + { + "id": 2, + "name": "Calderon Maxwell" + } + ], + "greeting": "Hello, Castro Pope! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8a80e132dbba6485", + "index": 94, + "guid": "470a66f8-72a7-462d-b548-84a3fb530d5b", + "isActive": true, + "balance": "$1,384.25", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "brown", + "name": "Amparo Donovan", + "gender": "female", + "company": "ZENTRY", + "email": "amparodonovan@zentry.com", + "phone": "+1 (983) 422-3583", + "address": "392 Sutter Avenue, Tibbie, American Samoa, 3098", + "about": "Est enim dolore irure ea laborum aliqua aute veniam officia est nulla quis anim proident. Sit pariatur cupidatat Lorem in culpa aliquip ipsum. Lorem ex aliqua culpa elit est occaecat occaecat tempor. Tempor esse eu nisi ipsum id officia nostrud elit enim nisi cupidatat proident. Consectetur veniam anim ipsum do. Veniam cupidatat elit ut cillum ea dolore dolore excepteur id dolor excepteur sint. Aliqua aute consectetur amet ullamco exercitation ea proident Lorem non excepteur ullamco.\r\n", + "registered": "2022-09-25T03:27:32 -06:-30", + "latitude": -26.061754, + "longitude": -143.248213, + "tags": [ + "est", + "reprehenderit", + "laborum", + "et", + "commodo", + "amet", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Beverley Morrison" + }, + { + "id": 1, + "name": "Audrey Jacobson" + }, + { + "id": 2, + "name": "Whitney Hunt" + } + ], + "greeting": "Hello, Amparo Donovan! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b7342b2f1463b3810", + "index": 95, + "guid": "e78e88e1-8ee4-42cf-94f2-d0e4e1f08f8c", + "isActive": false, + "balance": "$3,812.82", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "brown", + "name": "Gertrude Peters", + "gender": "female", + "company": "DIGIFAD", + "email": "gertrudepeters@digifad.com", + "phone": "+1 (976) 503-2146", + "address": "271 Hazel Court, Hegins, Illinois, 852", + "about": "Elit ut enim incididunt aute quis incididunt nisi consequat mollit exercitation sunt. Fugiat deserunt proident veniam qui sint consequat enim anim. Lorem dolore non excepteur aliqua ullamco aliqua sit. Cupidatat nostrud eiusmod incididunt reprehenderit ex laborum irure eu esse. Ad eiusmod elit cupidatat pariatur id non magna consequat id enim adipisicing anim consectetur.\r\n", + "registered": "2015-04-29T01:51:44 -06:-30", + "latitude": -33.908009, + "longitude": 51.773277, + "tags": [ + "duis", + "deserunt", + "cillum", + "eiusmod", + "nisi", + "fugiat", + "consectetur" + ], + "friends": [ + { + "id": 0, + "name": "Lawrence Dickson" + }, + { + "id": 1, + "name": "Lucy Hays" + }, + { + "id": 2, + "name": "Lenora Maynard" + } + ], + "greeting": "Hello, Gertrude Peters! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b11cec371911c5a9d", + "index": 96, + "guid": "fc40ea71-50da-4b02-b57c-a3d6d5268b26", + "isActive": false, + "balance": "$2,836.71", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Leonard Shields", + "gender": "male", + "company": "PLASTO", + "email": "leonardshields@plasto.com", + "phone": "+1 (974) 509-2976", + "address": "864 Banker Street, Snyderville, Missouri, 1676", + "about": "Elit veniam aliquip eiusmod incididunt incididunt occaecat qui laborum commodo aute. Consequat duis exercitation labore ad ex et qui. Eu fugiat labore et esse dolore. Occaecat anim officia elit excepteur sit culpa culpa est amet ut consectetur. Id ut eiusmod exercitation ut esse ea. Eiusmod sit duis incididunt consectetur aliquip occaecat officia laborum laborum irure irure aute et.\r\n", + "registered": "2020-06-06T02:46:21 -06:-30", + "latitude": -38.625987, + "longitude": -104.4442, + "tags": [ + "cupidatat", + "officia", + "in", + "id", + "labore", + "officia", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Juliette Lloyd" + }, + { + "id": 1, + "name": "Lorena Wallace" + }, + { + "id": 2, + "name": "Kelley Ruiz" + } + ], + "greeting": "Hello, Leonard Shields! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3d23de442e91beb1", + "index": 97, + "guid": "bf3e7ece-ec52-46b1-900f-0afccd39c856", + "isActive": true, + "balance": "$1,269.15", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Ginger Knox", + "gender": "female", + "company": "AUTOGRATE", + "email": "gingerknox@autograte.com", + "phone": "+1 (974) 450-2286", + "address": "523 Mill Street, Cochranville, Idaho, 884", + "about": "Est exercitation nulla magna dolor sint in ipsum esse ut sunt. Proident occaecat commodo amet laborum irure anim et. Nisi minim elit duis quis Lorem proident elit sint officia cupidatat anim laboris. Eu adipisicing dolor veniam eu deserunt tempor laborum commodo minim non qui elit.\r\n", + "registered": "2015-07-11T06:09:47 -06:-30", + "latitude": 11.722925, + "longitude": 149.394894, + "tags": [ + "sint", + "duis", + "excepteur", + "consequat", + "elit", + "non", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Nona Gibbs" + }, + { + "id": 1, + "name": "Harding Brennan" + }, + { + "id": 2, + "name": "Maryann Davis" + } + ], + "greeting": "Hello, Ginger Knox! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b2879aa462a70d9cc", + "index": 98, + "guid": "7c6b111d-2d8a-45cc-b327-a1b59899a405", + "isActive": false, + "balance": "$2,484.92", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Marion Gould", + "gender": "female", + "company": "ZANITY", + "email": "mariongould@zanity.com", + "phone": "+1 (845) 475-2598", + "address": "984 Lawn Court, Dexter, South Carolina, 7034", + "about": "Aute consectetur et irure eu in et Lorem pariatur sunt qui dolore est. Et excepteur dolore incididunt duis est quis ipsum veniam velit id tempor aliqua. Aute excepteur aute nostrud id. Culpa enim voluptate velit qui magna nulla. Proident commodo laboris tempor nulla. Proident ea sunt aute id laboris sint.\r\n", + "registered": "2018-01-01T11:46:38 -06:-30", + "latitude": -37.708708, + "longitude": 166.275235, + "tags": [ + "dolor", + "aliquip", + "esse", + "ipsum", + "aliqua", + "nostrud", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Cameron Nunez" + }, + { + "id": 1, + "name": "Debora Becker" + }, + { + "id": 2, + "name": "Delgado Solis" + } + ], + "greeting": "Hello, Marion Gould! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b465026fb11926fff", + "index": 99, + "guid": "213d5df7-e89f-4198-9669-81acb36067fe", + "isActive": true, + "balance": "$3,074.13", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "brown", + "name": "Morse Marshall", + "gender": "male", + "company": "QUAILCOM", + "email": "morsemarshall@quailcom.com", + "phone": "+1 (899) 459-2496", + "address": "324 Nevins Street, Conestoga, Colorado, 1410", + "about": "Aliquip commodo voluptate dolor laborum pariatur in aliquip deserunt aliquip nisi Lorem in. Reprehenderit aliqua culpa laborum aliquip nostrud laboris voluptate sunt duis proident duis. Cupidatat nostrud ea nulla in eu officia et non enim magna est amet.\r\n", + "registered": "2014-12-09T02:25:56 -06:-30", + "latitude": -86.369577, + "longitude": -86.6504, + "tags": [ + "ex", + "qui", + "velit", + "sit", + "anim", + "ullamco", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Valerie Horton" + }, + { + "id": 1, + "name": "Suzette Estrada" + }, + { + "id": 2, + "name": "Della Morgan" + } + ], + "greeting": "Hello, Morse Marshall! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4baed8fd7e0b9ce190", + "index": 100, + "guid": "a8929e06-cd9f-4e24-96f5-b568b79d7839", + "isActive": true, + "balance": "$1,041.82", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "Cooley Ballard", + "gender": "male", + "company": "IMMUNICS", + "email": "cooleyballard@immunics.com", + "phone": "+1 (982) 478-2990", + "address": "371 Cumberland Street, Hoagland, New Hampshire, 1088", + "about": "Aliquip excepteur ea ea incididunt elit sunt nulla ea nisi adipisicing. Eiusmod consequat Lorem cupidatat ad voluptate exercitation incididunt velit. Ipsum nisi enim sunt voluptate esse nisi adipisicing pariatur ut. Eiusmod enim adipisicing dolore mollit dolore elit.\r\n", + "registered": "2019-06-04T04:33:32 -06:-30", + "latitude": 76.177787, + "longitude": -88.448689, + "tags": [ + "ex", + "non", + "magna", + "enim", + "esse", + "exercitation", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Muriel Bond" + }, + { + "id": 1, + "name": "Mckee Clayton" + }, + { + "id": 2, + "name": "Josefa Rhodes" + } + ], + "greeting": "Hello, Cooley Ballard! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7d66bf08b2e65f21", + "index": 101, + "guid": "88de169f-3b70-4881-bf72-35d7071aa0ba", + "isActive": false, + "balance": "$2,874.13", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "brown", + "name": "Pace Mcgee", + "gender": "male", + "company": "ZENTURY", + "email": "pacemcgee@zentury.com", + "phone": "+1 (924) 476-2006", + "address": "954 Tampa Court, Ypsilanti, Minnesota, 948", + "about": "Minim velit exercitation consequat amet. Est ut aute irure culpa. Amet incididunt do eiusmod irure anim sunt. Dolor eu exercitation irure veniam deserunt exercitation. Duis aliqua aute laborum nostrud qui labore adipisicing cupidatat magna laboris anim anim occaecat. In veniam aliquip elit ad mollit elit sunt esse anim commodo.\r\n", + "registered": "2015-10-21T07:48:45 -06:-30", + "latitude": 2.887828, + "longitude": -68.730427, + "tags": [ + "veniam", + "officia", + "minim", + "mollit", + "mollit", + "nulla", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Marian Jenkins" + }, + { + "id": 1, + "name": "Joanna Perkins" + }, + { + "id": 2, + "name": "Hopper Bullock" + } + ], + "greeting": "Hello, Pace Mcgee! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b1d1592b99a7adcf7", + "index": 102, + "guid": "49c0caf8-802b-4a10-95b3-ed0830bd068b", + "isActive": true, + "balance": "$2,422.62", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Juliet Hunter", + "gender": "female", + "company": "PLAYCE", + "email": "juliethunter@playce.com", + "phone": "+1 (976) 550-3705", + "address": "543 Louise Terrace, Vivian, Utah, 3139", + "about": "Velit officia ullamco esse est proident aute sit exercitation consectetur veniam proident. Labore nisi consequat ipsum nostrud minim. Ut veniam Lorem fugiat aliqua quis exercitation consectetur ipsum magna velit duis. Anim velit tempor quis fugiat non ut cillum in.\r\n", + "registered": "2016-02-19T05:37:39 -06:-30", + "latitude": -48.261985, + "longitude": 146.530749, + "tags": [ + "consectetur", + "labore", + "reprehenderit", + "id", + "aute", + "reprehenderit", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Weeks Parker" + }, + { + "id": 1, + "name": "Skinner Moses" + }, + { + "id": 2, + "name": "Ashley Kramer" + } + ], + "greeting": "Hello, Juliet Hunter! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b80c3d851fe1bbc74", + "index": 103, + "guid": "e115b4ad-70d7-430a-a122-80e4fdfaaabf", + "isActive": false, + "balance": "$2,406.33", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "Rena Orr", + "gender": "female", + "company": "ZAPHIRE", + "email": "renaorr@zaphire.com", + "phone": "+1 (800) 408-3844", + "address": "767 Fillmore Place, Glidden, South Dakota, 9129", + "about": "Id duis qui proident sint dolor consequat incididunt aute ipsum do incididunt nostrud. Reprehenderit cillum quis nostrud proident. Nulla consequat elit culpa duis ullamco cillum sint ullamco ut fugiat incididunt sunt. Ullamco elit velit aliquip officia enim ad ut minim aliqua minim aute ut id pariatur.\r\n", + "registered": "2020-08-20T08:09:03 -06:-30", + "latitude": 29.45732, + "longitude": -135.874081, + "tags": [ + "ut", + "magna", + "fugiat", + "cillum", + "pariatur", + "minim", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Burks Bolton" + }, + { + "id": 1, + "name": "Carol Barry" + }, + { + "id": 2, + "name": "Sloan Jensen" + } + ], + "greeting": "Hello, Rena Orr! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b72fcabeaa744aea3", + "index": 104, + "guid": "3c2e6347-5ade-406d-a2ae-59498f74decc", + "isActive": true, + "balance": "$1,124.73", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Leona Hobbs", + "gender": "female", + "company": "CENTREGY", + "email": "leonahobbs@centregy.com", + "phone": "+1 (860) 469-2600", + "address": "595 Granite Street, Herlong, Arizona, 2980", + "about": "Ipsum sit cillum occaecat eu. Sit deserunt reprehenderit aute duis ut. Id sint exercitation sunt nisi dolore consequat reprehenderit culpa cupidatat occaecat. Nisi laboris proident veniam non irure qui tempor elit. Quis est occaecat consectetur culpa eu duis quis reprehenderit sint cupidatat. Officia Lorem do consequat sunt irure cillum et velit excepteur ut Lorem et amet officia.\r\n", + "registered": "2016-08-01T04:10:41 -06:-30", + "latitude": 35.971046, + "longitude": -121.161055, + "tags": [ + "et", + "do", + "dolore", + "occaecat", + "do", + "esse", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Bullock Lang" + }, + { + "id": 1, + "name": "Lydia Vargas" + }, + { + "id": 2, + "name": "Carlson Rosario" + } + ], + "greeting": "Hello, Leona Hobbs! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b878d2e1b52c3a44c", + "index": 105, + "guid": "9f7a6a5d-cae6-4743-a9f6-3dcbb13b34c9", + "isActive": true, + "balance": "$1,632.59", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Mcfadden Miller", + "gender": "male", + "company": "MAGNINA", + "email": "mcfaddenmiller@magnina.com", + "phone": "+1 (945) 409-2386", + "address": "270 Catherine Street, Sutton, Marshall Islands, 9111", + "about": "Cillum ad sint fugiat quis aliqua. Qui tempor anim ipsum ipsum sint do labore ad elit in. Nostrud cupidatat do id ipsum tempor id incididunt veniam laborum duis ad incididunt cupidatat adipisicing. Duis quis incididunt aliqua irure consequat reprehenderit et qui ad commodo. Sit nostrud quis laborum id. Pariatur velit nulla sint nostrud tempor qui dolore ipsum deserunt sint nulla non officia laborum.\r\n", + "registered": "2016-09-18T10:53:49 -06:-30", + "latitude": 0.17802, + "longitude": -96.061752, + "tags": [ + "aliquip", + "sit", + "quis", + "enim", + "non", + "ex", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Matthews Dodson" + }, + { + "id": 1, + "name": "Cook Nelson" + }, + { + "id": 2, + "name": "Alma Deleon" + } + ], + "greeting": "Hello, Mcfadden Miller! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3487591ebe3d42dd", + "index": 106, + "guid": "dfdd6d50-c250-46bd-bbab-939a9b141de2", + "isActive": false, + "balance": "$3,231.91", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Bridgette Hebert", + "gender": "female", + "company": "QUILCH", + "email": "bridgettehebert@quilch.com", + "phone": "+1 (989) 518-3583", + "address": "367 Williams Court, Ballico, Ohio, 5609", + "about": "In ut est amet ullamco deserunt. Laboris mollit incididunt consequat qui et quis cillum proident ullamco do sint sunt ut minim. Aute nisi consectetur duis officia ea ea. Eiusmod ad aliquip cupidatat aliqua irure elit aliqua irure sunt consequat cupidatat tempor. Commodo cillum excepteur et eiusmod occaecat excepteur magna irure deserunt sit voluptate elit ex ullamco.\r\n", + "registered": "2022-03-01T04:07:09 -06:-30", + "latitude": -21.548516, + "longitude": 168.416568, + "tags": [ + "pariatur", + "deserunt", + "fugiat", + "duis", + "esse", + "velit", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Rowena Talley" + }, + { + "id": 1, + "name": "Savage Sims" + }, + { + "id": 2, + "name": "Glenda Holden" + } + ], + "greeting": "Hello, Bridgette Hebert! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb0d2824a27dc8b6b", + "index": 107, + "guid": "7ec7adc4-106e-4ab7-9b29-5e7ca63809f2", + "isActive": false, + "balance": "$2,479.53", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Greene Bell", + "gender": "male", + "company": "ZANYMAX", + "email": "greenebell@zanymax.com", + "phone": "+1 (966) 544-3636", + "address": "226 Elm Place, Canterwood, Alabama, 7152", + "about": "Proident aliquip aliqua eiusmod aute ex elit anim ullamco consequat labore. Ex incididunt eu qui sunt sit. Ea est laboris voluptate do. Tempor ex nulla ullamco culpa incididunt occaecat elit. Fugiat adipisicing occaecat tempor mollit incididunt. Excepteur exercitation amet do velit elit irure commodo veniam proident id Lorem consectetur labore laboris. Id ad tempor adipisicing exercitation occaecat labore aliqua sunt tempor.\r\n", + "registered": "2021-12-13T08:59:49 -06:-30", + "latitude": 11.440815, + "longitude": -135.000327, + "tags": [ + "dolore", + "dolore", + "commodo", + "excepteur", + "proident", + "quis", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Reilly Bates" + }, + { + "id": 1, + "name": "Michael Lindsey" + }, + { + "id": 2, + "name": "Jacobson Odonnell" + } + ], + "greeting": "Hello, Greene Bell! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b532a007ec4b62241", + "index": 108, + "guid": "e99895af-6375-4fd7-8ead-815e736f3333", + "isActive": true, + "balance": "$2,485.01", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Miller Ramsey", + "gender": "male", + "company": "XOGGLE", + "email": "millerramsey@xoggle.com", + "phone": "+1 (934) 509-2978", + "address": "849 Karweg Place, Cobbtown, Georgia, 4831", + "about": "Eu anim non ullamco sunt ex. Deserunt qui id veniam velit enim irure adipisicing eu exercitation anim velit sit quis. Cupidatat laboris sit dolore aliquip. Ex cillum nulla sint quis ipsum dolore officia.\r\n", + "registered": "2018-09-02T10:07:39 -06:-30", + "latitude": -46.108109, + "longitude": -142.487627, + "tags": [ + "consequat", + "culpa", + "magna", + "sit", + "culpa", + "aliquip", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Carolina Sawyer" + }, + { + "id": 1, + "name": "Odom Mcconnell" + }, + { + "id": 2, + "name": "Flora Foster" + } + ], + "greeting": "Hello, Miller Ramsey! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb037a9e4086cb58d", + "index": 109, + "guid": "ca65ca8d-686f-438d-8f48-d33bec84ae65", + "isActive": false, + "balance": "$3,804.94", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Anita Gordon", + "gender": "female", + "company": "NIPAZ", + "email": "anitagordon@nipaz.com", + "phone": "+1 (918) 403-3417", + "address": "713 Strauss Street, Herbster, California, 8817", + "about": "Proident laborum nulla tempor voluptate tempor magna qui. Ea est irure ut quis quis incididunt proident id occaecat deserunt excepteur magna Lorem. Anim culpa ullamco velit quis reprehenderit minim ipsum consectetur in.\r\n", + "registered": "2018-11-08T01:53:36 -06:-30", + "latitude": -38.278615, + "longitude": -20.360211, + "tags": [ + "velit", + "eiusmod", + "ea", + "velit", + "commodo", + "adipisicing", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "Hillary Martinez" + }, + { + "id": 1, + "name": "Patricia Horne" + }, + { + "id": 2, + "name": "Craft Baldwin" + } + ], + "greeting": "Hello, Anita Gordon! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bdc8b78ed61d58c5c", + "index": 110, + "guid": "cd26393e-dd73-4991-92e0-71307758db10", + "isActive": true, + "balance": "$2,990.31", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Peck Peterson", + "gender": "male", + "company": "ZYTREK", + "email": "peckpeterson@zytrek.com", + "phone": "+1 (928) 502-3452", + "address": "296 Hewes Street, Madrid, Northern Mariana Islands, 5030", + "about": "Do veniam aliqua proident cillum velit sit sit adipisicing est aute occaecat. Commodo est reprehenderit non amet cillum ullamco. Id aliquip irure reprehenderit duis labore duis reprehenderit minim mollit. Velit quis sit reprehenderit tempor irure qui in dolore amet non fugiat sunt anim aliquip. Tempor ut sunt laborum irure cillum nostrud consequat incididunt. Quis occaecat labore fugiat magna eiusmod et magna elit officia consectetur sint ex culpa laboris.\r\n", + "registered": "2018-02-11T12:56:29 -06:-30", + "latitude": 18.267441, + "longitude": -162.930083, + "tags": [ + "ex", + "mollit", + "elit", + "proident", + "eu", + "pariatur", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Karen Payne" + }, + { + "id": 1, + "name": "Cobb Powell" + }, + { + "id": 2, + "name": "Acevedo Mckenzie" + } + ], + "greeting": "Hello, Peck Peterson! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4baf51388bd2310920", + "index": 111, + "guid": "bc93a132-52c0-4b07-9f1c-b0702a10b0c6", + "isActive": true, + "balance": "$1,269.40", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "Farley Buckner", + "gender": "male", + "company": "LUMBREX", + "email": "farleybuckner@lumbrex.com", + "phone": "+1 (886) 543-3800", + "address": "355 Seabring Street, Noxen, Kansas, 5348", + "about": "Est deserunt consequat nisi laborum. Velit incididunt deserunt consequat velit nostrud. Aliquip ullamco mollit culpa et ex qui labore do ut ex nulla culpa elit. Incididunt ut ipsum occaecat eu culpa ut fugiat. Reprehenderit incididunt tempor labore velit tempor ipsum. Voluptate eiusmod quis consequat sunt amet. Deserunt Lorem incididunt Lorem reprehenderit ex et eu.\r\n", + "registered": "2015-06-02T02:23:03 -06:-30", + "latitude": 87.309868, + "longitude": -78.163966, + "tags": [ + "nisi", + "est", + "aute", + "non", + "nostrud", + "sunt", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Glover Mosley" + }, + { + "id": 1, + "name": "Janet Hood" + }, + { + "id": 2, + "name": "Mcdowell Hahn" + } + ], + "greeting": "Hello, Farley Buckner! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b93831c94910f5a63", + "index": 112, + "guid": "18185465-ec18-42c8-9701-45e4f41abf23", + "isActive": false, + "balance": "$2,873.77", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "blue", + "name": "Katrina Rocha", + "gender": "female", + "company": "NIMON", + "email": "katrinarocha@nimon.com", + "phone": "+1 (877) 440-3592", + "address": "425 Hendrickson Street, Berwind, North Dakota, 4583", + "about": "Cupidatat nisi magna sunt fugiat enim ad voluptate. Proident fugiat dolore cillum occaecat occaecat aliqua consequat amet anim eiusmod ullamco reprehenderit cillum. Consectetur aliqua minim nisi Lorem ad laborum irure aute. Exercitation excepteur irure sint elit ea. Cupidatat non aute culpa nisi pariatur incididunt sit pariatur eiusmod quis voluptate incididunt. Dolor non veniam laboris sunt.\r\n", + "registered": "2014-06-06T11:14:35 -06:-30", + "latitude": 72.868432, + "longitude": 51.668071, + "tags": [ + "do", + "duis", + "aute", + "cupidatat", + "duis", + "irure", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Tyson Rodriguez" + }, + { + "id": 1, + "name": "Forbes Day" + }, + { + "id": 2, + "name": "Clemons Randolph" + } + ], + "greeting": "Hello, Katrina Rocha! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b47a68c2f903b2a33", + "index": 113, + "guid": "5cf53bbc-ea43-4349-96db-9d019b15efd6", + "isActive": false, + "balance": "$3,308.30", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Thompson Haynes", + "gender": "male", + "company": "PROTODYNE", + "email": "thompsonhaynes@protodyne.com", + "phone": "+1 (875) 508-2612", + "address": "550 Stockton Street, Enetai, New York, 6219", + "about": "Adipisicing ullamco exercitation duis nostrud mollit quis commodo sit. Nisi non deserunt cupidatat officia dolor. Amet culpa elit voluptate voluptate nisi elit. Reprehenderit nisi culpa veniam velit est consectetur. Commodo reprehenderit in aute esse laborum adipisicing aliqua elit id. Dolor nisi est et officia est. Elit dolor voluptate sunt dolor dolore veniam amet sunt est.\r\n", + "registered": "2015-05-21T10:11:30 -06:-30", + "latitude": 49.922641, + "longitude": 133.358582, + "tags": [ + "Lorem", + "officia", + "labore", + "velit", + "dolore", + "qui", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Roxie Lynn" + }, + { + "id": 1, + "name": "Turner Kent" + }, + { + "id": 2, + "name": "Gwendolyn May" + } + ], + "greeting": "Hello, Thompson Haynes! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bfb0b31478318ecc0", + "index": 114, + "guid": "e47f898a-aa3a-4c3e-adb1-dcd498e40dc6", + "isActive": false, + "balance": "$3,660.92", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Connie Reeves", + "gender": "female", + "company": "PHUEL", + "email": "conniereeves@phuel.com", + "phone": "+1 (930) 580-3480", + "address": "386 Ainslie Street, Alderpoint, New Jersey, 451", + "about": "Excepteur ea ea voluptate adipisicing magna qui id pariatur culpa anim officia nulla irure esse. Enim ea consectetur tempor mollit. Do dolor est ipsum quis eu veniam. Commodo exercitation do culpa ipsum laborum exercitation. Eu labore minim anim anim voluptate culpa. Sint mollit fugiat dolore irure nulla incididunt nulla officia occaecat exercitation ea.\r\n", + "registered": "2021-05-14T10:15:09 -06:-30", + "latitude": -35.830348, + "longitude": 98.936149, + "tags": [ + "ipsum", + "non", + "incididunt", + "labore", + "non", + "aliqua", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Lucas Alford" + }, + { + "id": 1, + "name": "Lora Mcdowell" + }, + { + "id": 2, + "name": "Magdalena Bean" + } + ], + "greeting": "Hello, Connie Reeves! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b2127e413ab2260bc", + "index": 115, + "guid": "2365e30a-2d1f-4025-bb37-f9c70ea25724", + "isActive": true, + "balance": "$3,751.15", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Powers Barnett", + "gender": "male", + "company": "HINWAY", + "email": "powersbarnett@hinway.com", + "phone": "+1 (963) 436-3129", + "address": "285 Trucklemans Lane, Winfred, Texas, 8888", + "about": "Exercitation non nulla sit excepteur reprehenderit sint officia et aute sint Lorem fugiat dolore incididunt. Non consequat consequat adipisicing Lorem eu excepteur quis officia dolor. Pariatur eiusmod velit aute do consectetur ullamco laboris mollit do. Deserunt ad ullamco reprehenderit laborum commodo eu aliquip. Ut et dolore culpa aliqua irure do est Lorem cupidatat anim mollit aliquip enim adipisicing. Laborum enim ullamco consequat nisi. Elit nisi officia Lorem sunt commodo aute.\r\n", + "registered": "2015-05-29T09:00:06 -06:-30", + "latitude": 72.437836, + "longitude": 91.281841, + "tags": [ + "duis", + "sit", + "exercitation", + "excepteur", + "in", + "sit", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Weiss Elliott" + }, + { + "id": 1, + "name": "Megan Sampson" + }, + { + "id": 2, + "name": "Allie Duffy" + } + ], + "greeting": "Hello, Powers Barnett! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b7003b79967a2b53f", + "index": 116, + "guid": "ef7d511e-ca26-4009-9c20-2f38a1255adf", + "isActive": true, + "balance": "$3,082.97", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Melissa Guy", + "gender": "female", + "company": "ZOLAREX", + "email": "melissaguy@zolarex.com", + "phone": "+1 (851) 460-2503", + "address": "432 McClancy Place, Ada, Massachusetts, 833", + "about": "Duis Lorem reprehenderit proident ut dolor aute esse veniam cillum consequat aliquip adipisicing. Reprehenderit ex tempor id nulla enim ex magna officia nisi consequat ipsum. Cupidatat duis excepteur minim in dolore duis. Reprehenderit et labore anim Lorem commodo officia deserunt est minim velit deserunt dolor. Minim ipsum Lorem consectetur ad id. Pariatur sunt consequat laborum laboris velit exercitation laborum ullamco reprehenderit ullamco elit tempor aliqua.\r\n", + "registered": "2017-11-07T12:47:18 -06:-30", + "latitude": 26.6948, + "longitude": 113.205529, + "tags": [ + "tempor", + "ea", + "occaecat", + "culpa", + "non", + "eiusmod", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Jerry Delacruz" + }, + { + "id": 1, + "name": "Wise Beasley" + }, + { + "id": 2, + "name": "Viola Wyatt" + } + ], + "greeting": "Hello, Melissa Guy! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd4558a2237776443", + "index": 117, + "guid": "2c42e6e5-ab0d-4212-9919-29556f7ec421", + "isActive": false, + "balance": "$1,962.09", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Hart Barr", + "gender": "male", + "company": "XSPORTS", + "email": "hartbarr@xsports.com", + "phone": "+1 (888) 425-2738", + "address": "443 Sapphire Street, Harrodsburg, Palau, 6486", + "about": "Anim ipsum amet nostrud adipisicing Lorem deserunt. Ex et elit velit sit aliqua sint adipisicing sit proident ullamco irure ex. Ad aliqua eu excepteur ad reprehenderit irure minim aliquip Lorem culpa ex culpa minim in. Et commodo culpa amet tempor pariatur proident deserunt tempor nostrud irure amet dolore occaecat nulla.\r\n", + "registered": "2014-09-10T02:40:07 -06:-30", + "latitude": 30.745755, + "longitude": -44.648787, + "tags": [ + "cupidatat", + "ipsum", + "nisi", + "est", + "aute", + "aliqua", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Christian Watkins" + }, + { + "id": 1, + "name": "Singleton Sanford" + }, + { + "id": 2, + "name": "Laurie Summers" + } + ], + "greeting": "Hello, Hart Barr! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3fd0124737e68c62", + "index": 118, + "guid": "2f31df37-0a09-444f-bc55-1650181a02b6", + "isActive": true, + "balance": "$2,014.58", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Barnett Blevins", + "gender": "male", + "company": "JETSILK", + "email": "barnettblevins@jetsilk.com", + "phone": "+1 (848) 563-3767", + "address": "675 Milton Street, Wakulla, Alaska, 9293", + "about": "Pariatur duis nostrud minim ex. Ut dolore esse laborum irure Lorem excepteur tempor sint officia ipsum dolore id qui aliqua. Amet in est labore consectetur velit nostrud reprehenderit quis qui. Sunt in proident proident aute aliqua nulla dolor labore laborum deserunt.\r\n", + "registered": "2021-06-10T10:47:53 -06:-30", + "latitude": -57.013942, + "longitude": 160.489913, + "tags": [ + "ut", + "proident", + "labore", + "exercitation", + "tempor", + "laborum", + "ipsum" + ], + "friends": [ + { + "id": 0, + "name": "Chris Gilmore" + }, + { + "id": 1, + "name": "Morgan Wilkins" + }, + { + "id": 2, + "name": "Mabel Rivera" + } + ], + "greeting": "Hello, Barnett Blevins! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b56e0054d16b41fde", + "index": 119, + "guid": "9c0f56f7-e030-44d8-b0fd-abb215a07388", + "isActive": true, + "balance": "$3,678.66", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Ada Moran", + "gender": "female", + "company": "OVATION", + "email": "adamoran@ovation.com", + "phone": "+1 (856) 424-2899", + "address": "369 Vandalia Avenue, Sattley, Oklahoma, 2478", + "about": "Exercitation amet fugiat adipisicing ullamco nulla cillum qui reprehenderit nulla. Enim eu velit aute eiusmod dolor mollit dolor in adipisicing. Commodo dolor aliquip adipisicing enim quis. Nisi consectetur amet reprehenderit dolor ipsum est consequat. Laborum reprehenderit ex commodo occaecat culpa adipisicing est sunt laboris sit amet ea nisi. Quis quis aliquip et eiusmod Lorem minim nisi mollit officia velit. Quis incididunt cillum fugiat cillum dolor.\r\n", + "registered": "2021-08-14T08:51:43 -06:-30", + "latitude": 65.040699, + "longitude": -71.485407, + "tags": [ + "laboris", + "nisi", + "labore", + "laboris", + "dolor", + "voluptate", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Davis Mccall" + }, + { + "id": 1, + "name": "Mercedes Decker" + }, + { + "id": 2, + "name": "Duran Barrett" + } + ], + "greeting": "Hello, Ada Moran! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7739c60d0c8e3f2e", + "index": 120, + "guid": "c65dd6b5-2c15-4769-8394-17a41367466d", + "isActive": false, + "balance": "$3,617.32", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Whitfield Sellers", + "gender": "male", + "company": "FITCORE", + "email": "whitfieldsellers@fitcore.com", + "phone": "+1 (964) 575-3565", + "address": "216 Winthrop Street, Canby, New Mexico, 4005", + "about": "Eu ipsum sint irure ipsum nostrud incididunt ipsum pariatur ipsum reprehenderit sint. Veniam deserunt irure reprehenderit adipisicing dolor ut. Dolor dolore proident consectetur commodo anim non. In ipsum officia esse qui ullamco. Occaecat ad aliquip quis cupidatat tempor laboris.\r\n", + "registered": "2022-08-22T01:55:58 -06:-30", + "latitude": 5.859659, + "longitude": 175.427951, + "tags": [ + "fugiat", + "aliqua", + "amet", + "officia", + "esse", + "ut", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Leon Pate" + }, + { + "id": 1, + "name": "Gonzales Preston" + }, + { + "id": 2, + "name": "Danielle Munoz" + } + ], + "greeting": "Hello, Whitfield Sellers! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf0898786f93e25de", + "index": 121, + "guid": "ee791741-bd46-49dd-8c92-f5a671f3c25d", + "isActive": false, + "balance": "$1,507.90", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Herrera Avila", + "gender": "male", + "company": "SENMEI", + "email": "herreraavila@senmei.com", + "phone": "+1 (960) 453-2470", + "address": "943 Overbaugh Place, Klagetoh, Wyoming, 2602", + "about": "Fugiat aliqua id veniam labore laboris incididunt adipisicing ad magna deserunt id nostrud. Anim laboris duis ut id sit dolor ad aliquip laboris proident nisi. Officia nisi nostrud cupidatat enim culpa et consequat quis. Do consequat amet occaecat labore voluptate amet elit sit sunt eu. Ipsum qui esse est amet sit deserunt incididunt sunt qui.\r\n", + "registered": "2017-01-17T06:23:24 -06:-30", + "latitude": -42.18847, + "longitude": -135.901523, + "tags": [ + "occaecat", + "qui", + "do", + "duis", + "magna", + "eiusmod", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Sweeney Riley" + }, + { + "id": 1, + "name": "Myers Baker" + }, + { + "id": 2, + "name": "Billie Emerson" + } + ], + "greeting": "Hello, Herrera Avila! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b5327123a68a3888e", + "index": 122, + "guid": "41312624-de5e-466e-bcae-6dc19ab6532a", + "isActive": true, + "balance": "$3,108.32", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Pauline Tucker", + "gender": "female", + "company": "KOFFEE", + "email": "paulinetucker@koffee.com", + "phone": "+1 (841) 590-2749", + "address": "553 Drew Street, Bedias, Rhode Island, 5569", + "about": "Ut esse do incididunt tempor duis dolore fugiat fugiat ut. Cillum enim ex Lorem sint proident ullamco. Nulla deserunt cillum irure nulla anim eu proident ut incididunt adipisicing velit velit.\r\n", + "registered": "2014-04-18T07:37:51 -06:-30", + "latitude": -64.584207, + "longitude": -59.056558, + "tags": [ + "adipisicing", + "velit", + "nostrud", + "enim", + "minim", + "eu", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Cain Holder" + }, + { + "id": 1, + "name": "Ashlee Tanner" + }, + { + "id": 2, + "name": "Loraine Reilly" + } + ], + "greeting": "Hello, Pauline Tucker! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bfe1f1300166dab85", + "index": 123, + "guid": "4e947ed0-72fc-4b32-b6c8-fe899c184909", + "isActive": true, + "balance": "$1,117.46", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Guerrero Fry", + "gender": "male", + "company": "ECLIPTO", + "email": "guerrerofry@eclipto.com", + "phone": "+1 (804) 403-2033", + "address": "673 Desmond Court, Lindcove, West Virginia, 1550", + "about": "Minim ex esse dolor exercitation. Veniam eu commodo proident anim. Sit duis consectetur ut duis irure ullamco enim ad. Adipisicing nisi duis magna fugiat aliqua cupidatat nostrud mollit ea amet consequat consectetur do. Occaecat reprehenderit deserunt anim eiusmod veniam cillum irure ex do mollit est. Consequat occaecat esse anim quis ipsum ipsum do Lorem velit non tempor excepteur.\r\n", + "registered": "2016-02-05T10:40:46 -06:-30", + "latitude": -19.969472, + "longitude": 172.231621, + "tags": [ + "magna", + "aute", + "dolor", + "culpa", + "incididunt", + "esse", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Hamilton Fox" + }, + { + "id": 1, + "name": "Tyler Roman" + }, + { + "id": 2, + "name": "Letitia Russo" + } + ], + "greeting": "Hello, Guerrero Fry! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b02779a153e9387f9", + "index": 124, + "guid": "73609995-76b1-4f44-8657-4f29bada2d8d", + "isActive": false, + "balance": "$1,220.27", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Hopkins Curtis", + "gender": "male", + "company": "RONBERT", + "email": "hopkinscurtis@ronbert.com", + "phone": "+1 (959) 452-2725", + "address": "837 Hendrix Street, Roderfield, Nevada, 8193", + "about": "Eiusmod voluptate mollit tempor elit do adipisicing est officia. Id Lorem pariatur consectetur consequat ut dolor magna pariatur laborum ullamco tempor est cupidatat. Magna officia sunt est aliqua id et enim amet ea ut culpa in. Non elit eiusmod mollit veniam irure non excepteur minim cillum non cupidatat eu. Dolore consectetur sint veniam non irure veniam aliqua et. Mollit ut labore occaecat nisi enim officia consectetur tempor.\r\n", + "registered": "2020-09-24T04:28:26 -06:-30", + "latitude": 55.186212, + "longitude": 83.117267, + "tags": [ + "nostrud", + "dolore", + "sunt", + "mollit", + "ea", + "ad", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Hazel Rollins" + }, + { + "id": 1, + "name": "Paige Ross" + }, + { + "id": 2, + "name": "Hanson Austin" + } + ], + "greeting": "Hello, Hopkins Curtis! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1942d95fa5ce186f", + "index": 125, + "guid": "793b5f3f-c931-4e1f-9c82-90c81fe2d6c5", + "isActive": true, + "balance": "$1,060.41", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Terrell Shannon", + "gender": "male", + "company": "ENJOLA", + "email": "terrellshannon@enjola.com", + "phone": "+1 (997) 549-2509", + "address": "253 Kenmore Terrace, Cannondale, Delaware, 6406", + "about": "Do cupidatat elit quis minim. Excepteur mollit velit irure magna aliquip tempor irure voluptate cupidatat ex. Mollit irure sit in est. Nisi ut excepteur consectetur laboris enim minim laborum nisi commodo amet ut occaecat elit. Magna anim consequat adipisicing enim sunt aute. Ut magna velit irure ad occaecat sit et pariatur est.\r\n", + "registered": "2014-07-01T09:49:12 -06:-30", + "latitude": -63.167755, + "longitude": 43.331911, + "tags": [ + "amet", + "labore", + "elit", + "dolor", + "ea", + "magna", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Whitley Tyson" + }, + { + "id": 1, + "name": "Robbins Miranda" + }, + { + "id": 2, + "name": "Torres Mathis" + } + ], + "greeting": "Hello, Terrell Shannon! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b5a4caa287909ec9f", + "index": 126, + "guid": "3d3aefe9-cd7c-4616-a25e-083497bd201a", + "isActive": false, + "balance": "$2,199.53", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Lucille Gray", + "gender": "female", + "company": "SPHERIX", + "email": "lucillegray@spherix.com", + "phone": "+1 (806) 403-3100", + "address": "734 Victor Road, Winston, Federated States Of Micronesia, 279", + "about": "Dolore incididunt tempor culpa nostrud do officia voluptate eu ad velit cupidatat proident nostrud ipsum. Dolore consequat do sint Lorem deserunt sunt cupidatat quis deserunt nulla eiusmod pariatur anim consectetur. Cillum aliquip do veniam non laboris ut ipsum fugiat adipisicing voluptate. Nulla et ad sint consectetur et enim. Fugiat ea reprehenderit reprehenderit Lorem eiusmod fugiat ipsum reprehenderit laboris Lorem.\r\n", + "registered": "2017-10-21T09:48:29 -06:-30", + "latitude": 89.097749, + "longitude": 146.732604, + "tags": [ + "commodo", + "adipisicing", + "ex", + "velit", + "voluptate", + "ipsum", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Mccarthy Haney" + }, + { + "id": 1, + "name": "Raymond Villarreal" + }, + { + "id": 2, + "name": "Gina Fleming" + } + ], + "greeting": "Hello, Lucille Gray! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4be47986a028e260a1", + "index": 127, + "guid": "5eac8a48-198b-4e43-9bb1-f2c07ac89a5d", + "isActive": true, + "balance": "$1,378.64", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Dollie Santiago", + "gender": "female", + "company": "WEBIOTIC", + "email": "dolliesantiago@webiotic.com", + "phone": "+1 (829) 461-3988", + "address": "411 Tiffany Place, Adamstown, Pennsylvania, 8510", + "about": "Id laborum veniam dolor sint pariatur tempor laboris mollit ipsum amet ut aliqua eu. Culpa qui enim dolore esse. Dolore commodo magna tempor commodo ullamco quis. Eiusmod officia fugiat nulla excepteur excepteur ad culpa consectetur. Sunt Lorem non ad elit dolor laboris pariatur pariatur incididunt sint mollit qui.\r\n", + "registered": "2022-01-22T11:04:36 -06:-30", + "latitude": 51.854072, + "longitude": 94.154415, + "tags": [ + "id", + "eu", + "sunt", + "et", + "id", + "labore", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Petersen Osborne" + }, + { + "id": 1, + "name": "Madeline Sears" + }, + { + "id": 2, + "name": "Rowland Richard" + } + ], + "greeting": "Hello, Dollie Santiago! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4be6d47dea332160d8", + "index": 128, + "guid": "6f35f44a-2697-4fdd-8afb-92adc8694394", + "isActive": true, + "balance": "$1,203.93", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Velasquez Jordan", + "gender": "male", + "company": "MACRONAUT", + "email": "velasquezjordan@macronaut.com", + "phone": "+1 (919) 512-2117", + "address": "919 Lott Avenue, Allison, Connecticut, 9843", + "about": "Labore esse sint id pariatur. Ad magna veniam ullamco anim quis magna occaecat amet minim. Lorem eiusmod ea officia occaecat Lorem nisi occaecat irure. Veniam veniam aliquip minim amet ipsum incididunt eiusmod enim deserunt irure. Lorem eu sunt minim eu Lorem ut.\r\n", + "registered": "2016-02-18T02:21:10 -06:-30", + "latitude": -67.236116, + "longitude": -71.939622, + "tags": [ + "dolor", + "commodo", + "cillum", + "sint", + "officia", + "duis", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Haney Burt" + }, + { + "id": 1, + "name": "Bolton Estes" + }, + { + "id": 2, + "name": "Elisabeth Stephens" + } + ], + "greeting": "Hello, Velasquez Jordan! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bac68c765e6c296b7", + "index": 129, + "guid": "2e7d10df-3601-4691-b06f-f9d9041cbdf1", + "isActive": false, + "balance": "$1,445.60", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Aisha Mcfadden", + "gender": "female", + "company": "KONGENE", + "email": "aishamcfadden@kongene.com", + "phone": "+1 (862) 502-3385", + "address": "164 Royce Street, Beaverdale, Louisiana, 352", + "about": "Aliqua labore officia nisi occaecat aliqua nisi dolor. Enim sint id officia elit ut mollit officia in veniam enim irure dolor. Sunt deserunt qui id aliquip ullamco voluptate quis aute. Sunt in enim eiusmod nostrud sit tempor consequat fugiat ut ad eiusmod dolor nulla in. Minim culpa ullamco commodo consequat deserunt Lorem exercitation enim mollit labore deserunt non. Cillum est eu sint aliquip enim fugiat consequat. Ex in cupidatat cupidatat aliquip consectetur ut dolore consequat ipsum amet laborum fugiat ad Lorem.\r\n", + "registered": "2019-09-04T10:33:02 -06:-30", + "latitude": -25.424141, + "longitude": 16.321255, + "tags": [ + "duis", + "eiusmod", + "irure", + "id", + "magna", + "velit", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Bonnie Gentry" + }, + { + "id": 1, + "name": "Kathrine Rosa" + }, + { + "id": 2, + "name": "Bartlett Daniel" + } + ], + "greeting": "Hello, Aisha Mcfadden! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb3aa06b901d7475d", + "index": 130, + "guid": "9a0728fe-405c-43ad-9355-d5429d9576bc", + "isActive": true, + "balance": "$2,082.86", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Rogers Dorsey", + "gender": "male", + "company": "BLEENDOT", + "email": "rogersdorsey@bleendot.com", + "phone": "+1 (835) 543-3674", + "address": "850 Sutton Street, Beyerville, Vermont, 5108", + "about": "Do velit in commodo labore Lorem irure nulla occaecat ad quis. Excepteur deserunt incididunt fugiat ex Lorem sit ut deserunt adipisicing est anim voluptate. Proident enim do nostrud non quis in mollit. Qui sit deserunt cillum ut. Nulla non occaecat adipisicing labore culpa non eu. Irure enim adipisicing excepteur ad pariatur velit velit enim nulla occaecat ullamco.\r\n", + "registered": "2017-08-20T09:46:25 -06:-30", + "latitude": -81.306757, + "longitude": -168.273923, + "tags": [ + "duis", + "fugiat", + "eiusmod", + "enim", + "cillum", + "laborum", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Dorothy Anthony" + }, + { + "id": 1, + "name": "Douglas Aguilar" + }, + { + "id": 2, + "name": "Strong Bruce" + } + ], + "greeting": "Hello, Rogers Dorsey! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9a77bcb5b44c92ae", + "index": 131, + "guid": "174e3dd8-20f8-4f34-a362-30c6c403ce78", + "isActive": false, + "balance": "$1,279.50", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Bray Lowery", + "gender": "male", + "company": "ZYPLE", + "email": "braylowery@zyple.com", + "phone": "+1 (904) 598-2260", + "address": "408 President Street, Kerby, Iowa, 1680", + "about": "Veniam ex in Lorem velit cillum aute velit ut non dolore. Incididunt dolore commodo cupidatat aute tempor ut. Incididunt excepteur nisi dolore do nostrud enim. Excepteur nostrud dolor amet officia veniam nisi exercitation. Minim nisi non labore aliqua aliquip amet id labore aliquip laboris ad elit reprehenderit.\r\n", + "registered": "2018-10-09T10:15:28 -06:-30", + "latitude": 20.339766, + "longitude": 57.196058, + "tags": [ + "minim", + "dolore", + "ullamco", + "magna", + "aliqua", + "ad", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Carla Buchanan" + }, + { + "id": 1, + "name": "Brianna Molina" + }, + { + "id": 2, + "name": "Maude Kinney" + } + ], + "greeting": "Hello, Bray Lowery! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9acff788c97a8410", + "index": 132, + "guid": "703b38a8-3b63-4f46-887c-2a4be79158c6", + "isActive": true, + "balance": "$3,629.99", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Pamela Wheeler", + "gender": "female", + "company": "CABLAM", + "email": "pamelawheeler@cablam.com", + "phone": "+1 (840) 490-3419", + "address": "660 Polar Street, Wikieup, Virginia, 4702", + "about": "Sint ullamco veniam mollit minim sit ut nulla aliqua dolor ipsum est reprehenderit nostrud. Esse adipisicing aliquip in amet id elit proident pariatur commodo eiusmod. Exercitation ut voluptate irure veniam labore commodo et exercitation. Consectetur eiusmod veniam sunt aliqua sunt ea.\r\n", + "registered": "2019-10-04T06:40:17 -06:-30", + "latitude": 37.979658, + "longitude": -32.941799, + "tags": [ + "eu", + "ullamco", + "nisi", + "in", + "mollit", + "ad", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Benita Ayala" + }, + { + "id": 1, + "name": "Marcia Vinson" + }, + { + "id": 2, + "name": "Walker Dejesus" + } + ], + "greeting": "Hello, Pamela Wheeler! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b784b9acde8d8e400", + "index": 133, + "guid": "a6f0fdf9-bf67-465f-8af1-f56eacba5509", + "isActive": false, + "balance": "$1,158.88", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Blanca Mcmillan", + "gender": "female", + "company": "SPEEDBOLT", + "email": "blancamcmillan@speedbolt.com", + "phone": "+1 (969) 410-2662", + "address": "468 Kiely Place, Rose, Maine, 3074", + "about": "Minim nostrud occaecat sunt eiusmod et cupidatat laborum et minim nisi. Aliqua ex enim in ipsum ut eu qui fugiat sit laboris sunt velit. Magna nisi sunt esse esse nostrud. Minim in est cillum nisi ex laborum duis ea reprehenderit cillum eu est. Labore officia elit dolor cupidatat nisi mollit exercitation aliquip.\r\n", + "registered": "2016-06-17T07:39:30 -06:-30", + "latitude": 66.534309, + "longitude": 143.807881, + "tags": [ + "nulla", + "dolor", + "commodo", + "pariatur", + "qui", + "ut", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "May Pitts" + }, + { + "id": 1, + "name": "Mcbride Henson" + }, + { + "id": 2, + "name": "Alta Watson" + } + ], + "greeting": "Hello, Blanca Mcmillan! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b070b1b4b55b6a4b5", + "index": 134, + "guid": "ffefb448-d42b-44be-8632-8d0b4996cc19", + "isActive": true, + "balance": "$2,146.75", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Gretchen Berger", + "gender": "female", + "company": "KLUGGER", + "email": "gretchenberger@klugger.com", + "phone": "+1 (981) 520-2415", + "address": "228 Lefferts Avenue, Stewart, Nebraska, 8503", + "about": "Ullamco laborum culpa enim exercitation aute. Cillum ad irure exercitation excepteur Lorem. Amet adipisicing incididunt duis aliqua pariatur reprehenderit ex in.\r\n", + "registered": "2016-03-14T03:23:37 -06:-30", + "latitude": -33.841249, + "longitude": -96.183149, + "tags": [ + "aute", + "ex", + "do", + "ut", + "occaecat", + "sunt", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Celeste Kirby" + }, + { + "id": 1, + "name": "Holmes Fischer" + }, + { + "id": 2, + "name": "Olsen Stein" + } + ], + "greeting": "Hello, Gretchen Berger! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf84654087d31a346", + "index": 135, + "guid": "24a4afd7-6c95-48dd-b60b-f722764c42e5", + "isActive": true, + "balance": "$1,035.47", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Cantu Gregory", + "gender": "male", + "company": "AVIT", + "email": "cantugregory@avit.com", + "phone": "+1 (837) 583-2244", + "address": "808 Harbor Lane, Denio, Mississippi, 2010", + "about": "Magna enim in laborum esse. Mollit veniam amet reprehenderit minim dolore elit magna ea. Elit cupidatat aliquip amet veniam minim aute esse sint quis irure.\r\n", + "registered": "2021-11-28T07:05:49 -06:-30", + "latitude": -0.478805, + "longitude": 7.926812, + "tags": [ + "et", + "elit", + "in", + "nisi", + "laboris", + "duis", + "ullamco" + ], + "friends": [ + { + "id": 0, + "name": "Wiggins Parsons" + }, + { + "id": 1, + "name": "Cunningham Allen" + }, + { + "id": 2, + "name": "Irma Mccormick" + } + ], + "greeting": "Hello, Cantu Gregory! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b263d1c0bfeacb3e4", + "index": 136, + "guid": "97630d13-09b7-4e53-beac-a040052e8e2e", + "isActive": false, + "balance": "$1,478.67", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "brown", + "name": "Ashley Savage", + "gender": "female", + "company": "ATGEN", + "email": "ashleysavage@atgen.com", + "phone": "+1 (874) 521-2033", + "address": "185 Kermit Place, Eastmont, Indiana, 1894", + "about": "Qui esse Lorem eu consequat et magna in minim. Ipsum aliquip quis eu sit veniam est voluptate. Et ad voluptate ad do in nulla enim. Sint qui proident aute Lorem culpa cupidatat veniam dolor ullamco qui. In sit ad ex commodo deserunt consectetur consequat reprehenderit eu ad elit. Sunt consectetur Lorem sint non in. Cupidatat veniam tempor aute minim cupidatat enim dolore quis minim irure irure ullamco aute.\r\n", + "registered": "2020-11-16T09:41:15 -06:-30", + "latitude": 9.178677, + "longitude": 110.71187, + "tags": [ + "qui", + "excepteur", + "magna", + "tempor", + "fugiat", + "aliquip", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Cornelia Clemons" + }, + { + "id": 1, + "name": "Holt Snyder" + }, + { + "id": 2, + "name": "England Williams" + } + ], + "greeting": "Hello, Ashley Savage! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b9abdbfe855a0da1a", + "index": 137, + "guid": "c1865c91-708d-4d57-bcb1-baccfcd8c0ad", + "isActive": true, + "balance": "$1,456.90", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Georgina Casey", + "gender": "female", + "company": "WARETEL", + "email": "georginacasey@waretel.com", + "phone": "+1 (862) 489-2978", + "address": "512 Matthews Place, Tampico, Guam, 3140", + "about": "Eiusmod qui proident magna qui eiusmod voluptate ex. Tempor ipsum irure consectetur exercitation et. Eu voluptate sint irure in velit enim consequat. Excepteur voluptate esse elit ad enim excepteur dolore ad nisi ullamco eiusmod magna.\r\n", + "registered": "2014-07-12T08:24:07 -06:-30", + "latitude": 73.825427, + "longitude": -119.948011, + "tags": [ + "et", + "sunt", + "eiusmod", + "nulla", + "ad", + "exercitation", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Watts Brewer" + }, + { + "id": 1, + "name": "Padilla Barker" + }, + { + "id": 2, + "name": "Juliana Oneal" + } + ], + "greeting": "Hello, Georgina Casey! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7515f719f659db21", + "index": 138, + "guid": "d2e9b765-4f49-4e19-bd35-237e0b3d23d2", + "isActive": false, + "balance": "$1,342.46", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Fuller Fields", + "gender": "male", + "company": "LOCAZONE", + "email": "fullerfields@locazone.com", + "phone": "+1 (873) 494-2368", + "address": "764 Clove Road, Celeryville, Kentucky, 5933", + "about": "Laboris laborum veniam ipsum ex magna proident enim tempor anim nisi aute. Amet incididunt exercitation in enim ex commodo elit excepteur ullamco proident sint do ut eiusmod. Enim veniam reprehenderit do cupidatat est duis in est Lorem deserunt esse consequat exercitation. Cillum eu consectetur consectetur amet cupidatat voluptate dolore ex tempor non est deserunt. Id reprehenderit ea ullamco commodo elit cupidatat aliqua do veniam ad deserunt et occaecat eiusmod. Ipsum laboris dolor enim ipsum ipsum veniam in ipsum officia elit magna ad.\r\n", + "registered": "2019-02-10T04:53:10 -06:-30", + "latitude": 76.082221, + "longitude": 148.896871, + "tags": [ + "amet", + "enim", + "ad", + "ea", + "esse", + "laborum", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Ronda Forbes" + }, + { + "id": 1, + "name": "Cote Wade" + }, + { + "id": 2, + "name": "Beryl Saunders" + } + ], + "greeting": "Hello, Fuller Fields! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf4701b938a08981a", + "index": 139, + "guid": "ad5f12e1-54e8-4eef-b324-9c3150669b35", + "isActive": true, + "balance": "$1,765.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Mitchell Wilcox", + "gender": "male", + "company": "ZOLARITY", + "email": "mitchellwilcox@zolarity.com", + "phone": "+1 (829) 582-3615", + "address": "646 Hampton Place, Jeff, Puerto Rico, 2457", + "about": "Sit ad velit esse in in. Consequat eu fugiat commodo id. Aliquip consectetur duis officia commodo. Minim nulla culpa nostrud id laborum laboris et. Labore reprehenderit laboris eu aliqua sit excepteur irure commodo aute anim amet.\r\n", + "registered": "2021-11-24T02:19:42 -06:-30", + "latitude": -8.853018, + "longitude": 3.463572, + "tags": [ + "voluptate", + "eiusmod", + "est", + "pariatur", + "ea", + "cillum", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Woodard Byrd" + }, + { + "id": 1, + "name": "Hughes Ferguson" + }, + { + "id": 2, + "name": "Ursula Lamb" + } + ], + "greeting": "Hello, Mitchell Wilcox! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4ba6de92cbff3a0b41", + "index": 140, + "guid": "253160f6-b914-431f-b5b7-234519f75170", + "isActive": true, + "balance": "$1,006.26", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Naomi Melton", + "gender": "female", + "company": "KNEEDLES", + "email": "naomimelton@kneedles.com", + "phone": "+1 (893) 548-3636", + "address": "519 Ridgecrest Terrace, Dunlo, North Carolina, 9332", + "about": "Ea ipsum proident consequat culpa qui enim cupidatat consectetur est non incididunt nisi. Nostrud eiusmod cupidatat adipisicing minim ipsum Lorem laborum. Reprehenderit consequat consequat quis commodo tempor exercitation sint ipsum cupidatat ex sit.\r\n", + "registered": "2022-01-05T06:18:44 -06:-30", + "latitude": 63.076285, + "longitude": -115.123883, + "tags": [ + "voluptate", + "eu", + "Lorem", + "magna", + "et", + "proident", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Kerr Strickland" + }, + { + "id": 1, + "name": "Adele Norris" + }, + { + "id": 2, + "name": "Kelly Wise" + } + ], + "greeting": "Hello, Naomi Melton! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be6cd8084f55cfa71", + "index": 141, + "guid": "d8f902c0-e31f-4977-b358-8409d5893a7f", + "isActive": true, + "balance": "$2,378.15", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Minnie Duke", + "gender": "female", + "company": "VOIPA", + "email": "minnieduke@voipa.com", + "phone": "+1 (925) 443-3464", + "address": "201 Mill Avenue, Byrnedale, Tennessee, 1921", + "about": "Consectetur eiusmod id eu do exercitation sit mollit esse veniam mollit sunt qui. Elit adipisicing deserunt ipsum pariatur laboris esse. Ex elit officia exercitation laborum non adipisicing dolor enim officia sint nostrud. Ea ad esse aliquip sunt culpa veniam mollit ipsum duis non esse.\r\n", + "registered": "2014-03-12T04:43:10 -06:-30", + "latitude": 76.002729, + "longitude": -98.315921, + "tags": [ + "nulla", + "do", + "ut", + "ullamco", + "nostrud", + "magna", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Mamie Lopez" + }, + { + "id": 1, + "name": "Langley Richmond" + }, + { + "id": 2, + "name": "Berger Sanchez" + } + ], + "greeting": "Hello, Minnie Duke! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bcbeaac1f9dda1944", + "index": 142, + "guid": "34d5046f-a133-47f3-8d94-fbd562889022", + "isActive": false, + "balance": "$1,341.84", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Ballard Holmes", + "gender": "male", + "company": "OVERPLEX", + "email": "ballardholmes@overplex.com", + "phone": "+1 (927) 444-2359", + "address": "841 Mersereau Court, Henrietta, Arkansas, 9592", + "about": "Laboris esse voluptate esse deserunt occaecat amet cillum proident. Magna aliquip deserunt nostrud mollit aliqua ex duis excepteur proident. Dolor reprehenderit minim amet reprehenderit ea officia voluptate dolore laborum culpa officia occaecat sunt. Et esse nostrud anim adipisicing sit nulla velit mollit mollit fugiat Lorem excepteur. Officia aliqua non sit qui ex.\r\n", + "registered": "2014-03-25T12:44:10 -06:-30", + "latitude": 78.487412, + "longitude": -40.804959, + "tags": [ + "cupidatat", + "voluptate", + "nulla", + "laborum", + "sit", + "laboris", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Dolly Nolan" + }, + { + "id": 1, + "name": "Vance Levy" + }, + { + "id": 2, + "name": "Franco Alvarado" + } + ], + "greeting": "Hello, Ballard Holmes! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd36f762486a903fe", + "index": 143, + "guid": "e0c58db6-6192-49d7-b00b-f57f66f4b901", + "isActive": true, + "balance": "$1,719.90", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Tillman Beach", + "gender": "male", + "company": "GENESYNK", + "email": "tillmanbeach@genesynk.com", + "phone": "+1 (862) 573-2016", + "address": "194 Stuyvesant Avenue, Leroy, Virgin Islands, 3199", + "about": "Excepteur proident nulla elit ut fugiat proident ipsum exercitation irure. Ipsum sunt mollit ullamco ad laborum adipisicing nisi deserunt duis laboris duis culpa ullamco. Sit veniam ad aliquip fugiat. Labore enim aliquip sit dolore veniam quis ex consectetur laboris fugiat qui ex. Cillum nostrud sit officia labore ipsum labore consectetur ullamco aute fugiat non ullamco eiusmod velit. Dolor nisi qui minim ad labore sit excepteur enim Lorem elit ea eu.\r\n", + "registered": "2019-06-27T12:06:42 -06:-30", + "latitude": -68.957538, + "longitude": -103.611995, + "tags": [ + "tempor", + "consequat", + "aute", + "irure", + "amet", + "sit", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Wilkerson Noel" + }, + { + "id": 1, + "name": "Randolph Lowe" + }, + { + "id": 2, + "name": "Brady Ward" + } + ], + "greeting": "Hello, Tillman Beach! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b12d9f61f9bda18d5", + "index": 144, + "guid": "0745d7f4-7e30-4c81-87aa-1da3d99e068f", + "isActive": true, + "balance": "$1,096.90", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Ewing Mcneil", + "gender": "male", + "company": "BILLMED", + "email": "ewingmcneil@billmed.com", + "phone": "+1 (914) 572-2174", + "address": "733 Madeline Court, Hillsboro, Oregon, 3945", + "about": "Ipsum pariatur sint cupidatat nisi occaecat aliqua fugiat Lorem ex pariatur labore magna ad. Elit est minim exercitation ut tempor culpa consectetur ipsum tempor nisi. Veniam irure duis esse adipisicing commodo incididunt non dolore id. Aliqua do ullamco anim nulla exercitation velit voluptate tempor aliqua cupidatat quis esse elit. Voluptate Lorem dolore incididunt sunt amet ea amet. Fugiat Lorem id aliquip sit cillum incididunt minim duis. Non enim et dolore veniam minim.\r\n", + "registered": "2020-12-26T11:26:36 -06:-30", + "latitude": 2.430916, + "longitude": 100.297647, + "tags": [ + "velit", + "elit", + "qui", + "mollit", + "nostrud", + "officia", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Bernadine Garza" + }, + { + "id": 1, + "name": "Houston Adkins" + }, + { + "id": 2, + "name": "Hayes Webb" + } + ], + "greeting": "Hello, Ewing Mcneil! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b80d1e00a110702f3", + "index": 145, + "guid": "deb8b67d-55a8-42b7-8d82-24d1df3cad32", + "isActive": false, + "balance": "$1,000.11", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Gordon England", + "gender": "male", + "company": "EXODOC", + "email": "gordonengland@exodoc.com", + "phone": "+1 (886) 541-2812", + "address": "305 Commerce Street, Brethren, District Of Columbia, 1426", + "about": "Cillum aliquip aliquip ullamco irure. Sint tempor deserunt duis reprehenderit aliqua aliqua esse nulla. Amet voluptate labore commodo ex ut mollit occaecat dolor. Pariatur dolore commodo fugiat exercitation labore esse enim cupidatat et nostrud et. Ex labore in dolor amet eu aute minim ad cupidatat consequat nisi pariatur cupidatat nisi. Pariatur aliqua eiusmod aliquip dolor et esse ex amet est ullamco pariatur est nostrud. Culpa enim quis laboris aute cillum dolore deserunt proident excepteur cillum Lorem.\r\n", + "registered": "2020-04-10T12:13:20 -06:-30", + "latitude": 18.138421, + "longitude": -121.009254, + "tags": [ + "consectetur", + "qui", + "quis", + "reprehenderit", + "aliquip", + "reprehenderit", + "deserunt" + ], + "friends": [ + { + "id": 0, + "name": "Lee Roberson" + }, + { + "id": 1, + "name": "Eve Kennedy" + }, + { + "id": 2, + "name": "Curry Burke" + } + ], + "greeting": "Hello, Gordon England! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bdd3d5b4691f9f628", + "index": 146, + "guid": "653514db-e145-4172-91d2-ad24850c4c97", + "isActive": false, + "balance": "$3,124.09", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Amanda Weber", + "gender": "female", + "company": "NEBULEAN", + "email": "amandaweber@nebulean.com", + "phone": "+1 (863) 446-2596", + "address": "312 Bedell Lane, Motley, Florida, 4384", + "about": "Eiusmod Lorem ad irure dolor et sint elit non veniam amet. Id irure ut amet incididunt. Duis adipisicing reprehenderit est minim commodo eiusmod veniam ullamco aliqua proident cupidatat excepteur in. Do labore ipsum dolor id amet deserunt commodo nulla nostrud. Deserunt tempor pariatur consectetur ad enim veniam dolor ipsum voluptate. Non proident Lorem magna pariatur.\r\n", + "registered": "2018-10-14T10:12:41 -06:-30", + "latitude": -31.328371, + "longitude": 26.644046, + "tags": [ + "reprehenderit", + "magna", + "pariatur", + "consectetur", + "ullamco", + "mollit", + "quis" + ], + "friends": [ + { + "id": 0, + "name": "Kari Peck" + }, + { + "id": 1, + "name": "Shanna Wilder" + }, + { + "id": 2, + "name": "Katy Guerra" + } + ], + "greeting": "Hello, Amanda Weber! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbd7cf3b16cb9bdd8", + "index": 147, + "guid": "6bd835fe-0e05-4ccf-a453-66248770035d", + "isActive": true, + "balance": "$1,144.42", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Dillard Chen", + "gender": "male", + "company": "FIBRODYNE", + "email": "dillardchen@fibrodyne.com", + "phone": "+1 (944) 545-2440", + "address": "411 Butler Place, Bluffview, Washington, 2355", + "about": "Ipsum veniam amet anim duis exercitation nisi. Labore amet excepteur do adipisicing nulla minim sit culpa cupidatat nostrud voluptate eiusmod magna in. Esse mollit nisi est adipisicing amet tempor deserunt reprehenderit.\r\n", + "registered": "2015-10-24T11:22:29 -06:-30", + "latitude": 47.819434, + "longitude": 6.827121, + "tags": [ + "nisi", + "eu", + "consequat", + "dolor", + "veniam", + "aliquip", + "deserunt" + ], + "friends": [ + { + "id": 0, + "name": "Elnora Cole" + }, + { + "id": 1, + "name": "Rosario Compton" + }, + { + "id": 2, + "name": "Gutierrez Moon" + } + ], + "greeting": "Hello, Dillard Chen! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bfe58f12d03cfe721", + "index": 148, + "guid": "92860c1d-5145-4a81-b091-decbff111c44", + "isActive": false, + "balance": "$3,066.16", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Dorthy Rogers", + "gender": "female", + "company": "SARASONIC", + "email": "dorthyrogers@sarasonic.com", + "phone": "+1 (930) 543-3613", + "address": "859 Pacific Street, Dorneyville, Montana, 6625", + "about": "Lorem ad magna aliqua deserunt mollit duis. Laboris ex ullamco elit dolore adipisicing est esse mollit mollit. Aliquip sint et magna sint do amet quis nulla reprehenderit esse in mollit id dolor. Officia laboris magna ullamco adipisicing amet adipisicing non proident deserunt aute.\r\n", + "registered": "2016-03-13T11:03:28 -06:-30", + "latitude": 48.501519, + "longitude": -2.665044, + "tags": [ + "enim", + "laboris", + "in", + "Lorem", + "veniam", + "consectetur", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Franks Hester" + }, + { + "id": 1, + "name": "Ebony Lawrence" + }, + { + "id": 2, + "name": "Andrea Fowler" + } + ], + "greeting": "Hello, Dorthy Rogers! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbd91ae99ab588130", + "index": 149, + "guid": "bb59faa2-0959-4694-adae-b91947a8c30f", + "isActive": false, + "balance": "$2,348.01", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Chrystal Gross", + "gender": "female", + "company": "SLOFAST", + "email": "chrystalgross@slofast.com", + "phone": "+1 (871) 462-2731", + "address": "268 Lorraine Street, Kilbourne, Hawaii, 9952", + "about": "Ullamco nulla ut cillum commodo nisi. Duis aliquip consectetur deserunt nostrud velit commodo eu incididunt excepteur consectetur nostrud mollit. Id nulla dolor cillum labore dolor sint ea enim labore ea nostrud. Exercitation veniam nulla officia officia do laboris esse aliqua ullamco sit enim.\r\n", + "registered": "2015-08-13T09:23:58 -06:-30", + "latitude": 81.422929, + "longitude": 46.303317, + "tags": [ + "magna", + "reprehenderit", + "duis", + "exercitation", + "anim", + "enim", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Leach Moreno" + }, + { + "id": 1, + "name": "Clarke Marsh" + }, + { + "id": 2, + "name": "Jones Jones" + } + ], + "greeting": "Hello, Chrystal Gross! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1edcbba1a5715c32", + "index": 150, + "guid": "fc422133-b1eb-4027-8501-990d49cdaa89", + "isActive": true, + "balance": "$2,222.08", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Ramsey Flynn", + "gender": "male", + "company": "ISOSWITCH", + "email": "ramseyflynn@isoswitch.com", + "phone": "+1 (928) 599-2662", + "address": "517 Taaffe Place, Waverly, Michigan, 2624", + "about": "Aliquip nostrud et deserunt ad do dolore sint officia nostrud et veniam qui duis. In duis anim nisi voluptate. Enim aute excepteur qui excepteur nisi ipsum esse non in ullamco nostrud in non. Exercitation anim do voluptate commodo officia duis do sunt deserunt est cupidatat. Amet velit labore cupidatat sint velit sit reprehenderit.\r\n", + "registered": "2020-03-13T10:52:31 -06:-30", + "latitude": 48.916275, + "longitude": -118.409, + "tags": [ + "proident", + "eu", + "officia", + "sunt", + "do", + "laborum", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Rosalyn Wood" + }, + { + "id": 1, + "name": "Jane Holt" + }, + { + "id": 2, + "name": "Inez Foreman" + } + ], + "greeting": "Hello, Ramsey Flynn! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbd13f147930aef7d", + "index": 151, + "guid": "bccd4a49-c9c1-4723-bcfe-9f4abaf54497", + "isActive": false, + "balance": "$2,324.57", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "brown", + "name": "Liz Salazar", + "gender": "female", + "company": "MONDICIL", + "email": "lizsalazar@mondicil.com", + "phone": "+1 (862) 482-2192", + "address": "186 Blake Avenue, Shawmut, Maryland, 2832", + "about": "Proident ea et amet occaecat cupidatat amet enim id sint non duis. Minim Lorem nostrud deserunt aute sint exercitation deserunt. Enim incididunt in consectetur reprehenderit duis. Dolor sint tempor veniam aliqua.\r\n", + "registered": "2018-11-23T10:12:00 -06:-30", + "latitude": -0.102375, + "longitude": 43.028187, + "tags": [ + "eu", + "dolore", + "enim", + "sint", + "dolor", + "commodo", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Beatrice Ewing" + }, + { + "id": 1, + "name": "Petra Finch" + }, + { + "id": 2, + "name": "Nita Hoffman" + } + ], + "greeting": "Hello, Liz Salazar! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b69d41e80858b62b6", + "index": 152, + "guid": "9b8533b0-04b8-4b7e-ba30-4ba8ea6c990b", + "isActive": true, + "balance": "$2,477.91", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Morrow James", + "gender": "male", + "company": "PETIGEMS", + "email": "morrowjames@petigems.com", + "phone": "+1 (960) 432-3752", + "address": "583 Pleasant Place, Day, American Samoa, 7019", + "about": "Cillum velit velit ea velit ipsum sit anim officia fugiat sunt. Ex eu aliqua ea occaecat sunt. Occaecat et tempor Lorem nulla. Ut fugiat magna aliqua reprehenderit ipsum et sit magna culpa laborum. Enim id cupidatat incididunt duis enim non voluptate culpa adipisicing nulla nulla.\r\n", + "registered": "2016-06-13T10:27:48 -06:-30", + "latitude": -65.736441, + "longitude": -126.697588, + "tags": [ + "cillum", + "culpa", + "officia", + "nostrud", + "incididunt", + "velit", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Vivian Cervantes" + }, + { + "id": 1, + "name": "Socorro Suarez" + }, + { + "id": 2, + "name": "Lula Hensley" + } + ], + "greeting": "Hello, Morrow James! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b46dabf98abefd972", + "index": 153, + "guid": "d504a457-b9d6-4e75-ad9c-324cc47670a4", + "isActive": true, + "balance": "$1,971.90", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Wagner Gilliam", + "gender": "male", + "company": "REVERSUS", + "email": "wagnergilliam@reversus.com", + "phone": "+1 (833) 554-2880", + "address": "993 Ditmas Avenue, Marion, Illinois, 8426", + "about": "Magna fugiat eu consectetur et ut cupidatat qui excepteur magna ut. Laborum dolore laborum est veniam ipsum consectetur nisi. Ipsum irure in enim do sunt qui est consequat ipsum nostrud sint fugiat. Nisi tempor laborum esse consectetur commodo excepteur laboris nulla.\r\n", + "registered": "2022-06-26T07:13:15 -06:-30", + "latitude": -26.855155, + "longitude": 26.426935, + "tags": [ + "esse", + "ad", + "ipsum", + "officia", + "ea", + "commodo", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Tonia Sheppard" + }, + { + "id": 1, + "name": "Bell Frost" + }, + { + "id": 2, + "name": "Dora Pratt" + } + ], + "greeting": "Hello, Wagner Gilliam! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b91cc70c71657189c", + "index": 154, + "guid": "77050c41-b9ff-4c24-8ede-30af074259b5", + "isActive": true, + "balance": "$2,879.37", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Owens Schultz", + "gender": "male", + "company": "SUREMAX", + "email": "owensschultz@suremax.com", + "phone": "+1 (912) 592-2314", + "address": "797 Laurel Avenue, Idledale, Missouri, 8348", + "about": "Esse est non eiusmod voluptate voluptate ullamco duis cillum. Veniam duis qui duis enim veniam tempor mollit. Reprehenderit anim amet qui nisi irure quis aute id magna aliquip eiusmod excepteur sit.\r\n", + "registered": "2015-09-09T01:21:37 -06:-30", + "latitude": -2.258601, + "longitude": 133.210541, + "tags": [ + "officia", + "irure", + "proident", + "veniam", + "nostrud", + "adipisicing", + "dolore" + ], + "friends": [ + { + "id": 0, + "name": "Mollie Frank" + }, + { + "id": 1, + "name": "Ana Oconnor" + }, + { + "id": 2, + "name": "Dickson Mcdonald" + } + ], + "greeting": "Hello, Owens Schultz! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb09a0a160a31fefe", + "index": 155, + "guid": "181f876a-fd99-4bf9-98c8-1de08748b662", + "isActive": true, + "balance": "$1,368.66", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Karla Roth", + "gender": "female", + "company": "ORGANICA", + "email": "karlaroth@organica.com", + "phone": "+1 (812) 419-3237", + "address": "368 Bridge Street, Boyd, Idaho, 8909", + "about": "Id nostrud duis ex magna consectetur deserunt. Aute enim sint sint aliquip eu exercitation duis et consequat. Reprehenderit eu eu consectetur sunt fugiat qui fugiat. Reprehenderit minim ipsum tempor qui. Ullamco ut voluptate exercitation excepteur cupidatat. Cillum id ea elit veniam enim anim ex consectetur nulla.\r\n", + "registered": "2015-07-31T04:55:02 -06:-30", + "latitude": 15.367727, + "longitude": 92.374312, + "tags": [ + "nulla", + "dolore", + "excepteur", + "nulla", + "et", + "officia", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Mcgee Durham" + }, + { + "id": 1, + "name": "Sally Floyd" + }, + { + "id": 2, + "name": "Gates Best" + } + ], + "greeting": "Hello, Karla Roth! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4baeac4fed73d916fe", + "index": 156, + "guid": "8404dad2-4293-41ef-88de-cb658edeac06", + "isActive": true, + "balance": "$2,074.12", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Bass Swanson", + "gender": "male", + "company": "COMVOY", + "email": "bassswanson@comvoy.com", + "phone": "+1 (944) 493-3226", + "address": "339 Concord Street, Fedora, South Carolina, 5265", + "about": "Laboris dolor et occaecat ex. Irure in do culpa commodo reprehenderit consequat velit quis qui qui nostrud amet aliqua est. Exercitation nulla nostrud cupidatat consectetur aute labore occaecat anim reprehenderit culpa minim duis veniam elit. Consectetur officia proident ea irure ipsum. Nulla tempor eu cillum nisi excepteur aute laborum duis Lorem labore do adipisicing qui nostrud. Pariatur pariatur dolore labore ad.\r\n", + "registered": "2015-04-13T04:35:23 -06:-30", + "latitude": -76.339703, + "longitude": 100.2739, + "tags": [ + "fugiat", + "dolore", + "nisi", + "qui", + "dolore", + "velit", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "Mccoy Singleton" + }, + { + "id": 1, + "name": "Gilliam Holman" + }, + { + "id": 2, + "name": "Velma Espinoza" + } + ], + "greeting": "Hello, Bass Swanson! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4b83dc588268aeb3", + "index": 157, + "guid": "21acb02a-820c-494c-af3b-90ec4f76f210", + "isActive": true, + "balance": "$2,405.56", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Heath Bush", + "gender": "male", + "company": "UNIA", + "email": "heathbush@unia.com", + "phone": "+1 (975) 406-3561", + "address": "483 Cozine Avenue, Lund, Colorado, 4965", + "about": "Ea irure et amet laboris ipsum labore laboris officia ut commodo deserunt ea non. Nostrud est eiusmod cupidatat duis excepteur exercitation velit amet labore ex labore exercitation quis. Consequat est et cupidatat proident qui minim. Id amet consectetur dolore laborum aliqua. Dolore adipisicing cupidatat nostrud eu amet ex quis ut ullamco quis aliqua irure id incididunt.\r\n", + "registered": "2020-10-24T11:37:51 -06:-30", + "latitude": 69.164829, + "longitude": -93.661663, + "tags": [ + "ut", + "dolore", + "aliquip", + "ipsum", + "quis", + "proident", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Ryan Erickson" + }, + { + "id": 1, + "name": "Joanne Horn" + }, + { + "id": 2, + "name": "Cora Gutierrez" + } + ], + "greeting": "Hello, Heath Bush! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf3f98c2a520d3bb5", + "index": 158, + "guid": "0e183dca-1ee1-42e2-8ad8-d6b6f0de841e", + "isActive": true, + "balance": "$3,930.70", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Matilda Mccray", + "gender": "female", + "company": "QIMONK", + "email": "matildamccray@qimonk.com", + "phone": "+1 (802) 531-2209", + "address": "248 Garland Court, Crenshaw, New Hampshire, 4329", + "about": "Aute nostrud adipisicing eu nulla est consequat exercitation esse est aliquip ut id qui magna. Do id excepteur consectetur nostrud ullamco elit incididunt fugiat aliquip enim. Sint sunt quis in sit commodo.\r\n", + "registered": "2021-08-21T03:38:41 -06:-30", + "latitude": -67.913686, + "longitude": -67.363591, + "tags": [ + "deserunt", + "non", + "sunt", + "eu", + "nostrud", + "ea", + "consectetur" + ], + "friends": [ + { + "id": 0, + "name": "Anastasia Atkins" + }, + { + "id": 1, + "name": "Sadie Shaw" + }, + { + "id": 2, + "name": "Loretta Cummings" + } + ], + "greeting": "Hello, Matilda Mccray! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b285ee2940b942a7b", + "index": 159, + "guid": "f6a46315-8e0a-4d63-b37d-d9027652d9ac", + "isActive": false, + "balance": "$2,388.52", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Jeanine Wright", + "gender": "female", + "company": "MUSIX", + "email": "jeaninewright@musix.com", + "phone": "+1 (846) 582-3055", + "address": "391 Schenectady Avenue, Madaket, Minnesota, 1730", + "about": "Consequat veniam nulla cupidatat voluptate. Occaecat nulla excepteur magna velit pariatur elit nulla. Ipsum ipsum ad tempor fugiat enim nostrud velit elit id.\r\n", + "registered": "2021-02-14T05:17:52 -06:-30", + "latitude": 35.491269, + "longitude": -62.038458, + "tags": [ + "veniam", + "deserunt", + "reprehenderit", + "Lorem", + "nostrud", + "aute", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Earnestine Travis" + }, + { + "id": 1, + "name": "Robles Wiley" + }, + { + "id": 2, + "name": "Thornton Burgess" + } + ], + "greeting": "Hello, Jeanine Wright! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b1994a2a6abe157e4", + "index": 160, + "guid": "0ec6d558-bb79-4eaa-9b22-9eb60408ddff", + "isActive": true, + "balance": "$2,112.37", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Oneil Rosales", + "gender": "male", + "company": "PYRAMAX", + "email": "oneilrosales@pyramax.com", + "phone": "+1 (935) 508-2339", + "address": "782 Huron Street, Hebron, Utah, 2386", + "about": "Minim veniam laboris velit Lorem ea aliqua fugiat ad nostrud. Voluptate Lorem in laborum reprehenderit sunt dolor commodo irure anim ipsum veniam et cupidatat cupidatat. Aliqua do do laborum magna cillum nostrud voluptate.\r\n", + "registered": "2018-10-01T01:47:39 -06:-30", + "latitude": 84.337439, + "longitude": 141.604397, + "tags": [ + "esse", + "ut", + "irure", + "sint", + "est", + "eiusmod", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Ruth Silva" + }, + { + "id": 1, + "name": "Lesley Zimmerman" + }, + { + "id": 2, + "name": "Erma Wooten" + } + ], + "greeting": "Hello, Oneil Rosales! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1414b18d5607ece6", + "index": 161, + "guid": "3d358131-c6bd-4035-bf76-0ac54ac3e4c6", + "isActive": true, + "balance": "$2,280.78", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Gamble Oliver", + "gender": "male", + "company": "UTARA", + "email": "gambleoliver@utara.com", + "phone": "+1 (953) 469-2153", + "address": "152 Powers Street, Dargan, South Dakota, 1751", + "about": "Ullamco laborum amet dolore et cillum cillum fugiat id amet ex amet mollit. Ullamco ex minim anim sit dolor nisi ullamco eiusmod dolore ea. Amet cupidatat excepteur laborum sint et ut est aliqua tempor. Fugiat pariatur aute voluptate pariatur eiusmod dolor sit laboris tempor deserunt nulla laboris ex tempor.\r\n", + "registered": "2016-11-08T12:15:49 -06:-30", + "latitude": 80.471736, + "longitude": -110.638836, + "tags": [ + "pariatur", + "aute", + "ex", + "officia", + "anim", + "incididunt", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Lakeisha Turner" + }, + { + "id": 1, + "name": "Wheeler Guthrie" + }, + { + "id": 2, + "name": "Cara Washington" + } + ], + "greeting": "Hello, Gamble Oliver! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b983ae39e3f252900", + "index": 162, + "guid": "d0e24436-f943-45ba-a474-1a2febd20bf5", + "isActive": true, + "balance": "$1,938.60", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Margaret Mann", + "gender": "female", + "company": "ASSURITY", + "email": "margaretmann@assurity.com", + "phone": "+1 (804) 404-2556", + "address": "143 Fenimore Street, Blende, Arizona, 4681", + "about": "Veniam fugiat nulla dolore laboris nisi cupidatat cillum. Nisi exercitation eu anim aute cillum velit reprehenderit amet cupidatat ex proident. Do ipsum laboris elit incididunt cupidatat nostrud duis qui laborum proident deserunt. Excepteur elit voluptate eiusmod elit cillum enim consectetur nostrud duis voluptate reprehenderit ut ea laboris. Consequat quis qui ipsum sint qui commodo proident.\r\n", + "registered": "2019-04-21T09:03:23 -06:-30", + "latitude": 86.070514, + "longitude": 77.595485, + "tags": [ + "aliqua", + "irure", + "pariatur", + "amet", + "dolore", + "consequat", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Lawanda Ingram" + }, + { + "id": 1, + "name": "Carpenter Thornton" + }, + { + "id": 2, + "name": "Page Kirkland" + } + ], + "greeting": "Hello, Margaret Mann! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b736e5aec24fb92ca", + "index": 163, + "guid": "66046942-d8da-4634-9471-7ee7ff739524", + "isActive": false, + "balance": "$3,265.56", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Katheryn Mack", + "gender": "female", + "company": "TWIIST", + "email": "katherynmack@twiist.com", + "phone": "+1 (927) 407-2052", + "address": "462 Albemarle Road, Caron, Marshall Islands, 650", + "about": "Esse pariatur eiusmod incididunt ad Lorem velit. Sunt tempor nulla elit quis veniam excepteur. Enim esse aliquip dolor reprehenderit enim excepteur nulla dolore labore magna. Amet sint non culpa sit incididunt cillum sit.\r\n", + "registered": "2018-12-06T02:50:18 -06:-30", + "latitude": -64.52358, + "longitude": 51.264098, + "tags": [ + "tempor", + "id", + "velit", + "quis", + "magna", + "ex", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Jody Leach" + }, + { + "id": 1, + "name": "Mayer Kelly" + }, + { + "id": 2, + "name": "Tania Knapp" + } + ], + "greeting": "Hello, Katheryn Mack! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3f18f19468bb35e5", + "index": 164, + "guid": "9b0ab1de-176f-46f3-8127-789fd905ee09", + "isActive": false, + "balance": "$3,380.67", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Iris Rice", + "gender": "female", + "company": "PERKLE", + "email": "irisrice@perkle.com", + "phone": "+1 (874) 475-3635", + "address": "556 Cambridge Place, Fontanelle, Ohio, 1572", + "about": "Elit esse consequat cillum amet non aute quis. Aute laboris laborum laboris ut. Consectetur fugiat consectetur laboris consequat reprehenderit quis qui voluptate dolore amet tempor sit in ea. Exercitation aliqua ipsum exercitation ullamco eu proident enim deserunt culpa id. Nisi enim labore magna pariatur id mollit.\r\n", + "registered": "2022-04-25T09:10:57 -06:-30", + "latitude": 42.577341, + "longitude": 152.269849, + "tags": [ + "eu", + "aliqua", + "et", + "nisi", + "voluptate", + "id", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Conrad Fulton" + }, + { + "id": 1, + "name": "Hall Montoya" + }, + { + "id": 2, + "name": "Cherie Warren" + } + ], + "greeting": "Hello, Iris Rice! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b6f8e67998b250899", + "index": 165, + "guid": "57681105-593b-477a-b101-75224ed68210", + "isActive": true, + "balance": "$1,414.67", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Rebecca Romero", + "gender": "female", + "company": "SPRINGBEE", + "email": "rebeccaromero@springbee.com", + "phone": "+1 (942) 519-2287", + "address": "591 Verona Street, Riviera, Alabama, 3666", + "about": "Dolor nulla mollit fugiat cupidatat ullamco. Sint incididunt eiusmod cupidatat enim aute excepteur Lorem occaecat incididunt tempor cupidatat amet. Qui veniam magna aute laboris tempor ad pariatur pariatur. Dolore incididunt excepteur nisi eu laboris esse ea eiusmod elit ipsum. Non cupidatat in quis culpa velit reprehenderit quis ea. Mollit cillum duis laborum ea laborum exercitation.\r\n", + "registered": "2017-08-20T07:56:40 -06:-30", + "latitude": 87.241056, + "longitude": -44.217269, + "tags": [ + "proident", + "aliquip", + "occaecat", + "enim", + "adipisicing", + "ex", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Wilma Franklin" + }, + { + "id": 1, + "name": "Hardy Sharp" + }, + { + "id": 2, + "name": "Elise Burch" + } + ], + "greeting": "Hello, Rebecca Romero! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b27b5ba19b3de09b0", + "index": 166, + "guid": "79025e0d-4a3c-48a7-bd10-5cecf9167e9e", + "isActive": false, + "balance": "$1,624.62", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Rosanna Byers", + "gender": "female", + "company": "STROZEN", + "email": "rosannabyers@strozen.com", + "phone": "+1 (961) 584-3508", + "address": "829 Throop Avenue, Cherokee, Georgia, 2558", + "about": "Officia ex labore labore fugiat nostrud id officia sit deserunt minim. Irure nostrud ipsum eiusmod nulla in est quis. Laborum ea deserunt nisi consectetur. Enim ex incididunt commodo proident laboris cupidatat dolore sunt qui. Irure adipisicing sit ipsum voluptate ipsum eu quis consectetur dolor laboris in anim irure proident. Enim cillum ad magna tempor exercitation ullamco aute et labore consectetur excepteur. Culpa sunt ad voluptate sunt aute aliqua laborum mollit exercitation tempor ex.\r\n", + "registered": "2015-11-09T08:56:25 -06:-30", + "latitude": -0.566952, + "longitude": 127.164456, + "tags": [ + "consectetur", + "quis", + "occaecat", + "nulla", + "mollit", + "est", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Patti Harvey" + }, + { + "id": 1, + "name": "Wanda West" + }, + { + "id": 2, + "name": "Alice Porter" + } + ], + "greeting": "Hello, Rosanna Byers! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdcd589a939aed31b", + "index": 167, + "guid": "c416c12e-242e-4252-aad8-c221c937ed09", + "isActive": true, + "balance": "$2,464.39", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Annmarie Monroe", + "gender": "female", + "company": "MARVANE", + "email": "annmariemonroe@marvane.com", + "phone": "+1 (840) 491-3039", + "address": "862 Forest Place, Tuskahoma, California, 5016", + "about": "Officia eiusmod cupidatat officia Lorem laboris exercitation commodo laboris laborum nisi ea dolor deserunt dolore. Cillum ad et incididunt culpa cupidatat. Amet id id magna incididunt eu cillum eu esse magna sit esse ex do duis. Tempor pariatur dolore do minim. Enim commodo mollit minim reprehenderit.\r\n", + "registered": "2017-01-14T02:02:48 -06:-30", + "latitude": 83.126581, + "longitude": 170.190769, + "tags": [ + "amet", + "aute", + "minim", + "mollit", + "ex", + "aute", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Mclaughlin Lester" + }, + { + "id": 1, + "name": "Irwin Clarke" + }, + { + "id": 2, + "name": "Fisher David" + } + ], + "greeting": "Hello, Annmarie Monroe! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba78aa0fabd049d55", + "index": 168, + "guid": "ab377685-bdbc-496a-a5bc-73d9b9c3eeb6", + "isActive": true, + "balance": "$1,453.31", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "Marlene Hopkins", + "gender": "female", + "company": "BRAINCLIP", + "email": "marlenehopkins@brainclip.com", + "phone": "+1 (981) 442-2826", + "address": "851 Poplar Street, Northchase, Northern Mariana Islands, 4066", + "about": "Deserunt aliqua esse amet dolor reprehenderit culpa amet non esse est ad qui cillum. Consequat labore sint incididunt dolor aute mollit. Aute culpa mollit proident eu Lorem excepteur duis dolor eiusmod cillum sit pariatur officia proident. Nostrud eiusmod do irure qui culpa veniam fugiat eu laboris exercitation. Ea incididunt mollit tempor culpa eu.\r\n", + "registered": "2017-04-14T09:48:06 -06:-30", + "latitude": 6.811668, + "longitude": 66.658322, + "tags": [ + "eiusmod", + "nulla", + "adipisicing", + "eu", + "aliquip", + "ex", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Clare Alston" + }, + { + "id": 1, + "name": "Lenore Mayer" + }, + { + "id": 2, + "name": "Leanne Doyle" + } + ], + "greeting": "Hello, Marlene Hopkins! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd637ab5d0f796972", + "index": 169, + "guid": "8ca244bc-9096-4811-99f7-2c93f7bc8750", + "isActive": true, + "balance": "$1,358.81", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Malone Barnes", + "gender": "male", + "company": "AFFLUEX", + "email": "malonebarnes@affluex.com", + "phone": "+1 (878) 437-2159", + "address": "189 Poplar Avenue, Walland, Kansas, 750", + "about": "Elit ipsum velit voluptate eu. Ullamco tempor culpa consequat cillum dolor. Excepteur cupidatat fugiat labore ex voluptate laboris sit aute veniam exercitation esse labore. Anim nisi pariatur est non nostrud magna mollit ex.\r\n", + "registered": "2017-03-25T04:41:47 -06:-30", + "latitude": -70.339041, + "longitude": 52.987656, + "tags": [ + "veniam", + "labore", + "pariatur", + "ea", + "tempor", + "pariatur", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Mae Barron" + }, + { + "id": 1, + "name": "Theresa Ortiz" + }, + { + "id": 2, + "name": "Tran Valenzuela" + } + ], + "greeting": "Hello, Malone Barnes! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b238ff4cd06bd3183", + "index": 170, + "guid": "d606f595-dfb9-4895-83ab-66127b7d20e2", + "isActive": true, + "balance": "$2,147.47", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Rosemarie Berg", + "gender": "female", + "company": "ANACHO", + "email": "rosemarieberg@anacho.com", + "phone": "+1 (915) 594-2844", + "address": "473 Clara Street, Sunwest, North Dakota, 3095", + "about": "Quis amet dolore dolore esse laboris deserunt. Sunt ut laborum est labore non et ullamco laboris. Aute consequat eu commodo elit ex ipsum in reprehenderit aliquip velit ea. Laborum id laboris eiusmod excepteur duis ad eu. Veniam aliqua do exercitation pariatur laborum nostrud.\r\n", + "registered": "2020-11-29T02:38:06 -06:-30", + "latitude": -10.378067, + "longitude": 117.147321, + "tags": [ + "magna", + "non", + "est", + "consectetur", + "qui", + "deserunt", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Clarissa Dyer" + }, + { + "id": 1, + "name": "Maryanne Andrews" + }, + { + "id": 2, + "name": "Decker Mathews" + } + ], + "greeting": "Hello, Rosemarie Berg! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf3c56e91b91c313a", + "index": 171, + "guid": "dd6abd8c-26ab-465b-b63c-eaea78ea6cc9", + "isActive": true, + "balance": "$1,379.45", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "Smith Coleman", + "gender": "male", + "company": "KEGULAR", + "email": "smithcoleman@kegular.com", + "phone": "+1 (878) 481-3175", + "address": "282 Schermerhorn Street, Richford, New York, 9587", + "about": "Aliquip quis mollit eiusmod eu. Fugiat est in incididunt aliquip sunt. Tempor eiusmod velit mollit nostrud adipisicing nostrud laboris aliqua cupidatat eiusmod sit. Dolore deserunt fugiat sunt aliqua sint reprehenderit deserunt excepteur pariatur culpa ipsum sunt exercitation.\r\n", + "registered": "2015-11-05T04:10:52 -06:-30", + "latitude": -68.918024, + "longitude": -143.804763, + "tags": [ + "magna", + "anim", + "occaecat", + "sunt", + "ut", + "aliqua", + "ipsum" + ], + "friends": [ + { + "id": 0, + "name": "Lavonne Schmidt" + }, + { + "id": 1, + "name": "Briggs Willis" + }, + { + "id": 2, + "name": "Annabelle Ayers" + } + ], + "greeting": "Hello, Smith Coleman! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b72c65c9b9d9d28ca", + "index": 172, + "guid": "98d27ce2-b541-49fd-8e24-0dfbb3f13231", + "isActive": true, + "balance": "$3,922.21", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Aguilar Whitaker", + "gender": "male", + "company": "TROLLERY", + "email": "aguilarwhitaker@trollery.com", + "phone": "+1 (837) 580-2374", + "address": "821 Dupont Street, Kapowsin, New Jersey, 230", + "about": "Ad voluptate esse mollit in nulla incididunt sunt. Nostrud commodo consequat do laborum pariatur nulla dolore ullamco do voluptate eu. Nulla officia irure exercitation veniam sunt officia nostrud est consequat eu ipsum et deserunt. Tempor id ex fugiat commodo commodo.\r\n", + "registered": "2021-03-07T07:57:20 -06:-30", + "latitude": 2.283148, + "longitude": -177.530252, + "tags": [ + "pariatur", + "sit", + "magna", + "do", + "mollit", + "quis", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Stephens Burnett" + }, + { + "id": 1, + "name": "Figueroa Russell" + }, + { + "id": 2, + "name": "Rivera Carney" + } + ], + "greeting": "Hello, Aguilar Whitaker! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1722a1bdd5146d4f", + "index": 173, + "guid": "97456ca3-68e2-445d-b480-46306cedb250", + "isActive": true, + "balance": "$1,670.54", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "green", + "name": "Pam Clark", + "gender": "female", + "company": "ZIDOX", + "email": "pamclark@zidox.com", + "phone": "+1 (830) 477-2797", + "address": "578 Lewis Place, Gambrills, Texas, 6951", + "about": "Enim laboris est enim proident dolore. Tempor proident esse consequat irure dolore minim. Et cillum culpa esse et occaecat qui. Aute eiusmod ea id reprehenderit elit ad sit. Tempor proident sunt Lorem quis est aute. Ea ipsum sunt mollit nisi incididunt aliqua do nostrud.\r\n", + "registered": "2021-11-13T04:12:11 -06:-30", + "latitude": 64.307153, + "longitude": 23.914476, + "tags": [ + "et", + "ad", + "veniam", + "proident", + "magna", + "excepteur", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Allyson Yang" + }, + { + "id": 1, + "name": "Porter Mercer" + }, + { + "id": 2, + "name": "Stuart Lynch" + } + ], + "greeting": "Hello, Pam Clark! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b420d5ad89ee1450e", + "index": 174, + "guid": "16809719-f282-4532-837c-37818dc2798d", + "isActive": false, + "balance": "$3,213.00", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Natalie Perez", + "gender": "female", + "company": "BLANET", + "email": "natalieperez@blanet.com", + "phone": "+1 (850) 590-2036", + "address": "219 Debevoise Avenue, Windsor, Massachusetts, 3158", + "about": "Laboris adipisicing aliqua irure qui adipisicing enim laborum officia laboris sunt nisi quis eiusmod. Dolore ad labore eu sint eiusmod enim aute cillum in sunt deserunt officia. Dolore laborum fugiat dolore occaecat do cupidatat pariatur nostrud ad excepteur elit.\r\n", + "registered": "2015-12-13T07:59:52 -06:-30", + "latitude": -38.934322, + "longitude": 118.902268, + "tags": [ + "aliquip", + "aliqua", + "anim", + "esse", + "fugiat", + "do", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Janine Nash" + }, + { + "id": 1, + "name": "Jo Black" + }, + { + "id": 2, + "name": "Burris Witt" + } + ], + "greeting": "Hello, Natalie Perez! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b6bc886cc0e626479", + "index": 175, + "guid": "8653af13-c8cc-4042-8099-68505a560d8e", + "isActive": true, + "balance": "$3,442.53", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Pearson Trujillo", + "gender": "male", + "company": "CEDWARD", + "email": "pearsontrujillo@cedward.com", + "phone": "+1 (894) 445-2402", + "address": "650 Sunnyside Court, Zortman, Palau, 3695", + "about": "Adipisicing nisi laborum id adipisicing voluptate ea labore et eu aliquip laborum. Duis esse nostrud velit cupidatat fugiat veniam dolor aliqua veniam proident do occaecat amet. Commodo laborum exercitation consectetur consectetur dolore reprehenderit magna occaecat esse aute qui laborum nostrud esse. Lorem sit in adipisicing minim pariatur nostrud qui elit magna duis irure nulla laborum quis. Id cupidatat est qui laborum officia dolor laborum est aliquip aute magna et voluptate. Officia aliqua Lorem veniam quis proident.\r\n", + "registered": "2016-09-11T05:37:17 -06:-30", + "latitude": 51.969802, + "longitude": -100.893343, + "tags": [ + "pariatur", + "minim", + "ex", + "exercitation", + "adipisicing", + "qui", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Rosales Bartlett" + }, + { + "id": 1, + "name": "Daisy Zamora" + }, + { + "id": 2, + "name": "Swanson Lott" + } + ], + "greeting": "Hello, Pearson Trujillo! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b72f56afbfc732004", + "index": 176, + "guid": "3ab550f9-0e56-461d-a9ec-39b0c1b80df7", + "isActive": true, + "balance": "$1,434.34", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Jami Cooley", + "gender": "female", + "company": "HALAP", + "email": "jamicooley@halap.com", + "phone": "+1 (964) 593-3263", + "address": "846 Beach Place, Logan, Alaska, 6902", + "about": "Veniam labore aliquip tempor deserunt incididunt mollit laborum aliquip laborum aliqua. Cupidatat eiusmod nisi deserunt id do elit proident ex. Amet consectetur et dolore commodo laborum officia laboris Lorem sit eu nulla. Fugiat elit nostrud culpa aute ipsum nisi esse.\r\n", + "registered": "2019-09-28T06:53:18 -06:-30", + "latitude": 45.417035, + "longitude": -90.015522, + "tags": [ + "consequat", + "proident", + "consequat", + "veniam", + "et", + "cillum", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Mason Davenport" + }, + { + "id": 1, + "name": "Merrill Long" + }, + { + "id": 2, + "name": "Kasey George" + } + ], + "greeting": "Hello, Jami Cooley! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdb316ecfc651487c", + "index": 177, + "guid": "84d53db8-39d2-4cd4-aa37-d8cc5ba7d452", + "isActive": false, + "balance": "$2,074.46", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Snyder Holloway", + "gender": "male", + "company": "TRIPSCH", + "email": "snyderholloway@tripsch.com", + "phone": "+1 (973) 523-3622", + "address": "810 Bank Street, Caledonia, Oklahoma, 1052", + "about": "Ipsum id veniam tempor duis laborum id nostrud laborum fugiat. Excepteur incididunt laborum laborum enim ipsum. Officia elit reprehenderit incididunt deserunt do laborum aliquip minim pariatur veniam do. Anim magna cupidatat dolor eiusmod. Cupidatat ea deserunt dolore duis incididunt nostrud magna reprehenderit officia mollit dolore. Eu anim aute voluptate consequat id deserunt ex eu sit adipisicing est ipsum tempor.\r\n", + "registered": "2014-01-31T09:19:39 -06:-30", + "latitude": 3.530161, + "longitude": 61.704719, + "tags": [ + "enim", + "ipsum", + "aute", + "est", + "commodo", + "labore", + "enim" + ], + "friends": [ + { + "id": 0, + "name": "Tameka Harmon" + }, + { + "id": 1, + "name": "Cleo Ray" + }, + { + "id": 2, + "name": "Debbie Bauer" + } + ], + "greeting": "Hello, Snyder Holloway! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4baf8298820a967bd8", + "index": 178, + "guid": "be3e6287-9e1a-4bcf-8999-385f9394218e", + "isActive": true, + "balance": "$3,472.87", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Romero Gill", + "gender": "male", + "company": "ORBALIX", + "email": "romerogill@orbalix.com", + "phone": "+1 (868) 497-3548", + "address": "751 Clarendon Road, Urbana, New Mexico, 5533", + "about": "Mollit sit tempor excepteur aute est consectetur fugiat deserunt cillum tempor qui eiusmod duis culpa. Dolore non consectetur in duis sit qui mollit ut nisi nostrud eu eiusmod. Consequat qui culpa laborum tempor voluptate et eiusmod.\r\n", + "registered": "2022-09-28T01:13:20 -06:-30", + "latitude": -25.631899, + "longitude": 55.631976, + "tags": [ + "elit", + "ad", + "pariatur", + "enim", + "adipisicing", + "elit", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Caldwell Stevenson" + }, + { + "id": 1, + "name": "Kline Walter" + }, + { + "id": 2, + "name": "Kay Bird" + } + ], + "greeting": "Hello, Romero Gill! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b789469583ca30e04", + "index": 179, + "guid": "12eda218-4bdd-4f4a-a2af-af07d4cec89b", + "isActive": false, + "balance": "$3,503.47", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "West Hartman", + "gender": "male", + "company": "ZENSOR", + "email": "westhartman@zensor.com", + "phone": "+1 (967) 439-2218", + "address": "688 Loring Avenue, Chesapeake, Wyoming, 4621", + "about": "Lorem Lorem qui elit est culpa. Deserunt excepteur ex minim ea sunt laborum ullamco nulla ad. Aliqua minim elit et et id nostrud labore proident reprehenderit dolore velit exercitation. Veniam aute in nisi sit aute velit voluptate occaecat cupidatat aliquip.\r\n", + "registered": "2021-01-10T07:16:06 -06:-30", + "latitude": 88.792089, + "longitude": -134.954465, + "tags": [ + "occaecat", + "ad", + "enim", + "aliquip", + "officia", + "sunt", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Paula Carroll" + }, + { + "id": 1, + "name": "Paulette Yates" + }, + { + "id": 2, + "name": "Wolfe Hull" + } + ], + "greeting": "Hello, West Hartman! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b98fdb3ecc64a93c8", + "index": 180, + "guid": "84465a4b-db3b-4017-9001-e3c066a6baa1", + "isActive": true, + "balance": "$3,261.93", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Lott Sargent", + "gender": "male", + "company": "GOLOGY", + "email": "lottsargent@gology.com", + "phone": "+1 (817) 595-2921", + "address": "943 Greenpoint Avenue, Why, Rhode Island, 1956", + "about": "Eu quis laboris ex qui. Dolor aliquip elit tempor cillum aliqua exercitation. Laborum in eu deserunt laborum consectetur ut. Id ea enim dolor quis sint. Est aliquip dolor exercitation incididunt id Lorem velit et ea laboris nisi. Anim adipisicing incididunt est eiusmod. Deserunt ullamco sint amet id nisi pariatur dolore ut ipsum velit mollit minim fugiat velit.\r\n", + "registered": "2021-04-13T01:08:59 -06:-30", + "latitude": 9.952211, + "longitude": 119.517541, + "tags": [ + "sint", + "ea", + "Lorem", + "quis", + "velit", + "cillum", + "excepteur" + ], + "friends": [ + { + "id": 0, + "name": "Berry Petersen" + }, + { + "id": 1, + "name": "Johanna Buck" + }, + { + "id": 2, + "name": "Dixon Mcguire" + } + ], + "greeting": "Hello, Lott Sargent! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bc56aa042e70f2566", + "index": 181, + "guid": "37f93242-58f9-4cb6-9cf3-1f07d1c53e72", + "isActive": true, + "balance": "$3,066.65", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Sampson Lara", + "gender": "male", + "company": "KIOSK", + "email": "sampsonlara@kiosk.com", + "phone": "+1 (877) 530-3536", + "address": "961 Varick Avenue, Kula, West Virginia, 2863", + "about": "Do magna irure aliquip eiusmod sit nisi ex. Tempor quis tempor nisi aliqua eu laborum ipsum anim minim deserunt nulla magna consequat qui. Adipisicing dolore pariatur culpa dolore nisi non esse tempor veniam deserunt sunt nostrud laborum.\r\n", + "registered": "2016-04-09T06:13:20 -06:-30", + "latitude": -76.824609, + "longitude": 148.364771, + "tags": [ + "nisi", + "nisi", + "Lorem", + "ut", + "labore", + "ad", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Blevins Benton" + }, + { + "id": 1, + "name": "Mildred Maddox" + }, + { + "id": 2, + "name": "Cherry Boyer" + } + ], + "greeting": "Hello, Sampson Lara! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb051ec283cb82cd1", + "index": 182, + "guid": "411731da-e938-444a-9980-432226166557", + "isActive": true, + "balance": "$3,283.56", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Elma Bowen", + "gender": "female", + "company": "UNEEQ", + "email": "elmabowen@uneeq.com", + "phone": "+1 (893) 560-3093", + "address": "480 Elton Street, Croom, Nevada, 8230", + "about": "Aliquip cillum do officia minim ex eu commodo duis et aliquip elit pariatur consectetur. Non incididunt non commodo irure amet. Enim ea irure nulla consequat amet fugiat nisi mollit incididunt ad amet Lorem dolore nulla. Qui dolore nulla quis sint et amet sunt anim. Incididunt officia ea culpa cillum excepteur aliquip tempor veniam qui do. Veniam tempor et minim nulla adipisicing duis pariatur quis commodo mollit. Elit elit irure tempor amet culpa.\r\n", + "registered": "2020-06-18T06:35:59 -06:-30", + "latitude": 61.226426, + "longitude": -56.395946, + "tags": [ + "commodo", + "fugiat", + "esse", + "esse", + "eiusmod", + "amet", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Nelda Gallegos" + }, + { + "id": 1, + "name": "Pearlie Cobb" + }, + { + "id": 2, + "name": "Shepard Joseph" + } + ], + "greeting": "Hello, Elma Bowen! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b95436e3f3e9a97f8", + "index": 183, + "guid": "528fe959-8817-433d-bedb-59e5a3c78daa", + "isActive": true, + "balance": "$3,282.33", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Patsy Hodges", + "gender": "female", + "company": "HAWKSTER", + "email": "patsyhodges@hawkster.com", + "phone": "+1 (829) 563-2558", + "address": "853 Cox Place, Detroit, Delaware, 7661", + "about": "Cupidatat ad veniam nostrud esse dolore qui. In culpa incididunt sint proident nisi deserunt magna cillum quis incididunt exercitation do dolore. Aliquip voluptate ea veniam mollit amet sint eiusmod tempor excepteur excepteur magna veniam dolor. Aliqua eu nulla do est. Qui irure sunt commodo minim magna.\r\n", + "registered": "2016-10-23T08:39:33 -06:-30", + "latitude": -86.964278, + "longitude": -22.040929, + "tags": [ + "consequat", + "consectetur", + "laborum", + "aliqua", + "aliqua", + "commodo", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Kate Campbell" + }, + { + "id": 1, + "name": "Blankenship Pennington" + }, + { + "id": 2, + "name": "Short Benson" + } + ], + "greeting": "Hello, Patsy Hodges! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1b00c9e510e80f4b", + "index": 184, + "guid": "2b0d2fd8-b6a6-45c3-8d0a-281829f06896", + "isActive": false, + "balance": "$1,490.88", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Gardner Hanson", + "gender": "male", + "company": "OPPORTECH", + "email": "gardnerhanson@opportech.com", + "phone": "+1 (839) 431-2938", + "address": "781 Arkansas Drive, Elrama, Federated States Of Micronesia, 3885", + "about": "Ipsum excepteur aute commodo sit esse anim consectetur aute nulla ad Lorem. Et consequat laborum duis cillum consectetur voluptate elit laboris incididunt mollit mollit irure. Nulla reprehenderit occaecat cillum incididunt minim. Aute velit commodo esse ut reprehenderit ad dolor pariatur. Adipisicing dolore aute in exercitation velit ex. Nisi pariatur eiusmod labore eiusmod fugiat sit est minim reprehenderit proident. Incididunt ex incididunt Lorem do voluptate ea.\r\n", + "registered": "2014-07-28T04:03:17 -06:-30", + "latitude": -2.715831, + "longitude": 119.99923, + "tags": [ + "proident", + "occaecat", + "laborum", + "esse", + "mollit", + "do", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Talley Norman" + }, + { + "id": 1, + "name": "Bonner Stafford" + }, + { + "id": 2, + "name": "Henrietta Phillips" + } + ], + "greeting": "Hello, Gardner Hanson! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b90b692d4d5f86035", + "index": 185, + "guid": "5afbaef8-e4d0-4989-874d-c7ae235c9700", + "isActive": false, + "balance": "$1,433.83", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Erin Poole", + "gender": "female", + "company": "ZILLACON", + "email": "erinpoole@zillacon.com", + "phone": "+1 (836) 543-2901", + "address": "810 Bedford Place, Sterling, Pennsylvania, 9458", + "about": "Nostrud exercitation commodo cupidatat reprehenderit sunt proident pariatur. Ex dolore labore voluptate voluptate labore anim minim fugiat tempor. Do dolore est proident reprehenderit est do enim. Minim voluptate excepteur mollit enim laboris tempor sint irure. Amet velit eu aliqua velit occaecat ipsum. Consequat in sint aliquip non. Officia non esse irure mollit.\r\n", + "registered": "2021-04-25T07:27:05 -06:-30", + "latitude": -89.773441, + "longitude": 68.954632, + "tags": [ + "excepteur", + "mollit", + "excepteur", + "anim", + "aliquip", + "consequat", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Pollard Woodward" + }, + { + "id": 1, + "name": "Wiley Higgins" + }, + { + "id": 2, + "name": "Thelma Charles" + } + ], + "greeting": "Hello, Erin Poole! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd96e02c89b520546", + "index": 186, + "guid": "b1075d74-0a44-4d2e-97e3-b587dcbb6150", + "isActive": true, + "balance": "$1,919.87", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Teri Todd", + "gender": "female", + "company": "ZEDALIS", + "email": "teritodd@zedalis.com", + "phone": "+1 (802) 472-2845", + "address": "637 Cedar Street, Manchester, Connecticut, 2500", + "about": "Laborum ex veniam esse ipsum eu ad tempor Lorem incididunt cupidatat occaecat veniam. In sint ullamco id pariatur eiusmod magna cupidatat pariatur ullamco duis enim fugiat ad excepteur. Nisi anim officia ex et est culpa nisi ipsum cupidatat nostrud commodo. Id in elit est esse esse.\r\n", + "registered": "2020-02-26T06:26:33 -06:-30", + "latitude": -70.492639, + "longitude": -103.549422, + "tags": [ + "et", + "non", + "laborum", + "cillum", + "aliqua", + "reprehenderit", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Jill Weiss" + }, + { + "id": 1, + "name": "Parsons Whitney" + }, + { + "id": 2, + "name": "Joan Coffey" + } + ], + "greeting": "Hello, Teri Todd! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1331744b777d952e", + "index": 187, + "guid": "570ba051-4c58-4ebf-a2b4-02833697581f", + "isActive": true, + "balance": "$2,221.51", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Grace Camacho", + "gender": "female", + "company": "TECHADE", + "email": "gracecamacho@techade.com", + "phone": "+1 (845) 404-2471", + "address": "459 Knickerbocker Avenue, Talpa, Louisiana, 6145", + "about": "Magna cillum incididunt est sit incididunt sit consectetur ea officia. Tempor consectetur culpa enim voluptate excepteur reprehenderit anim et commodo consequat do enim amet sit. Et enim aliqua aliqua aliquip reprehenderit eu ullamco anim non dolor officia sunt mollit ut. Duis esse occaecat cupidatat deserunt do amet consectetur eiusmod proident exercitation eiusmod aute voluptate. Dolore officia proident cillum et excepteur anim velit excepteur incididunt. Aute eu pariatur voluptate duis consectetur non excepteur elit ut aliquip dolore ad qui. Laborum fugiat mollit nostrud aute dolor aliquip est proident ullamco ex pariatur adipisicing occaecat.\r\n", + "registered": "2018-05-09T07:01:13 -06:-30", + "latitude": 51.755906, + "longitude": -147.17892, + "tags": [ + "ipsum", + "consequat", + "nisi", + "laboris", + "labore", + "eu", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Reed Randall" + }, + { + "id": 1, + "name": "Ellis Fletcher" + }, + { + "id": 2, + "name": "Mendez Barrera" + } + ], + "greeting": "Hello, Grace Camacho! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0d35e45d6644ba57", + "index": 188, + "guid": "31bd4cd1-6a49-4d35-918c-fb99da9cc894", + "isActive": false, + "balance": "$1,591.49", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Travis Abbott", + "gender": "male", + "company": "PRINTSPAN", + "email": "travisabbott@printspan.com", + "phone": "+1 (887) 583-3018", + "address": "616 Putnam Avenue, Dubois, Vermont, 1037", + "about": "Sint adipisicing minim proident duis ad minim velit. Ipsum duis minim pariatur anim Lorem. Ullamco labore esse enim culpa laborum sunt. Aliquip nulla officia laboris veniam ex adipisicing enim duis mollit incididunt amet fugiat anim cupidatat. Exercitation dolore magna aliqua aliquip nisi adipisicing sint reprehenderit sint pariatur ea commodo deserunt. Ad incididunt consequat cupidatat aliquip reprehenderit amet ex magna deserunt qui aliquip incididunt. Enim nostrud veniam deserunt culpa irure laboris irure Lorem laboris laborum fugiat mollit quis.\r\n", + "registered": "2015-11-11T02:57:08 -06:-30", + "latitude": 79.778232, + "longitude": -54.754761, + "tags": [ + "cupidatat", + "proident", + "veniam", + "eu", + "eu", + "consequat", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Randall Cannon" + }, + { + "id": 1, + "name": "Leonor Carey" + }, + { + "id": 2, + "name": "Rose Drake" + } + ], + "greeting": "Hello, Travis Abbott! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4f5d6ecc28f28ea1", + "index": 189, + "guid": "9f87d60a-95ad-4d58-a142-1240680e20db", + "isActive": true, + "balance": "$2,051.53", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Kellie Castillo", + "gender": "female", + "company": "ORONOKO", + "email": "kelliecastillo@oronoko.com", + "phone": "+1 (966) 525-2919", + "address": "307 Turner Place, Riner, Iowa, 5115", + "about": "Dolor adipisicing excepteur eu aliqua nisi ut aute in aliquip. Eu nostrud aliqua ea laboris commodo minim elit ipsum. Eiusmod non enim veniam duis mollit ullamco labore enim ad sit Lorem proident. Mollit ad irure aliqua aliquip velit commodo adipisicing nulla deserunt. Aute ex duis deserunt exercitation labore minim voluptate consectetur reprehenderit excepteur commodo consequat proident et. Fugiat officia eiusmod cupidatat Lorem enim fugiat tempor. Culpa reprehenderit aliqua dolor sunt pariatur consectetur esse consectetur fugiat velit consequat proident.\r\n", + "registered": "2022-10-03T02:50:55 -06:-30", + "latitude": -44.071797, + "longitude": 9.680767, + "tags": [ + "tempor", + "ut", + "minim", + "amet", + "exercitation", + "duis", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Sandy Stewart" + }, + { + "id": 1, + "name": "Lakisha Avery" + }, + { + "id": 2, + "name": "Carole Meyers" + } + ], + "greeting": "Hello, Kellie Castillo! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf20f9fadfd2d5afe", + "index": 190, + "guid": "aafd9892-03bb-4887-a56f-d8be0575f247", + "isActive": false, + "balance": "$2,911.16", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "brown", + "name": "Rasmussen Butler", + "gender": "male", + "company": "VIAGREAT", + "email": "rasmussenbutler@viagreat.com", + "phone": "+1 (959) 587-2910", + "address": "717 Summit Street, Lynn, Virginia, 6276", + "about": "Adipisicing minim ex proident exercitation est. Laboris aliquip fugiat nisi laborum ex sit. Aute ipsum enim officia magna elit et aliquip culpa. In adipisicing irure qui ex do deserunt irure reprehenderit ipsum occaecat ex ipsum incididunt officia. Consectetur culpa cillum irure quis esse proident aliquip commodo nisi tempor velit sit.\r\n", + "registered": "2016-02-03T12:18:46 -06:-30", + "latitude": 32.39676, + "longitude": 72.387162, + "tags": [ + "duis", + "officia", + "dolor", + "cillum", + "dolore", + "dolore", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Estelle Sexton" + }, + { + "id": 1, + "name": "Joni Harding" + }, + { + "id": 2, + "name": "Conner Livingston" + } + ], + "greeting": "Hello, Rasmussen Butler! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b8ef927d3aa38eae9", + "index": 191, + "guid": "98484414-5110-4cc6-b694-089fd0b1d67f", + "isActive": true, + "balance": "$1,264.39", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Jordan Fitzgerald", + "gender": "female", + "company": "DIGIGENE", + "email": "jordanfitzgerald@digigene.com", + "phone": "+1 (835) 496-3776", + "address": "991 Bay Parkway, Edgar, Maine, 9290", + "about": "Sint proident et mollit eu eu commodo consectetur. Nisi fugiat consequat minim do cillum cupidatat culpa eiusmod ea aute. Ut ad veniam amet irure labore velit incididunt aliquip culpa. Culpa deserunt et eu veniam reprehenderit sint esse eiusmod sit irure reprehenderit nisi non esse. Quis cupidatat aliqua commodo quis officia duis consequat nulla excepteur dolore Lorem excepteur aliquip. Ut adipisicing proident id irure minim adipisicing laboris eu reprehenderit.\r\n", + "registered": "2019-07-26T02:47:41 -06:-30", + "latitude": -63.391385, + "longitude": 25.369237, + "tags": [ + "occaecat", + "reprehenderit", + "adipisicing", + "sit", + "magna", + "non", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Roberts Wells" + }, + { + "id": 1, + "name": "Riddle Hardin" + }, + { + "id": 2, + "name": "Antonia Francis" + } + ], + "greeting": "Hello, Jordan Fitzgerald! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb64622eb86324fbd", + "index": 192, + "guid": "4488ba49-f933-42c4-85e5-a43dd7cf584c", + "isActive": true, + "balance": "$3,718.01", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "green", + "name": "Sara Cook", + "gender": "female", + "company": "CALCULA", + "email": "saracook@calcula.com", + "phone": "+1 (974) 476-2635", + "address": "673 Bokee Court, Gorham, Nebraska, 6195", + "about": "Reprehenderit pariatur non tempor voluptate cillum enim reprehenderit laborum dolore dolor. Labore commodo in mollit incididunt cupidatat adipisicing labore cillum eiusmod proident sint laborum. Amet pariatur incididunt elit voluptate Lorem officia incididunt excepteur eu ullamco laborum aute enim. Cillum sunt amet incididunt aute. Exercitation duis veniam aliquip cupidatat incididunt aliquip ad ea cillum et consectetur elit.\r\n", + "registered": "2020-08-18T07:09:43 -06:-30", + "latitude": -43.612981, + "longitude": -127.352159, + "tags": [ + "sit", + "labore", + "non", + "dolore", + "elit", + "occaecat", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Valenzuela Gates" + }, + { + "id": 1, + "name": "Cohen Mccarthy" + }, + { + "id": 2, + "name": "Marissa Mccoy" + } + ], + "greeting": "Hello, Sara Cook! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b405cbfba73baf225", + "index": 193, + "guid": "fe73693c-897f-458a-af49-8984bdba42b3", + "isActive": true, + "balance": "$3,025.26", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Bettie Ryan", + "gender": "female", + "company": "CYTREK", + "email": "bettieryan@cytrek.com", + "phone": "+1 (935) 541-2939", + "address": "892 Harkness Avenue, Chamizal, Mississippi, 1222", + "about": "Irure aliqua sint aliquip labore commodo magna ut labore nisi in occaecat reprehenderit velit. Cillum aliqua amet ullamco in incididunt deserunt consequat enim consectetur excepteur ea. Cupidatat cupidatat nulla culpa ex deserunt officia voluptate cupidatat. Enim ea ullamco magna aute commodo nisi adipisicing quis dolore nisi. Dolore irure culpa eiusmod Lorem dolor occaecat culpa ea commodo sint minim. Eu ullamco labore ullamco nulla laborum nisi duis consequat aute elit sit exercitation. Cupidatat aliquip in laborum in laboris.\r\n", + "registered": "2017-12-24T07:44:48 -06:-30", + "latitude": 55.857929, + "longitude": 175.139979, + "tags": [ + "do", + "incididunt", + "qui", + "nulla", + "commodo", + "Lorem", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Francesca Berry" + }, + { + "id": 1, + "name": "Hampton Simmons" + }, + { + "id": 2, + "name": "Sonya Castaneda" + } + ], + "greeting": "Hello, Bettie Ryan! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4be25744beb52f4862", + "index": 194, + "guid": "ff2060ea-5afc-4018-bbbe-9adcc96078b5", + "isActive": false, + "balance": "$2,974.34", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Lamb Hyde", + "gender": "male", + "company": "GEOLOGIX", + "email": "lambhyde@geologix.com", + "phone": "+1 (817) 554-2595", + "address": "233 Paerdegat Avenue, Grill, Indiana, 3681", + "about": "Irure sunt et ut do irure laborum incididunt et. Et voluptate nulla commodo deserunt deserunt in enim pariatur magna. Incididunt laboris reprehenderit dolor veniam laborum aliquip. Duis laboris do ea consequat labore quis minim fugiat ipsum mollit deserunt cillum fugiat.\r\n", + "registered": "2022-08-20T10:36:58 -06:-30", + "latitude": -46.869313, + "longitude": 93.911219, + "tags": [ + "incididunt", + "nulla", + "commodo", + "sunt", + "ut", + "elit", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Leta Welch" + }, + { + "id": 1, + "name": "Finch Stuart" + }, + { + "id": 2, + "name": "Arline Macias" + } + ], + "greeting": "Hello, Lamb Hyde! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdec8e1e8b8ba2564", + "index": 195, + "guid": "d171e6e1-de8b-4e0c-b662-6411127c792c", + "isActive": false, + "balance": "$1,011.66", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Potts Hale", + "gender": "male", + "company": "EYERIS", + "email": "pottshale@eyeris.com", + "phone": "+1 (940) 481-3394", + "address": "760 Montague Street, Galesville, Guam, 6006", + "about": "Non mollit cillum id amet sunt ut magna pariatur sint eu. Et enim anim officia Lorem irure ex velit ad consequat. Sunt do esse mollit ea nostrud enim ea. Sint ullamco reprehenderit dolor ipsum minim sit veniam culpa ea. Fugiat exercitation incididunt ut irure eu ullamco qui amet aliqua.\r\n", + "registered": "2021-05-21T02:50:39 -06:-30", + "latitude": 3.097701, + "longitude": -95.466453, + "tags": [ + "occaecat", + "minim", + "esse", + "ut", + "enim", + "ullamco", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Kathryn Dean" + }, + { + "id": 1, + "name": "Michael Franco" + }, + { + "id": 2, + "name": "Bailey Mercado" + } + ], + "greeting": "Hello, Potts Hale! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b75cbfd06e35dab9c", + "index": 196, + "guid": "2bf4c497-2979-44c5-a16d-1687c3e2526c", + "isActive": true, + "balance": "$2,334.62", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Kayla Brown", + "gender": "female", + "company": "NETERIA", + "email": "kaylabrown@neteria.com", + "phone": "+1 (845) 434-3121", + "address": "296 Bayview Place, Wyoming, Kentucky, 6928", + "about": "Reprehenderit consequat dolore anim ut ullamco proident proident laborum ad consectetur ea deserunt adipisicing commodo. Ut in magna sit consectetur laboris ea aute quis aute voluptate sint sunt in cillum. Deserunt magna occaecat quis esse excepteur consequat nostrud ullamco sit reprehenderit non.\r\n", + "registered": "2016-02-06T05:08:45 -06:-30", + "latitude": -78.739474, + "longitude": 71.692727, + "tags": [ + "irure", + "consectetur", + "tempor", + "aute", + "nisi", + "amet", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Deanne Simon" + }, + { + "id": 1, + "name": "Holcomb Walker" + }, + { + "id": 2, + "name": "Lily Chandler" + } + ], + "greeting": "Hello, Kayla Brown! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4becd050e97560a580", + "index": 197, + "guid": "66e12ade-d9c8-4c1e-92a4-3d151e87a706", + "isActive": false, + "balance": "$1,928.13", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Elva Merrill", + "gender": "female", + "company": "VOLAX", + "email": "elvamerrill@volax.com", + "phone": "+1 (830) 487-2208", + "address": "317 Ryder Street, Salix, Puerto Rico, 5600", + "about": "Deserunt excepteur eiusmod sit Lorem et eiusmod occaecat exercitation cillum. Incididunt commodo ex elit incididunt commodo non laborum proident. Magna laboris fugiat velit proident ex laboris quis exercitation id in sunt reprehenderit. Do minim laboris cupidatat voluptate amet culpa irure proident ullamco ex anim cupidatat. Do incididunt Lorem aliqua sit sunt dolore nulla dolore qui do aliqua commodo. Est enim labore minim sint duis nulla sit.\r\n", + "registered": "2019-12-12T02:22:12 -06:-30", + "latitude": 52.191293, + "longitude": 107.628537, + "tags": [ + "velit", + "pariatur", + "ipsum", + "fugiat", + "cillum", + "et", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Golden Rivas" + }, + { + "id": 1, + "name": "Yesenia Keith" + }, + { + "id": 2, + "name": "Stacey Mcpherson" + } + ], + "greeting": "Hello, Elva Merrill! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3051e05c8a107e98", + "index": 198, + "guid": "75241852-a055-4cd9-8352-05e2b2f0b436", + "isActive": true, + "balance": "$2,926.47", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Chelsea Harper", + "gender": "female", + "company": "EQUICOM", + "email": "chelseaharper@equicom.com", + "phone": "+1 (816) 412-3056", + "address": "506 Stoddard Place, Whipholt, North Carolina, 6455", + "about": "Ad nulla exercitation commodo labore labore irure consequat duis sint non. Sunt deserunt anim do ea do dolore est deserunt Lorem. In esse esse aute id irure ea quis elit. Et sit voluptate aliqua sint consequat officia proident. Veniam laborum ex nisi et occaecat. Ullamco non ad ullamco fugiat proident velit ex laboris aliquip ad elit.\r\n", + "registered": "2020-07-11T07:18:03 -06:-30", + "latitude": 77.053235, + "longitude": -137.560189, + "tags": [ + "adipisicing", + "excepteur", + "enim", + "est", + "anim", + "labore", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Maryellen Baird" + }, + { + "id": 1, + "name": "Lee Wagner" + }, + { + "id": 2, + "name": "Holden Boyd" + } + ], + "greeting": "Hello, Chelsea Harper! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b56f1bbecd3b13207", + "index": 199, + "guid": "6b6fba9f-4f22-443d-bf2e-d0856448d245", + "isActive": true, + "balance": "$3,061.96", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Clark Dominguez", + "gender": "male", + "company": "CEMENTION", + "email": "clarkdominguez@cemention.com", + "phone": "+1 (804) 454-2949", + "address": "689 Court Street, Sisquoc, Tennessee, 448", + "about": "Ipsum nulla occaecat consequat sunt quis officia officia ea sint magna. Nisi elit nostrud ullamco ea aliquip sit consequat nulla. Exercitation aliqua qui laborum sint incididunt anim proident eu ea eiusmod enim pariatur irure nisi. Laborum qui ullamco nostrud est do aliqua sit ipsum exercitation veniam culpa qui dolor labore. Enim duis ipsum elit officia excepteur. Dolore consequat et do voluptate excepteur consequat est reprehenderit culpa. Cillum esse voluptate consequat mollit est exercitation cupidatat ea exercitation.\r\n", + "registered": "2016-12-06T08:16:34 -06:-30", + "latitude": 66.425764, + "longitude": -36.333379, + "tags": [ + "consequat", + "do", + "pariatur", + "ipsum", + "minim", + "deserunt", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Bean Moore" + }, + { + "id": 1, + "name": "Thomas Blackburn" + }, + { + "id": 2, + "name": "Roberson Pierce" + } + ], + "greeting": "Hello, Clark Dominguez! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b05ed2bee61dba436", + "index": 200, + "guid": "aded2bba-367a-4630-a955-17ff0ae4caf3", + "isActive": true, + "balance": "$1,288.41", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Glenna Griffin", + "gender": "female", + "company": "ZEROLOGY", + "email": "glennagriffin@zerology.com", + "phone": "+1 (884) 501-2836", + "address": "975 Dorchester Road, Tetherow, Arkansas, 8111", + "about": "Id consectetur ipsum tempor enim cillum irure commodo do est duis Lorem. Ullamco nulla eu ipsum minim aliqua qui nulla. Officia quis incididunt aliqua ut. Pariatur quis labore sunt aute.\r\n", + "registered": "2014-06-13T10:16:20 -06:-30", + "latitude": 57.133, + "longitude": -158.851456, + "tags": [ + "adipisicing", + "dolor", + "eiusmod", + "excepteur", + "cillum", + "eu", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Nixon Schroeder" + }, + { + "id": 1, + "name": "Hayden Garner" + }, + { + "id": 2, + "name": "Jordan Marquez" + } + ], + "greeting": "Hello, Glenna Griffin! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd686961c7870e7df", + "index": 201, + "guid": "f966e07e-b65f-4e5a-8fbc-b817827ce221", + "isActive": false, + "balance": "$3,261.53", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Katie Hudson", + "gender": "female", + "company": "TERRAGEN", + "email": "katiehudson@terragen.com", + "phone": "+1 (856) 544-2836", + "address": "419 Nassau Street, Accoville, Virgin Islands, 4633", + "about": "Lorem culpa adipisicing deserunt eu eu quis exercitation sunt magna. Aliqua anim ea incididunt aliquip dolor duis culpa sint exercitation reprehenderit minim quis elit minim. Esse est dolor aliqua tempor qui magna ipsum tempor. Veniam mollit et exercitation ea. Sint reprehenderit sit cupidatat ea laboris commodo ipsum.\r\n", + "registered": "2017-03-29T01:13:35 -06:-30", + "latitude": 61.659437, + "longitude": 35.430782, + "tags": [ + "cillum", + "ipsum", + "voluptate", + "velit", + "officia", + "ipsum", + "velit" + ], + "friends": [ + { + "id": 0, + "name": "Merritt Freeman" + }, + { + "id": 1, + "name": "Brandie Castro" + }, + { + "id": 2, + "name": "Foreman Bryan" + } + ], + "greeting": "Hello, Katie Hudson! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b4843fafb1a8fb6c1", + "index": 202, + "guid": "32981991-c005-4e9b-9e9a-1a369974f3ac", + "isActive": false, + "balance": "$3,884.93", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Aurelia Webster", + "gender": "female", + "company": "STRALOY", + "email": "aureliawebster@straloy.com", + "phone": "+1 (943) 493-3059", + "address": "766 Quincy Street, Hilltop, Oregon, 8254", + "about": "Sint ullamco aliqua officia culpa voluptate elit id officia ad mollit et nulla. Veniam adipisicing quis veniam occaecat ea qui tempor ex mollit nisi laborum. Ut est nostrud commodo amet eu minim veniam aliqua ad dolore commodo. Id anim Lorem culpa sunt et amet exercitation sit. Excepteur esse tempor reprehenderit exercitation adipisicing nulla consectetur qui in ad. Eu laboris qui ad esse mollit fugiat amet aliqua ex esse fugiat nulla deserunt.\r\n", + "registered": "2021-03-14T05:53:38 -06:-30", + "latitude": -58.226794, + "longitude": -50.861136, + "tags": [ + "sit", + "ex", + "incididunt", + "qui", + "aliqua", + "dolor", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Emily Franks" + }, + { + "id": 1, + "name": "Celina Bridges" + }, + { + "id": 2, + "name": "Jaclyn Keller" + } + ], + "greeting": "Hello, Aurelia Webster! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b41d4a1b27412f962", + "index": 203, + "guid": "9d9a2d16-f074-46d5-9922-ed7f42375fc3", + "isActive": true, + "balance": "$2,490.80", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Krystal Stokes", + "gender": "female", + "company": "BICOL", + "email": "krystalstokes@bicol.com", + "phone": "+1 (803) 520-3877", + "address": "892 Bergen Court, Breinigsville, District Of Columbia, 6451", + "about": "Cillum tempor fugiat duis pariatur quis mollit consequat culpa enim esse aliquip aute. Dolore aliqua veniam proident consectetur. Magna excepteur nostrud officia dolore aliquip enim ullamco consectetur laboris. Et nisi consectetur est non veniam occaecat magna sunt ad. Voluptate ea do nostrud veniam officia enim dolor. Nulla occaecat magna consequat labore anim aute pariatur reprehenderit dolor. Fugiat consectetur qui laborum aliquip anim deserunt ea excepteur in ex incididunt ullamco ad.\r\n", + "registered": "2016-10-16T04:47:31 -06:-30", + "latitude": -7.899553, + "longitude": -62.50176, + "tags": [ + "exercitation", + "occaecat", + "non", + "in", + "commodo", + "ipsum", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Serrano Hodge" + }, + { + "id": 1, + "name": "Elena Fisher" + }, + { + "id": 2, + "name": "Brandi Herring" + } + ], + "greeting": "Hello, Krystal Stokes! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b22d0a9e390786e5d", + "index": 204, + "guid": "761f5bf4-9bf7-4fdd-a34d-62e4b10bc28c", + "isActive": false, + "balance": "$3,816.63", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Lucia Morrow", + "gender": "female", + "company": "JUMPSTACK", + "email": "luciamorrow@jumpstack.com", + "phone": "+1 (803) 407-2138", + "address": "406 Adams Street, Hall, Florida, 1700", + "about": "In minim exercitation amet in excepteur commodo ullamco in nisi ipsum. Qui incididunt ea qui velit velit culpa do. Eiusmod ex id exercitation qui sint pariatur magna.\r\n", + "registered": "2017-01-21T09:12:58 -06:-30", + "latitude": 8.875525, + "longitude": -4.868289, + "tags": [ + "occaecat", + "dolore", + "sit", + "sunt", + "ut", + "sunt", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Olga Ramos" + }, + { + "id": 1, + "name": "Corinne Lawson" + }, + { + "id": 2, + "name": "Burch Carpenter" + } + ], + "greeting": "Hello, Lucia Morrow! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b4c4a47b9b3210ede", + "index": 205, + "guid": "d941b605-7a77-4773-934d-2bb910e8f130", + "isActive": false, + "balance": "$1,549.02", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Lillie Head", + "gender": "female", + "company": "KAGGLE", + "email": "lilliehead@kaggle.com", + "phone": "+1 (836) 476-3002", + "address": "624 Just Court, Faywood, Washington, 1671", + "about": "Laboris labore ad velit culpa minim nulla aute nulla reprehenderit aute culpa. Enim elit eu proident magna Lorem laboris sunt. Tempor exercitation aliquip minim anim ea elit anim mollit nostrud excepteur deserunt et duis non. Irure incididunt exercitation commodo dolor nisi mollit qui amet et ut. Cupidatat ipsum ullamco fugiat laboris aliquip adipisicing mollit sunt. Nostrud aliquip voluptate esse amet ipsum labore nisi Lorem ipsum et ullamco est minim. Excepteur laborum nulla commodo dolor proident et occaecat esse voluptate non id ipsum ea.\r\n", + "registered": "2016-10-02T04:24:28 -06:-30", + "latitude": 1.275736, + "longitude": 22.750018, + "tags": [ + "consectetur", + "culpa", + "nostrud", + "veniam", + "tempor", + "et", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Ray Galloway" + }, + { + "id": 1, + "name": "Hull Everett" + }, + { + "id": 2, + "name": "Trevino Mckinney" + } + ], + "greeting": "Hello, Lillie Head! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b798f34052e3c8d13", + "index": 206, + "guid": "a0e369bf-5fb0-4d8e-8cf5-4d9bf6050603", + "isActive": false, + "balance": "$1,192.19", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Salas Irwin", + "gender": "male", + "company": "KOOGLE", + "email": "salasirwin@koogle.com", + "phone": "+1 (890) 406-2735", + "address": "424 Otsego Street, Farmington, Montana, 2494", + "about": "Nostrud ipsum fugiat nisi cupidatat. Mollit labore fugiat labore laborum culpa aute ea ea officia ut occaecat do. Elit qui velit ea quis dolor sit sint nisi id enim. Culpa amet voluptate eu irure est reprehenderit Lorem amet esse et occaecat nisi. Non ut est cupidatat quis sunt ad culpa id do.\r\n", + "registered": "2019-08-14T12:53:52 -06:-30", + "latitude": -75.493248, + "longitude": 146.149892, + "tags": [ + "nisi", + "Lorem", + "anim", + "deserunt", + "sunt", + "qui", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Valeria Powers" + }, + { + "id": 1, + "name": "Petty Patton" + }, + { + "id": 2, + "name": "Dale Serrano" + } + ], + "greeting": "Hello, Salas Irwin! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf5301f2aed6847f6", + "index": 207, + "guid": "2a9ef00b-5fdd-41ab-b25a-f88fd7356bd0", + "isActive": false, + "balance": "$2,963.32", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Maldonado Cabrera", + "gender": "male", + "company": "FISHLAND", + "email": "maldonadocabrera@fishland.com", + "phone": "+1 (966) 568-2103", + "address": "609 Devoe Street, Topaz, Hawaii, 131", + "about": "Aliquip labore reprehenderit id voluptate laborum qui. Cillum adipisicing eiusmod cupidatat occaecat incididunt enim cillum. Aliquip quis sunt reprehenderit consectetur fugiat quis mollit exercitation in fugiat enim mollit pariatur enim. Anim voluptate id laborum quis id. Sint dolore dolor cillum sint voluptate anim commodo laboris sunt officia deserunt ea. Elit pariatur sit anim dolore. Laborum dolore cillum veniam consectetur adipisicing reprehenderit.\r\n", + "registered": "2021-07-01T10:41:34 -06:-30", + "latitude": -62.312605, + "longitude": -54.742829, + "tags": [ + "magna", + "elit", + "occaecat", + "tempor", + "laboris", + "duis", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Levy Dennis" + }, + { + "id": 1, + "name": "Evelyn Figueroa" + }, + { + "id": 2, + "name": "Garrison Gardner" + } + ], + "greeting": "Hello, Maldonado Cabrera! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bffce2a9ad2d5b4cd", + "index": 208, + "guid": "203a585b-5cef-42ea-bcf8-5c0254e508fb", + "isActive": false, + "balance": "$3,678.77", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "green", + "name": "Boone Hinton", + "gender": "male", + "company": "VIRXO", + "email": "boonehinton@virxo.com", + "phone": "+1 (827) 448-3276", + "address": "207 Keap Street, Belleview, Michigan, 5274", + "about": "Quis sit mollit ad eu. Ipsum elit et voluptate laborum mollit duis adipisicing do nostrud minim. Commodo consequat est in ut sit. Nisi qui laboris consectetur pariatur. In cupidatat aliquip officia voluptate quis eu nostrud fugiat magna.\r\n", + "registered": "2020-08-18T02:29:31 -06:-30", + "latitude": -47.028963, + "longitude": -68.550152, + "tags": [ + "id", + "amet", + "culpa", + "aliqua", + "pariatur", + "nulla", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Marjorie Rios" + }, + { + "id": 1, + "name": "Sheri Mcclain" + }, + { + "id": 2, + "name": "Craig Hammond" + } + ], + "greeting": "Hello, Boone Hinton! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b45f5eb079f58e56a", + "index": 209, + "guid": "9c6c579f-1f53-4f5b-81c3-202f8b863ea3", + "isActive": false, + "balance": "$1,570.73", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Fern Cantu", + "gender": "female", + "company": "SOFTMICRO", + "email": "ferncantu@softmicro.com", + "phone": "+1 (961) 493-2203", + "address": "269 Wakeman Place, Corinne, Maryland, 2530", + "about": "Dolor sunt magna ullamco dolore. Magna in sit eiusmod ipsum sint ea aliquip est quis eiusmod elit nulla. Occaecat incididunt minim aliqua ipsum ullamco proident adipisicing consectetur in exercitation aute pariatur. Ullamco ad consectetur culpa culpa ad Lorem eiusmod dolore ipsum laboris.\r\n", + "registered": "2015-06-21T11:35:11 -06:-30", + "latitude": 10.038117, + "longitude": -177.403381, + "tags": [ + "consectetur", + "voluptate", + "et", + "exercitation", + "adipisicing", + "exercitation", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Sexton Mcintyre" + }, + { + "id": 1, + "name": "Dixie Goodman" + }, + { + "id": 2, + "name": "Candy Trevino" + } + ], + "greeting": "Hello, Fern Cantu! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd13dfa8ee71fbf19", + "index": 210, + "guid": "c3a4d6ce-160e-4344-bf4f-b4de8b25b03c", + "isActive": false, + "balance": "$1,867.41", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Holder King", + "gender": "male", + "company": "BLEEKO", + "email": "holderking@bleeko.com", + "phone": "+1 (800) 456-2980", + "address": "544 Kossuth Place, Gouglersville, American Samoa, 8025", + "about": "Ut est cillum nisi elit proident. Ea aute elit reprehenderit excepteur veniam cupidatat irure dolore exercitation. Duis est veniam exercitation qui dolor. Pariatur et mollit ullamco ad elit fugiat. Sint quis non veniam aliquip sit magna aliqua dolor quis sunt eiusmod dolore fugiat Lorem. Labore voluptate commodo in consectetur sit nisi exercitation dolore irure.\r\n", + "registered": "2015-07-11T10:43:11 -06:-30", + "latitude": -11.805759, + "longitude": -70.233449, + "tags": [ + "sit", + "fugiat", + "adipisicing", + "nulla", + "dolore", + "laboris", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Eva Rodriquez" + }, + { + "id": 1, + "name": "Neal Case" + }, + { + "id": 2, + "name": "Tanya Copeland" + } + ], + "greeting": "Hello, Holder King! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bafe81c8bb1e2976c", + "index": 211, + "guid": "49633480-7eaa-41cd-b782-d08151a89b91", + "isActive": true, + "balance": "$1,023.96", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Nancy Herrera", + "gender": "female", + "company": "SONGBIRD", + "email": "nancyherrera@songbird.com", + "phone": "+1 (838) 507-2826", + "address": "429 Huntington Street, Barclay, Illinois, 5486", + "about": "Quis aliqua ullamco Lorem officia irure reprehenderit consectetur tempor cillum labore do occaecat. Culpa ipsum qui non voluptate. Est ullamco laboris magna amet id veniam. Elit eiusmod aliqua sint sit sunt irure. Nisi elit reprehenderit ad et consectetur amet.\r\n", + "registered": "2015-06-08T10:00:46 -06:-30", + "latitude": -17.402294, + "longitude": 38.932106, + "tags": [ + "cupidatat", + "deserunt", + "Lorem", + "elit", + "est", + "officia", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Bridget Glass" + }, + { + "id": 1, + "name": "Mclean Salas" + }, + { + "id": 2, + "name": "Stella Greer" + } + ], + "greeting": "Hello, Nancy Herrera! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b91e3e7f6b6bd187a", + "index": 212, + "guid": "eaa46b40-8180-46cf-a8f5-7157c3eb9d58", + "isActive": true, + "balance": "$2,639.96", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "brown", + "name": "Wyatt Britt", + "gender": "male", + "company": "FURNAFIX", + "email": "wyattbritt@furnafix.com", + "phone": "+1 (974) 565-3410", + "address": "512 Linden Street, Sanborn, Missouri, 1507", + "about": "Nulla aute nostrud veniam id proident enim sint nostrud labore. Dolore consequat cupidatat dolor quis id quis laboris laboris dolor amet aliqua occaecat ea. Nisi veniam eiusmod laborum anim veniam. Culpa veniam mollit qui officia labore enim dolor pariatur incididunt aute. Laborum magna excepteur officia ut cupidatat nulla labore eu duis ea esse. Qui ullamco aliqua fugiat veniam occaecat aliquip aute reprehenderit laboris irure nisi irure qui ullamco.\r\n", + "registered": "2022-10-07T08:59:50 -06:-30", + "latitude": 50.056776, + "longitude": -35.948881, + "tags": [ + "enim", + "labore", + "ullamco", + "consequat", + "dolor", + "labore", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Tamera Leonard" + }, + { + "id": 1, + "name": "Tammy Mason" + }, + { + "id": 2, + "name": "Reyes Bishop" + } + ], + "greeting": "Hello, Wyatt Britt! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b4099cc866bd9baad", + "index": 213, + "guid": "75ad677f-1821-48c2-b434-3e3995edb11b", + "isActive": true, + "balance": "$1,817.28", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Walter Hansen", + "gender": "male", + "company": "OMATOM", + "email": "walterhansen@omatom.com", + "phone": "+1 (973) 531-3620", + "address": "616 Pioneer Street, Shepardsville, Idaho, 9406", + "about": "Fugiat fugiat exercitation ut sit esse irure aliqua laboris ex dolor occaecat. Laborum ad nulla nulla id enim nisi laboris eu veniam anim. Id eiusmod labore est pariatur non ut esse veniam mollit in id occaecat. Labore deserunt non ex ut. Est occaecat mollit anim commodo veniam deserunt commodo ad enim. Aliquip aliqua non excepteur ex dolore qui non laborum pariatur ut do eiusmod.\r\n", + "registered": "2022-02-09T10:10:49 -06:-30", + "latitude": 80.119521, + "longitude": -67.582642, + "tags": [ + "exercitation", + "officia", + "aute", + "ad", + "aliquip", + "ea", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Leah Mendez" + }, + { + "id": 1, + "name": "Meyer Burks" + }, + { + "id": 2, + "name": "Mattie Shepard" + } + ], + "greeting": "Hello, Walter Hansen! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be0081dccdd034fa5", + "index": 214, + "guid": "f5756e79-95d4-4d45-b7b3-18f5d8b47848", + "isActive": true, + "balance": "$2,990.40", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Chandler Reynolds", + "gender": "male", + "company": "EXOTERIC", + "email": "chandlerreynolds@exoteric.com", + "phone": "+1 (829) 530-3921", + "address": "345 Roosevelt Court, Darrtown, South Carolina, 1776", + "about": "Eiusmod elit amet sit nulla id ex cillum aliquip irure velit aute mollit non. Est in id anim dolore cillum commodo. Reprehenderit mollit ad do occaecat ullamco laboris qui. Est eiusmod mollit deserunt velit mollit officia amet consectetur occaecat et dolore ex consectetur esse.\r\n", + "registered": "2018-10-09T02:14:35 -06:-30", + "latitude": -84.932883, + "longitude": -9.268858, + "tags": [ + "quis", + "et", + "sint", + "enim", + "sint", + "qui", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Huff Dunlap" + }, + { + "id": 1, + "name": "Elaine Tillman" + }, + { + "id": 2, + "name": "Cummings Bray" + } + ], + "greeting": "Hello, Chandler Reynolds! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bc7258dc744d3f5ba", + "index": 215, + "guid": "b50a51b6-d130-4dba-a362-d629fbd4c79c", + "isActive": true, + "balance": "$3,724.25", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Gwen Townsend", + "gender": "female", + "company": "EWAVES", + "email": "gwentownsend@ewaves.com", + "phone": "+1 (870) 557-3190", + "address": "347 Hubbard Place, Epworth, Colorado, 6455", + "about": "Amet consectetur ut et nulla magna qui. Dolor minim culpa occaecat in reprehenderit ut elit magna esse cupidatat. Minim ipsum fugiat occaecat in laborum. Adipisicing mollit amet non qui. Proident duis occaecat culpa enim tempor ipsum est quis consectetur tempor occaecat laboris.\r\n", + "registered": "2017-12-04T06:05:03 -06:-30", + "latitude": -3.670858, + "longitude": 145.368259, + "tags": [ + "magna", + "laboris", + "nisi", + "anim", + "sunt", + "ut", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Rosella Campos" + }, + { + "id": 1, + "name": "Dotson Santana" + }, + { + "id": 2, + "name": "Kane Vang" + } + ], + "greeting": "Hello, Gwen Townsend! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b5bde0130013c4745", + "index": 216, + "guid": "a64e7c84-5206-4d4a-afbc-16c17e1051a3", + "isActive": true, + "balance": "$3,837.58", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Debra Cunningham", + "gender": "female", + "company": "ENTALITY", + "email": "debracunningham@entality.com", + "phone": "+1 (898) 572-2796", + "address": "933 Dunham Place, Kohatk, New Hampshire, 7525", + "about": "Ea commodo nisi minim occaecat labore magna minim. Elit aliqua ipsum anim est amet. Amet esse tempor Lorem voluptate excepteur pariatur velit qui fugiat ex. Ex est non labore ex et elit id nisi nostrud ad voluptate. Dolor consequat elit ullamco nisi do minim amet ex fugiat culpa. Ipsum aliquip pariatur exercitation aliquip eiusmod elit consequat do laboris voluptate ut laborum.\r\n", + "registered": "2021-01-13T06:02:59 -06:-30", + "latitude": 32.439021, + "longitude": -81.749391, + "tags": [ + "veniam", + "do", + "ex", + "dolore", + "occaecat", + "enim", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Diaz Burton" + }, + { + "id": 1, + "name": "Johnson Ratliff" + }, + { + "id": 2, + "name": "Ross Jimenez" + } + ], + "greeting": "Hello, Debra Cunningham! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be512da7cb7f74fff", + "index": 217, + "guid": "9f8d7248-1578-4f66-9460-3777d4ecb73f", + "isActive": true, + "balance": "$2,013.96", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Crane Houston", + "gender": "male", + "company": "RUGSTARS", + "email": "cranehouston@rugstars.com", + "phone": "+1 (837) 479-3832", + "address": "568 Remsen Street, Vowinckel, Minnesota, 706", + "about": "Adipisicing amet qui tempor cupidatat non ea commodo. Tempor amet consequat anim laboris ex nulla. Reprehenderit culpa excepteur est exercitation Lorem laboris. Laboris tempor fugiat elit quis cillum in pariatur esse est enim pariatur id. Est quis esse dolore laborum cillum enim velit exercitation est irure dolor non culpa fugiat. Adipisicing elit sint veniam ut aute fugiat. Cupidatat excepteur veniam adipisicing duis culpa in nisi occaecat nulla in culpa elit ut.\r\n", + "registered": "2021-01-15T11:24:55 -06:-30", + "latitude": 48.626303, + "longitude": 32.071564, + "tags": [ + "proident", + "enim", + "amet", + "tempor", + "exercitation", + "in", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Shepherd Garcia" + }, + { + "id": 1, + "name": "Parrish Klein" + }, + { + "id": 2, + "name": "Jolene Dixon" + } + ], + "greeting": "Hello, Crane Houston! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b21c0bcb2afcb785a", + "index": 218, + "guid": "56d5be4a-9e4e-4ba9-959d-776c0d547053", + "isActive": false, + "balance": "$2,516.31", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Patterson Golden", + "gender": "male", + "company": "EGYPTO", + "email": "pattersongolden@egypto.com", + "phone": "+1 (846) 562-3090", + "address": "252 Hopkins Street, Bagtown, Utah, 5836", + "about": "Consequat amet eiusmod consectetur aliqua quis sunt excepteur eiusmod. Aliquip aliquip laborum dolor occaecat eu. Consectetur deserunt minim veniam irure cupidatat aliqua et ad minim est cupidatat. Sint adipisicing laborum aliquip labore amet laboris ut reprehenderit amet sint. Officia consectetur velit id proident dolor magna sint elit laboris in deserunt. Excepteur irure cupidatat veniam mollit anim non fugiat ullamco eiusmod culpa velit. Et consequat ipsum officia in esse ad consequat cillum consequat dolor qui.\r\n", + "registered": "2014-01-19T10:15:35 -06:-30", + "latitude": 30.440313, + "longitude": 52.453754, + "tags": [ + "aliquip", + "esse", + "ad", + "elit", + "minim", + "anim", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Chasity Leon" + }, + { + "id": 1, + "name": "Priscilla Logan" + }, + { + "id": 2, + "name": "Jessie Leblanc" + } + ], + "greeting": "Hello, Patterson Golden! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b61a63cb08a70abfe", + "index": 219, + "guid": "4d7cbb92-bffb-4e8e-ac20-7981ff57e18f", + "isActive": true, + "balance": "$1,932.08", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Vaughan Sherman", + "gender": "male", + "company": "BIZMATIC", + "email": "vaughansherman@bizmatic.com", + "phone": "+1 (814) 476-2649", + "address": "202 Amboy Street, Colton, South Dakota, 2237", + "about": "Cupidatat sunt nisi enim ad exercitation. Ullamco cillum et occaecat adipisicing ea consequat pariatur adipisicing labore quis officia. Non veniam nostrud enim deserunt qui labore do.\r\n", + "registered": "2015-09-30T10:48:29 -06:-30", + "latitude": 12.059653, + "longitude": 4.384365, + "tags": [ + "aute", + "laborum", + "eu", + "culpa", + "exercitation", + "laboris", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Harrington Potts" + }, + { + "id": 1, + "name": "Gail Albert" + }, + { + "id": 2, + "name": "Marla Davidson" + } + ], + "greeting": "Hello, Vaughan Sherman! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bd75780c763122158", + "index": 220, + "guid": "53f9d7a3-0d9b-40e2-bc09-5b75713bc55b", + "isActive": false, + "balance": "$1,133.80", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Alston Mills", + "gender": "male", + "company": "SLAMBDA", + "email": "alstonmills@slambda.com", + "phone": "+1 (990) 499-2624", + "address": "837 Nolans Lane, Marenisco, Arizona, 1583", + "about": "Dolore tempor velit elit proident elit commodo minim irure nulla magna consequat voluptate. Enim eiusmod culpa dolor amet esse ea. Veniam exercitation do ex eu magna magna id exercitation sint. Dolore consectetur dolore sint nisi nulla nisi nulla dolore id culpa pariatur eiusmod mollit commodo. Eiusmod sint nulla nisi consequat eiusmod est anim tempor id Lorem.\r\n", + "registered": "2018-06-25T05:20:55 -06:-30", + "latitude": -31.745676, + "longitude": -156.363099, + "tags": [ + "Lorem", + "veniam", + "irure", + "adipisicing", + "anim", + "ad", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Reba Stark" + }, + { + "id": 1, + "name": "Kristina Curry" + }, + { + "id": 2, + "name": "Miranda Potter" + } + ], + "greeting": "Hello, Alston Mills! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b075cd19d64af4563", + "index": 221, + "guid": "f5603316-c052-44a0-8a92-b9e61ff3db14", + "isActive": false, + "balance": "$1,725.90", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Gallagher Guerrero", + "gender": "male", + "company": "DUFLEX", + "email": "gallagherguerrero@duflex.com", + "phone": "+1 (872) 483-3458", + "address": "669 Dekalb Avenue, Mammoth, Marshall Islands, 1051", + "about": "Proident cupidatat esse nulla laboris consectetur excepteur nostrud ipsum qui. Occaecat eu do culpa excepteur ad excepteur anim cupidatat ipsum consequat velit magna amet ipsum. Non adipisicing dolore ea exercitation enim in tempor consectetur eu et voluptate labore. Deserunt quis veniam quis velit ipsum cillum. Officia ut incididunt quis minim labore fugiat elit officia. Ut esse ea eu amet minim nostrud fugiat deserunt ipsum aliquip ipsum.\r\n", + "registered": "2018-08-15T08:46:45 -06:-30", + "latitude": -70.322842, + "longitude": -21.909698, + "tags": [ + "sit", + "culpa", + "pariatur", + "qui", + "tempor", + "enim", + "consectetur" + ], + "friends": [ + { + "id": 0, + "name": "Ina Richardson" + }, + { + "id": 1, + "name": "Johnnie Sandoval" + }, + { + "id": 2, + "name": "Whitney Dillon" + } + ], + "greeting": "Hello, Gallagher Guerrero! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bff58c6b3d4cdd9e4", + "index": 222, + "guid": "41793756-f418-436d-bf29-84c5f01e0c34", + "isActive": true, + "balance": "$2,175.31", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "green", + "name": "Constance Joyce", + "gender": "female", + "company": "GROK", + "email": "constancejoyce@grok.com", + "phone": "+1 (947) 467-2203", + "address": "466 Engert Avenue, Belgreen, Ohio, 5195", + "about": "Quis consequat velit enim dolore minim pariatur nulla culpa deserunt minim minim excepteur. Exercitation ut labore nisi ullamco consectetur aute ex laborum amet enim in. Reprehenderit id minim tempor reprehenderit enim id enim pariatur dolor anim. Incididunt labore laborum proident incididunt mollit ea culpa non ea magna duis labore sunt consequat.\r\n", + "registered": "2021-01-11T09:22:50 -06:-30", + "latitude": 38.331391, + "longitude": -133.051569, + "tags": [ + "proident", + "velit", + "aliqua", + "sunt", + "elit", + "adipisicing", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Ingrid Rodgers" + }, + { + "id": 1, + "name": "Lola Walton" + }, + { + "id": 2, + "name": "Hess Perry" + } + ], + "greeting": "Hello, Constance Joyce! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b356f9f4699e2b557", + "index": 223, + "guid": "46605ea1-03ad-4255-8eb6-7f4e655031e1", + "isActive": false, + "balance": "$3,277.42", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Jan Short", + "gender": "female", + "company": "RONELON", + "email": "janshort@ronelon.com", + "phone": "+1 (877) 488-2124", + "address": "981 Bartlett Street, Balm, Alabama, 2818", + "about": "Culpa veniam veniam ex exercitation. Nisi magna velit excepteur adipisicing eu eiusmod elit minim aute tempor aute eu qui dolor. Incididunt aliqua aliqua anim in eu esse pariatur nisi et minim consequat anim eiusmod fugiat. Eiusmod eiusmod Lorem eiusmod ullamco incididunt ut et magna aute ut laboris incididunt et aute. Quis culpa voluptate exercitation amet qui aliquip sint. Officia esse do voluptate dolor eu sunt ex duis consectetur dolore in velit. Lorem excepteur eiusmod aliqua sunt labore cillum anim exercitation dolor.\r\n", + "registered": "2014-10-08T07:58:24 -06:-30", + "latitude": 74.39662, + "longitude": 44.189216, + "tags": [ + "esse", + "velit", + "quis", + "aute", + "laborum", + "labore", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Gonzalez Goff" + }, + { + "id": 1, + "name": "Johnston Wolf" + }, + { + "id": 2, + "name": "Desiree Green" + } + ], + "greeting": "Hello, Jan Short! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b41c9dddb2180d350", + "index": 224, + "guid": "38d2e9a6-cc6f-4d7d-a073-dc32db514b5b", + "isActive": true, + "balance": "$3,966.89", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Clarice Robinson", + "gender": "female", + "company": "TERASCAPE", + "email": "claricerobinson@terascape.com", + "phone": "+1 (938) 442-3198", + "address": "903 Arion Place, Cotopaxi, Georgia, 4441", + "about": "Incididunt dolore duis qui reprehenderit do pariatur anim. Anim reprehenderit aliqua do occaecat elit. Adipisicing occaecat pariatur anim non commodo nostrud nostrud sint officia. Laborum esse officia officia dolore.\r\n", + "registered": "2014-08-13T10:57:27 -06:-30", + "latitude": -19.115478, + "longitude": -45.438159, + "tags": [ + "exercitation", + "in", + "reprehenderit", + "voluptate", + "consequat", + "est", + "velit" + ], + "friends": [ + { + "id": 0, + "name": "Long Mullen" + }, + { + "id": 1, + "name": "Gabrielle Manning" + }, + { + "id": 2, + "name": "Day Whitley" + } + ], + "greeting": "Hello, Clarice Robinson! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd99ada27e0acd21c", + "index": 225, + "guid": "0846617d-83a3-4bc2-8738-83dee9ee124e", + "isActive": true, + "balance": "$3,042.57", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Santana Odom", + "gender": "male", + "company": "ISOSURE", + "email": "santanaodom@isosure.com", + "phone": "+1 (923) 401-2143", + "address": "759 McKibben Street, Kansas, California, 7175", + "about": "Laborum quis ad ullamco fugiat ut adipisicing eu nulla ipsum ullamco nulla eiusmod deserunt. Sit anim culpa commodo sunt cillum laboris reprehenderit. Ipsum officia deserunt irure magna mollit.\r\n", + "registered": "2020-12-08T04:59:16 -06:-30", + "latitude": -73.194322, + "longitude": -32.54907, + "tags": [ + "ullamco", + "ipsum", + "Lorem", + "ut", + "Lorem", + "laboris", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Sherry Hooper" + }, + { + "id": 1, + "name": "Carney Gaines" + }, + { + "id": 2, + "name": "Charity Sanders" + } + ], + "greeting": "Hello, Santana Odom! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bca9c6e0af4f1d9c0", + "index": 226, + "guid": "96bd80fb-70cf-4e2b-aa35-228d0be0fb48", + "isActive": true, + "balance": "$3,389.64", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Roslyn Humphrey", + "gender": "female", + "company": "GENMEX", + "email": "roslynhumphrey@genmex.com", + "phone": "+1 (863) 571-2916", + "address": "799 Macon Street, Beaulieu, Northern Mariana Islands, 8311", + "about": "Enim nisi reprehenderit voluptate incididunt anim exercitation duis et consequat. Laboris officia sint ea elit est. In voluptate sit exercitation ipsum sit dolor laborum eu consectetur reprehenderit velit ipsum do fugiat. Sunt deserunt qui et reprehenderit aliquip id non ut proident commodo ipsum voluptate non cupidatat. Aliqua commodo cupidatat non laboris quis ut aliquip quis deserunt duis. Elit ea deserunt exercitation do Lorem nostrud do consectetur. Nisi cillum velit ex incididunt elit officia do et cupidatat eu in reprehenderit.\r\n", + "registered": "2015-09-12T10:28:11 -06:-30", + "latitude": 78.50592, + "longitude": -164.236001, + "tags": [ + "dolore", + "fugiat", + "non", + "nostrud", + "tempor", + "eu", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Jeri Velazquez" + }, + { + "id": 1, + "name": "Gibson Frazier" + }, + { + "id": 2, + "name": "Oliver Scott" + } + ], + "greeting": "Hello, Roslyn Humphrey! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9b1294fa2cd5a258", + "index": 227, + "guid": "6f0d2db1-ab61-4214-954b-a4e158d6caab", + "isActive": false, + "balance": "$3,857.68", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Hollie Le", + "gender": "female", + "company": "GRAINSPOT", + "email": "holliele@grainspot.com", + "phone": "+1 (900) 441-3115", + "address": "218 Bay Avenue, Temperanceville, Kansas, 8568", + "about": "Magna ex et commodo ut adipisicing veniam quis ad cillum velit. Voluptate reprehenderit esse irure fugiat tempor deserunt aliquip qui cillum sit enim sit. Dolore nostrud incididunt quis excepteur consequat do amet officia occaecat aliquip. Incididunt nostrud commodo est sit dolor ad anim deserunt aliquip sunt labore ad ullamco Lorem. Veniam deserunt voluptate laboris in magna nisi minim.\r\n", + "registered": "2016-12-23T04:35:41 -06:-30", + "latitude": -40.950966, + "longitude": 33.553427, + "tags": [ + "ullamco", + "dolor", + "commodo", + "et", + "sit", + "et", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Tiffany Acevedo" + }, + { + "id": 1, + "name": "Rutledge Glover" + }, + { + "id": 2, + "name": "Shelton Patrick" + } + ], + "greeting": "Hello, Hollie Le! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b1cfa4d7dc3c79077", + "index": 228, + "guid": "92bfae66-d8ec-459b-a1df-0f3dd0aa12a4", + "isActive": false, + "balance": "$1,612.74", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Eddie Craig", + "gender": "female", + "company": "ORBIFLEX", + "email": "eddiecraig@orbiflex.com", + "phone": "+1 (993) 531-2463", + "address": "556 Bragg Court, Itmann, North Dakota, 7710", + "about": "Non dolor irure minim reprehenderit tempor excepteur adipisicing velit ex. Cillum non cupidatat reprehenderit magna eu labore. Cupidatat exercitation aliqua sunt anim sit commodo nisi ex et cillum aute occaecat. Nisi magna adipisicing excepteur ad non officia quis consectetur minim Lorem labore. Non deserunt qui eiusmod deserunt adipisicing labore labore enim nisi ad occaecat. Tempor ex ullamco dolor irure eiusmod ipsum mollit laborum deserunt.\r\n", + "registered": "2017-01-05T05:10:18 -06:-30", + "latitude": -49.742611, + "longitude": -22.173281, + "tags": [ + "labore", + "ea", + "sunt", + "officia", + "fugiat", + "elit", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Susie Page" + }, + { + "id": 1, + "name": "Pierce Ashley" + }, + { + "id": 2, + "name": "Myrtle Spence" + } + ], + "greeting": "Hello, Eddie Craig! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0e63a7863c5bba63", + "index": 229, + "guid": "dabaed19-25b4-456f-aa75-db3dbd58ce2f", + "isActive": false, + "balance": "$3,525.69", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Harriet Vasquez", + "gender": "female", + "company": "VELOS", + "email": "harrietvasquez@velos.com", + "phone": "+1 (909) 400-3743", + "address": "445 Guernsey Street, Catharine, New York, 4029", + "about": "Magna aute nostrud laboris Lorem aliquip dolore occaecat officia duis reprehenderit eu labore. Est do incididunt duis amet ex elit. Incididunt sunt exercitation in ut tempor nostrud cillum exercitation Lorem. Id qui nostrud quis id enim velit esse Lorem in et voluptate dolore aute. Velit exercitation ipsum eiusmod elit. Ipsum laborum laborum cupidatat mollit. Duis non dolore reprehenderit aute quis sint cillum non irure fugiat commodo anim exercitation culpa.\r\n", + "registered": "2017-05-21T08:43:56 -06:-30", + "latitude": 37.950637, + "longitude": 111.444887, + "tags": [ + "cillum", + "incididunt", + "sint", + "quis", + "enim", + "tempor", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Colette Stone" + }, + { + "id": 1, + "name": "Jacklyn Knowles" + }, + { + "id": 2, + "name": "Vicky Burns" + } + ], + "greeting": "Hello, Harriet Vasquez! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcdf327b3430f6e84", + "index": 230, + "guid": "0ec66971-43aa-464e-ace2-1003addb78b8", + "isActive": false, + "balance": "$1,591.36", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "brown", + "name": "Rhea Reid", + "gender": "female", + "company": "FLUMBO", + "email": "rheareid@flumbo.com", + "phone": "+1 (961) 436-3030", + "address": "699 Downing Street, Freetown, New Jersey, 8366", + "about": "Proident non do sit sint pariatur magna sint sunt qui ea aute. Reprehenderit occaecat fugiat ut aliqua aliqua nostrud. Qui qui cupidatat ullamco dolor tempor dolore ut magna sit ea fugiat. Qui enim exercitation cupidatat culpa id sint ea.\r\n", + "registered": "2016-04-19T09:18:31 -06:-30", + "latitude": -11.038611, + "longitude": -116.620642, + "tags": [ + "nostrud", + "Lorem", + "ad", + "veniam", + "nisi", + "dolor", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Alexandra Medina" + }, + { + "id": 1, + "name": "Aline Finley" + }, + { + "id": 2, + "name": "Silvia Sullivan" + } + ], + "greeting": "Hello, Rhea Reid! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf6671dcc8cc93499", + "index": 231, + "guid": "a47f1117-7d48-4e5e-925c-81961456aa72", + "isActive": true, + "balance": "$3,477.74", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Angelina Wall", + "gender": "female", + "company": "ISOPOP", + "email": "angelinawall@isopop.com", + "phone": "+1 (860) 453-3676", + "address": "367 Berry Street, Nicut, Texas, 2985", + "about": "Est incididunt eiusmod enim id sunt proident non enim officia laborum irure. In commodo sint incididunt labore. Consectetur pariatur ut do id proident ad anim cupidatat ea mollit aliquip. Officia veniam laborum ex anim irure non eu nostrud nulla nostrud tempor est. Eiusmod culpa duis pariatur fugiat deserunt duis velit quis adipisicing velit eiusmod Lorem. Magna do excepteur minim fugiat. Magna consectetur occaecat veniam minim qui qui amet nisi ullamco voluptate ullamco deserunt do.\r\n", + "registered": "2014-01-07T04:05:10 -06:-30", + "latitude": 23.81348, + "longitude": -36.552296, + "tags": [ + "quis", + "labore", + "occaecat", + "pariatur", + "ex", + "deserunt", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Harriett Nguyen" + }, + { + "id": 1, + "name": "Suarez Levine" + }, + { + "id": 2, + "name": "Margret Phelps" + } + ], + "greeting": "Hello, Angelina Wall! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b41b04413dc7299df", + "index": 232, + "guid": "b363246f-0b8b-4506-a396-651b856fca12", + "isActive": false, + "balance": "$3,400.23", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Nikki Hess", + "gender": "female", + "company": "TRIBALOG", + "email": "nikkihess@tribalog.com", + "phone": "+1 (832) 483-2835", + "address": "298 Dwight Street, Roeville, Massachusetts, 3186", + "about": "Incididunt exercitation duis proident ullamco eiusmod Lorem cupidatat dolor consequat eu dolor deserunt incididunt. Officia velit consequat aliquip irure non irure eiusmod. Consequat quis ut nisi voluptate. Culpa culpa dolore aliquip mollit do elit amet velit cillum cillum dolor. Officia dolore exercitation in fugiat magna fugiat pariatur voluptate tempor irure adipisicing nisi cillum.\r\n", + "registered": "2016-06-19T08:21:38 -06:-30", + "latitude": 7.289274, + "longitude": -127.227993, + "tags": [ + "proident", + "mollit", + "dolore", + "cillum", + "et", + "voluptate", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Lilly York" + }, + { + "id": 1, + "name": "Delia Mendoza" + }, + { + "id": 2, + "name": "Cathleen Cline" + } + ], + "greeting": "Hello, Nikki Hess! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4ba0cd6ff9613e6d44", + "index": 233, + "guid": "2c2b6571-8015-40b9-b160-47e2b763da44", + "isActive": true, + "balance": "$3,907.09", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Kerry Melendez", + "gender": "female", + "company": "SILODYNE", + "email": "kerrymelendez@silodyne.com", + "phone": "+1 (872) 550-3563", + "address": "551 Aster Court, Fidelis, Palau, 6662", + "about": "Et est aute sit qui cupidatat culpa adipisicing irure velit tempor cillum labore dolor. Ut ullamco exercitation consequat est ipsum duis nostrud. Sit nisi eiusmod labore sunt velit enim esse dolore. Nostrud minim nostrud velit labore ullamco. Eiusmod amet anim amet reprehenderit do esse officia esse non amet. Eiusmod qui occaecat velit nostrud ut labore excepteur cupidatat.\r\n", + "registered": "2017-03-03T11:39:08 -06:-30", + "latitude": 76.762709, + "longitude": 90.571608, + "tags": [ + "reprehenderit", + "dolor", + "nostrud", + "consectetur", + "occaecat", + "Lorem", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Vera Walsh" + }, + { + "id": 1, + "name": "Josefina Hancock" + }, + { + "id": 2, + "name": "Rachael Santos" + } + ], + "greeting": "Hello, Kerry Melendez! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9d6747e525ae41bc", + "index": 234, + "guid": "5723409a-fa8a-4bf9-8183-ba6e42d68c03", + "isActive": false, + "balance": "$1,715.42", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Maynard Grant", + "gender": "male", + "company": "EXOSPEED", + "email": "maynardgrant@exospeed.com", + "phone": "+1 (908) 595-2075", + "address": "363 Jackson Court, Bendon, Alaska, 1224", + "about": "Proident commodo anim ut sunt qui nostrud dolore amet tempor aliqua amet aliqua. In anim consectetur elit eiusmod voluptate dolore sunt. Fugiat commodo non elit anim.\r\n", + "registered": "2018-03-07T07:34:08 -06:-30", + "latitude": -66.937653, + "longitude": 117.943878, + "tags": [ + "incididunt", + "fugiat", + "eu", + "quis", + "ad", + "ad", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Edwina Chaney" + }, + { + "id": 1, + "name": "Claudia Lane" + }, + { + "id": 2, + "name": "Melendez Weaver" + } + ], + "greeting": "Hello, Maynard Grant! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b9a17543a5c017c0b", + "index": 235, + "guid": "0f34d0e0-d563-4057-b596-b644ccd748dd", + "isActive": true, + "balance": "$2,727.18", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Rosa Morales", + "gender": "male", + "company": "ZENSUS", + "email": "rosamorales@zensus.com", + "phone": "+1 (881) 421-2240", + "address": "571 Radde Place, Hasty, Oklahoma, 6140", + "about": "Aliqua aliqua nostrud laboris quis fugiat fugiat dolore dolor pariatur officia culpa est aute excepteur. Ad magna in incididunt irure ullamco adipisicing esse sit ut non labore. Aliqua commodo fugiat cillum Lorem amet Lorem dolor. Excepteur esse ipsum sunt nostrud minim in sunt elit enim non irure reprehenderit. Ut proident consectetur et quis ut excepteur. Occaecat laborum labore sit labore fugiat enim laboris ut in voluptate ad ullamco eiusmod aute.\r\n", + "registered": "2019-08-25T05:28:27 -06:-30", + "latitude": -71.756417, + "longitude": -126.232156, + "tags": [ + "qui", + "in", + "cupidatat", + "excepteur", + "eu", + "laborum", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Patrice Arnold" + }, + { + "id": 1, + "name": "Crosby Mclean" + }, + { + "id": 2, + "name": "Kaitlin Ball" + } + ], + "greeting": "Hello, Rosa Morales! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b03542cc95eb20dbd", + "index": 236, + "guid": "cfc52981-1a1d-46b9-a142-8a43cf4cdaa4", + "isActive": true, + "balance": "$1,363.42", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Osborn Paul", + "gender": "male", + "company": "PORTALIS", + "email": "osbornpaul@portalis.com", + "phone": "+1 (972) 564-3058", + "address": "862 Kane Place, Gila, New Mexico, 8052", + "about": "Consequat incididunt tempor do cillum elit incididunt dolore. Lorem sint laborum veniam tempor aute esse est ut nisi do reprehenderit aliquip aliqua sit. Enim consectetur qui et do aliqua cupidatat aliqua enim.\r\n", + "registered": "2020-11-30T06:05:06 -06:-30", + "latitude": -36.062239, + "longitude": -176.007865, + "tags": [ + "aliqua", + "reprehenderit", + "voluptate", + "Lorem", + "laboris", + "laboris", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Annette Pearson" + }, + { + "id": 1, + "name": "Marks Roberts" + }, + { + "id": 2, + "name": "Buckner Wilkinson" + } + ], + "greeting": "Hello, Osborn Paul! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b12234ec9f30a87b8", + "index": 237, + "guid": "32391a74-a13d-4c80-a9ee-9832827e4174", + "isActive": true, + "balance": "$1,141.64", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Tamika Dillard", + "gender": "female", + "company": "FARMEX", + "email": "tamikadillard@farmex.com", + "phone": "+1 (823) 565-3851", + "address": "975 Cove Lane, Williamson, Wyoming, 6545", + "about": "Ipsum commodo occaecat elit mollit et nostrud reprehenderit laborum reprehenderit cillum commodo deserunt laborum esse. Do sit laboris labore fugiat velit culpa adipisicing velit est est adipisicing. Ea laborum officia deserunt pariatur.\r\n", + "registered": "2014-10-12T01:54:46 -06:-30", + "latitude": 57.434808, + "longitude": 15.893882, + "tags": [ + "enim", + "laborum", + "minim", + "velit", + "ea", + "nulla", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Kris Middleton" + }, + { + "id": 1, + "name": "Jana Michael" + }, + { + "id": 2, + "name": "Tabitha Sweeney" + } + ], + "greeting": "Hello, Tamika Dillard! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8eec3d2bc2abddd0", + "index": 238, + "guid": "19bd36ea-a510-4753-9950-9f791e97802c", + "isActive": false, + "balance": "$2,006.40", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Carey Parks", + "gender": "male", + "company": "ZEAM", + "email": "careyparks@zeam.com", + "phone": "+1 (891) 489-3789", + "address": "476 Imlay Street, Lumberton, Rhode Island, 5813", + "about": "Consequat eu tempor velit veniam ipsum. Sit labore et excepteur deserunt voluptate Lorem incididunt elit id Lorem elit. Incididunt excepteur labore exercitation Lorem ipsum sint reprehenderit anim incididunt. Labore et occaecat anim sint officia est occaecat consequat cupidatat adipisicing.\r\n", + "registered": "2019-12-14T01:29:57 -06:-30", + "latitude": 64.631076, + "longitude": 160.654343, + "tags": [ + "commodo", + "tempor", + "eiusmod", + "id", + "do", + "non", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Luna Kane" + }, + { + "id": 1, + "name": "Robin Lucas" + }, + { + "id": 2, + "name": "Monica Rowland" + } + ], + "greeting": "Hello, Carey Parks! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcaf7e1391238a933", + "index": 239, + "guid": "8e8112bd-249e-484f-8486-e6cb7ec86a41", + "isActive": true, + "balance": "$3,876.65", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Joseph Heath", + "gender": "male", + "company": "BUNGA", + "email": "josephheath@bunga.com", + "phone": "+1 (900) 424-3789", + "address": "730 Highland Place, Floriston, West Virginia, 9813", + "about": "Aliquip aute non deserunt nostrud Lorem. Enim cillum veniam est id dolor laboris excepteur fugiat laborum. Proident aute magna et nisi consectetur fugiat laborum. Consectetur aute minim nostrud occaecat laborum occaecat. Aute amet aliquip proident adipisicing. Sunt qui labore veniam voluptate.\r\n", + "registered": "2017-10-12T03:13:29 -06:-30", + "latitude": -44.912136, + "longitude": -84.36876, + "tags": [ + "mollit", + "eu", + "voluptate", + "ullamco", + "consectetur", + "laborum", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Tasha Dawson" + }, + { + "id": 1, + "name": "Stanley Farmer" + }, + { + "id": 2, + "name": "Mccray Bowers" + } + ], + "greeting": "Hello, Joseph Heath! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3e02814b85fbdbc3", + "index": 240, + "guid": "c06183dd-e7af-42a2-8988-5f01b05e7dd1", + "isActive": true, + "balance": "$2,003.79", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Marshall Cash", + "gender": "male", + "company": "NEXGENE", + "email": "marshallcash@nexgene.com", + "phone": "+1 (913) 539-3829", + "address": "929 Story Street, Cazadero, Nevada, 1170", + "about": "Ad cillum eu minim eiusmod labore velit proident ad ullamco. Exercitation cupidatat id occaecat nostrud consequat non proident reprehenderit. Quis anim quis labore occaecat. Sit ad dolor aliquip cillum adipisicing sunt qui est voluptate irure incididunt consequat ad. Aute quis ut est eu dolore sunt et sint. Aliquip Lorem deserunt deserunt fugiat proident.\r\n", + "registered": "2020-03-07T05:09:27 -06:-30", + "latitude": 87.026493, + "longitude": 93.669157, + "tags": [ + "sunt", + "labore", + "laborum", + "labore", + "et", + "adipisicing", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Oconnor Morris" + }, + { + "id": 1, + "name": "Oneal Eaton" + }, + { + "id": 2, + "name": "Potter Ramirez" + } + ], + "greeting": "Hello, Marshall Cash! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b2a13b1b80ab90d1d", + "index": 241, + "guid": "2c1b5426-4758-4140-aa43-6f2689e1914b", + "isActive": true, + "balance": "$2,887.31", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Savannah Rowe", + "gender": "female", + "company": "ZANILLA", + "email": "savannahrowe@zanilla.com", + "phone": "+1 (865) 412-2746", + "address": "272 Hunterfly Place, Lopezo, Delaware, 2440", + "about": "Eu cupidatat proident fugiat cupidatat non. Fugiat veniam officia commodo quis ut id et nostrud duis. Lorem occaecat reprehenderit amet consectetur culpa reprehenderit culpa cillum nostrud.\r\n", + "registered": "2015-04-22T06:47:25 -06:-30", + "latitude": -18.004319, + "longitude": -123.564864, + "tags": [ + "proident", + "enim", + "quis", + "et", + "est", + "culpa", + "enim" + ], + "friends": [ + { + "id": 0, + "name": "Twila Morse" + }, + { + "id": 1, + "name": "Rosetta Vaughn" + }, + { + "id": 2, + "name": "Alyssa Chavez" + } + ], + "greeting": "Hello, Savannah Rowe! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be34918425261cf14", + "index": 242, + "guid": "c41b0ea0-70f2-4d0a-9dee-8fd6aa73d0cb", + "isActive": true, + "balance": "$1,143.15", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Jarvis Simpson", + "gender": "male", + "company": "ZUVY", + "email": "jarvissimpson@zuvy.com", + "phone": "+1 (854) 573-3390", + "address": "235 Beekman Place, Oley, Federated States Of Micronesia, 337", + "about": "Do aliqua aliquip dolore incididunt veniam enim. Consequat velit minim officia anim qui ullamco laborum ut sit nostrud. Eu dolore tempor consequat et consectetur duis ex incididunt proident. Elit Lorem adipisicing aliquip anim voluptate nulla minim mollit aliqua excepteur adipisicing ad consequat sunt. Commodo adipisicing magna consectetur exercitation labore minim eiusmod et cillum tempor. Magna cillum excepteur laboris mollit nulla ipsum deserunt ullamco. Deserunt mollit aute in Lorem pariatur cillum Lorem pariatur incididunt veniam commodo et non aute.\r\n", + "registered": "2019-07-14T05:44:51 -06:-30", + "latitude": 0.122335, + "longitude": -78.987263, + "tags": [ + "eu", + "adipisicing", + "adipisicing", + "dolore", + "eiusmod", + "elit", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Ethel Sykes" + }, + { + "id": 1, + "name": "Brennan Olson" + }, + { + "id": 2, + "name": "Josephine Kelley" + } + ], + "greeting": "Hello, Jarvis Simpson! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b521e9237a53a92de", + "index": 243, + "guid": "86785668-c684-457a-a732-c5d29d65aeba", + "isActive": false, + "balance": "$1,099.91", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "green", + "name": "Banks Holcomb", + "gender": "male", + "company": "ACCUPRINT", + "email": "banksholcomb@accuprint.com", + "phone": "+1 (815) 594-2964", + "address": "900 Lefferts Place, Clara, Pennsylvania, 4413", + "about": "Sint duis commodo fugiat enim qui quis nostrud. Enim et ut in non et mollit nulla consequat. Eiusmod commodo eu nisi magna id ut non. Irure duis aliqua proident ut. Dolor anim et magna mollit ea exercitation est incididunt do. Ipsum esse veniam officia minim eiusmod nulla ipsum.\r\n", + "registered": "2015-06-16T02:46:57 -06:-30", + "latitude": -14.332421, + "longitude": 125.975744, + "tags": [ + "nostrud", + "tempor", + "magna", + "aliqua", + "quis", + "pariatur", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Darla Martin" + }, + { + "id": 1, + "name": "Dalton Ochoa" + }, + { + "id": 2, + "name": "Brigitte Meadows" + } + ], + "greeting": "Hello, Banks Holcomb! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b88adcc3c44df808f", + "index": 244, + "guid": "55d642da-ed50-4dae-89af-9bb5ba983b73", + "isActive": true, + "balance": "$3,904.74", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "brown", + "name": "Velez Workman", + "gender": "male", + "company": "GEEKUS", + "email": "velezworkman@geekus.com", + "phone": "+1 (801) 408-2538", + "address": "653 Gates Avenue, Bartonsville, Connecticut, 3642", + "about": "Do duis qui aute occaecat voluptate. Incididunt do exercitation tempor eu. Proident amet nulla laboris enim consequat nulla cupidatat pariatur irure sint cillum eu officia. Et aute qui est nisi adipisicing dolor. Ex pariatur exercitation deserunt consequat laborum non excepteur fugiat adipisicing amet quis eu.\r\n", + "registered": "2017-09-01T02:44:43 -06:-30", + "latitude": 23.93446, + "longitude": -102.468239, + "tags": [ + "commodo", + "et", + "veniam", + "duis", + "adipisicing", + "id", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Mable Vincent" + }, + { + "id": 1, + "name": "Mullen Stephenson" + }, + { + "id": 2, + "name": "Ingram Montgomery" + } + ], + "greeting": "Hello, Velez Workman! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b132260f3f8fb7d77", + "index": 245, + "guid": "9bbfe6e9-f301-4010-b00f-71e2c9a0d743", + "isActive": true, + "balance": "$1,617.67", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Cash Fernandez", + "gender": "male", + "company": "PROWASTE", + "email": "cashfernandez@prowaste.com", + "phone": "+1 (815) 476-3449", + "address": "758 Randolph Street, Allensworth, Louisiana, 5541", + "about": "Mollit cupidatat incididunt in reprehenderit ea deserunt duis nostrud excepteur cillum adipisicing non magna qui. Eiusmod eiusmod elit dolore sint et quis. Culpa voluptate laboris irure in aliquip. Irure tempor excepteur proident sunt cupidatat consectetur esse consectetur magna veniam anim eu incididunt. Nulla aliquip velit aliqua proident laboris reprehenderit qui et ad laboris.\r\n", + "registered": "2014-03-25T02:52:07 -06:-30", + "latitude": 62.127628, + "longitude": 136.878458, + "tags": [ + "aliqua", + "sit", + "magna", + "sit", + "laboris", + "do", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Kenya Gillespie" + }, + { + "id": 1, + "name": "William Bowman" + }, + { + "id": 2, + "name": "Lindsey Collins" + } + ], + "greeting": "Hello, Cash Fernandez! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbe7a25cb9b1b7cf0", + "index": 246, + "guid": "a4309df8-c5f3-4dff-aaf7-95006c7e0ee3", + "isActive": false, + "balance": "$2,946.23", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "York Madden", + "gender": "male", + "company": "SQUISH", + "email": "yorkmadden@squish.com", + "phone": "+1 (992) 512-3792", + "address": "785 Cherry Street, Tyro, Vermont, 6398", + "about": "Ut consequat mollit quis adipisicing do magna in qui nostrud. Consequat tempor velit officia in in ipsum do dolor sint labore nisi mollit. Deserunt ex occaecat aliqua laborum quis Lorem cupidatat duis incididunt dolor exercitation ea non culpa.\r\n", + "registered": "2021-01-14T12:35:55 -06:-30", + "latitude": -19.244388, + "longitude": -87.584901, + "tags": [ + "exercitation", + "amet", + "esse", + "excepteur", + "ipsum", + "nostrud", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Walls Ware" + }, + { + "id": 1, + "name": "Bowman Patterson" + }, + { + "id": 2, + "name": "Washington Pace" + } + ], + "greeting": "Hello, York Madden! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b623ca671812ed06c", + "index": 247, + "guid": "d913c63f-5041-450a-b69c-9f93d82bb32b", + "isActive": true, + "balance": "$1,003.87", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Meredith Valdez", + "gender": "female", + "company": "FUTURIS", + "email": "meredithvaldez@futuris.com", + "phone": "+1 (835) 547-3689", + "address": "719 Scholes Street, Sunnyside, Iowa, 3969", + "about": "Ex nisi Lorem deserunt aliqua mollit qui est sunt labore sint reprehenderit anim ut. Irure dolore consectetur ea Lorem consequat do commodo mollit veniam sunt non quis. Quis consequat eiusmod magna et. Elit elit commodo esse culpa in elit eiusmod culpa in enim sunt minim est. Ex aute aliquip adipisicing ex aute esse ex aute anim officia mollit eiusmod esse laborum. Occaecat in consequat esse ullamco sit. Dolor consequat eiusmod sint quis magna amet velit duis dolor pariatur.\r\n", + "registered": "2016-10-12T11:36:40 -06:-30", + "latitude": 68.439856, + "longitude": -133.16114, + "tags": [ + "incididunt", + "ullamco", + "excepteur", + "occaecat", + "esse", + "eiusmod", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Sargent Cotton" + }, + { + "id": 1, + "name": "Trisha Boone" + }, + { + "id": 2, + "name": "Lessie Stanley" + } + ], + "greeting": "Hello, Meredith Valdez! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b30948808a1704e43", + "index": 248, + "guid": "d87942b5-3bad-49ed-a953-cb7888bc643c", + "isActive": true, + "balance": "$2,005.64", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Catherine Mooney", + "gender": "female", + "company": "GLOBOIL", + "email": "catherinemooney@globoil.com", + "phone": "+1 (937) 435-3258", + "address": "466 Taylor Street, Retsof, Virginia, 5440", + "about": "Anim id cillum et minim adipisicing et. Deserunt deserunt deserunt ipsum ut aute nulla id eiusmod excepteur non ex. Incididunt occaecat et nisi reprehenderit labore sit. Ut adipisicing ad exercitation deserunt Lorem occaecat incididunt proident non est nostrud mollit eiusmod.\r\n", + "registered": "2021-05-25T04:26:32 -06:-30", + "latitude": -8.023004, + "longitude": 73.119767, + "tags": [ + "nostrud", + "proident", + "labore", + "nulla", + "quis", + "exercitation", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Burke Calhoun" + }, + { + "id": 1, + "name": "Estela Rush" + }, + { + "id": 2, + "name": "Faye Kaufman" + } + ], + "greeting": "Hello, Catherine Mooney! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b02c0f35b9cc1de44", + "index": 249, + "guid": "a0ec389d-efaa-4969-a7c7-f06c2cf88d78", + "isActive": true, + "balance": "$2,168.16", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Reyna Palmer", + "gender": "female", + "company": "OCTOCORE", + "email": "reynapalmer@octocore.com", + "phone": "+1 (902) 504-3918", + "address": "806 Bowne Street, Kieler, Maine, 9194", + "about": "Adipisicing nulla dolor tempor irure officia ea aliqua. Irure ullamco ex amet ullamco aliquip Lorem deserunt voluptate laborum laboris cupidatat veniam adipisicing. Aute mollit ex tempor aute est laboris enim sint tempor. Aute officia excepteur aliquip in. Magna anim dolor in est velit anim aliqua mollit duis.\r\n", + "registered": "2021-08-21T05:18:10 -06:-30", + "latitude": -49.303623, + "longitude": 167.345341, + "tags": [ + "in", + "ex", + "voluptate", + "ea", + "nisi", + "pariatur", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Wolf Ferrell" + }, + { + "id": 1, + "name": "Rhoda Callahan" + }, + { + "id": 2, + "name": "Mathews Johns" + } + ], + "greeting": "Hello, Reyna Palmer! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b42db31869f15467b", + "index": 250, + "guid": "fcfe3276-798d-459b-900e-0996864c597c", + "isActive": true, + "balance": "$3,932.25", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Lilian Strong", + "gender": "female", + "company": "CANOPOLY", + "email": "lilianstrong@canopoly.com", + "phone": "+1 (903) 539-3007", + "address": "658 Williams Place, Collins, Nebraska, 4820", + "about": "Ad reprehenderit amet commodo labore consequat deserunt laborum magna cupidatat. Lorem officia aliquip veniam eiusmod est est cupidatat. Eu laboris velit proident incididunt eiusmod. Nisi aute adipisicing esse dolore amet minim incididunt. Eu adipisicing enim laborum duis duis dolore exercitation id dolor magna excepteur nisi nisi.\r\n", + "registered": "2022-09-18T12:53:20 -06:-30", + "latitude": 78.171236, + "longitude": 13.592731, + "tags": [ + "consectetur", + "mollit", + "anim", + "ullamco", + "do", + "magna", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Francisca Waller" + }, + { + "id": 1, + "name": "Robert Holland" + }, + { + "id": 2, + "name": "Rodriquez Mays" + } + ], + "greeting": "Hello, Lilian Strong! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bfe2ae4d47f031c59", + "index": 251, + "guid": "04f8ea81-408d-4d8a-9454-aa8a620da3cf", + "isActive": false, + "balance": "$1,488.26", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Carly Henderson", + "gender": "female", + "company": "VINCH", + "email": "carlyhenderson@vinch.com", + "phone": "+1 (876) 589-2008", + "address": "736 Havemeyer Street, Laurelton, Mississippi, 4031", + "about": "Aliqua minim reprehenderit duis labore proident nostrud voluptate elit duis culpa ullamco et. Pariatur culpa tempor non duis nulla. Aliquip laborum tempor duis proident exercitation. Incididunt id reprehenderit officia aliqua cupidatat sint commodo fugiat exercitation.\r\n", + "registered": "2015-10-07T01:24:27 -06:-30", + "latitude": -86.385773, + "longitude": -94.051637, + "tags": [ + "magna", + "ad", + "consectetur", + "sunt", + "Lorem", + "cupidatat", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Cruz Lee" + }, + { + "id": 1, + "name": "Tessa Hernandez" + }, + { + "id": 2, + "name": "Aileen Carter" + } + ], + "greeting": "Hello, Carly Henderson! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb2563d8431c5215a", + "index": 252, + "guid": "36982724-1303-4c7f-bdb2-b4ee9635bfab", + "isActive": true, + "balance": "$3,867.65", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Nguyen William", + "gender": "male", + "company": "ORBAXTER", + "email": "nguyenwilliam@orbaxter.com", + "phone": "+1 (893) 566-2281", + "address": "214 Knapp Street, Irwin, Indiana, 5770", + "about": "Amet nulla eu commodo incididunt aliqua anim eu non nisi nulla. Qui et sit duis ut fugiat reprehenderit excepteur mollit nostrud culpa. Sint minim Lorem cupidatat anim est esse veniam. Adipisicing fugiat incididunt tempor magna veniam reprehenderit in aliqua. Officia deserunt culpa irure sit occaecat cupidatat reprehenderit. Ut excepteur nulla nostrud ea tempor consectetur aliquip ex voluptate nisi velit dolor tempor. Id laborum nulla excepteur officia.\r\n", + "registered": "2017-10-15T08:09:56 -06:-30", + "latitude": 40.044867, + "longitude": -140.361768, + "tags": [ + "do", + "mollit", + "exercitation", + "eiusmod", + "adipisicing", + "in", + "quis" + ], + "friends": [ + { + "id": 0, + "name": "Crystal Flores" + }, + { + "id": 1, + "name": "Wendy Aguirre" + }, + { + "id": 2, + "name": "Nicholson Reese" + } + ], + "greeting": "Hello, Nguyen William! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba757a75d366a713e", + "index": 253, + "guid": "67667cf5-9c79-410b-b231-a27d7e0fe1b9", + "isActive": true, + "balance": "$3,303.73", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Shari Wilkerson", + "gender": "female", + "company": "ACCIDENCY", + "email": "shariwilkerson@accidency.com", + "phone": "+1 (995) 464-3837", + "address": "433 Willoughby Avenue, Belva, Guam, 8552", + "about": "Culpa adipisicing elit culpa exercitation. Anim esse est fugiat exercitation ea excepteur ut duis excepteur eiusmod. Culpa reprehenderit id occaecat irure incididunt veniam cillum sunt enim incididunt minim. Duis sit irure consequat ex minim dolore excepteur occaecat ullamco velit deserunt laborum. Aliquip adipisicing fugiat proident cupidatat laborum ea ea fugiat ex. Commodo ea cupidatat sint et elit commodo id. Incididunt minim reprehenderit eu dolor.\r\n", + "registered": "2022-03-17T08:52:46 -06:-30", + "latitude": -3.27947, + "longitude": -5.761517, + "tags": [ + "laboris", + "pariatur", + "eu", + "deserunt", + "esse", + "in", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Earlene Slater" + }, + { + "id": 1, + "name": "Camille Fuller" + }, + { + "id": 2, + "name": "Kelsey Sosa" + } + ], + "greeting": "Hello, Shari Wilkerson! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbcba35f34fbd85c2", + "index": 254, + "guid": "fb10f86d-1c22-4a26-95d5-441c88d4134b", + "isActive": false, + "balance": "$1,988.53", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "White Tyler", + "gender": "male", + "company": "POSHOME", + "email": "whitetyler@poshome.com", + "phone": "+1 (901) 405-2645", + "address": "668 Chestnut Avenue, Dundee, Kentucky, 6116", + "about": "Est est eu reprehenderit nostrud voluptate nisi occaecat enim mollit labore mollit labore enim enim. Velit aliqua consectetur incididunt et. Tempor consectetur voluptate irure officia aute aliqua duis ea et. Aute cillum exercitation veniam culpa nostrud sint. Occaecat voluptate occaecat fugiat qui laborum nulla sit eiusmod. Commodo elit occaecat proident qui non qui enim cillum eu culpa cillum id culpa.\r\n", + "registered": "2019-04-18T12:17:16 -06:-30", + "latitude": -59.592237, + "longitude": 141.672235, + "tags": [ + "et", + "amet", + "et", + "aliquip", + "quis", + "proident", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Castillo Farrell" + }, + { + "id": 1, + "name": "Beard Murray" + }, + { + "id": 2, + "name": "Shana Gonzales" + } + ], + "greeting": "Hello, White Tyler! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b99b9a1bfddd08157", + "index": 255, + "guid": "44abaf7c-a6d8-4a04-ad0d-4e1f12c21ba1", + "isActive": true, + "balance": "$3,937.81", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Morton Langley", + "gender": "male", + "company": "ENTROPIX", + "email": "mortonlangley@entropix.com", + "phone": "+1 (971) 484-2183", + "address": "235 Louis Place, Cawood, Puerto Rico, 4323", + "about": "Exercitation dolor ipsum adipisicing veniam. Labore consectetur laborum aliquip non incididunt irure labore culpa ullamco velit esse proident. Pariatur labore non ut tempor minim. Eiusmod cupidatat tempor elit irure fugiat aliqua pariatur occaecat sint ex. Magna pariatur consectetur Lorem culpa nulla laboris. Ex veniam enim quis labore nostrud occaecat pariatur anim fugiat nostrud esse adipisicing. Culpa veniam cupidatat culpa eu anim proident ex.\r\n", + "registered": "2015-09-03T03:09:39 -06:-30", + "latitude": -30.877912, + "longitude": 174.931466, + "tags": [ + "dolor", + "incididunt", + "ullamco", + "laborum", + "magna", + "ad", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Chen Frye" + }, + { + "id": 1, + "name": "Wade Johnson" + }, + { + "id": 2, + "name": "Allison Anderson" + } + ], + "greeting": "Hello, Morton Langley! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7862ba9ef15fc8d2", + "index": 256, + "guid": "1f743366-809d-493e-93ab-0b4ddeb3135c", + "isActive": false, + "balance": "$2,925.03", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Traci Whitfield", + "gender": "female", + "company": "ENDIPIN", + "email": "traciwhitfield@endipin.com", + "phone": "+1 (831) 430-2365", + "address": "705 Cypress Court, Harborton, North Carolina, 7137", + "about": "Ullamco aliqua occaecat reprehenderit tempor pariatur adipisicing labore. Veniam et pariatur exercitation non sit. Dolore magna eiusmod non minim quis irure minim eiusmod mollit ea officia eiusmod dolor deserunt.\r\n", + "registered": "2018-07-03T06:43:54 -06:-30", + "latitude": 23.024835, + "longitude": 19.720874, + "tags": [ + "magna", + "deserunt", + "et", + "officia", + "qui", + "consequat", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "Solomon Gilbert" + }, + { + "id": 1, + "name": "Dawson Bentley" + }, + { + "id": 2, + "name": "Pope Blanchard" + } + ], + "greeting": "Hello, Traci Whitfield! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b5f34c02922c6942c", + "index": 257, + "guid": "b73b97ee-5de1-4ce3-8889-8034d774f7ec", + "isActive": false, + "balance": "$3,241.81", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Callie Cox", + "gender": "female", + "company": "IRACK", + "email": "calliecox@irack.com", + "phone": "+1 (959) 567-3841", + "address": "729 Seagate Avenue, Kennedyville, Tennessee, 2587", + "about": "Proident nisi velit ullamco cillum id aliquip eiusmod officia. Amet ullamco laboris dolore commodo pariatur. Ex aliquip et eiusmod incididunt est. Pariatur veniam eiusmod id consectetur elit.\r\n", + "registered": "2022-06-01T07:32:57 -06:-30", + "latitude": 53.031852, + "longitude": 58.454114, + "tags": [ + "id", + "enim", + "ad", + "exercitation", + "exercitation", + "aliqua", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Helena Robles" + }, + { + "id": 1, + "name": "Ochoa Koch" + }, + { + "id": 2, + "name": "Burgess Navarro" + } + ], + "greeting": "Hello, Callie Cox! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4be4185efc22622202", + "index": 258, + "guid": "8390806a-66c4-4fc1-8e0a-7b0485ef7388", + "isActive": false, + "balance": "$1,542.65", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "blue", + "name": "Deidre Kidd", + "gender": "female", + "company": "AQUASSEUR", + "email": "deidrekidd@aquasseur.com", + "phone": "+1 (967) 575-3114", + "address": "327 Story Court, Russellville, Arkansas, 2442", + "about": "Irure commodo tempor exercitation et deserunt elit officia. Officia culpa sit ad minim non mollit ad laborum. Nostrud irure eu qui consectetur fugiat exercitation nulla ea adipisicing laboris Lorem. Eu consectetur dolor id eiusmod quis veniam ex aliquip irure laboris reprehenderit sit amet qui. Laboris exercitation officia proident voluptate officia occaecat non non amet occaecat consequat nulla ad. Pariatur aute ex irure enim occaecat deserunt reprehenderit deserunt velit incididunt qui in culpa veniam.\r\n", + "registered": "2019-11-02T09:24:53 -06:-30", + "latitude": -45.192039, + "longitude": 33.867418, + "tags": [ + "nisi", + "nisi", + "aute", + "in", + "magna", + "do", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Ferguson Kemp" + }, + { + "id": 1, + "name": "Macias Duncan" + }, + { + "id": 2, + "name": "Rose Hicks" + } + ], + "greeting": "Hello, Deidre Kidd! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4be660efc30950b2b1", + "index": 259, + "guid": "d58b1f18-2a4c-4f5d-b633-bd809d9cf3d5", + "isActive": true, + "balance": "$2,427.13", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Peters Rivers", + "gender": "male", + "company": "EPLOSION", + "email": "petersrivers@eplosion.com", + "phone": "+1 (916) 448-3796", + "address": "240 Fayette Street, Lacomb, Virgin Islands, 2251", + "about": "Lorem ipsum eiusmod deserunt anim magna occaecat ipsum deserunt excepteur incididunt. Lorem excepteur ut adipisicing mollit laboris anim labore excepteur non. Consequat minim esse cupidatat in.\r\n", + "registered": "2019-08-04T08:06:46 -06:-30", + "latitude": 11.153154, + "longitude": -155.475031, + "tags": [ + "non", + "consequat", + "enim", + "exercitation", + "occaecat", + "amet", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Dolores Norton" + }, + { + "id": 1, + "name": "Millicent Ellis" + }, + { + "id": 2, + "name": "Lou Benjamin" + } + ], + "greeting": "Hello, Peters Rivers! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6e977bec1eb257f1", + "index": 260, + "guid": "f5dd627c-6a37-46ff-b156-372b9b2dd6c7", + "isActive": true, + "balance": "$2,742.17", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Doris Whitehead", + "gender": "female", + "company": "QUIZMO", + "email": "doriswhitehead@quizmo.com", + "phone": "+1 (844) 534-2516", + "address": "720 Brown Street, Bowie, Oregon, 2354", + "about": "Amet incididunt ipsum id exercitation laboris eu aliquip magna ut sit sunt. Aliquip id anim sint quis sit ad cillum. Eiusmod deserunt commodo qui nulla commodo dolor consectetur incididunt.\r\n", + "registered": "2018-10-03T03:34:50 -06:-30", + "latitude": 31.255902, + "longitude": -110.729525, + "tags": [ + "minim", + "aliqua", + "nisi", + "officia", + "duis", + "consectetur", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Maricela Underwood" + }, + { + "id": 1, + "name": "Barton Mullins" + }, + { + "id": 2, + "name": "Alexander Joyner" + } + ], + "greeting": "Hello, Doris Whitehead! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb48211d0a6fe2964", + "index": 261, + "guid": "e4685cf9-e897-4c07-ae49-12ecade5fe32", + "isActive": false, + "balance": "$3,773.77", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Jannie Tate", + "gender": "female", + "company": "SEALOUD", + "email": "jannietate@sealoud.com", + "phone": "+1 (802) 416-2272", + "address": "629 Bogart Street, Neahkahnie, District Of Columbia, 4993", + "about": "Sit nostrud est ex laborum nostrud culpa pariatur qui eu pariatur sint anim nostrud. Dolor elit amet proident nisi proident. Deserunt amet nisi deserunt irure non laboris ullamco non duis. Id in in consectetur minim sint minim pariatur nulla proident officia adipisicing quis cupidatat veniam. Enim laborum in ex ad qui dolore irure consequat.\r\n", + "registered": "2016-03-07T04:39:57 -06:-30", + "latitude": -0.907577, + "longitude": 62.486206, + "tags": [ + "nisi", + "velit", + "consequat", + "enim", + "ullamco", + "adipisicing", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Fletcher Garrett" + }, + { + "id": 1, + "name": "Tisha Bradford" + }, + { + "id": 2, + "name": "Taylor Vance" + } + ], + "greeting": "Hello, Jannie Tate! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4beb6d27fe4a4218c8", + "index": 262, + "guid": "5e6bd48f-773e-4316-b77b-ce8d36f7b50d", + "isActive": false, + "balance": "$1,763.62", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Dianna Larsen", + "gender": "female", + "company": "EXOBLUE", + "email": "diannalarsen@exoblue.com", + "phone": "+1 (984) 512-2809", + "address": "965 Nassau Avenue, Hollins, Florida, 1199", + "about": "Id aliquip minim velit ut exercitation. Sunt in consectetur incididunt eiusmod fugiat sunt quis consectetur velit Lorem occaecat ea cupidatat. Proident qui ut incididunt magna cillum aliqua aliquip cillum. Lorem ex tempor culpa veniam culpa labore et consectetur excepteur. Consectetur ullamco ad voluptate ipsum velit magna. Exercitation aliqua ex velit sit nulla consectetur ullamco magna magna sunt. Sint enim tempor velit quis est cillum occaecat amet sunt proident.\r\n", + "registered": "2016-12-18T10:09:53 -06:-30", + "latitude": -21.847924, + "longitude": -64.496983, + "tags": [ + "id", + "aliqua", + "magna", + "velit", + "irure", + "exercitation", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Alissa Cameron" + }, + { + "id": 1, + "name": "Elinor Mclaughlin" + }, + { + "id": 2, + "name": "Rosalie Pickett" + } + ], + "greeting": "Hello, Dianna Larsen! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b29c2d898ee45ad32", + "index": 263, + "guid": "9e1574c3-84d2-406b-92f3-af34ea1f5417", + "isActive": true, + "balance": "$2,349.01", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Dyer Justice", + "gender": "male", + "company": "INEAR", + "email": "dyerjustice@inear.com", + "phone": "+1 (878) 419-2030", + "address": "373 Brevoort Place, Highland, Washington, 7770", + "about": "Duis proident in proident eiusmod. Nisi occaecat ex incididunt laboris nisi proident incididunt officia ipsum. Elit aliqua et culpa culpa voluptate eiusmod amet adipisicing ex mollit est ullamco. Velit proident ea sint dolor enim reprehenderit anim fugiat amet nulla. Consequat non voluptate fugiat sit excepteur non laborum do qui adipisicing.\r\n", + "registered": "2014-09-06T01:54:01 -06:-30", + "latitude": 42.781377, + "longitude": 158.987247, + "tags": [ + "aliqua", + "non", + "sint", + "qui", + "consequat", + "velit", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Guzman Hutchinson" + }, + { + "id": 1, + "name": "Graciela Olsen" + }, + { + "id": 2, + "name": "Herman Robertson" + } + ], + "greeting": "Hello, Dyer Justice! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba6c52669a3cc38be", + "index": 264, + "guid": "93b27237-2d5c-45bc-9d6b-50a698343b63", + "isActive": false, + "balance": "$1,953.85", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Ivy Contreras", + "gender": "female", + "company": "UXMOX", + "email": "ivycontreras@uxmox.com", + "phone": "+1 (995) 408-3368", + "address": "427 Applegate Court, Diaperville, Montana, 3882", + "about": "Elit laborum excepteur mollit voluptate et. Commodo laborum aliqua eu fugiat adipisicing aliquip eiusmod. Quis aute ad qui non voluptate esse aute dolor in cupidatat. Irure pariatur exercitation labore officia sint aliquip qui sit deserunt commodo amet nulla minim elit. Labore eiusmod voluptate velit proident deserunt excepteur nulla cillum anim adipisicing elit voluptate id.\r\n", + "registered": "2017-09-01T09:46:10 -06:-30", + "latitude": -69.140954, + "longitude": 94.018409, + "tags": [ + "est", + "aute", + "laboris", + "culpa", + "eiusmod", + "dolore", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Althea Price" + }, + { + "id": 1, + "name": "Vanessa Conner" + }, + { + "id": 2, + "name": "Darlene Warner" + } + ], + "greeting": "Hello, Ivy Contreras! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6159d43e7f9e3e4e", + "index": 265, + "guid": "15ab856a-e577-4f1e-843c-ec37401d1a93", + "isActive": false, + "balance": "$1,927.09", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Lottie Blair", + "gender": "female", + "company": "QUIZKA", + "email": "lottieblair@quizka.com", + "phone": "+1 (967) 478-3513", + "address": "496 Williamsburg Street, Lodoga, Hawaii, 9917", + "about": "In velit tempor ea reprehenderit ex reprehenderit amet. Culpa quis consequat sint fugiat consequat cillum ut qui cillum fugiat. Sunt exercitation Lorem adipisicing pariatur culpa esse ex. Velit nisi eu in voluptate laboris incididunt non adipisicing irure in qui qui cillum fugiat.\r\n", + "registered": "2020-08-21T03:02:53 -06:-30", + "latitude": -59.572538, + "longitude": 18.393405, + "tags": [ + "ex", + "ex", + "sunt", + "Lorem", + "qui", + "Lorem", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Emerson Bender" + }, + { + "id": 1, + "name": "Burt Booth" + }, + { + "id": 2, + "name": "Terry Hopper" + } + ], + "greeting": "Hello, Lottie Blair! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b26e561d36947f402", + "index": 266, + "guid": "4ec0f65d-6853-4ed9-a2ba-8a98ce5fc69b", + "isActive": true, + "balance": "$1,885.94", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Vega House", + "gender": "male", + "company": "NETPLAX", + "email": "vegahouse@netplax.com", + "phone": "+1 (854) 440-2754", + "address": "394 Beard Street, Moscow, Michigan, 4895", + "about": "Sit labore nostrud velit voluptate tempor labore proident. Ex esse anim culpa est proident non aliqua proident incididunt ex reprehenderit officia Lorem. Adipisicing nostrud voluptate eiusmod velit tempor non anim dolor mollit aliquip non ut mollit ea. Amet aute aute do est velit aliquip velit nostrud ex eiusmod sit occaecat irure sint.\r\n", + "registered": "2020-04-25T09:17:36 -06:-30", + "latitude": -22.960241, + "longitude": -58.216309, + "tags": [ + "irure", + "officia", + "ad", + "laborum", + "amet", + "ad", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Carter Cleveland" + }, + { + "id": 1, + "name": "Amalia Taylor" + }, + { + "id": 2, + "name": "Terri Crane" + } + ], + "greeting": "Hello, Vega House! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b97cf4a88612f0971", + "index": 267, + "guid": "0c451176-d08d-4a6d-bc67-2324008a2d15", + "isActive": false, + "balance": "$2,012.07", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "blue", + "name": "Malinda Howard", + "gender": "female", + "company": "OPTICON", + "email": "malindahoward@opticon.com", + "phone": "+1 (958) 567-3195", + "address": "423 Ridgewood Avenue, Vandiver, Maryland, 4623", + "about": "Proident do est labore enim eu fugiat dolor do proident. Et consectetur et esse sunt nostrud reprehenderit veniam proident mollit ut. Excepteur officia in mollit occaecat mollit tempor veniam veniam voluptate amet pariatur laborum aliqua est. Sunt tempor dolore minim exercitation exercitation proident non. Anim quis dolore consequat nostrud veniam esse magna deserunt irure. Tempor aliquip ex ut eu incididunt.\r\n", + "registered": "2019-11-17T03:15:25 -06:-30", + "latitude": 73.518036, + "longitude": -79.403601, + "tags": [ + "ex", + "mollit", + "reprehenderit", + "proident", + "laborum", + "minim", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Casandra Hart" + }, + { + "id": 1, + "name": "Jodi Walls" + }, + { + "id": 2, + "name": "Tanner Howe" + } + ], + "greeting": "Hello, Malinda Howard! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b511a6c10b1e1168a", + "index": 268, + "guid": "ab8fe8e7-a75a-4289-a4ec-c7618c576a2d", + "isActive": false, + "balance": "$3,330.92", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "blue", + "name": "Kinney Kerr", + "gender": "male", + "company": "ISOLOGICA", + "email": "kinneykerr@isologica.com", + "phone": "+1 (867) 432-3283", + "address": "893 Ridgewood Place, Washington, American Samoa, 9609", + "about": "Ea consectetur id laboris anim dolor magna veniam laborum nostrud aliqua fugiat pariatur. Elit veniam sit eu mollit esse do proident ad et voluptate excepteur aliqua est. Proident dolore laboris sunt commodo aliqua pariatur consequat laborum id magna cupidatat.\r\n", + "registered": "2015-09-18T07:13:10 -06:-30", + "latitude": 30.338159, + "longitude": -107.324039, + "tags": [ + "veniam", + "sit", + "commodo", + "incididunt", + "occaecat", + "duis", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Mallory Pacheco" + }, + { + "id": 1, + "name": "Caroline Lyons" + }, + { + "id": 2, + "name": "Liza Carrillo" + } + ], + "greeting": "Hello, Kinney Kerr! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb563b32513b4f1bc", + "index": 269, + "guid": "330677cb-e1a4-4725-9e12-23206b25bd78", + "isActive": false, + "balance": "$2,867.96", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Barrera Huffman", + "gender": "male", + "company": "CENTICE", + "email": "barrerahuffman@centice.com", + "phone": "+1 (909) 528-2447", + "address": "234 Division Place, Kraemer, Illinois, 6866", + "about": "Commodo do quis ea velit. Officia anim et non nostrud aliquip sit anim officia sunt. Id veniam eu enim Lorem.\r\n", + "registered": "2022-09-08T12:01:27 -06:-30", + "latitude": 57.638606, + "longitude": -152.47675, + "tags": [ + "nulla", + "voluptate", + "amet", + "in", + "tempor", + "incididunt", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Bennett Rich" + }, + { + "id": 1, + "name": "Manning Grimes" + }, + { + "id": 2, + "name": "Reese Mcgowan" + } + ], + "greeting": "Hello, Barrera Huffman! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b0ce56561b67be377", + "index": 270, + "guid": "805d20e6-dabd-42d0-ae31-cb74eff6dd7d", + "isActive": false, + "balance": "$1,575.90", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Nora Mcknight", + "gender": "female", + "company": "NEUROCELL", + "email": "noramcknight@neurocell.com", + "phone": "+1 (979) 531-2754", + "address": "192 Coffey Street, Urie, Missouri, 1402", + "about": "Aliqua ea laboris aliquip eu Lorem incididunt commodo veniam enim velit consequat dolor exercitation. Voluptate cupidatat consectetur irure dolor minim fugiat proident nisi ea. Aute et qui sit elit ex magna mollit proident nostrud ullamco minim. Magna enim anim consequat incididunt culpa cillum cupidatat id fugiat id occaecat magna Lorem incididunt. Nostrud pariatur eu deserunt ipsum voluptate pariatur laboris quis. Qui do ut voluptate dolor ullamco laboris pariatur laboris sint duis.\r\n", + "registered": "2021-02-15T05:09:37 -06:-30", + "latitude": -75.221683, + "longitude": 153.792124, + "tags": [ + "Lorem", + "id", + "magna", + "laboris", + "adipisicing", + "laboris", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Pat Terrell" + }, + { + "id": 1, + "name": "Garza Weeks" + }, + { + "id": 2, + "name": "Young Gay" + } + ], + "greeting": "Hello, Nora Mcknight! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b081625a886c437be", + "index": 271, + "guid": "63d53cd1-43c4-49b4-a98b-f899c6fc4589", + "isActive": false, + "balance": "$3,562.11", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Ortiz Quinn", + "gender": "male", + "company": "XPLOR", + "email": "ortizquinn@xplor.com", + "phone": "+1 (860) 478-2625", + "address": "109 Ridge Boulevard, Aberdeen, Idaho, 7438", + "about": "Amet sunt laborum minim labore enim elit. Laboris dolore velit est ex qui eu exercitation elit nulla mollit. Enim exercitation est commodo amet aliqua occaecat aliqua nostrud exercitation est.\r\n", + "registered": "2014-08-20T06:51:40 -06:-30", + "latitude": -15.0285, + "longitude": 137.809822, + "tags": [ + "sit", + "qui", + "esse", + "ullamco", + "enim", + "ut", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Rush Armstrong" + }, + { + "id": 1, + "name": "Kathie Kirk" + }, + { + "id": 2, + "name": "Janell Bennett" + } + ], + "greeting": "Hello, Ortiz Quinn! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbe96e8a9c5e57a8c", + "index": 272, + "guid": "3d5e7c29-db64-43fc-8a88-1788f41066db", + "isActive": false, + "balance": "$1,965.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Lane Hawkins", + "gender": "male", + "company": "KRAG", + "email": "lanehawkins@krag.com", + "phone": "+1 (948) 422-2088", + "address": "196 Wogan Terrace, Wollochet, South Carolina, 2562", + "about": "Pariatur ex incididunt adipisicing id non Lorem. Voluptate incididunt aute velit dolore proident id elit adipisicing. Fugiat aute aute non qui est irure nisi laborum. Nostrud anim dolor Lorem est velit sit occaecat sunt nisi ipsum.\r\n", + "registered": "2017-04-08T04:10:19 -06:-30", + "latitude": -17.492173, + "longitude": -102.104486, + "tags": [ + "amet", + "sit", + "irure", + "quis", + "ipsum", + "sit", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Conley Duran" + }, + { + "id": 1, + "name": "Manuela Landry" + }, + { + "id": 2, + "name": "Mai Christian" + } + ], + "greeting": "Hello, Lane Hawkins! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd77184797e4c3e30", + "index": 273, + "guid": "2f20945d-5494-420b-9f2a-2c207bfe431e", + "isActive": true, + "balance": "$2,850.40", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Gregory Gallagher", + "gender": "male", + "company": "GREEKER", + "email": "gregorygallagher@greeker.com", + "phone": "+1 (881) 516-2484", + "address": "692 Everit Street, Westwood, Colorado, 8209", + "about": "Aute non reprehenderit eu fugiat consectetur ad culpa in. Fugiat nostrud non do cillum quis ex elit sit sunt. Elit culpa culpa commodo consectetur voluptate voluptate ex culpa ex proident id laborum occaecat. Ad adipisicing non consectetur culpa ullamco velit eu id aliquip non sunt minim cillum Lorem.\r\n", + "registered": "2018-09-29T12:30:22 -06:-30", + "latitude": 48.174766, + "longitude": 126.775643, + "tags": [ + "mollit", + "in", + "Lorem", + "duis", + "magna", + "Lorem", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Sandoval Morin" + }, + { + "id": 1, + "name": "Heather Gonzalez" + }, + { + "id": 2, + "name": "Finley Cochran" + } + ], + "greeting": "Hello, Gregory Gallagher! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b2be0d67558a4ad9f", + "index": 274, + "guid": "d309864a-72d1-4233-82ec-c678bc41687f", + "isActive": false, + "balance": "$3,539.33", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Zelma Cooper", + "gender": "female", + "company": "WRAPTURE", + "email": "zelmacooper@wrapture.com", + "phone": "+1 (885) 597-2476", + "address": "110 Centre Street, Robinson, New Hampshire, 6677", + "about": "Et cillum est exercitation dolore. Exercitation sit id amet commodo est exercitation excepteur tempor nulla occaecat esse mollit irure. Ad tempor cupidatat elit duis proident est ipsum qui anim exercitation voluptate proident. Dolore ut tempor fugiat deserunt fugiat aute ipsum laborum cillum elit. Nisi cillum et esse et aliqua ipsum laboris. Quis excepteur deserunt aute ad incididunt sunt incididunt enim ex non. Adipisicing veniam anim magna magna quis officia labore esse consectetur laborum nisi irure exercitation.\r\n", + "registered": "2022-04-16T10:18:25 -06:-30", + "latitude": 51.696195, + "longitude": 68.580932, + "tags": [ + "mollit", + "laboris", + "consectetur", + "deserunt", + "officia", + "tempor", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Gilmore Sutton" + }, + { + "id": 1, + "name": "Miriam Riddle" + }, + { + "id": 2, + "name": "Erna Thomas" + } + ], + "greeting": "Hello, Zelma Cooper! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b85e93a51154a8542", + "index": 275, + "guid": "45e484c9-e61a-40ac-8bf5-cfedc5d505ea", + "isActive": false, + "balance": "$2,702.57", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Jenny Dale", + "gender": "female", + "company": "INDEXIA", + "email": "jennydale@indexia.com", + "phone": "+1 (855) 441-2012", + "address": "180 Roder Avenue, Chumuckla, Minnesota, 150", + "about": "Labore aliqua enim incididunt deserunt officia. Non dolore dolor aute dolore cupidatat culpa adipisicing ut mollit minim. Aliquip officia proident dolore sit nostrud ipsum consectetur exercitation eiusmod aute voluptate pariatur amet qui. Non cillum sunt incididunt pariatur quis dolor voluptate dolore do incididunt.\r\n", + "registered": "2020-07-05T06:44:46 -06:-30", + "latitude": 72.877526, + "longitude": 77.280833, + "tags": [ + "exercitation", + "eu", + "pariatur", + "commodo", + "nulla", + "anim", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Leann Burris" + }, + { + "id": 1, + "name": "Willie Chase" + }, + { + "id": 2, + "name": "Kim Bradshaw" + } + ], + "greeting": "Hello, Jenny Dale! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bdc5907085de99627", + "index": 276, + "guid": "f22850bb-c61b-4720-9782-d9f758077a77", + "isActive": true, + "balance": "$3,118.81", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Dawn Little", + "gender": "female", + "company": "ETERNIS", + "email": "dawnlittle@eternis.com", + "phone": "+1 (917) 536-3136", + "address": "359 Sullivan Place, Singer, Utah, 120", + "about": "Ad consequat laborum pariatur mollit ipsum proident qui do laborum duis. Sunt nisi est do ex in commodo duis mollit consectetur. Aute occaecat et est qui tempor officia elit aute pariatur nulla. Ea commodo aliqua Lorem dolor non aliquip. Nisi officia dolor eu nulla occaecat Lorem ea cupidatat laboris consectetur. Nulla anim ad amet sit culpa cillum fugiat. Nisi quis id voluptate labore mollit enim Lorem velit irure ex.\r\n", + "registered": "2020-01-04T03:21:49 -06:-30", + "latitude": -30.433769, + "longitude": -89.423016, + "tags": [ + "ut", + "exercitation", + "cillum", + "culpa", + "et", + "enim", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Therese Bradley" + }, + { + "id": 1, + "name": "Glenn Allison" + }, + { + "id": 2, + "name": "Woodward Branch" + } + ], + "greeting": "Hello, Dawn Little! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bfa1c3e93899233e9", + "index": 277, + "guid": "4dd8e63d-f792-4233-9948-da9a23cbbe27", + "isActive": true, + "balance": "$3,289.46", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Richardson Blake", + "gender": "male", + "company": "IMANT", + "email": "richardsonblake@imant.com", + "phone": "+1 (955) 477-3053", + "address": "735 Homecrest Court, Jacksonburg, South Dakota, 5993", + "about": "Dolore veniam qui excepteur labore reprehenderit et fugiat laborum. Ut ut occaecat consectetur reprehenderit cillum reprehenderit cupidatat. Est commodo incididunt sint voluptate magna mollit qui.\r\n", + "registered": "2014-10-17T04:35:01 -06:-30", + "latitude": 48.332012, + "longitude": 140.945931, + "tags": [ + "ex", + "enim", + "sint", + "aliqua", + "deserunt", + "duis", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Francis Massey" + }, + { + "id": 1, + "name": "Rice Blankenship" + }, + { + "id": 2, + "name": "Eliza Brooks" + } + ], + "greeting": "Hello, Richardson Blake! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b6c86d076eb09ec28", + "index": 278, + "guid": "46e50265-ae28-4c7b-811f-97fddde001ad", + "isActive": false, + "balance": "$3,204.94", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Schneider Cooke", + "gender": "male", + "company": "DOGNOSIS", + "email": "schneidercooke@dognosis.com", + "phone": "+1 (820) 478-2187", + "address": "997 Dodworth Street, Century, Arizona, 4663", + "about": "Excepteur non ea eiusmod eiusmod ad ipsum sint cillum amet aute nostrud. Ea cupidatat enim laborum consequat ea elit exercitation id anim magna nulla anim. Labore veniam in consectetur irure. Ullamco quis et incididunt ut.\r\n", + "registered": "2019-11-29T04:49:37 -06:-30", + "latitude": -20.800462, + "longitude": 166.287914, + "tags": [ + "voluptate", + "est", + "non", + "nulla", + "anim", + "ipsum", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Martinez Shelton" + }, + { + "id": 1, + "name": "Moody Jefferson" + }, + { + "id": 2, + "name": "Tracey Downs" + } + ], + "greeting": "Hello, Schneider Cooke! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b19702781e2085843", + "index": 279, + "guid": "49da74d3-8e54-47b8-99b9-45c155cb619b", + "isActive": false, + "balance": "$1,213.80", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Diann Roy", + "gender": "female", + "company": "DANCERITY", + "email": "diannroy@dancerity.com", + "phone": "+1 (953) 477-2517", + "address": "824 Grace Court, Macdona, Marshall Islands, 5181", + "about": "Laborum ex adipisicing qui cillum fugiat veniam voluptate. Nisi labore ad cupidatat irure. Eu cillum qui aliqua consequat nisi dolor anim aute nisi.\r\n", + "registered": "2016-09-08T06:08:06 -06:-30", + "latitude": -27.641694, + "longitude": -92.358793, + "tags": [ + "sint", + "cupidatat", + "ad", + "proident", + "in", + "aute", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Maura Matthews" + }, + { + "id": 1, + "name": "Mccullough Riggs" + }, + { + "id": 2, + "name": "Julianne Baxter" + } + ], + "greeting": "Hello, Diann Roy! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3872c7b8a2a79958", + "index": 280, + "guid": "3f35c175-bd5a-43f5-a7c0-df3eb3b5eb89", + "isActive": true, + "balance": "$1,840.22", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Elliott Chapman", + "gender": "male", + "company": "SUREPLEX", + "email": "elliottchapman@sureplex.com", + "phone": "+1 (906) 570-2182", + "address": "840 Graham Avenue, Wanship, Ohio, 8118", + "about": "Aliquip id in sunt voluptate excepteur deserunt eu aliquip aute. Pariatur voluptate cupidatat adipisicing deserunt excepteur duis enim. Enim sit fugiat nisi aliquip nostrud duis incididunt duis sint ullamco anim ipsum.\r\n", + "registered": "2017-01-19T02:26:31 -06:-30", + "latitude": 31.989451, + "longitude": -31.517905, + "tags": [ + "exercitation", + "pariatur", + "irure", + "duis", + "laborum", + "quis", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Lindsay Lindsay" + }, + { + "id": 1, + "name": "Rollins Small" + }, + { + "id": 2, + "name": "Mary Kline" + } + ], + "greeting": "Hello, Elliott Chapman! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b19b17294c6f492c6", + "index": 281, + "guid": "1aee0e3f-125b-4d83-aa16-2dccd2ca60e0", + "isActive": false, + "balance": "$2,834.47", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Sparks Stout", + "gender": "male", + "company": "ASIMILINE", + "email": "sparksstout@asimiline.com", + "phone": "+1 (933) 471-2438", + "address": "376 Norfolk Street, Stagecoach, Alabama, 8135", + "about": "Irure ipsum minim veniam amet aliquip laboris dolore ullamco exercitation duis tempor esse minim ullamco. Duis voluptate ex id aute fugiat ad voluptate commodo laboris ex Lorem ullamco ex in. Eiusmod tempor ipsum dolor labore tempor magna. Ad deserunt magna ut et cupidatat qui mollit deserunt laborum ex nostrud. Tempor anim culpa ipsum velit incididunt esse irure dolore ex labore adipisicing enim nostrud.\r\n", + "registered": "2016-02-13T04:07:21 -06:-30", + "latitude": 14.379024, + "longitude": -167.78528, + "tags": [ + "ad", + "id", + "ea", + "officia", + "non", + "dolor", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Hester Soto" + }, + { + "id": 1, + "name": "Elsa Osborn" + }, + { + "id": 2, + "name": "Ila White" + } + ], + "greeting": "Hello, Sparks Stout! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b4c24d4b1a42eb4aa", + "index": 282, + "guid": "5dcffabc-7651-477b-be2a-2a0653376d01", + "isActive": true, + "balance": "$1,304.85", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "green", + "name": "Georgia Winters", + "gender": "female", + "company": "NEWCUBE", + "email": "georgiawinters@newcube.com", + "phone": "+1 (884) 577-3851", + "address": "557 Gain Court, Websterville, Georgia, 9055", + "about": "Excepteur sint dolore deserunt ut fugiat sunt eu eu qui aliquip deserunt. Do elit occaecat veniam eiusmod ex veniam do irure excepteur in. Irure deserunt elit id culpa commodo tempor cupidatat incididunt in. Officia in non mollit aute Lorem. Ex et sunt ea cillum officia mollit mollit est.\r\n", + "registered": "2019-05-29T06:29:28 -06:-30", + "latitude": -22.247023, + "longitude": 112.605193, + "tags": [ + "enim", + "nisi", + "non", + "commodo", + "tempor", + "non", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Burnett Colon" + }, + { + "id": 1, + "name": "Lacy Good" + }, + { + "id": 2, + "name": "Carson Jarvis" + } + ], + "greeting": "Hello, Georgia Winters! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bae4b8a9e57a2d3df", + "index": 283, + "guid": "6d9fd2d9-4735-4e1e-896c-ef2ec6422a54", + "isActive": false, + "balance": "$1,592.27", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "brown", + "name": "Knapp Bright", + "gender": "male", + "company": "EARGO", + "email": "knappbright@eargo.com", + "phone": "+1 (977) 586-3480", + "address": "445 Maple Street, Shelby, California, 4050", + "about": "Mollit ut enim reprehenderit aliqua qui elit. Excepteur exercitation consectetur sunt adipisicing enim aute amet nulla cillum laborum do anim dolor amet. Eiusmod dolor reprehenderit duis cillum eiusmod tempor irure ut consectetur dolore quis.\r\n", + "registered": "2018-08-31T06:16:57 -06:-30", + "latitude": 48.991183, + "longitude": 47.095639, + "tags": [ + "minim", + "sint", + "ea", + "commodo", + "culpa", + "in", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Mays Conley" + }, + { + "id": 1, + "name": "Hoffman Lewis" + }, + { + "id": 2, + "name": "Noel French" + } + ], + "greeting": "Hello, Knapp Bright! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5acd5ba97913e3fb", + "index": 284, + "guid": "b1b627df-d06d-4a2c-84e2-20da6977b587", + "isActive": false, + "balance": "$3,871.69", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Patty Harris", + "gender": "female", + "company": "ISOSPHERE", + "email": "pattyharris@isosphere.com", + "phone": "+1 (897) 439-3824", + "address": "997 Sumner Place, Concho, Northern Mariana Islands, 3965", + "about": "Exercitation laborum deserunt aliqua et aliquip consequat est velit et labore elit velit minim ullamco. Et officia eu incididunt anim. Dolore ullamco sint amet id et veniam commodo minim non enim occaecat.\r\n", + "registered": "2017-01-10T06:27:38 -06:-30", + "latitude": -35.533226, + "longitude": -91.678584, + "tags": [ + "cupidatat", + "dolor", + "occaecat", + "incididunt", + "anim", + "sint", + "dolore" + ], + "friends": [ + { + "id": 0, + "name": "Allison Woodard" + }, + { + "id": 1, + "name": "Victoria Glenn" + }, + { + "id": 2, + "name": "Deena Fuentes" + } + ], + "greeting": "Hello, Patty Harris! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4f4c251bb21830e7", + "index": 285, + "guid": "e9b13a45-cb6b-4669-ae83-12edd47a2f28", + "isActive": true, + "balance": "$3,716.22", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Betsy Hill", + "gender": "female", + "company": "EPLODE", + "email": "betsyhill@eplode.com", + "phone": "+1 (897) 587-2665", + "address": "467 Maujer Street, Wright, Kansas, 3146", + "about": "Officia voluptate nisi qui cillum deserunt voluptate ullamco quis reprehenderit dolore. Incididunt sint cillum dolore quis dolore proident sunt mollit. Culpa dolore ipsum anim sunt. Elit quis Lorem et et nisi dolor. Nulla ea nisi Lorem ut aliquip fugiat. Non in qui id nostrud officia eiusmod voluptate. Incididunt aute excepteur commodo non in non elit aute id.\r\n", + "registered": "2018-05-27T12:41:40 -06:-30", + "latitude": 47.115066, + "longitude": 34.428528, + "tags": [ + "ea", + "adipisicing", + "aute", + "enim", + "do", + "incididunt", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Kirkland Conway" + }, + { + "id": 1, + "name": "Jerri Thompson" + }, + { + "id": 2, + "name": "Sellers Reed" + } + ], + "greeting": "Hello, Betsy Hill! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b356c480c42968ba3", + "index": 286, + "guid": "367c645b-ecc6-46ef-bc74-b91f9299e6ba", + "isActive": true, + "balance": "$2,545.62", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Leanna Nielsen", + "gender": "female", + "company": "DANCITY", + "email": "leannanielsen@dancity.com", + "phone": "+1 (966) 510-3280", + "address": "758 Dennett Place, Dola, North Dakota, 9945", + "about": "Eiusmod veniam eiusmod sint eu labore minim amet minim laborum eiusmod occaecat veniam culpa adipisicing. Cupidatat ea aliqua proident est nulla dolore sunt elit dolor in. Fugiat id nulla sint labore.\r\n", + "registered": "2021-08-18T04:57:05 -06:-30", + "latitude": 64.771707, + "longitude": 34.254386, + "tags": [ + "dolore", + "pariatur", + "officia", + "irure", + "commodo", + "Lorem", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Jacqueline Delgado" + }, + { + "id": 1, + "name": "Jessica Greene" + }, + { + "id": 2, + "name": "Mccall Padilla" + } + ], + "greeting": "Hello, Leanna Nielsen! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b79752d7e08d02b64", + "index": 287, + "guid": "39cf955d-99da-48e9-8cbc-8551cc87cd13", + "isActive": true, + "balance": "$1,909.58", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "green", + "name": "Battle Chang", + "gender": "male", + "company": "XELEGYL", + "email": "battlechang@xelegyl.com", + "phone": "+1 (881) 476-2026", + "address": "278 Linden Boulevard, Vaughn, New York, 3139", + "about": "Eiusmod labore voluptate labore sint nisi nostrud cupidatat ex cillum ad minim amet minim ut. Dolore quis fugiat et officia nostrud labore quis dolor nisi deserunt. Reprehenderit aute in laboris sint deserunt.\r\n", + "registered": "2015-06-03T07:30:42 -06:-30", + "latitude": 64.581001, + "longitude": -114.57166, + "tags": [ + "adipisicing", + "nisi", + "enim", + "adipisicing", + "consectetur", + "deserunt", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Kirk Hurley" + }, + { + "id": 1, + "name": "Angie Malone" + }, + { + "id": 2, + "name": "Snow Steele" + } + ], + "greeting": "Hello, Battle Chang! You have 3 unread messages.", + "favoriteFruit": "strawberry" + } + ] +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml new file mode 100644 index 0000000000..5f3c8b82a9 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/main/resources/application.yaml @@ -0,0 +1,5 @@ +spring: + codec: + max-in-memory-size: 500KB + +host: http://localhost:${server.port} diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/test/java/com/baeldung/spring/reactive/springreactiveexceptions/SpringReactiveExceptionsApplicationIntegrationTest.java b/spring-reactive-modules/spring-reactive-exceptions/src/test/java/com/baeldung/spring/reactive/springreactiveexceptions/SpringReactiveExceptionsApplicationIntegrationTest.java new file mode 100644 index 0000000000..6ff7c1f5b0 --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/test/java/com/baeldung/spring/reactive/springreactiveexceptions/SpringReactiveExceptionsApplicationIntegrationTest.java @@ -0,0 +1,52 @@ +package com.baeldung.spring.reactive.springreactiveexceptions; + +import com.baeldung.spring.reactive.springreactiveexceptions.model.Users; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.web.reactive.function.BodyInserters; + +import java.io.IOException; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT, properties = "server.port=60291") +class SpringReactiveExceptionsApplicationIntegrationTest { + @Autowired + private WebTestClient webTestClient; + @Autowired + private ObjectMapper objectMapper; + + @Test + void givenARequestBody_whenProcessIsCalled_thenReturnTheBodyAsIs() throws IOException { + Users users = objectMapper.readValue(new ClassPathResource("390KB.json") + .getURL(), Users.class); + + webTestClient + .post() + .uri("1.0/process") + .body(BodyInserters.fromValue(users)) + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.OK) + .expectBody(Users.class) + .isEqualTo(users); + } + + @Test + void whenTriggerIsCalled_thenReturnTheExpectedJSONResponse() throws IOException { + Users users = objectMapper.readValue(new ClassPathResource("390KB.json") + .getURL(), Users.class); + + webTestClient + .post() + .uri("1.0/trigger") + .exchange() + .expectStatus() + .isEqualTo(HttpStatus.OK) + .expectBody(Users.class) + .isEqualTo(users); + } +} \ No newline at end of file diff --git a/spring-reactive-modules/spring-reactive-exceptions/src/test/resources/390KB.json b/spring-reactive-modules/spring-reactive-exceptions/src/test/resources/390KB.json new file mode 100644 index 0000000000..2c96ffd0ce --- /dev/null +++ b/spring-reactive-modules/spring-reactive-exceptions/src/test/resources/390KB.json @@ -0,0 +1,12964 @@ +{ + "users": [ + { + "_id": "63443d4bae3f1e925aedba7e", + "index": 0, + "guid": "7bfb9da7-c854-493e-9439-7ebf591e6e27", + "isActive": true, + "balance": "$2,645.20", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Price Johns", + "gender": "male", + "company": "MATRIXITY", + "email": "pricejohns@matrixity.com", + "phone": "+1 (837) 441-2135", + "address": "351 Kathleen Court, Needmore, Massachusetts, 2146", + "about": "Nostrud quis irure elit exercitation eu. Nulla nisi ullamco qui in Lorem non labore. Excepteur incididunt cupidatat ipsum sunt officia velit.\r\n", + "registered": "2016-04-05T10:01:54 -06:-30", + "latitude": -68.604778, + "longitude": -136.192694, + "tags": [ + "culpa", + "esse", + "duis", + "eiusmod", + "ipsum", + "consectetur", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Yvonne Strong" + }, + { + "id": 1, + "name": "Shelia Waller" + }, + { + "id": 2, + "name": "Booker Holland" + } + ], + "greeting": "Hello, Price Johns! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4be96420c85b4beff4", + "index": 1, + "guid": "14e08767-a7ff-4312-8f38-8ee7c4dd2c4b", + "isActive": true, + "balance": "$2,654.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Larsen Mays", + "gender": "male", + "company": "ZOLAR", + "email": "larsenmays@zolar.com", + "phone": "+1 (869) 462-2003", + "address": "210 Seaview Avenue, Cornucopia, Palau, 2688", + "about": "Fugiat mollit ullamco officia sint labore. Exercitation adipisicing nulla reprehenderit ad. Amet cupidatat sit dolore deserunt sit quis irure. Anim culpa deserunt velit consequat nostrud culpa voluptate. Et nulla culpa adipisicing occaecat fugiat cillum ipsum fugiat ullamco velit nisi nostrud magna. Ipsum proident mollit eiusmod ipsum proident ullamco mollit non minim ullamco quis. Nulla voluptate elit elit excepteur ut exercitation in qui irure sit sit minim aliqua.\r\n", + "registered": "2016-08-16T08:00:49 -06:-30", + "latitude": 70.122077, + "longitude": -111.638749, + "tags": [ + "eiusmod", + "tempor", + "excepteur", + "enim", + "fugiat", + "magna", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Walton Henderson" + }, + { + "id": 1, + "name": "Lea Lee" + }, + { + "id": 2, + "name": "Albert Hernandez" + } + ], + "greeting": "Hello, Larsen Mays! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6bd5ab914697bc77", + "index": 2, + "guid": "a3477ba1-9519-4aec-8aaa-41c126a3f3fe", + "isActive": false, + "balance": "$3,390.88", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Imelda Carter", + "gender": "female", + "company": "EXOSPACE", + "email": "imeldacarter@exospace.com", + "phone": "+1 (967) 410-3353", + "address": "841 Livingston Street, Coral, Alaska, 1916", + "about": "Ipsum consequat dolor ullamco qui in aliquip pariatur ex veniam. Ut non mollit elit ipsum cillum nisi deserunt velit aliquip do tempor sint reprehenderit commodo. Minim sint incididunt ullamco veniam Lorem dolore cupidatat do eiusmod deserunt cupidatat irure.\r\n", + "registered": "2020-07-13T08:58:41 -06:-30", + "latitude": 44.631197, + "longitude": -173.456226, + "tags": [ + "est", + "nostrud", + "id", + "officia", + "et", + "sint", + "deserunt" + ], + "friends": [ + { + "id": 0, + "name": "Riley William" + }, + { + "id": 1, + "name": "Minerva Flores" + }, + { + "id": 2, + "name": "Bethany Aguirre" + } + ], + "greeting": "Hello, Imelda Carter! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4beede6d7271fb367b", + "index": 3, + "guid": "b289cb4b-c395-46d7-8b59-dd4ebc3c04c4", + "isActive": true, + "balance": "$2,681.00", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Janelle Reese", + "gender": "female", + "company": "GRONK", + "email": "janellereese@gronk.com", + "phone": "+1 (993) 453-2465", + "address": "560 Campus Place, Cleary, Oklahoma, 914", + "about": "In irure sit est ea amet labore. Consectetur pariatur sint excepteur nisi amet cupidatat incididunt. Officia enim voluptate cupidatat ullamco laboris commodo amet. Qui eu fugiat anim reprehenderit adipisicing qui irure cillum ea id proident ut ea elit. Aute deserunt nulla et velit eu.\r\n", + "registered": "2014-05-13T06:18:22 -06:-30", + "latitude": 71.574351, + "longitude": -172.635689, + "tags": [ + "proident", + "ad", + "laborum", + "sint", + "veniam", + "eiusmod", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Mercado Wilkerson" + }, + { + "id": 1, + "name": "Robinson Slater" + }, + { + "id": 2, + "name": "Eaton Fuller" + } + ], + "greeting": "Hello, Janelle Reese! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6beb097542281479", + "index": 4, + "guid": "a6983d63-6368-4db2-8ca8-d57bcf633be9", + "isActive": true, + "balance": "$1,438.44", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Curtis Sosa", + "gender": "male", + "company": "ZAYA", + "email": "curtissosa@zaya.com", + "phone": "+1 (810) 569-2812", + "address": "566 Hicks Street, Saddlebrooke, New Mexico, 4564", + "about": "Amet qui est est veniam tempor magna anim excepteur velit commodo quis. Commodo laboris aliqua ad ipsum cupidatat laborum qui ut Lorem aliqua reprehenderit sint. Aliquip laboris laborum exercitation magna quis. Laboris proident id pariatur consectetur dolor proident. Dolor in cupidatat pariatur ipsum ad id elit. Velit eiusmod Lorem quis qui reprehenderit labore dolore et incididunt dolor. Laborum quis duis anim excepteur sint labore reprehenderit est quis aute.\r\n", + "registered": "2015-06-25T12:28:21 -06:-30", + "latitude": 42.264845, + "longitude": -15.130883, + "tags": [ + "esse", + "elit", + "excepteur", + "aliquip", + "sunt", + "eiusmod", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Isabella Tyler" + }, + { + "id": 1, + "name": "Edna Farrell" + }, + { + "id": 2, + "name": "Beach Murray" + } + ], + "greeting": "Hello, Curtis Sosa! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3d7da6d4614baa40", + "index": 5, + "guid": "fa82f51d-0c22-493f-8380-9773b13fea3f", + "isActive": false, + "balance": "$2,121.54", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Vasquez Gonzales", + "gender": "male", + "company": "PLASMOSIS", + "email": "vasquezgonzales@plasmosis.com", + "phone": "+1 (996) 533-3358", + "address": "795 Rockaway Parkway, Bonanza, Wyoming, 8239", + "about": "Dolor eiusmod Lorem aliqua Lorem incididunt culpa do ullamco velit amet veniam non dolore cupidatat. Deserunt reprehenderit anim Lorem enim id consectetur minim amet velit sint cupidatat ullamco. Lorem do magna officia officia ipsum ullamco excepteur. Culpa ad enim veniam officia esse do in Lorem.\r\n", + "registered": "2021-01-14T06:08:29 -06:-30", + "latitude": -40.674626, + "longitude": -73.729646, + "tags": [ + "quis", + "veniam", + "amet", + "ipsum", + "laboris", + "pariatur", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Sims Langley" + }, + { + "id": 1, + "name": "Andrews Frye" + }, + { + "id": 2, + "name": "Melisa Johnson" + } + ], + "greeting": "Hello, Vasquez Gonzales! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b015fd0647f9f8079", + "index": 6, + "guid": "9caa1e50-9dc3-4c6d-a1d4-b04ce2eea5d3", + "isActive": false, + "balance": "$1,949.87", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "green", + "name": "Camacho Anderson", + "gender": "male", + "company": "FANGOLD", + "email": "camachoanderson@fangold.com", + "phone": "+1 (966) 535-2658", + "address": "234 Bushwick Avenue, Bartley, Rhode Island, 8229", + "about": "Ut quis id id excepteur. Esse tempor eu amet occaecat sunt ad irure duis id exercitation. Consectetur anim esse eiusmod cillum. Excepteur et ea aliquip consectetur. Ut aliquip dolore elit irure ut laboris nostrud non magna. Nostrud cillum nulla sint officia amet amet in eu ex.\r\n", + "registered": "2021-10-12T03:18:30 -06:-30", + "latitude": -41.638296, + "longitude": 87.818231, + "tags": [ + "cupidatat", + "esse", + "amet", + "do", + "eu", + "tempor", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Christy Whitfield" + }, + { + "id": 1, + "name": "Bette Gilbert" + }, + { + "id": 2, + "name": "Peterson Bentley" + } + ], + "greeting": "Hello, Camacho Anderson! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bc75570fd76462df9", + "index": 7, + "guid": "c96e51aa-d3a6-4383-ab29-afe0eba5b536", + "isActive": true, + "balance": "$3,005.84", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "blue", + "name": "Freda Blanchard", + "gender": "female", + "company": "PETICULAR", + "email": "fredablanchard@peticular.com", + "phone": "+1 (963) 509-3043", + "address": "981 Mill Road, Smock, West Virginia, 4952", + "about": "Ea eu nisi in occaecat non. Velit ea labore duis quis pariatur ipsum. Consectetur ad incididunt magna eiusmod voluptate laborum proident excepteur dolore duis tempor tempor do. Excepteur amet eiusmod eiusmod id nostrud minim commodo esse anim. Cupidatat sit incididunt cupidatat sunt occaecat in dolor cupidatat veniam dolore fugiat nulla. Ad ex Lorem occaecat cupidatat sit id ex cupidatat fugiat officia exercitation dolore ipsum do. Adipisicing consectetur laboris anim sunt est duis ullamco aliquip.\r\n", + "registered": "2020-01-29T02:21:04 -06:-30", + "latitude": 86.468975, + "longitude": 161.052521, + "tags": [ + "sint", + "sint", + "laboris", + "consectetur", + "occaecat", + "consectetur", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Kramer Cox" + }, + { + "id": 1, + "name": "Myra Robles" + }, + { + "id": 2, + "name": "Sanford Koch" + } + ], + "greeting": "Hello, Freda Blanchard! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b2ce2eb4cdb203780", + "index": 8, + "guid": "e94c471c-c25c-4960-9646-fe384ea9256d", + "isActive": false, + "balance": "$1,705.47", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Dickerson Navarro", + "gender": "male", + "company": "EXTRAGEN", + "email": "dickersonnavarro@extragen.com", + "phone": "+1 (963) 540-3791", + "address": "765 Kensington Walk, Waukeenah, Nevada, 7197", + "about": "Commodo consectetur do tempor Lorem. Consectetur aliqua est eu cupidatat est anim magna fugiat consequat exercitation. Ipsum commodo labore id enim eu velit excepteur minim est. Sit ex consequat labore officia nisi excepteur sint amet. Deserunt consequat eu dolore non nostrud exercitation. Id et fugiat commodo minim ea proident labore sunt laborum tempor. Culpa commodo quis quis id quis eu sunt.\r\n", + "registered": "2022-01-07T03:07:31 -06:-30", + "latitude": -76.21971, + "longitude": 86.923368, + "tags": [ + "sunt", + "enim", + "ad", + "laborum", + "excepteur", + "ex", + "laborum" + ], + "friends": [ + { + "id": 0, + "name": "Denise Kidd" + }, + { + "id": 1, + "name": "Roy Kemp" + }, + { + "id": 2, + "name": "Toni Duncan" + } + ], + "greeting": "Hello, Dickerson Navarro! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b2e7f67cf6ace2c83", + "index": 9, + "guid": "6f31ca8b-50f1-43a3-9ecc-8766c6cbbf87", + "isActive": true, + "balance": "$1,441.58", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Margarita Hicks", + "gender": "female", + "company": "SYNTAC", + "email": "margaritahicks@syntac.com", + "phone": "+1 (813) 472-2651", + "address": "680 Baughman Place, Wolcott, Delaware, 6890", + "about": "Dolore Lorem elit enim culpa occaecat commodo aliquip eiusmod. Lorem commodo laborum eiusmod sint aliquip aliqua est irure. Sit aute laboris incididunt dolore sunt nostrud est ullamco consequat. Proident veniam commodo proident laboris anim Lorem qui cupidatat veniam magna nostrud minim veniam. Pariatur aliqua amet officia in exercitation duis magna minim id consequat. Consectetur amet pariatur quis ullamco anim veniam commodo tempor commodo. Excepteur nulla ullamco labore id voluptate voluptate nostrud laborum mollit sit.\r\n", + "registered": "2019-04-09T09:41:14 -06:-30", + "latitude": 36.582562, + "longitude": -127.728853, + "tags": [ + "nisi", + "qui", + "duis", + "dolore", + "amet", + "elit", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Sasha Rivers" + }, + { + "id": 1, + "name": "Mendoza Norton" + }, + { + "id": 2, + "name": "Goodwin Ellis" + } + ], + "greeting": "Hello, Margarita Hicks! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4b218933a8e5fa09", + "index": 10, + "guid": "8ed6df40-42ed-4c76-a646-462396997e39", + "isActive": false, + "balance": "$3,355.36", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Horton Benjamin", + "gender": "male", + "company": "COREPAN", + "email": "hortonbenjamin@corepan.com", + "phone": "+1 (942) 520-2346", + "address": "133 Commercial Street, Mooresburg, Federated States Of Micronesia, 1881", + "about": "Dolore amet ex irure ex consectetur nostrud quis cillum eiusmod non est quis est. Cupidatat Lorem id nostrud sit magna. Duis ullamco magna magna cupidatat. Do dolor veniam sit do adipisicing ea incididunt. Velit commodo et voluptate sunt laborum. Lorem est eu consectetur consequat voluptate cupidatat laboris ipsum duis occaecat labore veniam. Sunt exercitation anim ut proident aute id aliqua minim ipsum esse eu.\r\n", + "registered": "2016-08-24T08:36:35 -06:-30", + "latitude": 73.768619, + "longitude": -171.225031, + "tags": [ + "deserunt", + "commodo", + "ad", + "eu", + "nostrud", + "incididunt", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Lynette Whitehead" + }, + { + "id": 1, + "name": "Isabel Underwood" + }, + { + "id": 2, + "name": "Olson Mullins" + } + ], + "greeting": "Hello, Horton Benjamin! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5eb76b5dc535c03e", + "index": 11, + "guid": "03110dbe-8d27-4a11-87b8-413819cd12ce", + "isActive": true, + "balance": "$3,277.96", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Verna Joyner", + "gender": "female", + "company": "AVENETRO", + "email": "vernajoyner@avenetro.com", + "phone": "+1 (826) 484-2360", + "address": "536 Gem Street, Skyland, Pennsylvania, 5473", + "about": "Occaecat commodo eiusmod irure veniam Lorem ullamco officia ea nulla cillum magna. Sit adipisicing dolore mollit laboris commodo ullamco consequat excepteur mollit. Anim qui eu sunt culpa non do minim magna proident consequat ullamco. Quis ipsum laborum mollit fugiat elit proident voluptate. Magna amet dolor nisi velit in aliqua et adipisicing proident. Velit elit dolore laboris proident excepteur. Ex officia tempor incididunt exercitation ad ullamco.\r\n", + "registered": "2016-07-16T04:43:04 -06:-30", + "latitude": 48.847133, + "longitude": -46.254124, + "tags": [ + "nisi", + "esse", + "aliqua", + "minim", + "consectetur", + "irure", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Santos Tate" + }, + { + "id": 1, + "name": "Zamora Garrett" + }, + { + "id": 2, + "name": "Shawna Bradford" + } + ], + "greeting": "Hello, Verna Joyner! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b93db26d017bffe61", + "index": 12, + "guid": "17d1af4f-2d89-4920-b2e1-a6c9f2bf7aa2", + "isActive": true, + "balance": "$3,824.28", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Carrillo Vance", + "gender": "male", + "company": "URBANSHEE", + "email": "carrillovance@urbanshee.com", + "phone": "+1 (843) 553-2322", + "address": "112 Milford Street, Yonah, Connecticut, 8288", + "about": "Magna ut duis veniam labore aliquip magna exercitation id enim consequat aliqua nostrud incididunt. Amet eu ad occaecat culpa esse deserunt ut nisi dolor veniam magna proident. Qui labore id ipsum consectetur nostrud culpa tempor est. Labore deserunt occaecat magna pariatur minim elit ipsum sint laborum sunt dolore ipsum.\r\n", + "registered": "2014-09-05T04:35:06 -06:-30", + "latitude": 58.651506, + "longitude": -58.186488, + "tags": [ + "in", + "est", + "mollit", + "mollit", + "aliqua", + "incididunt", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Hicks Larsen" + }, + { + "id": 1, + "name": "Christian Cameron" + }, + { + "id": 2, + "name": "Sylvia Mclaughlin" + } + ], + "greeting": "Hello, Carrillo Vance! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3474c267b4f031e0", + "index": 13, + "guid": "1fb2fc56-e685-404e-870e-8eaf07a3b8d3", + "isActive": false, + "balance": "$1,180.65", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Hensley Pickett", + "gender": "male", + "company": "GINKOGENE", + "email": "hensleypickett@ginkogene.com", + "phone": "+1 (894) 588-3009", + "address": "867 Whitney Avenue, Mappsville, Louisiana, 7724", + "about": "Velit consequat dolor fugiat reprehenderit veniam duis deserunt excepteur aute enim cupidatat minim culpa. Sunt laboris proident aute fugiat ad laborum ut anim. Ex esse pariatur occaecat sunt. Commodo nostrud do velit excepteur mollit qui aliqua excepteur reprehenderit tempor nisi id. Consectetur in dolore proident ipsum dolore. Qui commodo anim occaecat tempor ea qui ullamco veniam incididunt consequat eiusmod cupidatat adipisicing consectetur. Culpa minim qui id occaecat dolore ea laboris ea anim.\r\n", + "registered": "2017-03-07T12:48:14 -06:-30", + "latitude": -29.279572, + "longitude": -42.015693, + "tags": [ + "sit", + "fugiat", + "et", + "aliquip", + "quis", + "eiusmod", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Elizabeth Justice" + }, + { + "id": 1, + "name": "Madge Hutchinson" + }, + { + "id": 2, + "name": "Coleman Olsen" + } + ], + "greeting": "Hello, Hensley Pickett! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b741053d06d29996e", + "index": 14, + "guid": "1bdea636-cf4d-4067-9c6c-1be5ff80a14f", + "isActive": false, + "balance": "$3,436.05", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Carver Robertson", + "gender": "male", + "company": "XTH", + "email": "carverrobertson@xth.com", + "phone": "+1 (819) 451-2871", + "address": "687 River Street, Chloride, Vermont, 4583", + "about": "Consequat nulla velit sit pariatur Lorem officia esse id fugiat aliqua dolore. Commodo voluptate est magna consequat labore esse non aliquip enim Lorem aliqua ad. Consectetur occaecat commodo sit enim aute reprehenderit aute dolore mollit. Minim incididunt nostrud duis excepteur laboris. Ad fugiat do sit laborum. Ea laborum reprehenderit do excepteur culpa ipsum dolor sit proident consequat excepteur. Et consectetur commodo proident ut aliquip in ipsum.\r\n", + "registered": "2016-11-05T05:01:40 -06:-30", + "latitude": 20.817123, + "longitude": -138.801192, + "tags": [ + "fugiat", + "ad", + "ipsum", + "dolor", + "sint", + "Lorem", + "ullamco" + ], + "friends": [ + { + "id": 0, + "name": "Fields Contreras" + }, + { + "id": 1, + "name": "Klein Price" + }, + { + "id": 2, + "name": "Waller Conner" + } + ], + "greeting": "Hello, Carver Robertson! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b41e06ae9aa9781fc", + "index": 15, + "guid": "2b809770-22fc-44c3-a893-34b472ac2b30", + "isActive": true, + "balance": "$3,590.55", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Sonia Warner", + "gender": "female", + "company": "MIRACULA", + "email": "soniawarner@miracula.com", + "phone": "+1 (877) 506-3532", + "address": "615 Highland Boulevard, Rockbridge, Iowa, 471", + "about": "Incididunt nisi tempor esse deserunt incididunt laboris. Cillum anim Lorem irure veniam dolore laborum ex est proident esse ullamco id. Magna deserunt anim ad sit irure reprehenderit deserunt laboris.\r\n", + "registered": "2016-12-08T05:22:40 -06:-30", + "latitude": 83.753462, + "longitude": 156.776418, + "tags": [ + "eiusmod", + "deserunt", + "ad", + "quis", + "cillum", + "adipisicing", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Bonita Blair" + }, + { + "id": 1, + "name": "Elvira Bender" + }, + { + "id": 2, + "name": "Jimenez Booth" + } + ], + "greeting": "Hello, Sonia Warner! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bebaba7e507efb45f", + "index": 16, + "guid": "888ad204-ae7c-43d5-9f61-d31f2b02e36a", + "isActive": false, + "balance": "$3,230.62", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Mueller Hopper", + "gender": "male", + "company": "ZAJ", + "email": "muellerhopper@zaj.com", + "phone": "+1 (804) 506-3818", + "address": "669 Nixon Court, Flintville, Virginia, 4478", + "about": "Lorem elit veniam cupidatat commodo excepteur sunt voluptate enim culpa aliquip. Et et esse ipsum esse veniam nulla sunt et laborum reprehenderit ex amet. Duis deserunt labore veniam non sint incididunt est ad tempor cupidatat eiusmod aute eiusmod do. Do Lorem quis officia eu esse aliquip laboris duis sit id reprehenderit labore in.\r\n", + "registered": "2018-04-16T09:09:54 -06:-30", + "latitude": 33.256867, + "longitude": 31.264741, + "tags": [ + "dolore", + "eiusmod", + "ex", + "exercitation", + "esse", + "magna", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Kitty House" + }, + { + "id": 1, + "name": "Hood Cleveland" + }, + { + "id": 2, + "name": "Rios Taylor" + } + ], + "greeting": "Hello, Mueller Hopper! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b39b147cc07190bcc", + "index": 17, + "guid": "2733503e-3ef2-4cb2-a512-6a5217147141", + "isActive": false, + "balance": "$1,498.41", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Moon Crane", + "gender": "male", + "company": "COMCUR", + "email": "mooncrane@comcur.com", + "phone": "+1 (981) 527-2449", + "address": "799 Garden Place, Eagleville, Maine, 943", + "about": "Commodo aliquip enim esse id. Est irure qui veniam anim consequat laboris exercitation eu reprehenderit ut sint exercitation sunt. Irure ex deserunt mollit qui incididunt elit ea. Magna pariatur sit in ullamco esse.\r\n", + "registered": "2015-06-16T04:27:21 -06:-30", + "latitude": -55.544403, + "longitude": -165.853342, + "tags": [ + "officia", + "aliqua", + "deserunt", + "et", + "cupidatat", + "aute", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Karyn Howard" + }, + { + "id": 1, + "name": "Tabatha Hart" + }, + { + "id": 2, + "name": "Kelly Walls" + } + ], + "greeting": "Hello, Moon Crane! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b19367847ff1494ef", + "index": 18, + "guid": "7ca1780c-12cb-4265-a684-589688b5ba1c", + "isActive": true, + "balance": "$2,763.82", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Lelia Howe", + "gender": "female", + "company": "VELITY", + "email": "leliahowe@velity.com", + "phone": "+1 (897) 538-3179", + "address": "496 Bedford Avenue, Leola, Nebraska, 1185", + "about": "Ex elit mollit incididunt occaecat reprehenderit commodo nulla occaecat cupidatat. Ipsum et consectetur irure consectetur amet qui aliquip aliquip nulla elit. Ipsum id et non ea consequat sit excepteur veniam ipsum. Minim reprehenderit dolor sunt sunt ea veniam duis exercitation velit. Mollit Lorem aute officia qui ea laborum voluptate proident quis aliquip laborum laborum.\r\n", + "registered": "2014-04-04T09:36:19 -06:-30", + "latitude": -25.082308, + "longitude": -7.046394, + "tags": [ + "fugiat", + "minim", + "reprehenderit", + "ipsum", + "qui", + "ut", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Sheryl Kerr" + }, + { + "id": 1, + "name": "Bobbie Pacheco" + }, + { + "id": 2, + "name": "Dudley Lyons" + } + ], + "greeting": "Hello, Lelia Howe! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb8f1e2dea508a15f", + "index": 19, + "guid": "c722388e-cf0b-4583-8785-332762d15110", + "isActive": false, + "balance": "$3,499.15", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "brown", + "name": "Knight Carrillo", + "gender": "male", + "company": "DOGNOST", + "email": "knightcarrillo@dognost.com", + "phone": "+1 (937) 584-3188", + "address": "746 Haring Street, Rew, Mississippi, 3223", + "about": "Deserunt adipisicing esse fugiat proident est consequat exercitation fugiat mollit sint. Et commodo eu aute sit tempor nulla aliquip cillum dolore esse ex sit cupidatat nostrud. Deserunt ad occaecat exercitation non aute ullamco voluptate commodo Lorem dolore. Minim dolore minim minim sit ea aliqua. Ipsum eu culpa non non fugiat anim sit aute. Quis ad fugiat eiusmod amet sit ullamco.\r\n", + "registered": "2021-11-08T04:10:22 -06:-30", + "latitude": 33.461108, + "longitude": -47.549984, + "tags": [ + "irure", + "aute", + "eiusmod", + "quis", + "ipsum", + "occaecat", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Compton Huffman" + }, + { + "id": 1, + "name": "Williamson Rich" + }, + { + "id": 2, + "name": "Pugh Grimes" + } + ], + "greeting": "Hello, Knight Carrillo! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b26bb5c17ec8ddd00", + "index": 20, + "guid": "0d33a292-a21f-48df-9cb7-b29e6b875360", + "isActive": true, + "balance": "$2,540.94", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Case Mcgowan", + "gender": "male", + "company": "EVENTAGE", + "email": "casemcgowan@eventage.com", + "phone": "+1 (809) 524-3645", + "address": "536 Landis Court, Cuylerville, Indiana, 1947", + "about": "Ipsum sint ea mollit est eiusmod non ipsum id. Ipsum aute commodo eiusmod eiusmod irure voluptate. Do exercitation duis voluptate duis amet.\r\n", + "registered": "2015-03-05T01:21:59 -06:-30", + "latitude": 37.498988, + "longitude": -120.157698, + "tags": [ + "dolor", + "commodo", + "laborum", + "reprehenderit", + "amet", + "elit", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Edwards Mcknight" + }, + { + "id": 1, + "name": "Karina Terrell" + }, + { + "id": 2, + "name": "Underwood Weeks" + } + ], + "greeting": "Hello, Case Mcgowan! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b655f9ea76a17b85f", + "index": 21, + "guid": "f2889040-82ac-4583-b0fe-60531f9cad19", + "isActive": true, + "balance": "$2,115.73", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Stevenson Gay", + "gender": "male", + "company": "FROSNEX", + "email": "stevensongay@frosnex.com", + "phone": "+1 (852) 455-3703", + "address": "986 Jackson Place, Golconda, Guam, 9547", + "about": "Do aliqua veniam sunt ad. Duis magna veniam consequat labore elit consectetur enim excepteur cupidatat ex culpa sunt minim pariatur. Cupidatat nostrud fugiat laborum id culpa aute reprehenderit laboris. Non reprehenderit aliqua ipsum tempor ipsum dolor dolor. Consequat velit aute non veniam in sit qui ad commodo eu.\r\n", + "registered": "2020-01-10T02:28:15 -06:-30", + "latitude": 84.795211, + "longitude": -94.418547, + "tags": [ + "est", + "reprehenderit", + "proident", + "culpa", + "aliquip", + "culpa", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Waters Quinn" + }, + { + "id": 1, + "name": "Frederick Armstrong" + }, + { + "id": 2, + "name": "Ollie Kirk" + } + ], + "greeting": "Hello, Stevenson Gay! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b48b730b4cbbc481e", + "index": 22, + "guid": "cfdc0cc9-a3d9-4eb6-8de3-1541398ec257", + "isActive": false, + "balance": "$3,829.72", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Lynda Bennett", + "gender": "female", + "company": "REALMO", + "email": "lyndabennett@realmo.com", + "phone": "+1 (978) 414-3468", + "address": "358 Judge Street, Salvo, Kentucky, 5638", + "about": "Labore sit culpa labore laboris ad. Ut ex quis officia sunt occaecat ut amet do dolore velit occaecat velit. Labore ullamco enim ipsum eu velit et reprehenderit cillum culpa. Irure nostrud laboris voluptate magna sint ad magna incididunt duis labore consequat quis ea. Cupidatat velit aute velit nisi incididunt ex eu deserunt.\r\n", + "registered": "2016-08-03T12:03:17 -06:-30", + "latitude": -9.204697, + "longitude": 67.521738, + "tags": [ + "in", + "laboris", + "nostrud", + "proident", + "proident", + "cillum", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Lauri Hawkins" + }, + { + "id": 1, + "name": "Shirley Duran" + }, + { + "id": 2, + "name": "Weber Landry" + } + ], + "greeting": "Hello, Lynda Bennett! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b581f4eb6074caf04", + "index": 23, + "guid": "1ea1e000-20e7-4d41-be63-eb129b7e67c7", + "isActive": true, + "balance": "$3,462.01", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Luisa Christian", + "gender": "female", + "company": "ISOLOGIX", + "email": "luisachristian@isologix.com", + "phone": "+1 (871) 420-3518", + "address": "775 Branton Street, Manila, Puerto Rico, 8387", + "about": "Non elit aliqua laborum id cillum aute esse consectetur qui magna pariatur sit. Cillum ullamco occaecat sunt consequat. Enim commodo dolor esse reprehenderit laboris velit incididunt aliqua. Ipsum cillum eiusmod occaecat anim consequat Lorem nulla officia proident eu qui. Eu ad eu incididunt dolore veniam cupidatat anim ipsum minim consequat ea dolore do duis. Excepteur voluptate deserunt incididunt esse excepteur sunt commodo laborum non laborum officia.\r\n", + "registered": "2017-05-14T11:16:26 -06:-30", + "latitude": -71.990969, + "longitude": 4.677642, + "tags": [ + "minim", + "eu", + "labore", + "enim", + "fugiat", + "nostrud", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Lisa Gallagher" + }, + { + "id": 1, + "name": "Tracy Morin" + }, + { + "id": 2, + "name": "Isabelle Gonzalez" + } + ], + "greeting": "Hello, Luisa Christian! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b0e2fe23b7612c3f3", + "index": 24, + "guid": "d17f0ea0-33d1-4cbb-939b-c0f1e08b2192", + "isActive": false, + "balance": "$3,145.76", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Leigh Cochran", + "gender": "female", + "company": "ECOLIGHT", + "email": "leighcochran@ecolight.com", + "phone": "+1 (975) 417-2460", + "address": "544 Fiske Place, Englevale, North Carolina, 8327", + "about": "Est nulla ipsum nostrud nisi eiusmod ullamco Lorem sunt. Excepteur ullamco occaecat ad excepteur ullamco anim adipisicing Lorem. Voluptate excepteur ea eu culpa id.\r\n", + "registered": "2015-12-09T01:26:44 -06:-30", + "latitude": -53.756932, + "longitude": -129.044373, + "tags": [ + "cillum", + "incididunt", + "enim", + "consequat", + "et", + "magna", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Marci Cooper" + }, + { + "id": 1, + "name": "Tanisha Sutton" + }, + { + "id": 2, + "name": "Stanton Riddle" + } + ], + "greeting": "Hello, Leigh Cochran! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b824c5c3d2891aa4d", + "index": 25, + "guid": "de1cf650-8e74-4f7b-ab8f-5846390f995f", + "isActive": false, + "balance": "$1,841.33", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Jeanne Thomas", + "gender": "female", + "company": "VIOCULAR", + "email": "jeannethomas@viocular.com", + "phone": "+1 (846) 511-3434", + "address": "947 Atkins Avenue, Tooleville, Tennessee, 323", + "about": "Aute in incididunt cillum ullamco. Et ex ut aliqua incididunt pariatur cillum incididunt sint reprehenderit est et. Eiusmod ea nisi consequat esse minim id eu incididunt consequat. Magna culpa sint ea Lorem nulla et est quis duis ullamco amet laboris cupidatat. Ullamco sit mollit in commodo laboris velit consectetur anim.\r\n", + "registered": "2022-03-19T02:55:43 -06:-30", + "latitude": 31.857097, + "longitude": -52.19617, + "tags": [ + "tempor", + "esse", + "aliquip", + "Lorem", + "consequat", + "excepteur", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Pickett Dale" + }, + { + "id": 1, + "name": "Nettie Burris" + }, + { + "id": 2, + "name": "Michele Chase" + } + ], + "greeting": "Hello, Jeanne Thomas! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0c53a1aa32d2c1ab", + "index": 26, + "guid": "f6b5121f-a98d-46b9-a4de-87cded8e024a", + "isActive": false, + "balance": "$2,568.06", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "green", + "name": "Etta Bradshaw", + "gender": "female", + "company": "GEEKNET", + "email": "ettabradshaw@geeknet.com", + "phone": "+1 (921) 492-2289", + "address": "328 Autumn Avenue, Roberts, Arkansas, 4158", + "about": "Elit voluptate ullamco ut eu in ex qui eiusmod. Ullamco quis veniam culpa mollit ut aliquip nostrud occaecat. Nulla eu reprehenderit eu adipisicing ut incididunt dolore eiusmod aute cupidatat deserunt do esse sint. In pariatur id id elit velit velit occaecat Lorem duis ut sunt. Duis nulla qui in velit veniam culpa Lorem et ipsum Lorem irure est id do. Fugiat et non sit consequat nulla consectetur id. Sint tempor pariatur est ullamco ea est deserunt do ipsum consectetur ex.\r\n", + "registered": "2022-06-04T05:56:28 -06:-30", + "latitude": 29.981543, + "longitude": -106.183512, + "tags": [ + "id", + "voluptate", + "non", + "nostrud", + "id", + "eu", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Lyons Little" + }, + { + "id": 1, + "name": "Beulah Bradley" + }, + { + "id": 2, + "name": "Wilkins Allison" + } + ], + "greeting": "Hello, Etta Bradshaw! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bc87b94db85818a42", + "index": 27, + "guid": "567cd9f3-21e9-4177-91ba-cfb709449b5b", + "isActive": false, + "balance": "$3,988.18", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Bush Branch", + "gender": "male", + "company": "VORTEXACO", + "email": "bushbranch@vortexaco.com", + "phone": "+1 (987) 584-2311", + "address": "668 Crescent Street, Glenbrook, Virgin Islands, 7131", + "about": "Ad in ipsum id id. Aliqua ut aute non pariatur do et consectetur. Adipisicing culpa qui et est dolore velit deserunt. Cillum sit ea mollit sunt irure sint voluptate reprehenderit ut adipisicing non ipsum.\r\n", + "registered": "2015-10-31T04:54:08 -06:-30", + "latitude": -58.639, + "longitude": -103.346193, + "tags": [ + "sunt", + "commodo", + "qui", + "pariatur", + "Lorem", + "eiusmod", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Patel Blake" + }, + { + "id": 1, + "name": "Sherri Massey" + }, + { + "id": 2, + "name": "Lancaster Blankenship" + } + ], + "greeting": "Hello, Bush Branch! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b4c49ce1c72b7c24f", + "index": 28, + "guid": "7c554c9e-72e9-42ab-9a8e-11b7e1279c80", + "isActive": false, + "balance": "$2,555.19", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Good Brooks", + "gender": "male", + "company": "ZENSURE", + "email": "goodbrooks@zensure.com", + "phone": "+1 (827) 510-2780", + "address": "701 Marconi Place, Tolu, Oregon, 1690", + "about": "Duis laboris velit mollit sit ea culpa magna anim consequat adipisicing aliqua aute reprehenderit ad. Exercitation dolore dolor Lorem deserunt aute laborum culpa reprehenderit. Nostrud esse excepteur incididunt velit sint quis velit eiusmod. Aliquip culpa anim culpa nulla est. Velit do sint nulla magna aute incididunt aliquip nisi dolor veniam et Lorem tempor reprehenderit. Nulla amet ipsum elit nostrud laborum eiusmod velit minim sunt voluptate ea ut laboris tempor.\r\n", + "registered": "2016-09-26T11:24:23 -06:-30", + "latitude": 15.325138, + "longitude": -18.405977, + "tags": [ + "qui", + "nulla", + "labore", + "dolor", + "laboris", + "deserunt", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Salinas Cooke" + }, + { + "id": 1, + "name": "Cecile Shelton" + }, + { + "id": 2, + "name": "Stacie Jefferson" + } + ], + "greeting": "Hello, Good Brooks! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb95ffc5a9d9a400b", + "index": 29, + "guid": "6d26f62d-1c5a-4369-9c9d-d519326c3da5", + "isActive": false, + "balance": "$2,589.18", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Sharron Downs", + "gender": "female", + "company": "SNIPS", + "email": "sharrondowns@snips.com", + "phone": "+1 (858) 508-3860", + "address": "997 Cornelia Street, Southview, District Of Columbia, 2514", + "about": "Deserunt Lorem excepteur enim tempor cillum dolore anim esse. Elit enim do mollit ullamco incididunt esse ex quis eiusmod sunt eu id excepteur. Aute pariatur cupidatat in sit quis Lorem.\r\n", + "registered": "2020-10-18T04:04:40 -06:-30", + "latitude": 17.483556, + "longitude": 2.541913, + "tags": [ + "ipsum", + "quis", + "dolor", + "voluptate", + "culpa", + "adipisicing", + "laborum" + ], + "friends": [ + { + "id": 0, + "name": "Collins Roy" + }, + { + "id": 1, + "name": "Wilkinson Matthews" + }, + { + "id": 2, + "name": "Katharine Riggs" + } + ], + "greeting": "Hello, Sharron Downs! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b85d7653f2787238e", + "index": 30, + "guid": "50fb5354-6a78-4499-a2d4-22a917d7c306", + "isActive": false, + "balance": "$2,498.97", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Mcfarland Baxter", + "gender": "male", + "company": "COMBOT", + "email": "mcfarlandbaxter@combot.com", + "phone": "+1 (855) 492-3484", + "address": "828 Sandford Street, Savannah, Florida, 4860", + "about": "Veniam incididunt cillum non ad id nulla ea. Do ullamco ex pariatur sunt cillum occaecat fugiat non do irure consequat. Excepteur fugiat laboris ad exercitation voluptate culpa quis deserunt. Sit cupidatat Lorem do non. Non ea quis do dolore laboris dolor ipsum reprehenderit aliqua nostrud ea. Do qui ullamco sunt amet officia nostrud reprehenderit id nulla dolor laborum proident ut.\r\n", + "registered": "2020-05-06T06:35:32 -06:-30", + "latitude": -26.206898, + "longitude": -63.521805, + "tags": [ + "irure", + "fugiat", + "aliqua", + "irure", + "adipisicing", + "ipsum", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Janna Chapman" + }, + { + "id": 1, + "name": "Larson Lindsay" + }, + { + "id": 2, + "name": "Felicia Small" + } + ], + "greeting": "Hello, Mcfarland Baxter! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3ed4042be762f1dc", + "index": 31, + "guid": "41aa5096-9ad5-4618-ba1c-6dddc0c19dcd", + "isActive": true, + "balance": "$2,291.49", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Joyner Kline", + "gender": "male", + "company": "EMOLTRA", + "email": "joynerkline@emoltra.com", + "phone": "+1 (939) 527-2963", + "address": "714 Delmonico Place, Cade, Washington, 5618", + "about": "Irure consequat ea Lorem irure anim proident labore commodo. Esse dolore ex aute laboris mollit velit labore eu sit magna tempor aliquip reprehenderit deserunt. Fugiat ad aliquip consectetur aliqua exercitation.\r\n", + "registered": "2015-07-04T01:18:38 -06:-30", + "latitude": 79.90948, + "longitude": -4.642726, + "tags": [ + "qui", + "deserunt", + "qui", + "labore", + "tempor", + "deserunt", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Robyn Stout" + }, + { + "id": 1, + "name": "Hurst Soto" + }, + { + "id": 2, + "name": "Guy Osborn" + } + ], + "greeting": "Hello, Joyner Kline! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b0923fed831396b87", + "index": 32, + "guid": "db2c0bf2-da5f-4e33-835f-ec579dfe9520", + "isActive": true, + "balance": "$1,836.06", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Lester White", + "gender": "male", + "company": "PORTICO", + "email": "lesterwhite@portico.com", + "phone": "+1 (832) 523-3866", + "address": "729 Kane Street, Longoria, Montana, 1272", + "about": "Laborum eiusmod culpa enim et anim nisi amet labore consequat nulla est nulla excepteur. Nostrud nisi magna nisi ad enim aute. Adipisicing fugiat do consequat aliquip. Sint deserunt minim nisi consectetur aliqua incididunt tempor do id. Aute ad esse exercitation nostrud non ipsum consectetur aute. Voluptate minim deserunt est qui sint ea dolor in et tempor occaecat dolor.\r\n", + "registered": "2014-06-23T01:50:39 -06:-30", + "latitude": 30.624387, + "longitude": 122.292614, + "tags": [ + "irure", + "nostrud", + "aute", + "elit", + "irure", + "nulla", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Amy Winters" + }, + { + "id": 1, + "name": "Belinda Colon" + }, + { + "id": 2, + "name": "Sheila Good" + } + ], + "greeting": "Hello, Lester White! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bbadb62d2ce47ca13", + "index": 33, + "guid": "63fba9c2-0198-4d36-bc87-81be57de0a76", + "isActive": false, + "balance": "$2,831.54", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Mcintosh Jarvis", + "gender": "male", + "company": "ENVIRE", + "email": "mcintoshjarvis@envire.com", + "phone": "+1 (817) 581-3021", + "address": "590 Calyer Street, Yettem, Hawaii, 7776", + "about": "Dolore ex dolore anim ex velit. Elit consequat sint anim velit proident deserunt excepteur. Aute anim dolor consequat ut nulla irure aliqua. Irure proident id adipisicing commodo ut. Lorem qui amet ullamco id minim Lorem fugiat occaecat et exercitation aliquip cillum anim et. Voluptate nisi culpa commodo aute amet pariatur deserunt cillum. Id pariatur irure enim nulla esse sit labore cillum exercitation consectetur ex consectetur nisi culpa.\r\n", + "registered": "2020-07-16T05:30:46 -06:-30", + "latitude": 25.919285, + "longitude": -160.561921, + "tags": [ + "ea", + "excepteur", + "exercitation", + "laborum", + "deserunt", + "dolor", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Warner Bright" + }, + { + "id": 1, + "name": "Leila Conley" + }, + { + "id": 2, + "name": "Sawyer Lewis" + } + ], + "greeting": "Hello, Mcintosh Jarvis! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3045da10511460d4", + "index": 34, + "guid": "d23884cb-9191-472e-b1f2-48ce02b5be79", + "isActive": false, + "balance": "$3,793.59", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "green", + "name": "Anna French", + "gender": "female", + "company": "QUINTITY", + "email": "annafrench@quintity.com", + "phone": "+1 (856) 484-3922", + "address": "565 Norman Avenue, Woodlands, Michigan, 2915", + "about": "Labore pariatur minim consequat commodo occaecat sunt eu pariatur dolore minim sint velit amet consectetur. Laborum cupidatat anim elit duis sunt occaecat irure Lorem officia incididunt qui ut. Id consectetur dolore proident culpa Lorem magna exercitation nisi reprehenderit esse aute. Proident id veniam quis in sunt nostrud duis proident minim dolore. Eu labore commodo nulla amet consequat sunt ex Lorem voluptate. Minim exercitation sunt mollit ad do do eu ex. Excepteur sint elit ex labore.\r\n", + "registered": "2017-09-04T06:29:57 -06:-30", + "latitude": -36.165862, + "longitude": 28.596927, + "tags": [ + "nulla", + "quis", + "minim", + "irure", + "cillum", + "ullamco", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Vilma Harris" + }, + { + "id": 1, + "name": "Perkins Woodard" + }, + { + "id": 2, + "name": "Stewart Glenn" + } + ], + "greeting": "Hello, Anna French! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b51a4666139c1a11d", + "index": 35, + "guid": "a74d00e8-7bdf-4fa2-8783-9d20aee69083", + "isActive": true, + "balance": "$1,441.54", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Araceli Fuentes", + "gender": "female", + "company": "ENQUILITY", + "email": "aracelifuentes@enquility.com", + "phone": "+1 (884) 585-2706", + "address": "290 Herkimer Place, Maplewood, Maryland, 4835", + "about": "Irure consequat nulla nostrud incididunt nostrud anim exercitation pariatur dolore irure consectetur ipsum et et. Nostrud tempor veniam voluptate sunt deserunt consectetur. Minim anim sit sit labore. Excepteur id deserunt ad Lorem amet quis irure reprehenderit velit do deserunt tempor consectetur. Excepteur nostrud deserunt velit pariatur. In duis et consequat duis.\r\n", + "registered": "2018-08-10T12:25:05 -06:-30", + "latitude": 78.411466, + "longitude": -170.825111, + "tags": [ + "anim", + "nulla", + "culpa", + "irure", + "cillum", + "consequat", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Merle Hill" + }, + { + "id": 1, + "name": "Dorsey Conway" + }, + { + "id": 2, + "name": "Terry Thompson" + } + ], + "greeting": "Hello, Araceli Fuentes! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bd0e74b3f4c67aafc", + "index": 36, + "guid": "658d3be4-797a-46d5-93bc-a3d34a5bd2ac", + "isActive": true, + "balance": "$1,474.78", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Davidson Reed", + "gender": "male", + "company": "DRAGBOT", + "email": "davidsonreed@dragbot.com", + "phone": "+1 (881) 405-3382", + "address": "954 Union Avenue, Riceville, American Samoa, 2316", + "about": "Minim dolore excepteur deserunt pariatur ullamco Lorem dolore incididunt. Velit nostrud id reprehenderit ea excepteur minim ut tempor dolor in. Consectetur voluptate elit tempor excepteur adipisicing deserunt id cillum. Minim ipsum aute veniam excepteur nostrud. Ex adipisicing commodo eiusmod deserunt laborum fugiat.\r\n", + "registered": "2017-10-21T02:49:54 -06:-30", + "latitude": -40.01866, + "longitude": -57.986635, + "tags": [ + "tempor", + "laborum", + "voluptate", + "in", + "officia", + "nulla", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Bertha Nielsen" + }, + { + "id": 1, + "name": "Callahan Delgado" + }, + { + "id": 2, + "name": "Susanne Greene" + } + ], + "greeting": "Hello, Davidson Reed! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b70fc726b20c7f849", + "index": 37, + "guid": "b438aa34-7a91-4fb4-b29b-8c3195e5fa1e", + "isActive": true, + "balance": "$2,510.00", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Elba Padilla", + "gender": "female", + "company": "COMTRAK", + "email": "elbapadilla@comtrak.com", + "phone": "+1 (902) 582-2685", + "address": "973 Clark Street, Nettie, Illinois, 9848", + "about": "Ea id elit in nisi ea dolore aliquip sunt ex. Commodo pariatur deserunt non deserunt incididunt velit laboris tempor Lorem. Officia culpa nostrud et voluptate consequat. Mollit pariatur laboris deserunt consequat. Irure laboris sunt nisi qui sint veniam duis tempor in enim culpa qui. Reprehenderit aute anim in ullamco cupidatat est et fugiat consectetur esse esse.\r\n", + "registered": "2019-12-14T10:47:08 -06:-30", + "latitude": -22.947915, + "longitude": -164.792779, + "tags": [ + "est", + "mollit", + "commodo", + "eiusmod", + "voluptate", + "in", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Leblanc Chang" + }, + { + "id": 1, + "name": "Cheri Hurley" + }, + { + "id": 2, + "name": "Boyle Malone" + } + ], + "greeting": "Hello, Elba Padilla! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bc3081f4c3c5bc68d", + "index": 38, + "guid": "08e4a576-3a62-446b-b4a2-93fd336d1f33", + "isActive": true, + "balance": "$3,962.27", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Cecilia Steele", + "gender": "female", + "company": "FLEXIGEN", + "email": "ceciliasteele@flexigen.com", + "phone": "+1 (858) 535-3831", + "address": "331 Church Lane, Kempton, Missouri, 4904", + "about": "Nostrud minim eiusmod deserunt laborum nulla. Nostrud nisi laborum adipisicing mollit. Ullamco et ea deserunt occaecat tempor. Magna sit anim irure laboris aliqua exercitation labore. Est eiusmod laborum sunt aliquip tempor ex officia est sunt ipsum proident qui ea. Ullamco mollit officia ut id sint. Officia anim dolor sint consequat adipisicing consectetur duis voluptate occaecat aute nulla cillum.\r\n", + "registered": "2017-05-13T11:38:59 -06:-30", + "latitude": -37.578303, + "longitude": 61.403511, + "tags": [ + "quis", + "eu", + "consequat", + "eiusmod", + "sint", + "pariatur", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Claudette Carlson" + }, + { + "id": 1, + "name": "Tami Snider" + }, + { + "id": 2, + "name": "Cindy Obrien" + } + ], + "greeting": "Hello, Cecilia Steele! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b29b1bdc8641d5d29", + "index": 39, + "guid": "cfd10cb6-f690-439d-ab95-9f4d9b4c95f2", + "isActive": true, + "balance": "$3,996.49", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Barnes Richards", + "gender": "male", + "company": "QUALITERN", + "email": "barnesrichards@qualitern.com", + "phone": "+1 (982) 446-2321", + "address": "895 Olive Street, Inkerman, Idaho, 259", + "about": "In laborum do fugiat qui elit veniam. Eiusmod laboris nostrud laborum adipisicing aute. Adipisicing commodo culpa amet occaecat quis fugiat officia pariatur aliqua deserunt nisi ullamco sint cillum. Ad elit ea cillum voluptate est tempor fugiat.\r\n", + "registered": "2021-08-22T12:49:06 -06:-30", + "latitude": 58.708759, + "longitude": -63.558425, + "tags": [ + "commodo", + "ex", + "adipisicing", + "irure", + "excepteur", + "et", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Jennie Rojas" + }, + { + "id": 1, + "name": "Montgomery Pena" + }, + { + "id": 2, + "name": "Marie Kim" + } + ], + "greeting": "Hello, Barnes Richards! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b8247b0f9b2031d6d", + "index": 40, + "guid": "49e23448-29d5-432c-9c44-0b38af10b09f", + "isActive": true, + "balance": "$1,079.34", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "green", + "name": "Martina Waters", + "gender": "female", + "company": "SHOPABOUT", + "email": "martinawaters@shopabout.com", + "phone": "+1 (891) 516-3219", + "address": "965 Anchorage Place, Matthews, South Carolina, 8111", + "about": "Ut voluptate pariatur dolore aute ullamco sunt ullamco labore quis adipisicing officia irure laborum. Deserunt nulla id eiusmod laborum do est eiusmod culpa do. Ad ut nulla mollit labore non pariatur fugiat. Incididunt cillum consectetur exercitation culpa nisi proident. Non labore pariatur sit cupidatat nostrud cupidatat mollit.\r\n", + "registered": "2022-08-29T03:50:07 -06:-30", + "latitude": -67.707555, + "longitude": -178.651134, + "tags": [ + "minim", + "qui", + "id", + "enim", + "tempor", + "mollit", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Ladonna Tran" + }, + { + "id": 1, + "name": "Frost Reyes" + }, + { + "id": 2, + "name": "Brock Rutledge" + } + ], + "greeting": "Hello, Martina Waters! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd6058ee4e132feaf", + "index": 41, + "guid": "3597967c-8416-4a94-9ffb-540a971a8997", + "isActive": false, + "balance": "$1,243.44", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "blue", + "name": "Espinoza Dunn", + "gender": "male", + "company": "LETPRO", + "email": "espinozadunn@letpro.com", + "phone": "+1 (808) 503-2938", + "address": "146 Louisa Street, Centerville, Colorado, 3106", + "about": "Cillum deserunt in enim sit ipsum. Ad ullamco eu occaecat Lorem officia irure sunt Lorem non dolore laborum. Minim aute consequat ut aliquip.\r\n", + "registered": "2014-09-04T07:19:53 -06:-30", + "latitude": 56.269222, + "longitude": 13.610313, + "tags": [ + "enim", + "consequat", + "labore", + "aliqua", + "officia", + "occaecat", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Sutton Huff" + }, + { + "id": 1, + "name": "Doyle Luna" + }, + { + "id": 2, + "name": "Salazar Farley" + } + ], + "greeting": "Hello, Espinoza Dunn! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcd252fb1e4b20c43", + "index": 42, + "guid": "04756133-ae29-4984-9aa1-ef8dfa0573c3", + "isActive": true, + "balance": "$2,383.23", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Marta Huber", + "gender": "female", + "company": "PARLEYNET", + "email": "martahuber@parleynet.com", + "phone": "+1 (932) 509-3213", + "address": "515 Vernon Avenue, Blairstown, New Hampshire, 5358", + "about": "Officia irure ipsum nulla fugiat irure ad dolor adipisicing nulla ad. Cillum sit duis ad consequat labore non cupidatat duis sint excepteur consectetur duis. Commodo culpa magna est laboris magna qui duis eiusmod. Voluptate ullamco dolore sit culpa esse cillum nisi nisi quis sunt. Deserunt consectetur et fugiat eiusmod pariatur mollit sunt mollit laborum. Cillum adipisicing ad esse sit occaecat fugiat irure sint eu fugiat nisi aliquip. Elit ullamco eiusmod voluptate anim.\r\n", + "registered": "2014-12-09T03:09:09 -06:-30", + "latitude": 67.533387, + "longitude": -164.116649, + "tags": [ + "amet", + "elit", + "dolor", + "voluptate", + "anim", + "aute", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Slater Stevens" + }, + { + "id": 1, + "name": "Claudine Clay" + }, + { + "id": 2, + "name": "Phoebe Hughes" + } + ], + "greeting": "Hello, Marta Huber! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf32d2e481fb5f191", + "index": 43, + "guid": "e3350b34-2bf2-4bae-996e-94f61fa414b0", + "isActive": true, + "balance": "$3,396.41", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Carmella Carver", + "gender": "female", + "company": "ELEMANTRA", + "email": "carmellacarver@elemantra.com", + "phone": "+1 (846) 431-2240", + "address": "316 Provost Street, Aguila, Minnesota, 9376", + "about": "Deserunt dolor est duis qui nulla elit pariatur voluptate commodo. Laborum qui nulla ea velit occaecat est consectetur ullamco in occaecat. Amet ut anim occaecat ea non enim laborum fugiat occaecat.\r\n", + "registered": "2014-03-29T10:33:46 -06:-30", + "latitude": -12.677283, + "longitude": -47.250558, + "tags": [ + "ex", + "fugiat", + "officia", + "reprehenderit", + "amet", + "do", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "April Guzman" + }, + { + "id": 1, + "name": "Roach Browning" + }, + { + "id": 2, + "name": "Guthrie Nixon" + } + ], + "greeting": "Hello, Carmella Carver! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b12cbc90ec8138d7e", + "index": 44, + "guid": "423d394f-0a14-4396-ae34-05f49a644c3b", + "isActive": false, + "balance": "$3,738.98", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Quinn Mcdaniel", + "gender": "male", + "company": "ENTROFLEX", + "email": "quinnmcdaniel@entroflex.com", + "phone": "+1 (868) 476-3813", + "address": "313 School Lane, Southmont, Utah, 3777", + "about": "Laboris nulla magna excepteur velit anim velit ad velit et esse sint. Ipsum occaecat non exercitation dolore qui qui velit. Lorem ea eiusmod aliquip magna labore cillum ut magna nulla et dolore voluptate et. Incididunt incididunt magna nostrud cillum sit exercitation nostrud qui. Sint proident Lorem magna non magna voluptate mollit ut anim.\r\n", + "registered": "2014-10-16T12:43:25 -06:-30", + "latitude": 88.967585, + "longitude": 46.497285, + "tags": [ + "ea", + "laboris", + "duis", + "minim", + "nulla", + "magna", + "ipsum" + ], + "friends": [ + { + "id": 0, + "name": "Cox Young" + }, + { + "id": 1, + "name": "Corine Miles" + }, + { + "id": 2, + "name": "Brewer Blackwell" + } + ], + "greeting": "Hello, Quinn Mcdaniel! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1e83671dbf71d538", + "index": 45, + "guid": "58053c1c-7d3e-4a89-a5c2-b295a6750b8b", + "isActive": false, + "balance": "$3,355.18", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Simmons Hamilton", + "gender": "male", + "company": "BITREX", + "email": "simmonshamilton@bitrex.com", + "phone": "+1 (943) 432-2418", + "address": "557 Highland Avenue, Dupuyer, South Dakota, 1515", + "about": "Magna velit labore eu reprehenderit dolor magna amet esse. Lorem ad commodo ad labore Lorem amet ea proident ut pariatur. Cillum amet in reprehenderit dolor non enim in nostrud. Voluptate pariatur voluptate nisi consectetur sit esse occaecat magna.\r\n", + "registered": "2022-08-13T09:12:27 -06:-30", + "latitude": -41.924385, + "longitude": 42.716179, + "tags": [ + "ex", + "aute", + "aliquip", + "amet", + "aliquip", + "velit", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Terrie Meyer" + }, + { + "id": 1, + "name": "Middleton Church" + }, + { + "id": 2, + "name": "Roth Mcclure" + } + ], + "greeting": "Hello, Simmons Hamilton! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5284acb0ee916fb8", + "index": 46, + "guid": "56f2acb8-e172-4bab-8a64-02b8a5221a56", + "isActive": false, + "balance": "$3,584.87", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Puckett Spears", + "gender": "male", + "company": "ARTIQ", + "email": "puckettspears@artiq.com", + "phone": "+1 (861) 532-3908", + "address": "361 Post Court, Durham, Arizona, 3894", + "about": "Ex est dolore minim amet qui sit esse eiusmod non fugiat excepteur labore fugiat. Cillum veniam nostrud reprehenderit sint dolor laboris elit minim ullamco quis nisi cillum. Incididunt nulla irure proident esse. Labore non labore occaecat deserunt dolore cillum dolor fugiat ipsum anim. Sint occaecat proident sint est sit occaecat minim nisi mollit exercitation velit eu. Minim nisi irure et commodo elit id deserunt anim consectetur id aliqua. Pariatur irure aliqua ex officia.\r\n", + "registered": "2016-05-08T11:34:12 -06:-30", + "latitude": -18.021937, + "longitude": 54.146913, + "tags": [ + "ad", + "officia", + "amet", + "commodo", + "sunt", + "culpa", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Lorie Spencer" + }, + { + "id": 1, + "name": "King Goodwin" + }, + { + "id": 2, + "name": "Elisa Neal" + } + ], + "greeting": "Hello, Puckett Spears! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bc75ca6b2c9f2b102", + "index": 47, + "guid": "552e50cb-05f2-49a0-8117-bb8a747cc4b2", + "isActive": false, + "balance": "$3,924.07", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Corina Nichols", + "gender": "female", + "company": "CHILLIUM", + "email": "corinanichols@chillium.com", + "phone": "+1 (938) 540-2421", + "address": "465 Bevy Court, Herald, Marshall Islands, 1260", + "about": "Cillum magna fugiat aliqua enim amet. Officia qui sunt reprehenderit dolore qui. Occaecat non ex excepteur ea ipsum adipisicing nisi sunt deserunt irure nostrud. Sit proident ad nostrud dolore. Et ullamco sit cupidatat aliqua eu proident sit ut.\r\n", + "registered": "2020-09-09T10:49:18 -06:-30", + "latitude": 14.324555, + "longitude": 107.922118, + "tags": [ + "incididunt", + "cillum", + "consectetur", + "reprehenderit", + "nisi", + "duis", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Avery Smith" + }, + { + "id": 1, + "name": "Boyer Lambert" + }, + { + "id": 2, + "name": "Teresa Cortez" + } + ], + "greeting": "Hello, Corina Nichols! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b9b04f32fa90752db", + "index": 48, + "guid": "b81437a8-1a59-4b2f-ba28-fc925649e540", + "isActive": false, + "balance": "$1,504.05", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Mayra Haley", + "gender": "female", + "company": "MEDESIGN", + "email": "mayrahaley@medesign.com", + "phone": "+1 (933) 513-3522", + "address": "151 Schenck Avenue, Newry, Ohio, 3444", + "about": "Laboris ea dolor incididunt ut cupidatat non nulla eu velit sint ullamco velit ipsum magna. Cupidatat duis sint nulla fugiat aute velit sit anim ipsum et irure. Veniam cillum mollit fugiat occaecat velit. Anim duis in adipisicing aliqua mollit nostrud velit adipisicing sit duis reprehenderit ut.\r\n", + "registered": "2022-02-04T09:22:31 -06:-30", + "latitude": -19.433024, + "longitude": 120.942537, + "tags": [ + "fugiat", + "exercitation", + "cupidatat", + "culpa", + "velit", + "in", + "enim" + ], + "friends": [ + { + "id": 0, + "name": "Adrienne Valencia" + }, + { + "id": 1, + "name": "Ruby Cohen" + }, + { + "id": 2, + "name": "Imogene Atkinson" + } + ], + "greeting": "Hello, Mayra Haley! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b56679f4ee4a91d55", + "index": 49, + "guid": "fb42f586-5f33-4a85-bca0-8d007626b03e", + "isActive": true, + "balance": "$3,548.04", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Marquita Velasquez", + "gender": "female", + "company": "SAVVY", + "email": "marquitavelasquez@savvy.com", + "phone": "+1 (959) 599-2120", + "address": "981 Gelston Avenue, Jackpot, Alabama, 6833", + "about": "Ad consectetur deserunt laborum esse. Dolore ipsum occaecat do pariatur sit non adipisicing sint duis labore ipsum mollit sunt. Labore mollit duis ex occaecat laborum reprehenderit velit nulla non voluptate veniam. Duis excepteur proident laboris fugiat. Laboris eu irure consequat dolore ex cillum commodo in enim aliqua laborum esse exercitation eu.\r\n", + "registered": "2021-01-05T06:04:29 -06:-30", + "latitude": -41.068786, + "longitude": -98.425755, + "tags": [ + "fugiat", + "labore", + "nisi", + "anim", + "quis", + "elit", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Phyllis Hardy" + }, + { + "id": 1, + "name": "Gaines Hubbard" + }, + { + "id": 2, + "name": "Jenkins Vaughan" + } + ], + "greeting": "Hello, Marquita Velasquez! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b622957bd157d494e", + "index": 50, + "guid": "ffb4fb67-de5e-42ea-9a32-d1450bf986e6", + "isActive": true, + "balance": "$3,787.66", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Dena Walters", + "gender": "female", + "company": "NORSUL", + "email": "denawalters@norsul.com", + "phone": "+1 (925) 520-2689", + "address": "754 Rockaway Avenue, Williston, Georgia, 1970", + "about": "Sit irure irure ipsum esse qui. Velit adipisicing nulla aliquip officia ipsum. Eu ex consequat minim irure aliquip consectetur ullamco anim dolor. Esse deserunt duis enim occaecat officia minim exercitation irure est laborum nulla fugiat fugiat est. Et do exercitation do nulla ut. Culpa incididunt non non cillum id occaecat in fugiat mollit. Velit pariatur laboris consectetur eu duis incididunt incididunt dolor amet elit quis.\r\n", + "registered": "2014-07-13T03:00:44 -06:-30", + "latitude": 57.083288, + "longitude": 95.521837, + "tags": [ + "deserunt", + "eu", + "duis", + "nulla", + "dolor", + "ut", + "nostrud" + ], + "friends": [ + { + "id": 0, + "name": "Liliana Mayo" + }, + { + "id": 1, + "name": "Nichole Ellison" + }, + { + "id": 2, + "name": "Munoz Cain" + } + ], + "greeting": "Hello, Dena Walters! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b44d834e4bc590ef8", + "index": 51, + "guid": "997e1b15-d11a-4240-8b11-3ab114bdcbbc", + "isActive": false, + "balance": "$1,799.75", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "Joann Christensen", + "gender": "female", + "company": "HARMONEY", + "email": "joannchristensen@harmoney.com", + "phone": "+1 (911) 526-3508", + "address": "188 Allen Avenue, Cartwright, California, 2021", + "about": "Labore tempor ullamco non deserunt laboris nulla sunt reprehenderit. Irure consequat voluptate aliqua fugiat commodo do amet fugiat consectetur minim ex laboris nisi tempor. Amet ea ea culpa enim reprehenderit cupidatat do. Qui dolore velit nulla et sunt cupidatat pariatur non velit duis. Excepteur labore cupidatat qui velit sunt dolore. Labore ipsum non cillum mollit ipsum est ullamco aliqua nulla fugiat velit excepteur. Velit sit ad exercitation eiusmod fugiat dolore consequat eu est cupidatat.\r\n", + "registered": "2016-07-15T04:11:15 -06:-30", + "latitude": 45.243152, + "longitude": -168.689941, + "tags": [ + "proident", + "excepteur", + "eu", + "non", + "nulla", + "nisi", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Bettye Bryant" + }, + { + "id": 1, + "name": "Lara Garrison" + }, + { + "id": 2, + "name": "Deann Velez" + } + ], + "greeting": "Hello, Joann Christensen! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcd410cab9d0e648d", + "index": 52, + "guid": "1f98c763-23ec-4f31-a82d-d27b30819534", + "isActive": true, + "balance": "$3,483.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Sharp Mejia", + "gender": "male", + "company": "SPLINX", + "email": "sharpmejia@splinx.com", + "phone": "+1 (925) 494-3490", + "address": "825 Tapscott Avenue, Terlingua, Northern Mariana Islands, 5101", + "about": "Irure consequat quis irure magna et nulla occaecat ad voluptate reprehenderit. Exercitation culpa incididunt mollit ipsum aliquip est fugiat ex laborum anim. Esse veniam ad sunt eiusmod eu consectetur voluptate veniam cupidatat aute nisi. Ipsum tempor deserunt et eu culpa eu duis. Lorem aliquip sint exercitation dolore pariatur ipsum laborum esse proident quis eiusmod proident culpa nisi. Ut fugiat Lorem ad ex dolore tempor commodo dolore qui. Aliqua aliquip culpa adipisicing proident pariatur ipsum consequat proident qui qui in esse.\r\n", + "registered": "2018-03-03T04:45:51 -06:-30", + "latitude": -42.196655, + "longitude": 68.752722, + "tags": [ + "quis", + "qui", + "minim", + "enim", + "officia", + "in", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Fanny Alexander" + }, + { + "id": 1, + "name": "Wright Flowers" + }, + { + "id": 2, + "name": "Le Mcintosh" + } + ], + "greeting": "Hello, Sharp Mejia! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4c8925501d9a76ce", + "index": 53, + "guid": "4bb4522c-5e45-477f-a24c-d802d4cc228c", + "isActive": true, + "balance": "$1,785.24", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Shelby Acosta", + "gender": "female", + "company": "INSURITY", + "email": "shelbyacosta@insurity.com", + "phone": "+1 (847) 494-2798", + "address": "541 Oxford Street, Evergreen, Kansas, 9161", + "about": "Eiusmod ad eu id cupidatat commodo incididunt non deserunt proident voluptate mollit ut elit est. Fugiat anim laboris ea ad commodo sint tempor proident eu voluptate ad ullamco. Nostrud aliqua exercitation labore laborum minim minim id irure. Esse eu et qui non exercitation sit ad mollit in. Ex nulla ad exercitation occaecat dolor velit dolore aliquip ut voluptate ullamco. Id elit excepteur occaecat sit sunt sit deserunt duis excepteur ea dolore.\r\n", + "registered": "2020-08-10T10:52:20 -06:-30", + "latitude": -84.378509, + "longitude": -159.174996, + "tags": [ + "occaecat", + "voluptate", + "consequat", + "eiusmod", + "minim", + "nisi", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Willis Battle" + }, + { + "id": 1, + "name": "Riggs Daugherty" + }, + { + "id": 2, + "name": "Copeland Salinas" + } + ], + "greeting": "Hello, Shelby Acosta! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0f5be85ff1e7a8ab", + "index": 54, + "guid": "65fdceb7-969b-4f66-ac38-0e85d7d2571e", + "isActive": false, + "balance": "$2,590.80", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Deana Gamble", + "gender": "female", + "company": "GUSHKOOL", + "email": "deanagamble@gushkool.com", + "phone": "+1 (927) 599-3793", + "address": "903 Bragg Street, Valle, North Dakota, 527", + "about": "Duis dolore aute proident consequat aute velit esse cupidatat fugiat voluptate nulla ut ad anim. Officia tempor et aliqua Lorem. Consequat esse laborum consectetur non. Sunt excepteur qui cillum Lorem ex excepteur est anim sint.\r\n", + "registered": "2021-04-04T05:24:49 -06:-30", + "latitude": 75.105091, + "longitude": -41.656537, + "tags": [ + "enim", + "reprehenderit", + "aliqua", + "quis", + "ea", + "dolor", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Summers Carr" + }, + { + "id": 1, + "name": "Ball Conrad" + }, + { + "id": 2, + "name": "Dona Macdonald" + } + ], + "greeting": "Hello, Deana Gamble! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b32244bf04b771f30", + "index": 55, + "guid": "f8d8ea35-d451-4874-bcee-85868acc4a6e", + "isActive": true, + "balance": "$2,365.99", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Bobbi Combs", + "gender": "female", + "company": "CONFRENZY", + "email": "bobbicombs@confrenzy.com", + "phone": "+1 (965) 502-3575", + "address": "985 Dank Court, Naomi, New York, 6184", + "about": "Culpa ea eiusmod incididunt amet tempor magna. Duis velit mollit non amet laboris dolor deserunt deserunt. Est id exercitation incididunt anim nostrud qui. Voluptate voluptate adipisicing aute qui fugiat qui cupidatat non laborum quis in incididunt. Amet esse laboris exercitation nisi velit ad exercitation deserunt. Ex irure proident ad elit veniam culpa ullamco aliqua. Consectetur et anim laborum occaecat cupidatat eiusmod.\r\n", + "registered": "2022-08-28T07:22:17 -06:-30", + "latitude": -23.765704, + "longitude": -7.275231, + "tags": [ + "ut", + "Lorem", + "reprehenderit", + "proident", + "pariatur", + "eu", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Juana Moody" + }, + { + "id": 1, + "name": "Kathleen Dalton" + }, + { + "id": 2, + "name": "Melba Sloan" + } + ], + "greeting": "Hello, Bobbi Combs! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1116844792798d33", + "index": 56, + "guid": "40d24855-d04c-487d-ba0d-056b0ab591f1", + "isActive": true, + "balance": "$3,186.81", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Mejia Rose", + "gender": "male", + "company": "AQUAFIRE", + "email": "mejiarose@aquafire.com", + "phone": "+1 (914) 416-3136", + "address": "864 Elliott Place, Northridge, New Jersey, 5944", + "about": "Commodo Lorem magna officia labore irure aliquip pariatur veniam officia qui ullamco. Esse esse ex occaecat aute eiusmod mollit ut velit qui esse non proident. Tempor minim ea amet ex ipsum eiusmod ad consectetur aliquip enim. Commodo officia adipisicing occaecat occaecat eu pariatur deserunt. Culpa irure do nostrud fugiat laboris minim culpa sit ea nulla.\r\n", + "registered": "2015-12-17T06:25:20 -06:-30", + "latitude": 16.406022, + "longitude": 99.706138, + "tags": [ + "id", + "magna", + "consequat", + "occaecat", + "sit", + "laborum", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Ratliff Hendricks" + }, + { + "id": 1, + "name": "Blanche Mckay" + }, + { + "id": 2, + "name": "Amber Beard" + } + ], + "greeting": "Hello, Mejia Rose! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b9ee4349c86ade33d", + "index": 57, + "guid": "f067e0d0-e5ac-423a-ac28-d46e4ad28038", + "isActive": true, + "balance": "$1,240.25", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Francis Crawford", + "gender": "male", + "company": "TURNABOUT", + "email": "franciscrawford@turnabout.com", + "phone": "+1 (831) 504-2711", + "address": "990 Fanchon Place, Echo, Texas, 6988", + "about": "Amet culpa qui minim nisi nisi exercitation pariatur. Amet velit laborum dolore dolor. Cupidatat sint consectetur laboris nisi et laboris et sint cillum officia magna. Duis aliqua aliqua exercitation eiusmod duis nisi in incididunt deserunt commodo sunt excepteur.\r\n", + "registered": "2014-06-23T08:24:46 -06:-30", + "latitude": 4.63859, + "longitude": -1.583364, + "tags": [ + "deserunt", + "velit", + "occaecat", + "voluptate", + "labore", + "laborum", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Laura Edwards" + }, + { + "id": 1, + "name": "Jamie Murphy" + }, + { + "id": 2, + "name": "Phelps Newman" + } + ], + "greeting": "Hello, Francis Crawford! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b90c9e2ca26f660c9", + "index": 58, + "guid": "711e6575-ef25-41ef-8421-584e93842155", + "isActive": false, + "balance": "$3,093.52", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Willa Dudley", + "gender": "female", + "company": "SONGLINES", + "email": "willadudley@songlines.com", + "phone": "+1 (989) 600-2196", + "address": "916 Morgan Avenue, Waiohinu, Massachusetts, 677", + "about": "Ea proident dolor veniam quis non non aliqua nostrud consectetur nulla incididunt non aliqua. Deserunt id ipsum consectetur excepteur cillum ex ullamco fugiat occaecat consequat consequat. Magna fugiat nostrud fugiat qui amet ut aliquip. Aute laborum labore dolore magna sit deserunt dolor nisi consectetur. Est consectetur ut laboris quis enim id veniam aliqua consequat minim ipsum. Ea excepteur quis dolore aliquip sint non laborum sint laborum consequat ea officia. Non aliqua consequat esse aute veniam culpa eu qui cillum.\r\n", + "registered": "2015-01-17T05:07:09 -06:-30", + "latitude": 1.559747, + "longitude": -80.201662, + "tags": [ + "et", + "nulla", + "irure", + "consectetur", + "aute", + "ad", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Casey Patel" + }, + { + "id": 1, + "name": "Ferrell Woods" + }, + { + "id": 2, + "name": "Antoinette Nicholson" + } + ], + "greeting": "Hello, Willa Dudley! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b27c7cee351d55395", + "index": 59, + "guid": "348b8db9-0f38-4528-a8f0-55e3c4511e9d", + "isActive": true, + "balance": "$2,211.41", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Hendricks Wiggins", + "gender": "male", + "company": "MICRONAUT", + "email": "hendrickswiggins@micronaut.com", + "phone": "+1 (891) 433-3512", + "address": "254 Whitty Lane, Lowgap, Palau, 5435", + "about": "Eu laborum incididunt qui laboris. Commodo ea cupidatat adipisicing id et cupidatat culpa consectetur veniam. Sunt in sit Lorem sint qui.\r\n", + "registered": "2014-11-20T09:22:53 -06:-30", + "latitude": -7.306816, + "longitude": -132.641404, + "tags": [ + "veniam", + "quis", + "deserunt", + "ullamco", + "est", + "cillum", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Alvarado Merritt" + }, + { + "id": 1, + "name": "Dillon Owens" + }, + { + "id": 2, + "name": "Garrett Shepherd" + } + ], + "greeting": "Hello, Hendricks Wiggins! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb4aabdac5660ac1f", + "index": 60, + "guid": "d5234a1c-caa5-4c39-86a7-28271a19e807", + "isActive": true, + "balance": "$1,757.07", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "blue", + "name": "Lara Wong", + "gender": "female", + "company": "NAXDIS", + "email": "larawong@naxdis.com", + "phone": "+1 (813) 592-2083", + "address": "904 Rogers Avenue, Ripley, Alaska, 6830", + "about": "Reprehenderit tempor commodo enim consectetur anim laboris officia id. Labore do nulla laboris id velit veniam esse est do sit velit reprehenderit qui. Cillum veniam incididunt ullamco aliquip dolor est nostrud labore anim fugiat ad commodo fugiat. Esse irure ullamco quis adipisicing tempor ad ipsum cupidatat ex anim. Culpa anim incididunt eiusmod sint ullamco cillum. Commodo culpa sit incididunt reprehenderit in et deserunt quis occaecat ad occaecat fugiat.\r\n", + "registered": "2015-08-06T10:19:44 -06:-30", + "latitude": 57.236077, + "longitude": 123.540623, + "tags": [ + "ea", + "eiusmod", + "aliquip", + "velit", + "cupidatat", + "esse", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Britney Sparks" + }, + { + "id": 1, + "name": "Rachel Wynn" + }, + { + "id": 2, + "name": "Goldie Shaffer" + } + ], + "greeting": "Hello, Lara Wong! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b255d3b78009fbae1", + "index": 61, + "guid": "ff8ec544-9a67-4a03-b909-c75d89c05538", + "isActive": false, + "balance": "$3,391.44", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Neva Stanton", + "gender": "female", + "company": "QOT", + "email": "nevastanton@qot.com", + "phone": "+1 (914) 426-2121", + "address": "258 Tehama Street, Cresaptown, Oklahoma, 7285", + "about": "Nostrud magna ipsum duis dolore nulla veniam tempor veniam commodo. Nulla laborum ipsum qui anim nisi Lorem eu deserunt ex. Nulla quis culpa ipsum duis amet ut mollit labore anim aute esse fugiat. Magna enim ullamco aute deserunt esse. Pariatur consectetur culpa labore commodo fugiat. Deserunt qui nulla nulla tempor nostrud veniam voluptate consequat reprehenderit in dolore.\r\n", + "registered": "2018-05-24T07:19:49 -06:-30", + "latitude": 11.676929, + "longitude": -3.912016, + "tags": [ + "ullamco", + "ullamco", + "excepteur", + "sit", + "ad", + "deserunt", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Hunt Hines" + }, + { + "id": 1, + "name": "Hays Rasmussen" + }, + { + "id": 2, + "name": "Lana Hurst" + } + ], + "greeting": "Hello, Neva Stanton! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba574389ad1f63f87", + "index": 62, + "guid": "68b71d45-fbc6-413a-9946-adb946fe599d", + "isActive": false, + "balance": "$3,061.92", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Jackie Torres", + "gender": "female", + "company": "MAGNAFONE", + "email": "jackietorres@magnafone.com", + "phone": "+1 (939) 421-3993", + "address": "894 Llama Court, Jamestown, New Mexico, 9532", + "about": "Sunt Lorem cillum veniam minim id mollit ex excepteur amet cillum sint. Aute proident non ex laboris mollit sint nulla laboris exercitation laboris occaecat non. Duis non ea laborum sint officia dolor anim mollit commodo ut incididunt excepteur proident qui. Sit ea elit nulla esse aute cillum fugiat ullamco. Cillum nulla fugiat eiusmod dolor ipsum velit cupidatat irure occaecat culpa officia.\r\n", + "registered": "2018-11-16T08:17:01 -06:-30", + "latitude": 57.443768, + "longitude": 82.395954, + "tags": [ + "magna", + "culpa", + "adipisicing", + "consectetur", + "do", + "tempor", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Lillian Clements" + }, + { + "id": 1, + "name": "Bradley Vazquez" + }, + { + "id": 2, + "name": "Davenport Gibson" + } + ], + "greeting": "Hello, Jackie Torres! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b69fb41d97fb750e8", + "index": 63, + "guid": "cc2025b1-2ce4-46e0-bce1-c3adde80227b", + "isActive": true, + "balance": "$1,021.52", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Boyd Nieves", + "gender": "male", + "company": "MOLTONIC", + "email": "boydnieves@moltonic.com", + "phone": "+1 (995) 411-3423", + "address": "661 Hubbard Street, Maury, Wyoming, 6014", + "about": "Enim enim magna do laboris adipisicing nulla deserunt nisi reprehenderit id reprehenderit magna. Labore ipsum consectetur cillum do proident mollit do. Laborum adipisicing laborum tempor ut id pariatur esse dolor. Eiusmod velit aliquip magna elit eu ad incididunt est. Ea dolor officia id occaecat.\r\n", + "registered": "2021-04-19T07:11:12 -06:-30", + "latitude": -53.086107, + "longitude": -101.568354, + "tags": [ + "sint", + "non", + "est", + "excepteur", + "elit", + "aliqua", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Celia Valentine" + }, + { + "id": 1, + "name": "Virgie Barlow" + }, + { + "id": 2, + "name": "Deanna Mcleod" + } + ], + "greeting": "Hello, Boyd Nieves! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb683a300334f9c01", + "index": 64, + "guid": "30b38c75-3a52-4de0-a263-7fe18b77eba9", + "isActive": false, + "balance": "$3,916.98", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Hutchinson Cherry", + "gender": "male", + "company": "MEDIFAX", + "email": "hutchinsoncherry@medifax.com", + "phone": "+1 (965) 577-3370", + "address": "743 Harman Street, Munjor, Rhode Island, 3945", + "about": "Culpa commodo quis culpa in cillum do labore id eiusmod reprehenderit non. Laborum ex Lorem esse elit tempor non veniam elit enim minim exercitation. Ad magna adipisicing est enim sunt velit laboris commodo anim. Ut esse nostrud cillum sint labore qui aliquip duis amet labore voluptate sint laborum incididunt. Ullamco irure nostrud sunt tempor nostrud officia voluptate officia. Ut proident occaecat nisi elit velit aliquip duis. Adipisicing officia amet aute sint fugiat voluptate minim esse laboris.\r\n", + "registered": "2021-05-30T09:59:22 -06:-30", + "latitude": -60.497861, + "longitude": -168.538086, + "tags": [ + "exercitation", + "mollit", + "eiusmod", + "fugiat", + "pariatur", + "id", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "June Vega" + }, + { + "id": 1, + "name": "Welch Petty" + }, + { + "id": 2, + "name": "Roman Hendrix" + } + ], + "greeting": "Hello, Hutchinson Cherry! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b96a75f366f9739e3", + "index": 65, + "guid": "13de6382-0a6b-4e19-81de-3aa13202364b", + "isActive": false, + "balance": "$2,219.97", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Vargas Pruitt", + "gender": "male", + "company": "INTERODEO", + "email": "vargaspruitt@interodeo.com", + "phone": "+1 (897) 487-2745", + "address": "206 Grand Avenue, Rivers, West Virginia, 670", + "about": "Eiusmod commodo mollit est tempor aliquip et officia. Ipsum eiusmod esse tempor qui laboris velit voluptate elit. Elit occaecat officia do pariatur est dolore officia. Elit aliquip ex tempor sit ea adipisicing consectetur proident. Incididunt tempor sunt mollit proident reprehenderit irure aute dolore ad cupidatat.\r\n", + "registered": "2016-09-21T05:36:01 -06:-30", + "latitude": 66.610572, + "longitude": 135.534487, + "tags": [ + "voluptate", + "ad", + "cupidatat", + "esse", + "nostrud", + "laborum", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Melva Raymond" + }, + { + "id": 1, + "name": "Simone Foley" + }, + { + "id": 2, + "name": "Hilary Buckley" + } + ], + "greeting": "Hello, Vargas Pruitt! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb7bffdac3fd83b2c", + "index": 66, + "guid": "e031020e-5768-4bb0-9a7e-4eca659eb8f3", + "isActive": true, + "balance": "$3,371.46", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Angelique Graham", + "gender": "female", + "company": "BIOLIVE", + "email": "angeliquegraham@biolive.com", + "phone": "+1 (885) 547-3531", + "address": "465 Kingston Avenue, Movico, Nevada, 5897", + "about": "Commodo sit commodo eu ex sunt ipsum ullamco veniam laborum dolor. Ad aute ut eiusmod nisi reprehenderit veniam do. Tempor irure magna sunt minim nostrud dolore anim ut ex anim. In duis cupidatat elit velit amet nostrud id. Esse nisi excepteur sunt officia do. Adipisicing ipsum duis id id velit magna fugiat.\r\n", + "registered": "2022-07-03T06:21:38 -06:-30", + "latitude": 85.445641, + "longitude": -122.527508, + "tags": [ + "nisi", + "ea", + "nostrud", + "esse", + "sit", + "eiusmod", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Linda Brady" + }, + { + "id": 1, + "name": "Holloway Robbins" + }, + { + "id": 2, + "name": "Hinton Mitchell" + } + ], + "greeting": "Hello, Angelique Graham! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bc6485a1008ddde5e", + "index": 67, + "guid": "545b712c-0952-4344-b05d-9e94f87e289e", + "isActive": true, + "balance": "$3,064.35", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Moss Harrison", + "gender": "male", + "company": "PEARLESEX", + "email": "mossharrison@pearlesex.com", + "phone": "+1 (964) 587-3901", + "address": "828 Lafayette Walk, Chautauqua, Delaware, 5386", + "about": "Aliqua est id ad sit esse aliquip dolor veniam ut commodo velit laborum aliquip. Tempor adipisicing id et ex reprehenderit Lorem exercitation deserunt nulla fugiat irure. Ipsum magna occaecat amet amet ea ea sit officia sunt mollit id fugiat fugiat enim. Consequat non duis deserunt ad sit. Reprehenderit eiusmod qui minim laboris cupidatat id proident laboris anim duis velit esse. Amet esse ullamco anim pariatur velit dolore nisi nostrud proident. Veniam consequat occaecat ad proident.\r\n", + "registered": "2018-09-05T10:09:14 -06:-30", + "latitude": 32.908686, + "longitude": 59.333663, + "tags": [ + "officia", + "non", + "occaecat", + "sit", + "aliquip", + "culpa", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Haley Delaney" + }, + { + "id": 1, + "name": "Fuentes Jacobs" + }, + { + "id": 2, + "name": "Bradshaw Douglas" + } + ], + "greeting": "Hello, Moss Harrison! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1106be51be4abc01", + "index": 68, + "guid": "4bfa9ec6-bed9-445c-8fa1-4067d502ef5c", + "isActive": true, + "balance": "$1,596.54", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "blue", + "name": "Bessie Howell", + "gender": "female", + "company": "NETAGY", + "email": "bessiehowell@netagy.com", + "phone": "+1 (873) 578-3217", + "address": "166 Evergreen Avenue, Independence, Federated States Of Micronesia, 7022", + "about": "Pariatur amet ipsum exercitation laboris voluptate sunt aliqua do officia commodo reprehenderit. In dolor reprehenderit est culpa cillum. In nulla qui cupidatat duis.\r\n", + "registered": "2015-11-14T01:16:49 -06:-30", + "latitude": -83.68502, + "longitude": 154.694831, + "tags": [ + "nisi", + "esse", + "in", + "ex", + "deserunt", + "nulla", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "James Hayes" + }, + { + "id": 1, + "name": "Abby Hogan" + }, + { + "id": 2, + "name": "Nunez Parrish" + } + ], + "greeting": "Hello, Bessie Howell! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b66e9717ee7db1fd7", + "index": 69, + "guid": "c85a9576-f28d-4c54-b0ea-daaebd3022e6", + "isActive": true, + "balance": "$3,879.16", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Patrica Park", + "gender": "female", + "company": "GEEKFARM", + "email": "patricapark@geekfarm.com", + "phone": "+1 (818) 454-3796", + "address": "820 Emerald Street, Vienna, Pennsylvania, 6610", + "about": "In in sint sit ut mollit non fugiat nisi minim. Magna duis nulla eu esse est adipisicing magna. Aliquip ipsum cupidatat cillum ex exercitation labore.\r\n", + "registered": "2020-07-05T02:04:55 -06:-30", + "latitude": -44.698147, + "longitude": -150.377689, + "tags": [ + "ullamco", + "Lorem", + "sunt", + "ipsum", + "id", + "eiusmod", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Townsend Griffith" + }, + { + "id": 1, + "name": "Reeves Williamson" + }, + { + "id": 2, + "name": "Church Frederick" + } + ], + "greeting": "Hello, Patrica Park! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b99a7a0cf7fd01a36", + "index": 70, + "guid": "3aa54350-b18c-4ef0-9d79-c197d5709170", + "isActive": true, + "balance": "$1,806.05", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Valarie Herman", + "gender": "female", + "company": "DARWINIUM", + "email": "valarieherman@darwinium.com", + "phone": "+1 (819) 456-3732", + "address": "555 Scott Avenue, Cetronia, Connecticut, 6539", + "about": "Cupidatat nulla consequat et incididunt. Et dolor laboris id aliquip qui ullamco et fugiat mollit. Eu eu non ipsum nisi non elit Lorem laborum esse commodo reprehenderit. Amet nisi dolore dolor aliqua aliqua anim cupidatat excepteur occaecat exercitation laborum id laboris. Consequat minim Lorem qui do reprehenderit aliquip deserunt fugiat ea qui irure velit id.\r\n", + "registered": "2017-10-21T03:32:27 -06:-30", + "latitude": -82.652206, + "longitude": -80.792422, + "tags": [ + "labore", + "dolor", + "id", + "incididunt", + "excepteur", + "pariatur", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Moreno Hickman" + }, + { + "id": 1, + "name": "Krista Hoover" + }, + { + "id": 2, + "name": "Lucinda Owen" + } + ], + "greeting": "Hello, Valarie Herman! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdd4b2e5b66d4a1f7", + "index": 71, + "guid": "acad3ea5-a534-4fe3-8e0d-3a966a1a6256", + "isActive": true, + "balance": "$1,964.05", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Walters Craft", + "gender": "male", + "company": "MELBACOR", + "email": "walterscraft@melbacor.com", + "phone": "+1 (991) 446-3101", + "address": "292 Wilson Street, Bynum, Louisiana, 1613", + "about": "Amet ullamco irure quis duis irure esse veniam incididunt eu officia culpa. Id occaecat deserunt labore mollit Lorem aliquip occaecat pariatur reprehenderit dolore minim. Nostrud incididunt pariatur consectetur adipisicing velit Lorem quis exercitation laboris ullamco enim enim dolore. Amet veniam qui enim proident ut excepteur duis elit tempor laboris ad. Commodo labore eiusmod culpa dolor ex velit officia laboris eu. Cillum reprehenderit excepteur commodo id eu nisi.\r\n", + "registered": "2018-07-07T09:27:26 -06:-30", + "latitude": -87.145278, + "longitude": -5.832754, + "tags": [ + "exercitation", + "officia", + "ullamco", + "consequat", + "deserunt", + "aute", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Helen Ortega" + }, + { + "id": 1, + "name": "Wells Chan" + }, + { + "id": 2, + "name": "Rochelle Bass" + } + ], + "greeting": "Hello, Walters Craft! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b2d58e7cf82ccb708", + "index": 72, + "guid": "73506eff-96b8-46ba-bb11-4e86607c6240", + "isActive": false, + "balance": "$3,774.91", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Mckay Skinner", + "gender": "male", + "company": "XERONK", + "email": "mckayskinner@xeronk.com", + "phone": "+1 (815) 479-2514", + "address": "972 Atlantic Avenue, Floris, Vermont, 7656", + "about": "Aliqua consectetur cupidatat incididunt culpa minim incididunt ad cillum eu aliqua minim. Eiusmod velit dolor eu anim aliquip reprehenderit. Commodo do id consectetur sint sint ad. Ex occaecat enim aliquip nulla quis. Irure ipsum mollit deserunt in aliqua occaecat laborum reprehenderit aute. Adipisicing dolore cillum pariatur laboris elit dolor quis ea. Esse consectetur culpa aliquip proident.\r\n", + "registered": "2021-06-25T06:56:48 -06:-30", + "latitude": -34.015489, + "longitude": -32.113854, + "tags": [ + "culpa", + "excepteur", + "aliqua", + "est", + "ex", + "eiusmod", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Small Knight" + }, + { + "id": 1, + "name": "Durham Daniels" + }, + { + "id": 2, + "name": "Daphne Johnston" + } + ], + "greeting": "Hello, Mckay Skinner! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1db44eda61967e54", + "index": 73, + "guid": "f11d6d81-cb9e-4cae-a8d4-d208aa6f5945", + "isActive": false, + "balance": "$2,088.36", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "blue", + "name": "Yvette Calderon", + "gender": "female", + "company": "SLAX", + "email": "yvettecalderon@slax.com", + "phone": "+1 (842) 452-3630", + "address": "443 Stratford Road, Steinhatchee, Iowa, 3210", + "about": "Ea proident ad cupidatat amet elit eiusmod nisi duis sunt nostrud non do. Et dolor occaecat voluptate enim deserunt Lorem mollit Lorem est occaecat amet officia et. Ut nisi cupidatat labore mollit consequat voluptate nulla pariatur in incididunt officia in. Sint qui nisi amet eiusmod ad ad pariatur pariatur ut. Deserunt nisi qui mollit irure commodo cillum duis do nulla consectetur cupidatat elit cupidatat aliquip. Commodo ullamco exercitation officia laboris.\r\n", + "registered": "2020-06-01T04:00:27 -06:-30", + "latitude": 25.360169, + "longitude": -24.374867, + "tags": [ + "minim", + "ad", + "irure", + "officia", + "elit", + "ex", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Paul Oneill" + }, + { + "id": 1, + "name": "Sears Moss" + }, + { + "id": 2, + "name": "Kristi Collier" + } + ], + "greeting": "Hello, Yvette Calderon! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b03d85028e09e53ea", + "index": 74, + "guid": "2a17b7da-cecd-41cb-b696-f127410fd249", + "isActive": true, + "balance": "$3,258.69", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Wilder Pugh", + "gender": "male", + "company": "ROOFORIA", + "email": "wilderpugh@rooforia.com", + "phone": "+1 (873) 540-2851", + "address": "519 Goodwin Place, Matheny, Virginia, 1825", + "about": "Voluptate excepteur esse Lorem adipisicing magna magna consectetur non reprehenderit exercitation. Veniam culpa excepteur excepteur fugiat aliquip Lorem est exercitation ad adipisicing pariatur et dolore commodo. Reprehenderit quis sit irure nisi exercitation voluptate enim adipisicing. Quis pariatur eu ex elit nisi sunt. Ipsum amet quis do labore sunt. Dolore commodo commodo voluptate ea commodo voluptate do voluptate voluptate eu eiusmod minim laborum. Non laboris incididunt tempor labore irure excepteur veniam sit anim laborum.\r\n", + "registered": "2018-08-09T04:26:22 -06:-30", + "latitude": 80.369731, + "longitude": 162.492365, + "tags": [ + "ea", + "enim", + "occaecat", + "magna", + "sunt", + "officia", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Kristin English" + }, + { + "id": 1, + "name": "Laverne Bernard" + }, + { + "id": 2, + "name": "Castaneda Harrell" + } + ], + "greeting": "Hello, Wilder Pugh! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5e66a5455327aca9", + "index": 75, + "guid": "56a980c4-07b9-46a8-85d8-b2e2175e7f08", + "isActive": true, + "balance": "$2,135.68", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Kristy Mckee", + "gender": "female", + "company": "KOZGENE", + "email": "kristymckee@kozgene.com", + "phone": "+1 (863) 438-3357", + "address": "135 Ross Street, Spokane, Maine, 9715", + "about": "Sunt exercitation nulla proident consectetur ut ullamco ex sunt commodo. Ullamco aliqua reprehenderit anim consequat nostrud ea laborum fugiat aute fugiat nisi nulla id commodo. Aliquip amet consectetur reprehenderit nisi quis fugiat amet veniam fugiat magna elit pariatur consequat. Ut cillum do occaecat tempor cupidatat in velit ex. Lorem culpa occaecat commodo deserunt officia aliquip ea laborum excepteur adipisicing in sunt. Pariatur incididunt veniam excepteur officia deserunt exercitation cupidatat cillum sit cupidatat nisi nulla exercitation esse.\r\n", + "registered": "2019-06-21T09:08:22 -06:-30", + "latitude": 21.236258, + "longitude": 143.539334, + "tags": [ + "amet", + "anim", + "fugiat", + "consectetur", + "sit", + "magna", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Hobbs Giles" + }, + { + "id": 1, + "name": "Cole Ford" + }, + { + "id": 2, + "name": "Cotton Prince" + } + ], + "greeting": "Hello, Kristy Mckee! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb4203c6db3601117", + "index": 76, + "guid": "f3685137-3f63-4fde-a389-8da9e372fd00", + "isActive": true, + "balance": "$2,747.45", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Donovan Harrington", + "gender": "male", + "company": "BALOOBA", + "email": "donovanharrington@balooba.com", + "phone": "+1 (924) 466-3082", + "address": "247 Hornell Loop, Grandview, Nebraska, 8176", + "about": "Eiusmod commodo eiusmod exercitation officia in nostrud aliqua aliqua. Est id aliqua amet deserunt ut incididunt et ad esse sunt et. Laborum veniam commodo amet cupidatat minim culpa eiusmod culpa aliqua occaecat excepteur sunt. Non non nulla quis Lorem ut sint in elit elit fugiat.\r\n", + "registered": "2021-06-22T02:30:05 -06:-30", + "latitude": -55.278471, + "longitude": -34.229513, + "tags": [ + "eiusmod", + "nulla", + "deserunt", + "esse", + "aliqua", + "sint", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Lloyd Gomez" + }, + { + "id": 1, + "name": "Hahn Key" + }, + { + "id": 2, + "name": "Hardin Crosby" + } + ], + "greeting": "Hello, Donovan Harrington! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b982197fe8ec62c26", + "index": 77, + "guid": "a72ebc08-5099-44f5-8db8-1eba8c389748", + "isActive": false, + "balance": "$3,063.72", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Genevieve Wilson", + "gender": "female", + "company": "OPTICOM", + "email": "genevievewilson@opticom.com", + "phone": "+1 (814) 586-3212", + "address": "633 Ditmars Street, Grayhawk, Mississippi, 6879", + "about": "Do deserunt nisi fugiat nisi velit incididunt eiusmod mollit do. Non pariatur in Lorem nulla sint occaecat tempor fugiat adipisicing nostrud. Dolor magna ut velit occaecat id aliquip nostrud cupidatat id adipisicing nisi. Nisi consequat cillum aute et mollit cupidatat nulla. Exercitation veniam dolore labore mollit ea.\r\n", + "registered": "2022-03-20T06:00:01 -06:-30", + "latitude": 57.975507, + "longitude": -79.051632, + "tags": [ + "aute", + "nostrud", + "quis", + "ullamco", + "cillum", + "aute", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Luann Jennings" + }, + { + "id": 1, + "name": "Sheree Marks" + }, + { + "id": 2, + "name": "Vickie Booker" + } + ], + "greeting": "Hello, Genevieve Wilson! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb674187ae1f0eec2", + "index": 78, + "guid": "d80c826b-cc8c-40fa-8725-5684784c991c", + "isActive": false, + "balance": "$2,765.52", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Pennington Wolfe", + "gender": "male", + "company": "ENDIPINE", + "email": "penningtonwolfe@endipine.com", + "phone": "+1 (988) 501-3882", + "address": "986 Townsend Street, Soudan, Indiana, 8656", + "about": "Culpa voluptate nisi officia excepteur. Fugiat officia sit ex et consectetur voluptate occaecat Lorem id non est pariatur quis. Ad incididunt exercitation ullamco ut. Laboris cupidatat proident aliquip officia exercitation amet consequat proident labore dolore nostrud aliqua.\r\n", + "registered": "2022-09-15T08:09:33 -06:-30", + "latitude": 85.451876, + "longitude": 115.690105, + "tags": [ + "dolor", + "tempor", + "proident", + "cupidatat", + "dolor", + "reprehenderit", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Maggie Cruz" + }, + { + "id": 1, + "name": "Cantrell Brock" + }, + { + "id": 2, + "name": "Nadine Maldonado" + } + ], + "greeting": "Hello, Pennington Wolfe! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b68659f6acc85b8d8", + "index": 79, + "guid": "b5e19798-9da1-4ee8-bb41-3b1561dee20b", + "isActive": false, + "balance": "$2,290.55", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Brittney Hall", + "gender": "female", + "company": "CYTREX", + "email": "brittneyhall@cytrex.com", + "phone": "+1 (921) 551-2209", + "address": "134 Lois Avenue, Duryea, Guam, 7141", + "about": "Exercitation commodo ex esse sunt culpa aliqua qui do occaecat commodo nostrud laborum. Occaecat ex dolore pariatur enim ullamco. Ex aute commodo ea eiusmod eiusmod id irure dolor sunt eiusmod velit nulla.\r\n", + "registered": "2014-05-03T02:35:04 -06:-30", + "latitude": -27.866824, + "longitude": 47.69654, + "tags": [ + "elit", + "excepteur", + "eiusmod", + "officia", + "sunt", + "ut", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Pittman Caldwell" + }, + { + "id": 1, + "name": "Meghan Graves" + }, + { + "id": 2, + "name": "Mcleod Bailey" + } + ], + "greeting": "Hello, Brittney Hall! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8a48c51b103f0d28", + "index": 80, + "guid": "479bef54-0b68-4139-a563-2b40f5914a7f", + "isActive": true, + "balance": "$1,627.83", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "blue", + "name": "Emilia Henry", + "gender": "female", + "company": "TEMORAK", + "email": "emiliahenry@temorak.com", + "phone": "+1 (938) 517-2822", + "address": "219 Harbor Court, Alamo, Kentucky, 1764", + "about": "Incididunt incididunt ex dolore aliqua sint voluptate id officia culpa deserunt Lorem consequat et. Duis sunt adipisicing aute proident officia non ut laborum laboris exercitation sint. Ex non ea laboris elit cillum excepteur amet labore excepteur labore in dolore id. Magna dolore dolor do dolor excepteur elit. Id adipisicing enim nisi cupidatat proident aliqua dolore eu exercitation. Excepteur mollit excepteur deserunt ex deserunt nostrud ad anim nisi laboris esse in tempor culpa. Eu ipsum amet adipisicing id ea et cupidatat quis amet labore culpa elit.\r\n", + "registered": "2016-08-03T08:48:10 -06:-30", + "latitude": -81.693306, + "longitude": 89.40721, + "tags": [ + "mollit", + "exercitation", + "consequat", + "reprehenderit", + "cillum", + "consectetur", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Cynthia Cross" + }, + { + "id": 1, + "name": "Janie Barber" + }, + { + "id": 2, + "name": "Esmeralda Cantrell" + } + ], + "greeting": "Hello, Emilia Henry! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8ccc7b8fdf91529d", + "index": 81, + "guid": "a08774d1-9cfd-46ea-91af-53ab3503ed8a", + "isActive": true, + "balance": "$2,165.61", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "green", + "name": "Yolanda Watts", + "gender": "female", + "company": "MYOPIUM", + "email": "yolandawatts@myopium.com", + "phone": "+1 (957) 583-3850", + "address": "253 Montgomery Place, Shasta, Puerto Rico, 8257", + "about": "Lorem eu dolor voluptate adipisicing consequat aute officia culpa labore aliquip aliquip do deserunt culpa. Culpa nisi ullamco qui irure ut sit reprehenderit eu anim labore est. Nostrud sint deserunt eu sit elit dolore esse dolore.\r\n", + "registered": "2021-12-20T02:15:24 -06:-30", + "latitude": -46.757823, + "longitude": 49.982148, + "tags": [ + "Lorem", + "tempor", + "excepteur", + "reprehenderit", + "dolore", + "sit", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Evangelina Adams" + }, + { + "id": 1, + "name": "Angelia Oneil" + }, + { + "id": 2, + "name": "Montoya Sweet" + } + ], + "greeting": "Hello, Yolanda Watts! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9e090496e2636c88", + "index": 82, + "guid": "2efaa222-b168-4aaa-aae2-1118d267ba3b", + "isActive": false, + "balance": "$1,220.00", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Stein Pittman", + "gender": "male", + "company": "RUBADUB", + "email": "steinpittman@rubadub.com", + "phone": "+1 (854) 568-2405", + "address": "578 Hoyt Street, Gordon, North Carolina, 6858", + "about": "Fugiat laborum consequat occaecat esse ad do deserunt esse. Ex proident aliquip nisi fugiat culpa incididunt. Id anim aliquip esse amet exercitation consectetur deserunt consequat. Officia labore ad ut labore magna et nisi proident non fugiat laborum proident cillum irure. Magna voluptate nisi magna sit. Reprehenderit elit aute ullamco irure ea aliquip. Eiusmod excepteur amet amet eu.\r\n", + "registered": "2017-03-06T04:41:57 -06:-30", + "latitude": 19.111825, + "longitude": 76.475806, + "tags": [ + "dolore", + "pariatur", + "ullamco", + "qui", + "dolor", + "id", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Stafford Noble" + }, + { + "id": 1, + "name": "Kelley Newton" + }, + { + "id": 2, + "name": "Mccormick Diaz" + } + ], + "greeting": "Hello, Stein Pittman! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b53cdb9e922d99694", + "index": 83, + "guid": "d40edfeb-fae0-4bb2-b939-2172d2913191", + "isActive": false, + "balance": "$3,870.09", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Alberta Hayden", + "gender": "female", + "company": "ZORROMOP", + "email": "albertahayden@zorromop.com", + "phone": "+1 (989) 470-3922", + "address": "776 Arlington Place, Verdi, Tennessee, 7608", + "about": "Cupidatat eu fugiat laborum ea veniam sint commodo aliquip ex sit ullamco ad. Sunt ea laboris non nulla ut culpa sunt. Sunt deserunt aute culpa aute voluptate fugiat magna reprehenderit id veniam labore magna amet. Cupidatat veniam magna sit Lorem commodo elit ad quis. Ea officia eiusmod aliqua tempor cillum amet tempor. Nulla voluptate laboris non do exercitation.\r\n", + "registered": "2019-12-05T07:48:37 -06:-30", + "latitude": -68.87937, + "longitude": -41.485886, + "tags": [ + "nostrud", + "officia", + "occaecat", + "ad", + "enim", + "amet", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Vaughn Alvarez" + }, + { + "id": 1, + "name": "Laurel Bonner" + }, + { + "id": 2, + "name": "Vazquez Faulkner" + } + ], + "greeting": "Hello, Alberta Hayden! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdd8caf3ad70edee4", + "index": 84, + "guid": "4a75a33b-aa4b-417a-8fa4-8e75a97cb6c9", + "isActive": true, + "balance": "$3,159.86", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Deloris Barton", + "gender": "female", + "company": "GALLAXIA", + "email": "delorisbarton@gallaxia.com", + "phone": "+1 (844) 502-2651", + "address": "107 Farragut Place, Boomer, Arkansas, 1885", + "about": "Culpa pariatur cillum amet fugiat reprehenderit aliquip sunt dolor do. Aliquip deserunt sit et eu ad ad non et incididunt aute Lorem fugiat adipisicing. Tempor deserunt cupidatat ad minim pariatur sit non.\r\n", + "registered": "2016-12-28T04:38:01 -06:-30", + "latitude": -26.843318, + "longitude": 99.597793, + "tags": [ + "amet", + "aliqua", + "irure", + "ipsum", + "est", + "commodo", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Jeannine Jackson" + }, + { + "id": 1, + "name": "Guerra Beck" + }, + { + "id": 2, + "name": "Marilyn Larson" + } + ], + "greeting": "Hello, Deloris Barton! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b62d159f710b4c0e3", + "index": 85, + "guid": "6e8fb3c4-ae04-4fa4-92e5-fa6d006e9d02", + "isActive": true, + "balance": "$2,363.44", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Hansen Puckett", + "gender": "male", + "company": "OULU", + "email": "hansenpuckett@oulu.com", + "phone": "+1 (891) 544-3549", + "address": "812 Moffat Street, Rossmore, Virgin Islands, 4364", + "about": "Proident eiusmod et eiusmod deserunt non reprehenderit sit ipsum id culpa id dolor in. Ipsum culpa duis sunt consectetur aliquip voluptate deserunt ex eiusmod pariatur. Duis cupidatat aliqua mollit ex do exercitation. Aliqua in do nulla ullamco pariatur excepteur dolor ut aute dolore.\r\n", + "registered": "2020-12-13T03:20:42 -06:-30", + "latitude": 34.068887, + "longitude": 48.028786, + "tags": [ + "dolor", + "nulla", + "labore", + "minim", + "ad", + "quis", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Sophie Sharpe" + }, + { + "id": 1, + "name": "Mara Cote" + }, + { + "id": 2, + "name": "Hodge Love" + } + ], + "greeting": "Hello, Hansen Puckett! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b4c8c674dd2582b54", + "index": 86, + "guid": "13101809-f8c0-4dd6-b338-7cd3ae6d5c1f", + "isActive": false, + "balance": "$1,153.25", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Marcella Dickerson", + "gender": "female", + "company": "EXIAND", + "email": "marcelladickerson@exiand.com", + "phone": "+1 (979) 465-3355", + "address": "345 Hart Street, Chemung, Oregon, 8340", + "about": "Pariatur velit sit enim ea consectetur ut qui aute occaecat dolore sunt. Anim non duis do in labore ex ullamco proident sint exercitation labore. Eiusmod eu Lorem et laborum eiusmod nostrud consequat ullamco sunt voluptate cillum. Anim quis excepteur nulla consectetur reprehenderit et. Id aliqua officia tempor dolor amet est ipsum cillum magna irure nulla eu cillum. Occaecat nisi non magna velit fugiat pariatur adipisicing eu et fugiat do amet.\r\n", + "registered": "2020-05-15T08:03:11 -06:-30", + "latitude": 85.891872, + "longitude": -163.51097, + "tags": [ + "exercitation", + "aute", + "veniam", + "officia", + "ut", + "enim", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Daugherty Fitzpatrick" + }, + { + "id": 1, + "name": "Gentry Carson" + }, + { + "id": 2, + "name": "Bowen Hewitt" + } + ], + "greeting": "Hello, Marcella Dickerson! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb5992a3bbb63dc74", + "index": 87, + "guid": "18e49198-8021-460f-a585-65cc6158cd7e", + "isActive": false, + "balance": "$2,312.75", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Mia Mcmahon", + "gender": "female", + "company": "LUNCHPOD", + "email": "miamcmahon@lunchpod.com", + "phone": "+1 (841) 551-3800", + "address": "799 Rochester Avenue, Emison, District Of Columbia, 4047", + "about": "Occaecat adipisicing ullamco amet Lorem id. Non id laboris eu proident consequat. Labore minim qui sit dolor. Ipsum irure consectetur ipsum aliquip occaecat irure sit deserunt laboris consectetur velit excepteur esse sint. Do nulla cillum consectetur est proident est nisi aliqua excepteur sunt. Sit tempor voluptate nisi cillum. Occaecat tempor nisi irure labore deserunt.\r\n", + "registered": "2019-04-27T06:22:48 -06:-30", + "latitude": 61.546343, + "longitude": 122.820222, + "tags": [ + "officia", + "commodo", + "nostrud", + "enim", + "exercitation", + "culpa", + "ullamco" + ], + "friends": [ + { + "id": 0, + "name": "Lowery Mueller" + }, + { + "id": 1, + "name": "Violet Solomon" + }, + { + "id": 2, + "name": "Villarreal Pollard" + } + ], + "greeting": "Hello, Mia Mcmahon! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b06bb6fd610424b7a", + "index": 88, + "guid": "21fc3c7d-d4c4-4e2a-8589-c5d1e1516aa3", + "isActive": true, + "balance": "$2,021.00", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Dejesus Morton", + "gender": "male", + "company": "QUILTIGEN", + "email": "dejesusmorton@quiltigen.com", + "phone": "+1 (829) 465-2063", + "address": "172 Degraw Street, Loretto, Florida, 2010", + "about": "Duis nisi culpa nulla ullamco sunt reprehenderit fugiat reprehenderit fugiat deserunt ea. Anim mollit velit reprehenderit laborum enim. Ut sint mollit magna laborum aute duis adipisicing aute excepteur magna elit duis veniam. Pariatur cupidatat et nostrud id veniam laborum. Magna ex ut velit est aliquip proident mollit aliquip magna irure sint occaecat cillum pariatur. Voluptate aliqua officia culpa adipisicing eiusmod consectetur mollit. Laboris deserunt in nulla irure pariatur cillum consectetur.\r\n", + "registered": "2020-05-01T01:25:55 -06:-30", + "latitude": -1.866305, + "longitude": -6.012451, + "tags": [ + "nostrud", + "aliquip", + "proident", + "velit", + "duis", + "aute", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Aimee Boyle" + }, + { + "id": 1, + "name": "Wooten Mccarty" + }, + { + "id": 2, + "name": "Hallie Briggs" + } + ], + "greeting": "Hello, Dejesus Morton! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bbcf421156a68e7e8", + "index": 89, + "guid": "bfc881c8-8048-4586-bdbe-c91c78b3c455", + "isActive": true, + "balance": "$1,302.04", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Lucile Schwartz", + "gender": "female", + "company": "DREAMIA", + "email": "lucileschwartz@dreamia.com", + "phone": "+1 (950) 534-2353", + "address": "878 Kaufman Place, Foscoe, Washington, 6215", + "about": "Quis labore eu dolor incididunt Lorem culpa anim sit cupidatat deserunt do consequat. Est proident esse labore consequat amet nostrud quis. Eu Lorem esse sunt dolor duis voluptate eu consectetur incididunt. Eu consectetur dolore duis aliquip incididunt aliquip velit fugiat ut aliquip enim veniam. Qui sit magna ad et incididunt sit cillum ipsum magna in tempor anim.\r\n", + "registered": "2022-09-01T07:19:29 -06:-30", + "latitude": -40.486237, + "longitude": -18.36649, + "tags": [ + "ex", + "amet", + "velit", + "enim", + "anim", + "eiusmod", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Odonnell Hatfield" + }, + { + "id": 1, + "name": "Gilda Terry" + }, + { + "id": 2, + "name": "Morris Cardenas" + } + ], + "greeting": "Hello, Lucile Schwartz! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8d98ef634436424c", + "index": 90, + "guid": "d9cb4ec5-07ba-4a6a-a159-85ab2ea477a5", + "isActive": true, + "balance": "$1,121.84", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Brooke Mcbride", + "gender": "female", + "company": "PREMIANT", + "email": "brookemcbride@premiant.com", + "phone": "+1 (994) 412-2826", + "address": "339 Eckford Street, Juarez, Montana, 5785", + "about": "Voluptate qui velit Lorem commodo veniam ex id nisi et occaecat nostrud cillum. Consequat proident ex eu dolor elit proident sint voluptate nostrud culpa qui incididunt consectetur ad. Magna consequat velit culpa minim adipisicing occaecat deserunt. Eu esse in minim officia.\r\n", + "registered": "2018-10-31T07:06:16 -06:-30", + "latitude": -68.444539, + "longitude": -161.153615, + "tags": [ + "commodo", + "esse", + "voluptate", + "adipisicing", + "proident", + "ipsum", + "laborum" + ], + "friends": [ + { + "id": 0, + "name": "Vonda Banks" + }, + { + "id": 1, + "name": "Sykes Donaldson" + }, + { + "id": 2, + "name": "Candice Juarez" + } + ], + "greeting": "Hello, Brooke Mcbride! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b6e5ac0b3547b717e", + "index": 91, + "guid": "a8e8839e-355e-4427-8011-2c635f55a117", + "isActive": false, + "balance": "$3,312.81", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Fannie Myers", + "gender": "female", + "company": "PODUNK", + "email": "fanniemyers@podunk.com", + "phone": "+1 (886) 410-3487", + "address": "808 Clinton Avenue, Venice, Hawaii, 4168", + "about": "Labore labore nisi labore minim sit culpa sit ad duis aliquip est elit. Ut dolor id non anim aliqua velit cupidatat est consequat. Excepteur ad laborum enim laboris. Culpa exercitation quis nisi ipsum ad esse exercitation incididunt est ex ipsum. Do ea elit exercitation ea ad aliquip. Ea esse exercitation laborum anim deserunt excepteur reprehenderit in ad nulla excepteur exercitation. Consequat aliqua id quis aliqua velit velit et.\r\n", + "registered": "2021-06-14T10:49:01 -06:-30", + "latitude": -19.702803, + "longitude": 53.757481, + "tags": [ + "ea", + "id", + "consequat", + "sit", + "officia", + "sint", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Sofia Schneider" + }, + { + "id": 1, + "name": "Ruthie Hampton" + }, + { + "id": 2, + "name": "Kimberly Mccullough" + } + ], + "greeting": "Hello, Fannie Myers! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba55fa338b2cdc05b", + "index": 92, + "guid": "e91a7cd7-84f6-4d38-9ca5-b59696152c07", + "isActive": false, + "balance": "$1,271.79", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Addie Roach", + "gender": "female", + "company": "OVIUM", + "email": "addieroach@ovium.com", + "phone": "+1 (851) 504-2518", + "address": "282 Clifford Place, Coalmont, Michigan, 6442", + "about": "Sunt laborum ad anim tempor occaecat incididunt pariatur ad exercitation est enim do incididunt. Fugiat reprehenderit labore tempor reprehenderit Lorem quis eu ut ad est sit nulla aute labore. Lorem enim magna minim voluptate adipisicing deserunt Lorem voluptate dolore voluptate fugiat.\r\n", + "registered": "2021-05-29T10:30:35 -06:-30", + "latitude": 73.247658, + "longitude": -17.246293, + "tags": [ + "adipisicing", + "et", + "dolore", + "nisi", + "aliqua", + "duis", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Nelson Dotson" + }, + { + "id": 1, + "name": "Noreen Evans" + }, + { + "id": 2, + "name": "Campos Mcfarland" + } + ], + "greeting": "Hello, Addie Roach! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b83347be051429d83", + "index": 93, + "guid": "376fde7f-fe99-4fb5-a28f-3424385c78de", + "isActive": false, + "balance": "$1,845.63", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Castro Pope", + "gender": "male", + "company": "GLUKGLUK", + "email": "castropope@glukgluk.com", + "phone": "+1 (920) 504-2165", + "address": "253 Doone Court, Abrams, Maryland, 2313", + "about": "In anim aliquip laboris sint. Nisi id laborum consectetur nostrud velit dolore id aliquip sit. Anim sit deserunt ea eiusmod ad pariatur in magna veniam cupidatat occaecat.\r\n", + "registered": "2014-07-01T12:13:31 -06:-30", + "latitude": -64.29148, + "longitude": 2.44483, + "tags": [ + "laborum", + "tempor", + "sunt", + "magna", + "consequat", + "commodo", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Poole Lancaster" + }, + { + "id": 1, + "name": "Jeannette Chambers" + }, + { + "id": 2, + "name": "Calderon Maxwell" + } + ], + "greeting": "Hello, Castro Pope! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8a80e132dbba6485", + "index": 94, + "guid": "470a66f8-72a7-462d-b548-84a3fb530d5b", + "isActive": true, + "balance": "$1,384.25", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "brown", + "name": "Amparo Donovan", + "gender": "female", + "company": "ZENTRY", + "email": "amparodonovan@zentry.com", + "phone": "+1 (983) 422-3583", + "address": "392 Sutter Avenue, Tibbie, American Samoa, 3098", + "about": "Est enim dolore irure ea laborum aliqua aute veniam officia est nulla quis anim proident. Sit pariatur cupidatat Lorem in culpa aliquip ipsum. Lorem ex aliqua culpa elit est occaecat occaecat tempor. Tempor esse eu nisi ipsum id officia nostrud elit enim nisi cupidatat proident. Consectetur veniam anim ipsum do. Veniam cupidatat elit ut cillum ea dolore dolore excepteur id dolor excepteur sint. Aliqua aute consectetur amet ullamco exercitation ea proident Lorem non excepteur ullamco.\r\n", + "registered": "2022-09-25T03:27:32 -06:-30", + "latitude": -26.061754, + "longitude": -143.248213, + "tags": [ + "est", + "reprehenderit", + "laborum", + "et", + "commodo", + "amet", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Beverley Morrison" + }, + { + "id": 1, + "name": "Audrey Jacobson" + }, + { + "id": 2, + "name": "Whitney Hunt" + } + ], + "greeting": "Hello, Amparo Donovan! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b7342b2f1463b3810", + "index": 95, + "guid": "e78e88e1-8ee4-42cf-94f2-d0e4e1f08f8c", + "isActive": false, + "balance": "$3,812.82", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "brown", + "name": "Gertrude Peters", + "gender": "female", + "company": "DIGIFAD", + "email": "gertrudepeters@digifad.com", + "phone": "+1 (976) 503-2146", + "address": "271 Hazel Court, Hegins, Illinois, 852", + "about": "Elit ut enim incididunt aute quis incididunt nisi consequat mollit exercitation sunt. Fugiat deserunt proident veniam qui sint consequat enim anim. Lorem dolore non excepteur aliqua ullamco aliqua sit. Cupidatat nostrud eiusmod incididunt reprehenderit ex laborum irure eu esse. Ad eiusmod elit cupidatat pariatur id non magna consequat id enim adipisicing anim consectetur.\r\n", + "registered": "2015-04-29T01:51:44 -06:-30", + "latitude": -33.908009, + "longitude": 51.773277, + "tags": [ + "duis", + "deserunt", + "cillum", + "eiusmod", + "nisi", + "fugiat", + "consectetur" + ], + "friends": [ + { + "id": 0, + "name": "Lawrence Dickson" + }, + { + "id": 1, + "name": "Lucy Hays" + }, + { + "id": 2, + "name": "Lenora Maynard" + } + ], + "greeting": "Hello, Gertrude Peters! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b11cec371911c5a9d", + "index": 96, + "guid": "fc40ea71-50da-4b02-b57c-a3d6d5268b26", + "isActive": false, + "balance": "$2,836.71", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Leonard Shields", + "gender": "male", + "company": "PLASTO", + "email": "leonardshields@plasto.com", + "phone": "+1 (974) 509-2976", + "address": "864 Banker Street, Snyderville, Missouri, 1676", + "about": "Elit veniam aliquip eiusmod incididunt incididunt occaecat qui laborum commodo aute. Consequat duis exercitation labore ad ex et qui. Eu fugiat labore et esse dolore. Occaecat anim officia elit excepteur sit culpa culpa est amet ut consectetur. Id ut eiusmod exercitation ut esse ea. Eiusmod sit duis incididunt consectetur aliquip occaecat officia laborum laborum irure irure aute et.\r\n", + "registered": "2020-06-06T02:46:21 -06:-30", + "latitude": -38.625987, + "longitude": -104.4442, + "tags": [ + "cupidatat", + "officia", + "in", + "id", + "labore", + "officia", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Juliette Lloyd" + }, + { + "id": 1, + "name": "Lorena Wallace" + }, + { + "id": 2, + "name": "Kelley Ruiz" + } + ], + "greeting": "Hello, Leonard Shields! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3d23de442e91beb1", + "index": 97, + "guid": "bf3e7ece-ec52-46b1-900f-0afccd39c856", + "isActive": true, + "balance": "$1,269.15", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Ginger Knox", + "gender": "female", + "company": "AUTOGRATE", + "email": "gingerknox@autograte.com", + "phone": "+1 (974) 450-2286", + "address": "523 Mill Street, Cochranville, Idaho, 884", + "about": "Est exercitation nulla magna dolor sint in ipsum esse ut sunt. Proident occaecat commodo amet laborum irure anim et. Nisi minim elit duis quis Lorem proident elit sint officia cupidatat anim laboris. Eu adipisicing dolor veniam eu deserunt tempor laborum commodo minim non qui elit.\r\n", + "registered": "2015-07-11T06:09:47 -06:-30", + "latitude": 11.722925, + "longitude": 149.394894, + "tags": [ + "sint", + "duis", + "excepteur", + "consequat", + "elit", + "non", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Nona Gibbs" + }, + { + "id": 1, + "name": "Harding Brennan" + }, + { + "id": 2, + "name": "Maryann Davis" + } + ], + "greeting": "Hello, Ginger Knox! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b2879aa462a70d9cc", + "index": 98, + "guid": "7c6b111d-2d8a-45cc-b327-a1b59899a405", + "isActive": false, + "balance": "$2,484.92", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Marion Gould", + "gender": "female", + "company": "ZANITY", + "email": "mariongould@zanity.com", + "phone": "+1 (845) 475-2598", + "address": "984 Lawn Court, Dexter, South Carolina, 7034", + "about": "Aute consectetur et irure eu in et Lorem pariatur sunt qui dolore est. Et excepteur dolore incididunt duis est quis ipsum veniam velit id tempor aliqua. Aute excepteur aute nostrud id. Culpa enim voluptate velit qui magna nulla. Proident commodo laboris tempor nulla. Proident ea sunt aute id laboris sint.\r\n", + "registered": "2018-01-01T11:46:38 -06:-30", + "latitude": -37.708708, + "longitude": 166.275235, + "tags": [ + "dolor", + "aliquip", + "esse", + "ipsum", + "aliqua", + "nostrud", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Cameron Nunez" + }, + { + "id": 1, + "name": "Debora Becker" + }, + { + "id": 2, + "name": "Delgado Solis" + } + ], + "greeting": "Hello, Marion Gould! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b465026fb11926fff", + "index": 99, + "guid": "213d5df7-e89f-4198-9669-81acb36067fe", + "isActive": true, + "balance": "$3,074.13", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "brown", + "name": "Morse Marshall", + "gender": "male", + "company": "QUAILCOM", + "email": "morsemarshall@quailcom.com", + "phone": "+1 (899) 459-2496", + "address": "324 Nevins Street, Conestoga, Colorado, 1410", + "about": "Aliquip commodo voluptate dolor laborum pariatur in aliquip deserunt aliquip nisi Lorem in. Reprehenderit aliqua culpa laborum aliquip nostrud laboris voluptate sunt duis proident duis. Cupidatat nostrud ea nulla in eu officia et non enim magna est amet.\r\n", + "registered": "2014-12-09T02:25:56 -06:-30", + "latitude": -86.369577, + "longitude": -86.6504, + "tags": [ + "ex", + "qui", + "velit", + "sit", + "anim", + "ullamco", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Valerie Horton" + }, + { + "id": 1, + "name": "Suzette Estrada" + }, + { + "id": 2, + "name": "Della Morgan" + } + ], + "greeting": "Hello, Morse Marshall! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4baed8fd7e0b9ce190", + "index": 100, + "guid": "a8929e06-cd9f-4e24-96f5-b568b79d7839", + "isActive": true, + "balance": "$1,041.82", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "Cooley Ballard", + "gender": "male", + "company": "IMMUNICS", + "email": "cooleyballard@immunics.com", + "phone": "+1 (982) 478-2990", + "address": "371 Cumberland Street, Hoagland, New Hampshire, 1088", + "about": "Aliquip excepteur ea ea incididunt elit sunt nulla ea nisi adipisicing. Eiusmod consequat Lorem cupidatat ad voluptate exercitation incididunt velit. Ipsum nisi enim sunt voluptate esse nisi adipisicing pariatur ut. Eiusmod enim adipisicing dolore mollit dolore elit.\r\n", + "registered": "2019-06-04T04:33:32 -06:-30", + "latitude": 76.177787, + "longitude": -88.448689, + "tags": [ + "ex", + "non", + "magna", + "enim", + "esse", + "exercitation", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Muriel Bond" + }, + { + "id": 1, + "name": "Mckee Clayton" + }, + { + "id": 2, + "name": "Josefa Rhodes" + } + ], + "greeting": "Hello, Cooley Ballard! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7d66bf08b2e65f21", + "index": 101, + "guid": "88de169f-3b70-4881-bf72-35d7071aa0ba", + "isActive": false, + "balance": "$2,874.13", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "brown", + "name": "Pace Mcgee", + "gender": "male", + "company": "ZENTURY", + "email": "pacemcgee@zentury.com", + "phone": "+1 (924) 476-2006", + "address": "954 Tampa Court, Ypsilanti, Minnesota, 948", + "about": "Minim velit exercitation consequat amet. Est ut aute irure culpa. Amet incididunt do eiusmod irure anim sunt. Dolor eu exercitation irure veniam deserunt exercitation. Duis aliqua aute laborum nostrud qui labore adipisicing cupidatat magna laboris anim anim occaecat. In veniam aliquip elit ad mollit elit sunt esse anim commodo.\r\n", + "registered": "2015-10-21T07:48:45 -06:-30", + "latitude": 2.887828, + "longitude": -68.730427, + "tags": [ + "veniam", + "officia", + "minim", + "mollit", + "mollit", + "nulla", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Marian Jenkins" + }, + { + "id": 1, + "name": "Joanna Perkins" + }, + { + "id": 2, + "name": "Hopper Bullock" + } + ], + "greeting": "Hello, Pace Mcgee! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b1d1592b99a7adcf7", + "index": 102, + "guid": "49c0caf8-802b-4a10-95b3-ed0830bd068b", + "isActive": true, + "balance": "$2,422.62", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Juliet Hunter", + "gender": "female", + "company": "PLAYCE", + "email": "juliethunter@playce.com", + "phone": "+1 (976) 550-3705", + "address": "543 Louise Terrace, Vivian, Utah, 3139", + "about": "Velit officia ullamco esse est proident aute sit exercitation consectetur veniam proident. Labore nisi consequat ipsum nostrud minim. Ut veniam Lorem fugiat aliqua quis exercitation consectetur ipsum magna velit duis. Anim velit tempor quis fugiat non ut cillum in.\r\n", + "registered": "2016-02-19T05:37:39 -06:-30", + "latitude": -48.261985, + "longitude": 146.530749, + "tags": [ + "consectetur", + "labore", + "reprehenderit", + "id", + "aute", + "reprehenderit", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Weeks Parker" + }, + { + "id": 1, + "name": "Skinner Moses" + }, + { + "id": 2, + "name": "Ashley Kramer" + } + ], + "greeting": "Hello, Juliet Hunter! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b80c3d851fe1bbc74", + "index": 103, + "guid": "e115b4ad-70d7-430a-a122-80e4fdfaaabf", + "isActive": false, + "balance": "$2,406.33", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "Rena Orr", + "gender": "female", + "company": "ZAPHIRE", + "email": "renaorr@zaphire.com", + "phone": "+1 (800) 408-3844", + "address": "767 Fillmore Place, Glidden, South Dakota, 9129", + "about": "Id duis qui proident sint dolor consequat incididunt aute ipsum do incididunt nostrud. Reprehenderit cillum quis nostrud proident. Nulla consequat elit culpa duis ullamco cillum sint ullamco ut fugiat incididunt sunt. Ullamco elit velit aliquip officia enim ad ut minim aliqua minim aute ut id pariatur.\r\n", + "registered": "2020-08-20T08:09:03 -06:-30", + "latitude": 29.45732, + "longitude": -135.874081, + "tags": [ + "ut", + "magna", + "fugiat", + "cillum", + "pariatur", + "minim", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Burks Bolton" + }, + { + "id": 1, + "name": "Carol Barry" + }, + { + "id": 2, + "name": "Sloan Jensen" + } + ], + "greeting": "Hello, Rena Orr! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b72fcabeaa744aea3", + "index": 104, + "guid": "3c2e6347-5ade-406d-a2ae-59498f74decc", + "isActive": true, + "balance": "$1,124.73", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Leona Hobbs", + "gender": "female", + "company": "CENTREGY", + "email": "leonahobbs@centregy.com", + "phone": "+1 (860) 469-2600", + "address": "595 Granite Street, Herlong, Arizona, 2980", + "about": "Ipsum sit cillum occaecat eu. Sit deserunt reprehenderit aute duis ut. Id sint exercitation sunt nisi dolore consequat reprehenderit culpa cupidatat occaecat. Nisi laboris proident veniam non irure qui tempor elit. Quis est occaecat consectetur culpa eu duis quis reprehenderit sint cupidatat. Officia Lorem do consequat sunt irure cillum et velit excepteur ut Lorem et amet officia.\r\n", + "registered": "2016-08-01T04:10:41 -06:-30", + "latitude": 35.971046, + "longitude": -121.161055, + "tags": [ + "et", + "do", + "dolore", + "occaecat", + "do", + "esse", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Bullock Lang" + }, + { + "id": 1, + "name": "Lydia Vargas" + }, + { + "id": 2, + "name": "Carlson Rosario" + } + ], + "greeting": "Hello, Leona Hobbs! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b878d2e1b52c3a44c", + "index": 105, + "guid": "9f7a6a5d-cae6-4743-a9f6-3dcbb13b34c9", + "isActive": true, + "balance": "$1,632.59", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Mcfadden Miller", + "gender": "male", + "company": "MAGNINA", + "email": "mcfaddenmiller@magnina.com", + "phone": "+1 (945) 409-2386", + "address": "270 Catherine Street, Sutton, Marshall Islands, 9111", + "about": "Cillum ad sint fugiat quis aliqua. Qui tempor anim ipsum ipsum sint do labore ad elit in. Nostrud cupidatat do id ipsum tempor id incididunt veniam laborum duis ad incididunt cupidatat adipisicing. Duis quis incididunt aliqua irure consequat reprehenderit et qui ad commodo. Sit nostrud quis laborum id. Pariatur velit nulla sint nostrud tempor qui dolore ipsum deserunt sint nulla non officia laborum.\r\n", + "registered": "2016-09-18T10:53:49 -06:-30", + "latitude": 0.17802, + "longitude": -96.061752, + "tags": [ + "aliquip", + "sit", + "quis", + "enim", + "non", + "ex", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Matthews Dodson" + }, + { + "id": 1, + "name": "Cook Nelson" + }, + { + "id": 2, + "name": "Alma Deleon" + } + ], + "greeting": "Hello, Mcfadden Miller! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3487591ebe3d42dd", + "index": 106, + "guid": "dfdd6d50-c250-46bd-bbab-939a9b141de2", + "isActive": false, + "balance": "$3,231.91", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Bridgette Hebert", + "gender": "female", + "company": "QUILCH", + "email": "bridgettehebert@quilch.com", + "phone": "+1 (989) 518-3583", + "address": "367 Williams Court, Ballico, Ohio, 5609", + "about": "In ut est amet ullamco deserunt. Laboris mollit incididunt consequat qui et quis cillum proident ullamco do sint sunt ut minim. Aute nisi consectetur duis officia ea ea. Eiusmod ad aliquip cupidatat aliqua irure elit aliqua irure sunt consequat cupidatat tempor. Commodo cillum excepteur et eiusmod occaecat excepteur magna irure deserunt sit voluptate elit ex ullamco.\r\n", + "registered": "2022-03-01T04:07:09 -06:-30", + "latitude": -21.548516, + "longitude": 168.416568, + "tags": [ + "pariatur", + "deserunt", + "fugiat", + "duis", + "esse", + "velit", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Rowena Talley" + }, + { + "id": 1, + "name": "Savage Sims" + }, + { + "id": 2, + "name": "Glenda Holden" + } + ], + "greeting": "Hello, Bridgette Hebert! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb0d2824a27dc8b6b", + "index": 107, + "guid": "7ec7adc4-106e-4ab7-9b29-5e7ca63809f2", + "isActive": false, + "balance": "$2,479.53", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Greene Bell", + "gender": "male", + "company": "ZANYMAX", + "email": "greenebell@zanymax.com", + "phone": "+1 (966) 544-3636", + "address": "226 Elm Place, Canterwood, Alabama, 7152", + "about": "Proident aliquip aliqua eiusmod aute ex elit anim ullamco consequat labore. Ex incididunt eu qui sunt sit. Ea est laboris voluptate do. Tempor ex nulla ullamco culpa incididunt occaecat elit. Fugiat adipisicing occaecat tempor mollit incididunt. Excepteur exercitation amet do velit elit irure commodo veniam proident id Lorem consectetur labore laboris. Id ad tempor adipisicing exercitation occaecat labore aliqua sunt tempor.\r\n", + "registered": "2021-12-13T08:59:49 -06:-30", + "latitude": 11.440815, + "longitude": -135.000327, + "tags": [ + "dolore", + "dolore", + "commodo", + "excepteur", + "proident", + "quis", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Reilly Bates" + }, + { + "id": 1, + "name": "Michael Lindsey" + }, + { + "id": 2, + "name": "Jacobson Odonnell" + } + ], + "greeting": "Hello, Greene Bell! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b532a007ec4b62241", + "index": 108, + "guid": "e99895af-6375-4fd7-8ead-815e736f3333", + "isActive": true, + "balance": "$2,485.01", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Miller Ramsey", + "gender": "male", + "company": "XOGGLE", + "email": "millerramsey@xoggle.com", + "phone": "+1 (934) 509-2978", + "address": "849 Karweg Place, Cobbtown, Georgia, 4831", + "about": "Eu anim non ullamco sunt ex. Deserunt qui id veniam velit enim irure adipisicing eu exercitation anim velit sit quis. Cupidatat laboris sit dolore aliquip. Ex cillum nulla sint quis ipsum dolore officia.\r\n", + "registered": "2018-09-02T10:07:39 -06:-30", + "latitude": -46.108109, + "longitude": -142.487627, + "tags": [ + "consequat", + "culpa", + "magna", + "sit", + "culpa", + "aliquip", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Carolina Sawyer" + }, + { + "id": 1, + "name": "Odom Mcconnell" + }, + { + "id": 2, + "name": "Flora Foster" + } + ], + "greeting": "Hello, Miller Ramsey! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bb037a9e4086cb58d", + "index": 109, + "guid": "ca65ca8d-686f-438d-8f48-d33bec84ae65", + "isActive": false, + "balance": "$3,804.94", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Anita Gordon", + "gender": "female", + "company": "NIPAZ", + "email": "anitagordon@nipaz.com", + "phone": "+1 (918) 403-3417", + "address": "713 Strauss Street, Herbster, California, 8817", + "about": "Proident laborum nulla tempor voluptate tempor magna qui. Ea est irure ut quis quis incididunt proident id occaecat deserunt excepteur magna Lorem. Anim culpa ullamco velit quis reprehenderit minim ipsum consectetur in.\r\n", + "registered": "2018-11-08T01:53:36 -06:-30", + "latitude": -38.278615, + "longitude": -20.360211, + "tags": [ + "velit", + "eiusmod", + "ea", + "velit", + "commodo", + "adipisicing", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "Hillary Martinez" + }, + { + "id": 1, + "name": "Patricia Horne" + }, + { + "id": 2, + "name": "Craft Baldwin" + } + ], + "greeting": "Hello, Anita Gordon! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bdc8b78ed61d58c5c", + "index": 110, + "guid": "cd26393e-dd73-4991-92e0-71307758db10", + "isActive": true, + "balance": "$2,990.31", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Peck Peterson", + "gender": "male", + "company": "ZYTREK", + "email": "peckpeterson@zytrek.com", + "phone": "+1 (928) 502-3452", + "address": "296 Hewes Street, Madrid, Northern Mariana Islands, 5030", + "about": "Do veniam aliqua proident cillum velit sit sit adipisicing est aute occaecat. Commodo est reprehenderit non amet cillum ullamco. Id aliquip irure reprehenderit duis labore duis reprehenderit minim mollit. Velit quis sit reprehenderit tempor irure qui in dolore amet non fugiat sunt anim aliquip. Tempor ut sunt laborum irure cillum nostrud consequat incididunt. Quis occaecat labore fugiat magna eiusmod et magna elit officia consectetur sint ex culpa laboris.\r\n", + "registered": "2018-02-11T12:56:29 -06:-30", + "latitude": 18.267441, + "longitude": -162.930083, + "tags": [ + "ex", + "mollit", + "elit", + "proident", + "eu", + "pariatur", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Karen Payne" + }, + { + "id": 1, + "name": "Cobb Powell" + }, + { + "id": 2, + "name": "Acevedo Mckenzie" + } + ], + "greeting": "Hello, Peck Peterson! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4baf51388bd2310920", + "index": 111, + "guid": "bc93a132-52c0-4b07-9f1c-b0702a10b0c6", + "isActive": true, + "balance": "$1,269.40", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "Farley Buckner", + "gender": "male", + "company": "LUMBREX", + "email": "farleybuckner@lumbrex.com", + "phone": "+1 (886) 543-3800", + "address": "355 Seabring Street, Noxen, Kansas, 5348", + "about": "Est deserunt consequat nisi laborum. Velit incididunt deserunt consequat velit nostrud. Aliquip ullamco mollit culpa et ex qui labore do ut ex nulla culpa elit. Incididunt ut ipsum occaecat eu culpa ut fugiat. Reprehenderit incididunt tempor labore velit tempor ipsum. Voluptate eiusmod quis consequat sunt amet. Deserunt Lorem incididunt Lorem reprehenderit ex et eu.\r\n", + "registered": "2015-06-02T02:23:03 -06:-30", + "latitude": 87.309868, + "longitude": -78.163966, + "tags": [ + "nisi", + "est", + "aute", + "non", + "nostrud", + "sunt", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Glover Mosley" + }, + { + "id": 1, + "name": "Janet Hood" + }, + { + "id": 2, + "name": "Mcdowell Hahn" + } + ], + "greeting": "Hello, Farley Buckner! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b93831c94910f5a63", + "index": 112, + "guid": "18185465-ec18-42c8-9701-45e4f41abf23", + "isActive": false, + "balance": "$2,873.77", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "blue", + "name": "Katrina Rocha", + "gender": "female", + "company": "NIMON", + "email": "katrinarocha@nimon.com", + "phone": "+1 (877) 440-3592", + "address": "425 Hendrickson Street, Berwind, North Dakota, 4583", + "about": "Cupidatat nisi magna sunt fugiat enim ad voluptate. Proident fugiat dolore cillum occaecat occaecat aliqua consequat amet anim eiusmod ullamco reprehenderit cillum. Consectetur aliqua minim nisi Lorem ad laborum irure aute. Exercitation excepteur irure sint elit ea. Cupidatat non aute culpa nisi pariatur incididunt sit pariatur eiusmod quis voluptate incididunt. Dolor non veniam laboris sunt.\r\n", + "registered": "2014-06-06T11:14:35 -06:-30", + "latitude": 72.868432, + "longitude": 51.668071, + "tags": [ + "do", + "duis", + "aute", + "cupidatat", + "duis", + "irure", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Tyson Rodriguez" + }, + { + "id": 1, + "name": "Forbes Day" + }, + { + "id": 2, + "name": "Clemons Randolph" + } + ], + "greeting": "Hello, Katrina Rocha! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b47a68c2f903b2a33", + "index": 113, + "guid": "5cf53bbc-ea43-4349-96db-9d019b15efd6", + "isActive": false, + "balance": "$3,308.30", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Thompson Haynes", + "gender": "male", + "company": "PROTODYNE", + "email": "thompsonhaynes@protodyne.com", + "phone": "+1 (875) 508-2612", + "address": "550 Stockton Street, Enetai, New York, 6219", + "about": "Adipisicing ullamco exercitation duis nostrud mollit quis commodo sit. Nisi non deserunt cupidatat officia dolor. Amet culpa elit voluptate voluptate nisi elit. Reprehenderit nisi culpa veniam velit est consectetur. Commodo reprehenderit in aute esse laborum adipisicing aliqua elit id. Dolor nisi est et officia est. Elit dolor voluptate sunt dolor dolore veniam amet sunt est.\r\n", + "registered": "2015-05-21T10:11:30 -06:-30", + "latitude": 49.922641, + "longitude": 133.358582, + "tags": [ + "Lorem", + "officia", + "labore", + "velit", + "dolore", + "qui", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Roxie Lynn" + }, + { + "id": 1, + "name": "Turner Kent" + }, + { + "id": 2, + "name": "Gwendolyn May" + } + ], + "greeting": "Hello, Thompson Haynes! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bfb0b31478318ecc0", + "index": 114, + "guid": "e47f898a-aa3a-4c3e-adb1-dcd498e40dc6", + "isActive": false, + "balance": "$3,660.92", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Connie Reeves", + "gender": "female", + "company": "PHUEL", + "email": "conniereeves@phuel.com", + "phone": "+1 (930) 580-3480", + "address": "386 Ainslie Street, Alderpoint, New Jersey, 451", + "about": "Excepteur ea ea voluptate adipisicing magna qui id pariatur culpa anim officia nulla irure esse. Enim ea consectetur tempor mollit. Do dolor est ipsum quis eu veniam. Commodo exercitation do culpa ipsum laborum exercitation. Eu labore minim anim anim voluptate culpa. Sint mollit fugiat dolore irure nulla incididunt nulla officia occaecat exercitation ea.\r\n", + "registered": "2021-05-14T10:15:09 -06:-30", + "latitude": -35.830348, + "longitude": 98.936149, + "tags": [ + "ipsum", + "non", + "incididunt", + "labore", + "non", + "aliqua", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Lucas Alford" + }, + { + "id": 1, + "name": "Lora Mcdowell" + }, + { + "id": 2, + "name": "Magdalena Bean" + } + ], + "greeting": "Hello, Connie Reeves! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b2127e413ab2260bc", + "index": 115, + "guid": "2365e30a-2d1f-4025-bb37-f9c70ea25724", + "isActive": true, + "balance": "$3,751.15", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Powers Barnett", + "gender": "male", + "company": "HINWAY", + "email": "powersbarnett@hinway.com", + "phone": "+1 (963) 436-3129", + "address": "285 Trucklemans Lane, Winfred, Texas, 8888", + "about": "Exercitation non nulla sit excepteur reprehenderit sint officia et aute sint Lorem fugiat dolore incididunt. Non consequat consequat adipisicing Lorem eu excepteur quis officia dolor. Pariatur eiusmod velit aute do consectetur ullamco laboris mollit do. Deserunt ad ullamco reprehenderit laborum commodo eu aliquip. Ut et dolore culpa aliqua irure do est Lorem cupidatat anim mollit aliquip enim adipisicing. Laborum enim ullamco consequat nisi. Elit nisi officia Lorem sunt commodo aute.\r\n", + "registered": "2015-05-29T09:00:06 -06:-30", + "latitude": 72.437836, + "longitude": 91.281841, + "tags": [ + "duis", + "sit", + "exercitation", + "excepteur", + "in", + "sit", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Weiss Elliott" + }, + { + "id": 1, + "name": "Megan Sampson" + }, + { + "id": 2, + "name": "Allie Duffy" + } + ], + "greeting": "Hello, Powers Barnett! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b7003b79967a2b53f", + "index": 116, + "guid": "ef7d511e-ca26-4009-9c20-2f38a1255adf", + "isActive": true, + "balance": "$3,082.97", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Melissa Guy", + "gender": "female", + "company": "ZOLAREX", + "email": "melissaguy@zolarex.com", + "phone": "+1 (851) 460-2503", + "address": "432 McClancy Place, Ada, Massachusetts, 833", + "about": "Duis Lorem reprehenderit proident ut dolor aute esse veniam cillum consequat aliquip adipisicing. Reprehenderit ex tempor id nulla enim ex magna officia nisi consequat ipsum. Cupidatat duis excepteur minim in dolore duis. Reprehenderit et labore anim Lorem commodo officia deserunt est minim velit deserunt dolor. Minim ipsum Lorem consectetur ad id. Pariatur sunt consequat laborum laboris velit exercitation laborum ullamco reprehenderit ullamco elit tempor aliqua.\r\n", + "registered": "2017-11-07T12:47:18 -06:-30", + "latitude": 26.6948, + "longitude": 113.205529, + "tags": [ + "tempor", + "ea", + "occaecat", + "culpa", + "non", + "eiusmod", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Jerry Delacruz" + }, + { + "id": 1, + "name": "Wise Beasley" + }, + { + "id": 2, + "name": "Viola Wyatt" + } + ], + "greeting": "Hello, Melissa Guy! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd4558a2237776443", + "index": 117, + "guid": "2c42e6e5-ab0d-4212-9919-29556f7ec421", + "isActive": false, + "balance": "$1,962.09", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Hart Barr", + "gender": "male", + "company": "XSPORTS", + "email": "hartbarr@xsports.com", + "phone": "+1 (888) 425-2738", + "address": "443 Sapphire Street, Harrodsburg, Palau, 6486", + "about": "Anim ipsum amet nostrud adipisicing Lorem deserunt. Ex et elit velit sit aliqua sint adipisicing sit proident ullamco irure ex. Ad aliqua eu excepteur ad reprehenderit irure minim aliquip Lorem culpa ex culpa minim in. Et commodo culpa amet tempor pariatur proident deserunt tempor nostrud irure amet dolore occaecat nulla.\r\n", + "registered": "2014-09-10T02:40:07 -06:-30", + "latitude": 30.745755, + "longitude": -44.648787, + "tags": [ + "cupidatat", + "ipsum", + "nisi", + "est", + "aute", + "aliqua", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Christian Watkins" + }, + { + "id": 1, + "name": "Singleton Sanford" + }, + { + "id": 2, + "name": "Laurie Summers" + } + ], + "greeting": "Hello, Hart Barr! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3fd0124737e68c62", + "index": 118, + "guid": "2f31df37-0a09-444f-bc55-1650181a02b6", + "isActive": true, + "balance": "$2,014.58", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Barnett Blevins", + "gender": "male", + "company": "JETSILK", + "email": "barnettblevins@jetsilk.com", + "phone": "+1 (848) 563-3767", + "address": "675 Milton Street, Wakulla, Alaska, 9293", + "about": "Pariatur duis nostrud minim ex. Ut dolore esse laborum irure Lorem excepteur tempor sint officia ipsum dolore id qui aliqua. Amet in est labore consectetur velit nostrud reprehenderit quis qui. Sunt in proident proident aute aliqua nulla dolor labore laborum deserunt.\r\n", + "registered": "2021-06-10T10:47:53 -06:-30", + "latitude": -57.013942, + "longitude": 160.489913, + "tags": [ + "ut", + "proident", + "labore", + "exercitation", + "tempor", + "laborum", + "ipsum" + ], + "friends": [ + { + "id": 0, + "name": "Chris Gilmore" + }, + { + "id": 1, + "name": "Morgan Wilkins" + }, + { + "id": 2, + "name": "Mabel Rivera" + } + ], + "greeting": "Hello, Barnett Blevins! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b56e0054d16b41fde", + "index": 119, + "guid": "9c0f56f7-e030-44d8-b0fd-abb215a07388", + "isActive": true, + "balance": "$3,678.66", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Ada Moran", + "gender": "female", + "company": "OVATION", + "email": "adamoran@ovation.com", + "phone": "+1 (856) 424-2899", + "address": "369 Vandalia Avenue, Sattley, Oklahoma, 2478", + "about": "Exercitation amet fugiat adipisicing ullamco nulla cillum qui reprehenderit nulla. Enim eu velit aute eiusmod dolor mollit dolor in adipisicing. Commodo dolor aliquip adipisicing enim quis. Nisi consectetur amet reprehenderit dolor ipsum est consequat. Laborum reprehenderit ex commodo occaecat culpa adipisicing est sunt laboris sit amet ea nisi. Quis quis aliquip et eiusmod Lorem minim nisi mollit officia velit. Quis incididunt cillum fugiat cillum dolor.\r\n", + "registered": "2021-08-14T08:51:43 -06:-30", + "latitude": 65.040699, + "longitude": -71.485407, + "tags": [ + "laboris", + "nisi", + "labore", + "laboris", + "dolor", + "voluptate", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Davis Mccall" + }, + { + "id": 1, + "name": "Mercedes Decker" + }, + { + "id": 2, + "name": "Duran Barrett" + } + ], + "greeting": "Hello, Ada Moran! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7739c60d0c8e3f2e", + "index": 120, + "guid": "c65dd6b5-2c15-4769-8394-17a41367466d", + "isActive": false, + "balance": "$3,617.32", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Whitfield Sellers", + "gender": "male", + "company": "FITCORE", + "email": "whitfieldsellers@fitcore.com", + "phone": "+1 (964) 575-3565", + "address": "216 Winthrop Street, Canby, New Mexico, 4005", + "about": "Eu ipsum sint irure ipsum nostrud incididunt ipsum pariatur ipsum reprehenderit sint. Veniam deserunt irure reprehenderit adipisicing dolor ut. Dolor dolore proident consectetur commodo anim non. In ipsum officia esse qui ullamco. Occaecat ad aliquip quis cupidatat tempor laboris.\r\n", + "registered": "2022-08-22T01:55:58 -06:-30", + "latitude": 5.859659, + "longitude": 175.427951, + "tags": [ + "fugiat", + "aliqua", + "amet", + "officia", + "esse", + "ut", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Leon Pate" + }, + { + "id": 1, + "name": "Gonzales Preston" + }, + { + "id": 2, + "name": "Danielle Munoz" + } + ], + "greeting": "Hello, Whitfield Sellers! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf0898786f93e25de", + "index": 121, + "guid": "ee791741-bd46-49dd-8c92-f5a671f3c25d", + "isActive": false, + "balance": "$1,507.90", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Herrera Avila", + "gender": "male", + "company": "SENMEI", + "email": "herreraavila@senmei.com", + "phone": "+1 (960) 453-2470", + "address": "943 Overbaugh Place, Klagetoh, Wyoming, 2602", + "about": "Fugiat aliqua id veniam labore laboris incididunt adipisicing ad magna deserunt id nostrud. Anim laboris duis ut id sit dolor ad aliquip laboris proident nisi. Officia nisi nostrud cupidatat enim culpa et consequat quis. Do consequat amet occaecat labore voluptate amet elit sit sunt eu. Ipsum qui esse est amet sit deserunt incididunt sunt qui.\r\n", + "registered": "2017-01-17T06:23:24 -06:-30", + "latitude": -42.18847, + "longitude": -135.901523, + "tags": [ + "occaecat", + "qui", + "do", + "duis", + "magna", + "eiusmod", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Sweeney Riley" + }, + { + "id": 1, + "name": "Myers Baker" + }, + { + "id": 2, + "name": "Billie Emerson" + } + ], + "greeting": "Hello, Herrera Avila! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b5327123a68a3888e", + "index": 122, + "guid": "41312624-de5e-466e-bcae-6dc19ab6532a", + "isActive": true, + "balance": "$3,108.32", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Pauline Tucker", + "gender": "female", + "company": "KOFFEE", + "email": "paulinetucker@koffee.com", + "phone": "+1 (841) 590-2749", + "address": "553 Drew Street, Bedias, Rhode Island, 5569", + "about": "Ut esse do incididunt tempor duis dolore fugiat fugiat ut. Cillum enim ex Lorem sint proident ullamco. Nulla deserunt cillum irure nulla anim eu proident ut incididunt adipisicing velit velit.\r\n", + "registered": "2014-04-18T07:37:51 -06:-30", + "latitude": -64.584207, + "longitude": -59.056558, + "tags": [ + "adipisicing", + "velit", + "nostrud", + "enim", + "minim", + "eu", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Cain Holder" + }, + { + "id": 1, + "name": "Ashlee Tanner" + }, + { + "id": 2, + "name": "Loraine Reilly" + } + ], + "greeting": "Hello, Pauline Tucker! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bfe1f1300166dab85", + "index": 123, + "guid": "4e947ed0-72fc-4b32-b6c8-fe899c184909", + "isActive": true, + "balance": "$1,117.46", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Guerrero Fry", + "gender": "male", + "company": "ECLIPTO", + "email": "guerrerofry@eclipto.com", + "phone": "+1 (804) 403-2033", + "address": "673 Desmond Court, Lindcove, West Virginia, 1550", + "about": "Minim ex esse dolor exercitation. Veniam eu commodo proident anim. Sit duis consectetur ut duis irure ullamco enim ad. Adipisicing nisi duis magna fugiat aliqua cupidatat nostrud mollit ea amet consequat consectetur do. Occaecat reprehenderit deserunt anim eiusmod veniam cillum irure ex do mollit est. Consequat occaecat esse anim quis ipsum ipsum do Lorem velit non tempor excepteur.\r\n", + "registered": "2016-02-05T10:40:46 -06:-30", + "latitude": -19.969472, + "longitude": 172.231621, + "tags": [ + "magna", + "aute", + "dolor", + "culpa", + "incididunt", + "esse", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Hamilton Fox" + }, + { + "id": 1, + "name": "Tyler Roman" + }, + { + "id": 2, + "name": "Letitia Russo" + } + ], + "greeting": "Hello, Guerrero Fry! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b02779a153e9387f9", + "index": 124, + "guid": "73609995-76b1-4f44-8657-4f29bada2d8d", + "isActive": false, + "balance": "$1,220.27", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Hopkins Curtis", + "gender": "male", + "company": "RONBERT", + "email": "hopkinscurtis@ronbert.com", + "phone": "+1 (959) 452-2725", + "address": "837 Hendrix Street, Roderfield, Nevada, 8193", + "about": "Eiusmod voluptate mollit tempor elit do adipisicing est officia. Id Lorem pariatur consectetur consequat ut dolor magna pariatur laborum ullamco tempor est cupidatat. Magna officia sunt est aliqua id et enim amet ea ut culpa in. Non elit eiusmod mollit veniam irure non excepteur minim cillum non cupidatat eu. Dolore consectetur sint veniam non irure veniam aliqua et. Mollit ut labore occaecat nisi enim officia consectetur tempor.\r\n", + "registered": "2020-09-24T04:28:26 -06:-30", + "latitude": 55.186212, + "longitude": 83.117267, + "tags": [ + "nostrud", + "dolore", + "sunt", + "mollit", + "ea", + "ad", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Hazel Rollins" + }, + { + "id": 1, + "name": "Paige Ross" + }, + { + "id": 2, + "name": "Hanson Austin" + } + ], + "greeting": "Hello, Hopkins Curtis! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1942d95fa5ce186f", + "index": 125, + "guid": "793b5f3f-c931-4e1f-9c82-90c81fe2d6c5", + "isActive": true, + "balance": "$1,060.41", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Terrell Shannon", + "gender": "male", + "company": "ENJOLA", + "email": "terrellshannon@enjola.com", + "phone": "+1 (997) 549-2509", + "address": "253 Kenmore Terrace, Cannondale, Delaware, 6406", + "about": "Do cupidatat elit quis minim. Excepteur mollit velit irure magna aliquip tempor irure voluptate cupidatat ex. Mollit irure sit in est. Nisi ut excepteur consectetur laboris enim minim laborum nisi commodo amet ut occaecat elit. Magna anim consequat adipisicing enim sunt aute. Ut magna velit irure ad occaecat sit et pariatur est.\r\n", + "registered": "2014-07-01T09:49:12 -06:-30", + "latitude": -63.167755, + "longitude": 43.331911, + "tags": [ + "amet", + "labore", + "elit", + "dolor", + "ea", + "magna", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Whitley Tyson" + }, + { + "id": 1, + "name": "Robbins Miranda" + }, + { + "id": 2, + "name": "Torres Mathis" + } + ], + "greeting": "Hello, Terrell Shannon! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b5a4caa287909ec9f", + "index": 126, + "guid": "3d3aefe9-cd7c-4616-a25e-083497bd201a", + "isActive": false, + "balance": "$2,199.53", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Lucille Gray", + "gender": "female", + "company": "SPHERIX", + "email": "lucillegray@spherix.com", + "phone": "+1 (806) 403-3100", + "address": "734 Victor Road, Winston, Federated States Of Micronesia, 279", + "about": "Dolore incididunt tempor culpa nostrud do officia voluptate eu ad velit cupidatat proident nostrud ipsum. Dolore consequat do sint Lorem deserunt sunt cupidatat quis deserunt nulla eiusmod pariatur anim consectetur. Cillum aliquip do veniam non laboris ut ipsum fugiat adipisicing voluptate. Nulla et ad sint consectetur et enim. Fugiat ea reprehenderit reprehenderit Lorem eiusmod fugiat ipsum reprehenderit laboris Lorem.\r\n", + "registered": "2017-10-21T09:48:29 -06:-30", + "latitude": 89.097749, + "longitude": 146.732604, + "tags": [ + "commodo", + "adipisicing", + "ex", + "velit", + "voluptate", + "ipsum", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Mccarthy Haney" + }, + { + "id": 1, + "name": "Raymond Villarreal" + }, + { + "id": 2, + "name": "Gina Fleming" + } + ], + "greeting": "Hello, Lucille Gray! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4be47986a028e260a1", + "index": 127, + "guid": "5eac8a48-198b-4e43-9bb1-f2c07ac89a5d", + "isActive": true, + "balance": "$1,378.64", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Dollie Santiago", + "gender": "female", + "company": "WEBIOTIC", + "email": "dolliesantiago@webiotic.com", + "phone": "+1 (829) 461-3988", + "address": "411 Tiffany Place, Adamstown, Pennsylvania, 8510", + "about": "Id laborum veniam dolor sint pariatur tempor laboris mollit ipsum amet ut aliqua eu. Culpa qui enim dolore esse. Dolore commodo magna tempor commodo ullamco quis. Eiusmod officia fugiat nulla excepteur excepteur ad culpa consectetur. Sunt Lorem non ad elit dolor laboris pariatur pariatur incididunt sint mollit qui.\r\n", + "registered": "2022-01-22T11:04:36 -06:-30", + "latitude": 51.854072, + "longitude": 94.154415, + "tags": [ + "id", + "eu", + "sunt", + "et", + "id", + "labore", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Petersen Osborne" + }, + { + "id": 1, + "name": "Madeline Sears" + }, + { + "id": 2, + "name": "Rowland Richard" + } + ], + "greeting": "Hello, Dollie Santiago! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4be6d47dea332160d8", + "index": 128, + "guid": "6f35f44a-2697-4fdd-8afb-92adc8694394", + "isActive": true, + "balance": "$1,203.93", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Velasquez Jordan", + "gender": "male", + "company": "MACRONAUT", + "email": "velasquezjordan@macronaut.com", + "phone": "+1 (919) 512-2117", + "address": "919 Lott Avenue, Allison, Connecticut, 9843", + "about": "Labore esse sint id pariatur. Ad magna veniam ullamco anim quis magna occaecat amet minim. Lorem eiusmod ea officia occaecat Lorem nisi occaecat irure. Veniam veniam aliquip minim amet ipsum incididunt eiusmod enim deserunt irure. Lorem eu sunt minim eu Lorem ut.\r\n", + "registered": "2016-02-18T02:21:10 -06:-30", + "latitude": -67.236116, + "longitude": -71.939622, + "tags": [ + "dolor", + "commodo", + "cillum", + "sint", + "officia", + "duis", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Haney Burt" + }, + { + "id": 1, + "name": "Bolton Estes" + }, + { + "id": 2, + "name": "Elisabeth Stephens" + } + ], + "greeting": "Hello, Velasquez Jordan! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bac68c765e6c296b7", + "index": 129, + "guid": "2e7d10df-3601-4691-b06f-f9d9041cbdf1", + "isActive": false, + "balance": "$1,445.60", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Aisha Mcfadden", + "gender": "female", + "company": "KONGENE", + "email": "aishamcfadden@kongene.com", + "phone": "+1 (862) 502-3385", + "address": "164 Royce Street, Beaverdale, Louisiana, 352", + "about": "Aliqua labore officia nisi occaecat aliqua nisi dolor. Enim sint id officia elit ut mollit officia in veniam enim irure dolor. Sunt deserunt qui id aliquip ullamco voluptate quis aute. Sunt in enim eiusmod nostrud sit tempor consequat fugiat ut ad eiusmod dolor nulla in. Minim culpa ullamco commodo consequat deserunt Lorem exercitation enim mollit labore deserunt non. Cillum est eu sint aliquip enim fugiat consequat. Ex in cupidatat cupidatat aliquip consectetur ut dolore consequat ipsum amet laborum fugiat ad Lorem.\r\n", + "registered": "2019-09-04T10:33:02 -06:-30", + "latitude": -25.424141, + "longitude": 16.321255, + "tags": [ + "duis", + "eiusmod", + "irure", + "id", + "magna", + "velit", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Bonnie Gentry" + }, + { + "id": 1, + "name": "Kathrine Rosa" + }, + { + "id": 2, + "name": "Bartlett Daniel" + } + ], + "greeting": "Hello, Aisha Mcfadden! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb3aa06b901d7475d", + "index": 130, + "guid": "9a0728fe-405c-43ad-9355-d5429d9576bc", + "isActive": true, + "balance": "$2,082.86", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Rogers Dorsey", + "gender": "male", + "company": "BLEENDOT", + "email": "rogersdorsey@bleendot.com", + "phone": "+1 (835) 543-3674", + "address": "850 Sutton Street, Beyerville, Vermont, 5108", + "about": "Do velit in commodo labore Lorem irure nulla occaecat ad quis. Excepteur deserunt incididunt fugiat ex Lorem sit ut deserunt adipisicing est anim voluptate. Proident enim do nostrud non quis in mollit. Qui sit deserunt cillum ut. Nulla non occaecat adipisicing labore culpa non eu. Irure enim adipisicing excepteur ad pariatur velit velit enim nulla occaecat ullamco.\r\n", + "registered": "2017-08-20T09:46:25 -06:-30", + "latitude": -81.306757, + "longitude": -168.273923, + "tags": [ + "duis", + "fugiat", + "eiusmod", + "enim", + "cillum", + "laborum", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Dorothy Anthony" + }, + { + "id": 1, + "name": "Douglas Aguilar" + }, + { + "id": 2, + "name": "Strong Bruce" + } + ], + "greeting": "Hello, Rogers Dorsey! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9a77bcb5b44c92ae", + "index": 131, + "guid": "174e3dd8-20f8-4f34-a362-30c6c403ce78", + "isActive": false, + "balance": "$1,279.50", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Bray Lowery", + "gender": "male", + "company": "ZYPLE", + "email": "braylowery@zyple.com", + "phone": "+1 (904) 598-2260", + "address": "408 President Street, Kerby, Iowa, 1680", + "about": "Veniam ex in Lorem velit cillum aute velit ut non dolore. Incididunt dolore commodo cupidatat aute tempor ut. Incididunt excepteur nisi dolore do nostrud enim. Excepteur nostrud dolor amet officia veniam nisi exercitation. Minim nisi non labore aliqua aliquip amet id labore aliquip laboris ad elit reprehenderit.\r\n", + "registered": "2018-10-09T10:15:28 -06:-30", + "latitude": 20.339766, + "longitude": 57.196058, + "tags": [ + "minim", + "dolore", + "ullamco", + "magna", + "aliqua", + "ad", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Carla Buchanan" + }, + { + "id": 1, + "name": "Brianna Molina" + }, + { + "id": 2, + "name": "Maude Kinney" + } + ], + "greeting": "Hello, Bray Lowery! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9acff788c97a8410", + "index": 132, + "guid": "703b38a8-3b63-4f46-887c-2a4be79158c6", + "isActive": true, + "balance": "$3,629.99", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Pamela Wheeler", + "gender": "female", + "company": "CABLAM", + "email": "pamelawheeler@cablam.com", + "phone": "+1 (840) 490-3419", + "address": "660 Polar Street, Wikieup, Virginia, 4702", + "about": "Sint ullamco veniam mollit minim sit ut nulla aliqua dolor ipsum est reprehenderit nostrud. Esse adipisicing aliquip in amet id elit proident pariatur commodo eiusmod. Exercitation ut voluptate irure veniam labore commodo et exercitation. Consectetur eiusmod veniam sunt aliqua sunt ea.\r\n", + "registered": "2019-10-04T06:40:17 -06:-30", + "latitude": 37.979658, + "longitude": -32.941799, + "tags": [ + "eu", + "ullamco", + "nisi", + "in", + "mollit", + "ad", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Benita Ayala" + }, + { + "id": 1, + "name": "Marcia Vinson" + }, + { + "id": 2, + "name": "Walker Dejesus" + } + ], + "greeting": "Hello, Pamela Wheeler! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b784b9acde8d8e400", + "index": 133, + "guid": "a6f0fdf9-bf67-465f-8af1-f56eacba5509", + "isActive": false, + "balance": "$1,158.88", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Blanca Mcmillan", + "gender": "female", + "company": "SPEEDBOLT", + "email": "blancamcmillan@speedbolt.com", + "phone": "+1 (969) 410-2662", + "address": "468 Kiely Place, Rose, Maine, 3074", + "about": "Minim nostrud occaecat sunt eiusmod et cupidatat laborum et minim nisi. Aliqua ex enim in ipsum ut eu qui fugiat sit laboris sunt velit. Magna nisi sunt esse esse nostrud. Minim in est cillum nisi ex laborum duis ea reprehenderit cillum eu est. Labore officia elit dolor cupidatat nisi mollit exercitation aliquip.\r\n", + "registered": "2016-06-17T07:39:30 -06:-30", + "latitude": 66.534309, + "longitude": 143.807881, + "tags": [ + "nulla", + "dolor", + "commodo", + "pariatur", + "qui", + "ut", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "May Pitts" + }, + { + "id": 1, + "name": "Mcbride Henson" + }, + { + "id": 2, + "name": "Alta Watson" + } + ], + "greeting": "Hello, Blanca Mcmillan! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b070b1b4b55b6a4b5", + "index": 134, + "guid": "ffefb448-d42b-44be-8632-8d0b4996cc19", + "isActive": true, + "balance": "$2,146.75", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Gretchen Berger", + "gender": "female", + "company": "KLUGGER", + "email": "gretchenberger@klugger.com", + "phone": "+1 (981) 520-2415", + "address": "228 Lefferts Avenue, Stewart, Nebraska, 8503", + "about": "Ullamco laborum culpa enim exercitation aute. Cillum ad irure exercitation excepteur Lorem. Amet adipisicing incididunt duis aliqua pariatur reprehenderit ex in.\r\n", + "registered": "2016-03-14T03:23:37 -06:-30", + "latitude": -33.841249, + "longitude": -96.183149, + "tags": [ + "aute", + "ex", + "do", + "ut", + "occaecat", + "sunt", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Celeste Kirby" + }, + { + "id": 1, + "name": "Holmes Fischer" + }, + { + "id": 2, + "name": "Olsen Stein" + } + ], + "greeting": "Hello, Gretchen Berger! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf84654087d31a346", + "index": 135, + "guid": "24a4afd7-6c95-48dd-b60b-f722764c42e5", + "isActive": true, + "balance": "$1,035.47", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Cantu Gregory", + "gender": "male", + "company": "AVIT", + "email": "cantugregory@avit.com", + "phone": "+1 (837) 583-2244", + "address": "808 Harbor Lane, Denio, Mississippi, 2010", + "about": "Magna enim in laborum esse. Mollit veniam amet reprehenderit minim dolore elit magna ea. Elit cupidatat aliquip amet veniam minim aute esse sint quis irure.\r\n", + "registered": "2021-11-28T07:05:49 -06:-30", + "latitude": -0.478805, + "longitude": 7.926812, + "tags": [ + "et", + "elit", + "in", + "nisi", + "laboris", + "duis", + "ullamco" + ], + "friends": [ + { + "id": 0, + "name": "Wiggins Parsons" + }, + { + "id": 1, + "name": "Cunningham Allen" + }, + { + "id": 2, + "name": "Irma Mccormick" + } + ], + "greeting": "Hello, Cantu Gregory! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b263d1c0bfeacb3e4", + "index": 136, + "guid": "97630d13-09b7-4e53-beac-a040052e8e2e", + "isActive": false, + "balance": "$1,478.67", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "brown", + "name": "Ashley Savage", + "gender": "female", + "company": "ATGEN", + "email": "ashleysavage@atgen.com", + "phone": "+1 (874) 521-2033", + "address": "185 Kermit Place, Eastmont, Indiana, 1894", + "about": "Qui esse Lorem eu consequat et magna in minim. Ipsum aliquip quis eu sit veniam est voluptate. Et ad voluptate ad do in nulla enim. Sint qui proident aute Lorem culpa cupidatat veniam dolor ullamco qui. In sit ad ex commodo deserunt consectetur consequat reprehenderit eu ad elit. Sunt consectetur Lorem sint non in. Cupidatat veniam tempor aute minim cupidatat enim dolore quis minim irure irure ullamco aute.\r\n", + "registered": "2020-11-16T09:41:15 -06:-30", + "latitude": 9.178677, + "longitude": 110.71187, + "tags": [ + "qui", + "excepteur", + "magna", + "tempor", + "fugiat", + "aliquip", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Cornelia Clemons" + }, + { + "id": 1, + "name": "Holt Snyder" + }, + { + "id": 2, + "name": "England Williams" + } + ], + "greeting": "Hello, Ashley Savage! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b9abdbfe855a0da1a", + "index": 137, + "guid": "c1865c91-708d-4d57-bcb1-baccfcd8c0ad", + "isActive": true, + "balance": "$1,456.90", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Georgina Casey", + "gender": "female", + "company": "WARETEL", + "email": "georginacasey@waretel.com", + "phone": "+1 (862) 489-2978", + "address": "512 Matthews Place, Tampico, Guam, 3140", + "about": "Eiusmod qui proident magna qui eiusmod voluptate ex. Tempor ipsum irure consectetur exercitation et. Eu voluptate sint irure in velit enim consequat. Excepteur voluptate esse elit ad enim excepteur dolore ad nisi ullamco eiusmod magna.\r\n", + "registered": "2014-07-12T08:24:07 -06:-30", + "latitude": 73.825427, + "longitude": -119.948011, + "tags": [ + "et", + "sunt", + "eiusmod", + "nulla", + "ad", + "exercitation", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Watts Brewer" + }, + { + "id": 1, + "name": "Padilla Barker" + }, + { + "id": 2, + "name": "Juliana Oneal" + } + ], + "greeting": "Hello, Georgina Casey! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7515f719f659db21", + "index": 138, + "guid": "d2e9b765-4f49-4e19-bd35-237e0b3d23d2", + "isActive": false, + "balance": "$1,342.46", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Fuller Fields", + "gender": "male", + "company": "LOCAZONE", + "email": "fullerfields@locazone.com", + "phone": "+1 (873) 494-2368", + "address": "764 Clove Road, Celeryville, Kentucky, 5933", + "about": "Laboris laborum veniam ipsum ex magna proident enim tempor anim nisi aute. Amet incididunt exercitation in enim ex commodo elit excepteur ullamco proident sint do ut eiusmod. Enim veniam reprehenderit do cupidatat est duis in est Lorem deserunt esse consequat exercitation. Cillum eu consectetur consectetur amet cupidatat voluptate dolore ex tempor non est deserunt. Id reprehenderit ea ullamco commodo elit cupidatat aliqua do veniam ad deserunt et occaecat eiusmod. Ipsum laboris dolor enim ipsum ipsum veniam in ipsum officia elit magna ad.\r\n", + "registered": "2019-02-10T04:53:10 -06:-30", + "latitude": 76.082221, + "longitude": 148.896871, + "tags": [ + "amet", + "enim", + "ad", + "ea", + "esse", + "laborum", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Ronda Forbes" + }, + { + "id": 1, + "name": "Cote Wade" + }, + { + "id": 2, + "name": "Beryl Saunders" + } + ], + "greeting": "Hello, Fuller Fields! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf4701b938a08981a", + "index": 139, + "guid": "ad5f12e1-54e8-4eef-b324-9c3150669b35", + "isActive": true, + "balance": "$1,765.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Mitchell Wilcox", + "gender": "male", + "company": "ZOLARITY", + "email": "mitchellwilcox@zolarity.com", + "phone": "+1 (829) 582-3615", + "address": "646 Hampton Place, Jeff, Puerto Rico, 2457", + "about": "Sit ad velit esse in in. Consequat eu fugiat commodo id. Aliquip consectetur duis officia commodo. Minim nulla culpa nostrud id laborum laboris et. Labore reprehenderit laboris eu aliqua sit excepteur irure commodo aute anim amet.\r\n", + "registered": "2021-11-24T02:19:42 -06:-30", + "latitude": -8.853018, + "longitude": 3.463572, + "tags": [ + "voluptate", + "eiusmod", + "est", + "pariatur", + "ea", + "cillum", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Woodard Byrd" + }, + { + "id": 1, + "name": "Hughes Ferguson" + }, + { + "id": 2, + "name": "Ursula Lamb" + } + ], + "greeting": "Hello, Mitchell Wilcox! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4ba6de92cbff3a0b41", + "index": 140, + "guid": "253160f6-b914-431f-b5b7-234519f75170", + "isActive": true, + "balance": "$1,006.26", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "blue", + "name": "Naomi Melton", + "gender": "female", + "company": "KNEEDLES", + "email": "naomimelton@kneedles.com", + "phone": "+1 (893) 548-3636", + "address": "519 Ridgecrest Terrace, Dunlo, North Carolina, 9332", + "about": "Ea ipsum proident consequat culpa qui enim cupidatat consectetur est non incididunt nisi. Nostrud eiusmod cupidatat adipisicing minim ipsum Lorem laborum. Reprehenderit consequat consequat quis commodo tempor exercitation sint ipsum cupidatat ex sit.\r\n", + "registered": "2022-01-05T06:18:44 -06:-30", + "latitude": 63.076285, + "longitude": -115.123883, + "tags": [ + "voluptate", + "eu", + "Lorem", + "magna", + "et", + "proident", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Kerr Strickland" + }, + { + "id": 1, + "name": "Adele Norris" + }, + { + "id": 2, + "name": "Kelly Wise" + } + ], + "greeting": "Hello, Naomi Melton! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be6cd8084f55cfa71", + "index": 141, + "guid": "d8f902c0-e31f-4977-b358-8409d5893a7f", + "isActive": true, + "balance": "$2,378.15", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Minnie Duke", + "gender": "female", + "company": "VOIPA", + "email": "minnieduke@voipa.com", + "phone": "+1 (925) 443-3464", + "address": "201 Mill Avenue, Byrnedale, Tennessee, 1921", + "about": "Consectetur eiusmod id eu do exercitation sit mollit esse veniam mollit sunt qui. Elit adipisicing deserunt ipsum pariatur laboris esse. Ex elit officia exercitation laborum non adipisicing dolor enim officia sint nostrud. Ea ad esse aliquip sunt culpa veniam mollit ipsum duis non esse.\r\n", + "registered": "2014-03-12T04:43:10 -06:-30", + "latitude": 76.002729, + "longitude": -98.315921, + "tags": [ + "nulla", + "do", + "ut", + "ullamco", + "nostrud", + "magna", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Mamie Lopez" + }, + { + "id": 1, + "name": "Langley Richmond" + }, + { + "id": 2, + "name": "Berger Sanchez" + } + ], + "greeting": "Hello, Minnie Duke! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bcbeaac1f9dda1944", + "index": 142, + "guid": "34d5046f-a133-47f3-8d94-fbd562889022", + "isActive": false, + "balance": "$1,341.84", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Ballard Holmes", + "gender": "male", + "company": "OVERPLEX", + "email": "ballardholmes@overplex.com", + "phone": "+1 (927) 444-2359", + "address": "841 Mersereau Court, Henrietta, Arkansas, 9592", + "about": "Laboris esse voluptate esse deserunt occaecat amet cillum proident. Magna aliquip deserunt nostrud mollit aliqua ex duis excepteur proident. Dolor reprehenderit minim amet reprehenderit ea officia voluptate dolore laborum culpa officia occaecat sunt. Et esse nostrud anim adipisicing sit nulla velit mollit mollit fugiat Lorem excepteur. Officia aliqua non sit qui ex.\r\n", + "registered": "2014-03-25T12:44:10 -06:-30", + "latitude": 78.487412, + "longitude": -40.804959, + "tags": [ + "cupidatat", + "voluptate", + "nulla", + "laborum", + "sit", + "laboris", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Dolly Nolan" + }, + { + "id": 1, + "name": "Vance Levy" + }, + { + "id": 2, + "name": "Franco Alvarado" + } + ], + "greeting": "Hello, Ballard Holmes! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd36f762486a903fe", + "index": 143, + "guid": "e0c58db6-6192-49d7-b00b-f57f66f4b901", + "isActive": true, + "balance": "$1,719.90", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Tillman Beach", + "gender": "male", + "company": "GENESYNK", + "email": "tillmanbeach@genesynk.com", + "phone": "+1 (862) 573-2016", + "address": "194 Stuyvesant Avenue, Leroy, Virgin Islands, 3199", + "about": "Excepteur proident nulla elit ut fugiat proident ipsum exercitation irure. Ipsum sunt mollit ullamco ad laborum adipisicing nisi deserunt duis laboris duis culpa ullamco. Sit veniam ad aliquip fugiat. Labore enim aliquip sit dolore veniam quis ex consectetur laboris fugiat qui ex. Cillum nostrud sit officia labore ipsum labore consectetur ullamco aute fugiat non ullamco eiusmod velit. Dolor nisi qui minim ad labore sit excepteur enim Lorem elit ea eu.\r\n", + "registered": "2019-06-27T12:06:42 -06:-30", + "latitude": -68.957538, + "longitude": -103.611995, + "tags": [ + "tempor", + "consequat", + "aute", + "irure", + "amet", + "sit", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Wilkerson Noel" + }, + { + "id": 1, + "name": "Randolph Lowe" + }, + { + "id": 2, + "name": "Brady Ward" + } + ], + "greeting": "Hello, Tillman Beach! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b12d9f61f9bda18d5", + "index": 144, + "guid": "0745d7f4-7e30-4c81-87aa-1da3d99e068f", + "isActive": true, + "balance": "$1,096.90", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Ewing Mcneil", + "gender": "male", + "company": "BILLMED", + "email": "ewingmcneil@billmed.com", + "phone": "+1 (914) 572-2174", + "address": "733 Madeline Court, Hillsboro, Oregon, 3945", + "about": "Ipsum pariatur sint cupidatat nisi occaecat aliqua fugiat Lorem ex pariatur labore magna ad. Elit est minim exercitation ut tempor culpa consectetur ipsum tempor nisi. Veniam irure duis esse adipisicing commodo incididunt non dolore id. Aliqua do ullamco anim nulla exercitation velit voluptate tempor aliqua cupidatat quis esse elit. Voluptate Lorem dolore incididunt sunt amet ea amet. Fugiat Lorem id aliquip sit cillum incididunt minim duis. Non enim et dolore veniam minim.\r\n", + "registered": "2020-12-26T11:26:36 -06:-30", + "latitude": 2.430916, + "longitude": 100.297647, + "tags": [ + "velit", + "elit", + "qui", + "mollit", + "nostrud", + "officia", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Bernadine Garza" + }, + { + "id": 1, + "name": "Houston Adkins" + }, + { + "id": 2, + "name": "Hayes Webb" + } + ], + "greeting": "Hello, Ewing Mcneil! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b80d1e00a110702f3", + "index": 145, + "guid": "deb8b67d-55a8-42b7-8d82-24d1df3cad32", + "isActive": false, + "balance": "$1,000.11", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Gordon England", + "gender": "male", + "company": "EXODOC", + "email": "gordonengland@exodoc.com", + "phone": "+1 (886) 541-2812", + "address": "305 Commerce Street, Brethren, District Of Columbia, 1426", + "about": "Cillum aliquip aliquip ullamco irure. Sint tempor deserunt duis reprehenderit aliqua aliqua esse nulla. Amet voluptate labore commodo ex ut mollit occaecat dolor. Pariatur dolore commodo fugiat exercitation labore esse enim cupidatat et nostrud et. Ex labore in dolor amet eu aute minim ad cupidatat consequat nisi pariatur cupidatat nisi. Pariatur aliqua eiusmod aliquip dolor et esse ex amet est ullamco pariatur est nostrud. Culpa enim quis laboris aute cillum dolore deserunt proident excepteur cillum Lorem.\r\n", + "registered": "2020-04-10T12:13:20 -06:-30", + "latitude": 18.138421, + "longitude": -121.009254, + "tags": [ + "consectetur", + "qui", + "quis", + "reprehenderit", + "aliquip", + "reprehenderit", + "deserunt" + ], + "friends": [ + { + "id": 0, + "name": "Lee Roberson" + }, + { + "id": 1, + "name": "Eve Kennedy" + }, + { + "id": 2, + "name": "Curry Burke" + } + ], + "greeting": "Hello, Gordon England! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bdd3d5b4691f9f628", + "index": 146, + "guid": "653514db-e145-4172-91d2-ad24850c4c97", + "isActive": false, + "balance": "$3,124.09", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Amanda Weber", + "gender": "female", + "company": "NEBULEAN", + "email": "amandaweber@nebulean.com", + "phone": "+1 (863) 446-2596", + "address": "312 Bedell Lane, Motley, Florida, 4384", + "about": "Eiusmod Lorem ad irure dolor et sint elit non veniam amet. Id irure ut amet incididunt. Duis adipisicing reprehenderit est minim commodo eiusmod veniam ullamco aliqua proident cupidatat excepteur in. Do labore ipsum dolor id amet deserunt commodo nulla nostrud. Deserunt tempor pariatur consectetur ad enim veniam dolor ipsum voluptate. Non proident Lorem magna pariatur.\r\n", + "registered": "2018-10-14T10:12:41 -06:-30", + "latitude": -31.328371, + "longitude": 26.644046, + "tags": [ + "reprehenderit", + "magna", + "pariatur", + "consectetur", + "ullamco", + "mollit", + "quis" + ], + "friends": [ + { + "id": 0, + "name": "Kari Peck" + }, + { + "id": 1, + "name": "Shanna Wilder" + }, + { + "id": 2, + "name": "Katy Guerra" + } + ], + "greeting": "Hello, Amanda Weber! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbd7cf3b16cb9bdd8", + "index": 147, + "guid": "6bd835fe-0e05-4ccf-a453-66248770035d", + "isActive": true, + "balance": "$1,144.42", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Dillard Chen", + "gender": "male", + "company": "FIBRODYNE", + "email": "dillardchen@fibrodyne.com", + "phone": "+1 (944) 545-2440", + "address": "411 Butler Place, Bluffview, Washington, 2355", + "about": "Ipsum veniam amet anim duis exercitation nisi. Labore amet excepteur do adipisicing nulla minim sit culpa cupidatat nostrud voluptate eiusmod magna in. Esse mollit nisi est adipisicing amet tempor deserunt reprehenderit.\r\n", + "registered": "2015-10-24T11:22:29 -06:-30", + "latitude": 47.819434, + "longitude": 6.827121, + "tags": [ + "nisi", + "eu", + "consequat", + "dolor", + "veniam", + "aliquip", + "deserunt" + ], + "friends": [ + { + "id": 0, + "name": "Elnora Cole" + }, + { + "id": 1, + "name": "Rosario Compton" + }, + { + "id": 2, + "name": "Gutierrez Moon" + } + ], + "greeting": "Hello, Dillard Chen! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bfe58f12d03cfe721", + "index": 148, + "guid": "92860c1d-5145-4a81-b091-decbff111c44", + "isActive": false, + "balance": "$3,066.16", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Dorthy Rogers", + "gender": "female", + "company": "SARASONIC", + "email": "dorthyrogers@sarasonic.com", + "phone": "+1 (930) 543-3613", + "address": "859 Pacific Street, Dorneyville, Montana, 6625", + "about": "Lorem ad magna aliqua deserunt mollit duis. Laboris ex ullamco elit dolore adipisicing est esse mollit mollit. Aliquip sint et magna sint do amet quis nulla reprehenderit esse in mollit id dolor. Officia laboris magna ullamco adipisicing amet adipisicing non proident deserunt aute.\r\n", + "registered": "2016-03-13T11:03:28 -06:-30", + "latitude": 48.501519, + "longitude": -2.665044, + "tags": [ + "enim", + "laboris", + "in", + "Lorem", + "veniam", + "consectetur", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Franks Hester" + }, + { + "id": 1, + "name": "Ebony Lawrence" + }, + { + "id": 2, + "name": "Andrea Fowler" + } + ], + "greeting": "Hello, Dorthy Rogers! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbd91ae99ab588130", + "index": 149, + "guid": "bb59faa2-0959-4694-adae-b91947a8c30f", + "isActive": false, + "balance": "$2,348.01", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Chrystal Gross", + "gender": "female", + "company": "SLOFAST", + "email": "chrystalgross@slofast.com", + "phone": "+1 (871) 462-2731", + "address": "268 Lorraine Street, Kilbourne, Hawaii, 9952", + "about": "Ullamco nulla ut cillum commodo nisi. Duis aliquip consectetur deserunt nostrud velit commodo eu incididunt excepteur consectetur nostrud mollit. Id nulla dolor cillum labore dolor sint ea enim labore ea nostrud. Exercitation veniam nulla officia officia do laboris esse aliqua ullamco sit enim.\r\n", + "registered": "2015-08-13T09:23:58 -06:-30", + "latitude": 81.422929, + "longitude": 46.303317, + "tags": [ + "magna", + "reprehenderit", + "duis", + "exercitation", + "anim", + "enim", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Leach Moreno" + }, + { + "id": 1, + "name": "Clarke Marsh" + }, + { + "id": 2, + "name": "Jones Jones" + } + ], + "greeting": "Hello, Chrystal Gross! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1edcbba1a5715c32", + "index": 150, + "guid": "fc422133-b1eb-4027-8501-990d49cdaa89", + "isActive": true, + "balance": "$2,222.08", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Ramsey Flynn", + "gender": "male", + "company": "ISOSWITCH", + "email": "ramseyflynn@isoswitch.com", + "phone": "+1 (928) 599-2662", + "address": "517 Taaffe Place, Waverly, Michigan, 2624", + "about": "Aliquip nostrud et deserunt ad do dolore sint officia nostrud et veniam qui duis. In duis anim nisi voluptate. Enim aute excepteur qui excepteur nisi ipsum esse non in ullamco nostrud in non. Exercitation anim do voluptate commodo officia duis do sunt deserunt est cupidatat. Amet velit labore cupidatat sint velit sit reprehenderit.\r\n", + "registered": "2020-03-13T10:52:31 -06:-30", + "latitude": 48.916275, + "longitude": -118.409, + "tags": [ + "proident", + "eu", + "officia", + "sunt", + "do", + "laborum", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Rosalyn Wood" + }, + { + "id": 1, + "name": "Jane Holt" + }, + { + "id": 2, + "name": "Inez Foreman" + } + ], + "greeting": "Hello, Ramsey Flynn! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbd13f147930aef7d", + "index": 151, + "guid": "bccd4a49-c9c1-4723-bcfe-9f4abaf54497", + "isActive": false, + "balance": "$2,324.57", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "brown", + "name": "Liz Salazar", + "gender": "female", + "company": "MONDICIL", + "email": "lizsalazar@mondicil.com", + "phone": "+1 (862) 482-2192", + "address": "186 Blake Avenue, Shawmut, Maryland, 2832", + "about": "Proident ea et amet occaecat cupidatat amet enim id sint non duis. Minim Lorem nostrud deserunt aute sint exercitation deserunt. Enim incididunt in consectetur reprehenderit duis. Dolor sint tempor veniam aliqua.\r\n", + "registered": "2018-11-23T10:12:00 -06:-30", + "latitude": -0.102375, + "longitude": 43.028187, + "tags": [ + "eu", + "dolore", + "enim", + "sint", + "dolor", + "commodo", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Beatrice Ewing" + }, + { + "id": 1, + "name": "Petra Finch" + }, + { + "id": 2, + "name": "Nita Hoffman" + } + ], + "greeting": "Hello, Liz Salazar! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b69d41e80858b62b6", + "index": 152, + "guid": "9b8533b0-04b8-4b7e-ba30-4ba8ea6c990b", + "isActive": true, + "balance": "$2,477.91", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Morrow James", + "gender": "male", + "company": "PETIGEMS", + "email": "morrowjames@petigems.com", + "phone": "+1 (960) 432-3752", + "address": "583 Pleasant Place, Day, American Samoa, 7019", + "about": "Cillum velit velit ea velit ipsum sit anim officia fugiat sunt. Ex eu aliqua ea occaecat sunt. Occaecat et tempor Lorem nulla. Ut fugiat magna aliqua reprehenderit ipsum et sit magna culpa laborum. Enim id cupidatat incididunt duis enim non voluptate culpa adipisicing nulla nulla.\r\n", + "registered": "2016-06-13T10:27:48 -06:-30", + "latitude": -65.736441, + "longitude": -126.697588, + "tags": [ + "cillum", + "culpa", + "officia", + "nostrud", + "incididunt", + "velit", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Vivian Cervantes" + }, + { + "id": 1, + "name": "Socorro Suarez" + }, + { + "id": 2, + "name": "Lula Hensley" + } + ], + "greeting": "Hello, Morrow James! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b46dabf98abefd972", + "index": 153, + "guid": "d504a457-b9d6-4e75-ad9c-324cc47670a4", + "isActive": true, + "balance": "$1,971.90", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Wagner Gilliam", + "gender": "male", + "company": "REVERSUS", + "email": "wagnergilliam@reversus.com", + "phone": "+1 (833) 554-2880", + "address": "993 Ditmas Avenue, Marion, Illinois, 8426", + "about": "Magna fugiat eu consectetur et ut cupidatat qui excepteur magna ut. Laborum dolore laborum est veniam ipsum consectetur nisi. Ipsum irure in enim do sunt qui est consequat ipsum nostrud sint fugiat. Nisi tempor laborum esse consectetur commodo excepteur laboris nulla.\r\n", + "registered": "2022-06-26T07:13:15 -06:-30", + "latitude": -26.855155, + "longitude": 26.426935, + "tags": [ + "esse", + "ad", + "ipsum", + "officia", + "ea", + "commodo", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Tonia Sheppard" + }, + { + "id": 1, + "name": "Bell Frost" + }, + { + "id": 2, + "name": "Dora Pratt" + } + ], + "greeting": "Hello, Wagner Gilliam! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b91cc70c71657189c", + "index": 154, + "guid": "77050c41-b9ff-4c24-8ede-30af074259b5", + "isActive": true, + "balance": "$2,879.37", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Owens Schultz", + "gender": "male", + "company": "SUREMAX", + "email": "owensschultz@suremax.com", + "phone": "+1 (912) 592-2314", + "address": "797 Laurel Avenue, Idledale, Missouri, 8348", + "about": "Esse est non eiusmod voluptate voluptate ullamco duis cillum. Veniam duis qui duis enim veniam tempor mollit. Reprehenderit anim amet qui nisi irure quis aute id magna aliquip eiusmod excepteur sit.\r\n", + "registered": "2015-09-09T01:21:37 -06:-30", + "latitude": -2.258601, + "longitude": 133.210541, + "tags": [ + "officia", + "irure", + "proident", + "veniam", + "nostrud", + "adipisicing", + "dolore" + ], + "friends": [ + { + "id": 0, + "name": "Mollie Frank" + }, + { + "id": 1, + "name": "Ana Oconnor" + }, + { + "id": 2, + "name": "Dickson Mcdonald" + } + ], + "greeting": "Hello, Owens Schultz! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb09a0a160a31fefe", + "index": 155, + "guid": "181f876a-fd99-4bf9-98c8-1de08748b662", + "isActive": true, + "balance": "$1,368.66", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Karla Roth", + "gender": "female", + "company": "ORGANICA", + "email": "karlaroth@organica.com", + "phone": "+1 (812) 419-3237", + "address": "368 Bridge Street, Boyd, Idaho, 8909", + "about": "Id nostrud duis ex magna consectetur deserunt. Aute enim sint sint aliquip eu exercitation duis et consequat. Reprehenderit eu eu consectetur sunt fugiat qui fugiat. Reprehenderit minim ipsum tempor qui. Ullamco ut voluptate exercitation excepteur cupidatat. Cillum id ea elit veniam enim anim ex consectetur nulla.\r\n", + "registered": "2015-07-31T04:55:02 -06:-30", + "latitude": 15.367727, + "longitude": 92.374312, + "tags": [ + "nulla", + "dolore", + "excepteur", + "nulla", + "et", + "officia", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Mcgee Durham" + }, + { + "id": 1, + "name": "Sally Floyd" + }, + { + "id": 2, + "name": "Gates Best" + } + ], + "greeting": "Hello, Karla Roth! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4baeac4fed73d916fe", + "index": 156, + "guid": "8404dad2-4293-41ef-88de-cb658edeac06", + "isActive": true, + "balance": "$2,074.12", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Bass Swanson", + "gender": "male", + "company": "COMVOY", + "email": "bassswanson@comvoy.com", + "phone": "+1 (944) 493-3226", + "address": "339 Concord Street, Fedora, South Carolina, 5265", + "about": "Laboris dolor et occaecat ex. Irure in do culpa commodo reprehenderit consequat velit quis qui qui nostrud amet aliqua est. Exercitation nulla nostrud cupidatat consectetur aute labore occaecat anim reprehenderit culpa minim duis veniam elit. Consectetur officia proident ea irure ipsum. Nulla tempor eu cillum nisi excepteur aute laborum duis Lorem labore do adipisicing qui nostrud. Pariatur pariatur dolore labore ad.\r\n", + "registered": "2015-04-13T04:35:23 -06:-30", + "latitude": -76.339703, + "longitude": 100.2739, + "tags": [ + "fugiat", + "dolore", + "nisi", + "qui", + "dolore", + "velit", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "Mccoy Singleton" + }, + { + "id": 1, + "name": "Gilliam Holman" + }, + { + "id": 2, + "name": "Velma Espinoza" + } + ], + "greeting": "Hello, Bass Swanson! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4b83dc588268aeb3", + "index": 157, + "guid": "21acb02a-820c-494c-af3b-90ec4f76f210", + "isActive": true, + "balance": "$2,405.56", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Heath Bush", + "gender": "male", + "company": "UNIA", + "email": "heathbush@unia.com", + "phone": "+1 (975) 406-3561", + "address": "483 Cozine Avenue, Lund, Colorado, 4965", + "about": "Ea irure et amet laboris ipsum labore laboris officia ut commodo deserunt ea non. Nostrud est eiusmod cupidatat duis excepteur exercitation velit amet labore ex labore exercitation quis. Consequat est et cupidatat proident qui minim. Id amet consectetur dolore laborum aliqua. Dolore adipisicing cupidatat nostrud eu amet ex quis ut ullamco quis aliqua irure id incididunt.\r\n", + "registered": "2020-10-24T11:37:51 -06:-30", + "latitude": 69.164829, + "longitude": -93.661663, + "tags": [ + "ut", + "dolore", + "aliquip", + "ipsum", + "quis", + "proident", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Ryan Erickson" + }, + { + "id": 1, + "name": "Joanne Horn" + }, + { + "id": 2, + "name": "Cora Gutierrez" + } + ], + "greeting": "Hello, Heath Bush! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf3f98c2a520d3bb5", + "index": 158, + "guid": "0e183dca-1ee1-42e2-8ad8-d6b6f0de841e", + "isActive": true, + "balance": "$3,930.70", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Matilda Mccray", + "gender": "female", + "company": "QIMONK", + "email": "matildamccray@qimonk.com", + "phone": "+1 (802) 531-2209", + "address": "248 Garland Court, Crenshaw, New Hampshire, 4329", + "about": "Aute nostrud adipisicing eu nulla est consequat exercitation esse est aliquip ut id qui magna. Do id excepteur consectetur nostrud ullamco elit incididunt fugiat aliquip enim. Sint sunt quis in sit commodo.\r\n", + "registered": "2021-08-21T03:38:41 -06:-30", + "latitude": -67.913686, + "longitude": -67.363591, + "tags": [ + "deserunt", + "non", + "sunt", + "eu", + "nostrud", + "ea", + "consectetur" + ], + "friends": [ + { + "id": 0, + "name": "Anastasia Atkins" + }, + { + "id": 1, + "name": "Sadie Shaw" + }, + { + "id": 2, + "name": "Loretta Cummings" + } + ], + "greeting": "Hello, Matilda Mccray! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b285ee2940b942a7b", + "index": 159, + "guid": "f6a46315-8e0a-4d63-b37d-d9027652d9ac", + "isActive": false, + "balance": "$2,388.52", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Jeanine Wright", + "gender": "female", + "company": "MUSIX", + "email": "jeaninewright@musix.com", + "phone": "+1 (846) 582-3055", + "address": "391 Schenectady Avenue, Madaket, Minnesota, 1730", + "about": "Consequat veniam nulla cupidatat voluptate. Occaecat nulla excepteur magna velit pariatur elit nulla. Ipsum ipsum ad tempor fugiat enim nostrud velit elit id.\r\n", + "registered": "2021-02-14T05:17:52 -06:-30", + "latitude": 35.491269, + "longitude": -62.038458, + "tags": [ + "veniam", + "deserunt", + "reprehenderit", + "Lorem", + "nostrud", + "aute", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Earnestine Travis" + }, + { + "id": 1, + "name": "Robles Wiley" + }, + { + "id": 2, + "name": "Thornton Burgess" + } + ], + "greeting": "Hello, Jeanine Wright! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b1994a2a6abe157e4", + "index": 160, + "guid": "0ec6d558-bb79-4eaa-9b22-9eb60408ddff", + "isActive": true, + "balance": "$2,112.37", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Oneil Rosales", + "gender": "male", + "company": "PYRAMAX", + "email": "oneilrosales@pyramax.com", + "phone": "+1 (935) 508-2339", + "address": "782 Huron Street, Hebron, Utah, 2386", + "about": "Minim veniam laboris velit Lorem ea aliqua fugiat ad nostrud. Voluptate Lorem in laborum reprehenderit sunt dolor commodo irure anim ipsum veniam et cupidatat cupidatat. Aliqua do do laborum magna cillum nostrud voluptate.\r\n", + "registered": "2018-10-01T01:47:39 -06:-30", + "latitude": 84.337439, + "longitude": 141.604397, + "tags": [ + "esse", + "ut", + "irure", + "sint", + "est", + "eiusmod", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Ruth Silva" + }, + { + "id": 1, + "name": "Lesley Zimmerman" + }, + { + "id": 2, + "name": "Erma Wooten" + } + ], + "greeting": "Hello, Oneil Rosales! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1414b18d5607ece6", + "index": 161, + "guid": "3d358131-c6bd-4035-bf76-0ac54ac3e4c6", + "isActive": true, + "balance": "$2,280.78", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Gamble Oliver", + "gender": "male", + "company": "UTARA", + "email": "gambleoliver@utara.com", + "phone": "+1 (953) 469-2153", + "address": "152 Powers Street, Dargan, South Dakota, 1751", + "about": "Ullamco laborum amet dolore et cillum cillum fugiat id amet ex amet mollit. Ullamco ex minim anim sit dolor nisi ullamco eiusmod dolore ea. Amet cupidatat excepteur laborum sint et ut est aliqua tempor. Fugiat pariatur aute voluptate pariatur eiusmod dolor sit laboris tempor deserunt nulla laboris ex tempor.\r\n", + "registered": "2016-11-08T12:15:49 -06:-30", + "latitude": 80.471736, + "longitude": -110.638836, + "tags": [ + "pariatur", + "aute", + "ex", + "officia", + "anim", + "incididunt", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Lakeisha Turner" + }, + { + "id": 1, + "name": "Wheeler Guthrie" + }, + { + "id": 2, + "name": "Cara Washington" + } + ], + "greeting": "Hello, Gamble Oliver! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b983ae39e3f252900", + "index": 162, + "guid": "d0e24436-f943-45ba-a474-1a2febd20bf5", + "isActive": true, + "balance": "$1,938.60", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Margaret Mann", + "gender": "female", + "company": "ASSURITY", + "email": "margaretmann@assurity.com", + "phone": "+1 (804) 404-2556", + "address": "143 Fenimore Street, Blende, Arizona, 4681", + "about": "Veniam fugiat nulla dolore laboris nisi cupidatat cillum. Nisi exercitation eu anim aute cillum velit reprehenderit amet cupidatat ex proident. Do ipsum laboris elit incididunt cupidatat nostrud duis qui laborum proident deserunt. Excepteur elit voluptate eiusmod elit cillum enim consectetur nostrud duis voluptate reprehenderit ut ea laboris. Consequat quis qui ipsum sint qui commodo proident.\r\n", + "registered": "2019-04-21T09:03:23 -06:-30", + "latitude": 86.070514, + "longitude": 77.595485, + "tags": [ + "aliqua", + "irure", + "pariatur", + "amet", + "dolore", + "consequat", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Lawanda Ingram" + }, + { + "id": 1, + "name": "Carpenter Thornton" + }, + { + "id": 2, + "name": "Page Kirkland" + } + ], + "greeting": "Hello, Margaret Mann! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b736e5aec24fb92ca", + "index": 163, + "guid": "66046942-d8da-4634-9471-7ee7ff739524", + "isActive": false, + "balance": "$3,265.56", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Katheryn Mack", + "gender": "female", + "company": "TWIIST", + "email": "katherynmack@twiist.com", + "phone": "+1 (927) 407-2052", + "address": "462 Albemarle Road, Caron, Marshall Islands, 650", + "about": "Esse pariatur eiusmod incididunt ad Lorem velit. Sunt tempor nulla elit quis veniam excepteur. Enim esse aliquip dolor reprehenderit enim excepteur nulla dolore labore magna. Amet sint non culpa sit incididunt cillum sit.\r\n", + "registered": "2018-12-06T02:50:18 -06:-30", + "latitude": -64.52358, + "longitude": 51.264098, + "tags": [ + "tempor", + "id", + "velit", + "quis", + "magna", + "ex", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Jody Leach" + }, + { + "id": 1, + "name": "Mayer Kelly" + }, + { + "id": 2, + "name": "Tania Knapp" + } + ], + "greeting": "Hello, Katheryn Mack! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3f18f19468bb35e5", + "index": 164, + "guid": "9b0ab1de-176f-46f3-8127-789fd905ee09", + "isActive": false, + "balance": "$3,380.67", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Iris Rice", + "gender": "female", + "company": "PERKLE", + "email": "irisrice@perkle.com", + "phone": "+1 (874) 475-3635", + "address": "556 Cambridge Place, Fontanelle, Ohio, 1572", + "about": "Elit esse consequat cillum amet non aute quis. Aute laboris laborum laboris ut. Consectetur fugiat consectetur laboris consequat reprehenderit quis qui voluptate dolore amet tempor sit in ea. Exercitation aliqua ipsum exercitation ullamco eu proident enim deserunt culpa id. Nisi enim labore magna pariatur id mollit.\r\n", + "registered": "2022-04-25T09:10:57 -06:-30", + "latitude": 42.577341, + "longitude": 152.269849, + "tags": [ + "eu", + "aliqua", + "et", + "nisi", + "voluptate", + "id", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Conrad Fulton" + }, + { + "id": 1, + "name": "Hall Montoya" + }, + { + "id": 2, + "name": "Cherie Warren" + } + ], + "greeting": "Hello, Iris Rice! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b6f8e67998b250899", + "index": 165, + "guid": "57681105-593b-477a-b101-75224ed68210", + "isActive": true, + "balance": "$1,414.67", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Rebecca Romero", + "gender": "female", + "company": "SPRINGBEE", + "email": "rebeccaromero@springbee.com", + "phone": "+1 (942) 519-2287", + "address": "591 Verona Street, Riviera, Alabama, 3666", + "about": "Dolor nulla mollit fugiat cupidatat ullamco. Sint incididunt eiusmod cupidatat enim aute excepteur Lorem occaecat incididunt tempor cupidatat amet. Qui veniam magna aute laboris tempor ad pariatur pariatur. Dolore incididunt excepteur nisi eu laboris esse ea eiusmod elit ipsum. Non cupidatat in quis culpa velit reprehenderit quis ea. Mollit cillum duis laborum ea laborum exercitation.\r\n", + "registered": "2017-08-20T07:56:40 -06:-30", + "latitude": 87.241056, + "longitude": -44.217269, + "tags": [ + "proident", + "aliquip", + "occaecat", + "enim", + "adipisicing", + "ex", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Wilma Franklin" + }, + { + "id": 1, + "name": "Hardy Sharp" + }, + { + "id": 2, + "name": "Elise Burch" + } + ], + "greeting": "Hello, Rebecca Romero! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b27b5ba19b3de09b0", + "index": 166, + "guid": "79025e0d-4a3c-48a7-bd10-5cecf9167e9e", + "isActive": false, + "balance": "$1,624.62", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Rosanna Byers", + "gender": "female", + "company": "STROZEN", + "email": "rosannabyers@strozen.com", + "phone": "+1 (961) 584-3508", + "address": "829 Throop Avenue, Cherokee, Georgia, 2558", + "about": "Officia ex labore labore fugiat nostrud id officia sit deserunt minim. Irure nostrud ipsum eiusmod nulla in est quis. Laborum ea deserunt nisi consectetur. Enim ex incididunt commodo proident laboris cupidatat dolore sunt qui. Irure adipisicing sit ipsum voluptate ipsum eu quis consectetur dolor laboris in anim irure proident. Enim cillum ad magna tempor exercitation ullamco aute et labore consectetur excepteur. Culpa sunt ad voluptate sunt aute aliqua laborum mollit exercitation tempor ex.\r\n", + "registered": "2015-11-09T08:56:25 -06:-30", + "latitude": -0.566952, + "longitude": 127.164456, + "tags": [ + "consectetur", + "quis", + "occaecat", + "nulla", + "mollit", + "est", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Patti Harvey" + }, + { + "id": 1, + "name": "Wanda West" + }, + { + "id": 2, + "name": "Alice Porter" + } + ], + "greeting": "Hello, Rosanna Byers! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdcd589a939aed31b", + "index": 167, + "guid": "c416c12e-242e-4252-aad8-c221c937ed09", + "isActive": true, + "balance": "$2,464.39", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Annmarie Monroe", + "gender": "female", + "company": "MARVANE", + "email": "annmariemonroe@marvane.com", + "phone": "+1 (840) 491-3039", + "address": "862 Forest Place, Tuskahoma, California, 5016", + "about": "Officia eiusmod cupidatat officia Lorem laboris exercitation commodo laboris laborum nisi ea dolor deserunt dolore. Cillum ad et incididunt culpa cupidatat. Amet id id magna incididunt eu cillum eu esse magna sit esse ex do duis. Tempor pariatur dolore do minim. Enim commodo mollit minim reprehenderit.\r\n", + "registered": "2017-01-14T02:02:48 -06:-30", + "latitude": 83.126581, + "longitude": 170.190769, + "tags": [ + "amet", + "aute", + "minim", + "mollit", + "ex", + "aute", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Mclaughlin Lester" + }, + { + "id": 1, + "name": "Irwin Clarke" + }, + { + "id": 2, + "name": "Fisher David" + } + ], + "greeting": "Hello, Annmarie Monroe! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba78aa0fabd049d55", + "index": 168, + "guid": "ab377685-bdbc-496a-a5bc-73d9b9c3eeb6", + "isActive": true, + "balance": "$1,453.31", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "Marlene Hopkins", + "gender": "female", + "company": "BRAINCLIP", + "email": "marlenehopkins@brainclip.com", + "phone": "+1 (981) 442-2826", + "address": "851 Poplar Street, Northchase, Northern Mariana Islands, 4066", + "about": "Deserunt aliqua esse amet dolor reprehenderit culpa amet non esse est ad qui cillum. Consequat labore sint incididunt dolor aute mollit. Aute culpa mollit proident eu Lorem excepteur duis dolor eiusmod cillum sit pariatur officia proident. Nostrud eiusmod do irure qui culpa veniam fugiat eu laboris exercitation. Ea incididunt mollit tempor culpa eu.\r\n", + "registered": "2017-04-14T09:48:06 -06:-30", + "latitude": 6.811668, + "longitude": 66.658322, + "tags": [ + "eiusmod", + "nulla", + "adipisicing", + "eu", + "aliquip", + "ex", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Clare Alston" + }, + { + "id": 1, + "name": "Lenore Mayer" + }, + { + "id": 2, + "name": "Leanne Doyle" + } + ], + "greeting": "Hello, Marlene Hopkins! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd637ab5d0f796972", + "index": 169, + "guid": "8ca244bc-9096-4811-99f7-2c93f7bc8750", + "isActive": true, + "balance": "$1,358.81", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Malone Barnes", + "gender": "male", + "company": "AFFLUEX", + "email": "malonebarnes@affluex.com", + "phone": "+1 (878) 437-2159", + "address": "189 Poplar Avenue, Walland, Kansas, 750", + "about": "Elit ipsum velit voluptate eu. Ullamco tempor culpa consequat cillum dolor. Excepteur cupidatat fugiat labore ex voluptate laboris sit aute veniam exercitation esse labore. Anim nisi pariatur est non nostrud magna mollit ex.\r\n", + "registered": "2017-03-25T04:41:47 -06:-30", + "latitude": -70.339041, + "longitude": 52.987656, + "tags": [ + "veniam", + "labore", + "pariatur", + "ea", + "tempor", + "pariatur", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Mae Barron" + }, + { + "id": 1, + "name": "Theresa Ortiz" + }, + { + "id": 2, + "name": "Tran Valenzuela" + } + ], + "greeting": "Hello, Malone Barnes! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b238ff4cd06bd3183", + "index": 170, + "guid": "d606f595-dfb9-4895-83ab-66127b7d20e2", + "isActive": true, + "balance": "$2,147.47", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Rosemarie Berg", + "gender": "female", + "company": "ANACHO", + "email": "rosemarieberg@anacho.com", + "phone": "+1 (915) 594-2844", + "address": "473 Clara Street, Sunwest, North Dakota, 3095", + "about": "Quis amet dolore dolore esse laboris deserunt. Sunt ut laborum est labore non et ullamco laboris. Aute consequat eu commodo elit ex ipsum in reprehenderit aliquip velit ea. Laborum id laboris eiusmod excepteur duis ad eu. Veniam aliqua do exercitation pariatur laborum nostrud.\r\n", + "registered": "2020-11-29T02:38:06 -06:-30", + "latitude": -10.378067, + "longitude": 117.147321, + "tags": [ + "magna", + "non", + "est", + "consectetur", + "qui", + "deserunt", + "exercitation" + ], + "friends": [ + { + "id": 0, + "name": "Clarissa Dyer" + }, + { + "id": 1, + "name": "Maryanne Andrews" + }, + { + "id": 2, + "name": "Decker Mathews" + } + ], + "greeting": "Hello, Rosemarie Berg! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf3c56e91b91c313a", + "index": 171, + "guid": "dd6abd8c-26ab-465b-b63c-eaea78ea6cc9", + "isActive": true, + "balance": "$1,379.45", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "Smith Coleman", + "gender": "male", + "company": "KEGULAR", + "email": "smithcoleman@kegular.com", + "phone": "+1 (878) 481-3175", + "address": "282 Schermerhorn Street, Richford, New York, 9587", + "about": "Aliquip quis mollit eiusmod eu. Fugiat est in incididunt aliquip sunt. Tempor eiusmod velit mollit nostrud adipisicing nostrud laboris aliqua cupidatat eiusmod sit. Dolore deserunt fugiat sunt aliqua sint reprehenderit deserunt excepteur pariatur culpa ipsum sunt exercitation.\r\n", + "registered": "2015-11-05T04:10:52 -06:-30", + "latitude": -68.918024, + "longitude": -143.804763, + "tags": [ + "magna", + "anim", + "occaecat", + "sunt", + "ut", + "aliqua", + "ipsum" + ], + "friends": [ + { + "id": 0, + "name": "Lavonne Schmidt" + }, + { + "id": 1, + "name": "Briggs Willis" + }, + { + "id": 2, + "name": "Annabelle Ayers" + } + ], + "greeting": "Hello, Smith Coleman! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b72c65c9b9d9d28ca", + "index": 172, + "guid": "98d27ce2-b541-49fd-8e24-0dfbb3f13231", + "isActive": true, + "balance": "$3,922.21", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Aguilar Whitaker", + "gender": "male", + "company": "TROLLERY", + "email": "aguilarwhitaker@trollery.com", + "phone": "+1 (837) 580-2374", + "address": "821 Dupont Street, Kapowsin, New Jersey, 230", + "about": "Ad voluptate esse mollit in nulla incididunt sunt. Nostrud commodo consequat do laborum pariatur nulla dolore ullamco do voluptate eu. Nulla officia irure exercitation veniam sunt officia nostrud est consequat eu ipsum et deserunt. Tempor id ex fugiat commodo commodo.\r\n", + "registered": "2021-03-07T07:57:20 -06:-30", + "latitude": 2.283148, + "longitude": -177.530252, + "tags": [ + "pariatur", + "sit", + "magna", + "do", + "mollit", + "quis", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Stephens Burnett" + }, + { + "id": 1, + "name": "Figueroa Russell" + }, + { + "id": 2, + "name": "Rivera Carney" + } + ], + "greeting": "Hello, Aguilar Whitaker! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1722a1bdd5146d4f", + "index": 173, + "guid": "97456ca3-68e2-445d-b480-46306cedb250", + "isActive": true, + "balance": "$1,670.54", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "green", + "name": "Pam Clark", + "gender": "female", + "company": "ZIDOX", + "email": "pamclark@zidox.com", + "phone": "+1 (830) 477-2797", + "address": "578 Lewis Place, Gambrills, Texas, 6951", + "about": "Enim laboris est enim proident dolore. Tempor proident esse consequat irure dolore minim. Et cillum culpa esse et occaecat qui. Aute eiusmod ea id reprehenderit elit ad sit. Tempor proident sunt Lorem quis est aute. Ea ipsum sunt mollit nisi incididunt aliqua do nostrud.\r\n", + "registered": "2021-11-13T04:12:11 -06:-30", + "latitude": 64.307153, + "longitude": 23.914476, + "tags": [ + "et", + "ad", + "veniam", + "proident", + "magna", + "excepteur", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Allyson Yang" + }, + { + "id": 1, + "name": "Porter Mercer" + }, + { + "id": 2, + "name": "Stuart Lynch" + } + ], + "greeting": "Hello, Pam Clark! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b420d5ad89ee1450e", + "index": 174, + "guid": "16809719-f282-4532-837c-37818dc2798d", + "isActive": false, + "balance": "$3,213.00", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Natalie Perez", + "gender": "female", + "company": "BLANET", + "email": "natalieperez@blanet.com", + "phone": "+1 (850) 590-2036", + "address": "219 Debevoise Avenue, Windsor, Massachusetts, 3158", + "about": "Laboris adipisicing aliqua irure qui adipisicing enim laborum officia laboris sunt nisi quis eiusmod. Dolore ad labore eu sint eiusmod enim aute cillum in sunt deserunt officia. Dolore laborum fugiat dolore occaecat do cupidatat pariatur nostrud ad excepteur elit.\r\n", + "registered": "2015-12-13T07:59:52 -06:-30", + "latitude": -38.934322, + "longitude": 118.902268, + "tags": [ + "aliquip", + "aliqua", + "anim", + "esse", + "fugiat", + "do", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Janine Nash" + }, + { + "id": 1, + "name": "Jo Black" + }, + { + "id": 2, + "name": "Burris Witt" + } + ], + "greeting": "Hello, Natalie Perez! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b6bc886cc0e626479", + "index": 175, + "guid": "8653af13-c8cc-4042-8099-68505a560d8e", + "isActive": true, + "balance": "$3,442.53", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "blue", + "name": "Pearson Trujillo", + "gender": "male", + "company": "CEDWARD", + "email": "pearsontrujillo@cedward.com", + "phone": "+1 (894) 445-2402", + "address": "650 Sunnyside Court, Zortman, Palau, 3695", + "about": "Adipisicing nisi laborum id adipisicing voluptate ea labore et eu aliquip laborum. Duis esse nostrud velit cupidatat fugiat veniam dolor aliqua veniam proident do occaecat amet. Commodo laborum exercitation consectetur consectetur dolore reprehenderit magna occaecat esse aute qui laborum nostrud esse. Lorem sit in adipisicing minim pariatur nostrud qui elit magna duis irure nulla laborum quis. Id cupidatat est qui laborum officia dolor laborum est aliquip aute magna et voluptate. Officia aliqua Lorem veniam quis proident.\r\n", + "registered": "2016-09-11T05:37:17 -06:-30", + "latitude": 51.969802, + "longitude": -100.893343, + "tags": [ + "pariatur", + "minim", + "ex", + "exercitation", + "adipisicing", + "qui", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Rosales Bartlett" + }, + { + "id": 1, + "name": "Daisy Zamora" + }, + { + "id": 2, + "name": "Swanson Lott" + } + ], + "greeting": "Hello, Pearson Trujillo! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b72f56afbfc732004", + "index": 176, + "guid": "3ab550f9-0e56-461d-a9ec-39b0c1b80df7", + "isActive": true, + "balance": "$1,434.34", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Jami Cooley", + "gender": "female", + "company": "HALAP", + "email": "jamicooley@halap.com", + "phone": "+1 (964) 593-3263", + "address": "846 Beach Place, Logan, Alaska, 6902", + "about": "Veniam labore aliquip tempor deserunt incididunt mollit laborum aliquip laborum aliqua. Cupidatat eiusmod nisi deserunt id do elit proident ex. Amet consectetur et dolore commodo laborum officia laboris Lorem sit eu nulla. Fugiat elit nostrud culpa aute ipsum nisi esse.\r\n", + "registered": "2019-09-28T06:53:18 -06:-30", + "latitude": 45.417035, + "longitude": -90.015522, + "tags": [ + "consequat", + "proident", + "consequat", + "veniam", + "et", + "cillum", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Mason Davenport" + }, + { + "id": 1, + "name": "Merrill Long" + }, + { + "id": 2, + "name": "Kasey George" + } + ], + "greeting": "Hello, Jami Cooley! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdb316ecfc651487c", + "index": 177, + "guid": "84d53db8-39d2-4cd4-aa37-d8cc5ba7d452", + "isActive": false, + "balance": "$2,074.46", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Snyder Holloway", + "gender": "male", + "company": "TRIPSCH", + "email": "snyderholloway@tripsch.com", + "phone": "+1 (973) 523-3622", + "address": "810 Bank Street, Caledonia, Oklahoma, 1052", + "about": "Ipsum id veniam tempor duis laborum id nostrud laborum fugiat. Excepteur incididunt laborum laborum enim ipsum. Officia elit reprehenderit incididunt deserunt do laborum aliquip minim pariatur veniam do. Anim magna cupidatat dolor eiusmod. Cupidatat ea deserunt dolore duis incididunt nostrud magna reprehenderit officia mollit dolore. Eu anim aute voluptate consequat id deserunt ex eu sit adipisicing est ipsum tempor.\r\n", + "registered": "2014-01-31T09:19:39 -06:-30", + "latitude": 3.530161, + "longitude": 61.704719, + "tags": [ + "enim", + "ipsum", + "aute", + "est", + "commodo", + "labore", + "enim" + ], + "friends": [ + { + "id": 0, + "name": "Tameka Harmon" + }, + { + "id": 1, + "name": "Cleo Ray" + }, + { + "id": 2, + "name": "Debbie Bauer" + } + ], + "greeting": "Hello, Snyder Holloway! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4baf8298820a967bd8", + "index": 178, + "guid": "be3e6287-9e1a-4bcf-8999-385f9394218e", + "isActive": true, + "balance": "$3,472.87", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Romero Gill", + "gender": "male", + "company": "ORBALIX", + "email": "romerogill@orbalix.com", + "phone": "+1 (868) 497-3548", + "address": "751 Clarendon Road, Urbana, New Mexico, 5533", + "about": "Mollit sit tempor excepteur aute est consectetur fugiat deserunt cillum tempor qui eiusmod duis culpa. Dolore non consectetur in duis sit qui mollit ut nisi nostrud eu eiusmod. Consequat qui culpa laborum tempor voluptate et eiusmod.\r\n", + "registered": "2022-09-28T01:13:20 -06:-30", + "latitude": -25.631899, + "longitude": 55.631976, + "tags": [ + "elit", + "ad", + "pariatur", + "enim", + "adipisicing", + "elit", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Caldwell Stevenson" + }, + { + "id": 1, + "name": "Kline Walter" + }, + { + "id": 2, + "name": "Kay Bird" + } + ], + "greeting": "Hello, Romero Gill! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b789469583ca30e04", + "index": 179, + "guid": "12eda218-4bdd-4f4a-a2af-af07d4cec89b", + "isActive": false, + "balance": "$3,503.47", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "West Hartman", + "gender": "male", + "company": "ZENSOR", + "email": "westhartman@zensor.com", + "phone": "+1 (967) 439-2218", + "address": "688 Loring Avenue, Chesapeake, Wyoming, 4621", + "about": "Lorem Lorem qui elit est culpa. Deserunt excepteur ex minim ea sunt laborum ullamco nulla ad. Aliqua minim elit et et id nostrud labore proident reprehenderit dolore velit exercitation. Veniam aute in nisi sit aute velit voluptate occaecat cupidatat aliquip.\r\n", + "registered": "2021-01-10T07:16:06 -06:-30", + "latitude": 88.792089, + "longitude": -134.954465, + "tags": [ + "occaecat", + "ad", + "enim", + "aliquip", + "officia", + "sunt", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Paula Carroll" + }, + { + "id": 1, + "name": "Paulette Yates" + }, + { + "id": 2, + "name": "Wolfe Hull" + } + ], + "greeting": "Hello, West Hartman! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b98fdb3ecc64a93c8", + "index": 180, + "guid": "84465a4b-db3b-4017-9001-e3c066a6baa1", + "isActive": true, + "balance": "$3,261.93", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Lott Sargent", + "gender": "male", + "company": "GOLOGY", + "email": "lottsargent@gology.com", + "phone": "+1 (817) 595-2921", + "address": "943 Greenpoint Avenue, Why, Rhode Island, 1956", + "about": "Eu quis laboris ex qui. Dolor aliquip elit tempor cillum aliqua exercitation. Laborum in eu deserunt laborum consectetur ut. Id ea enim dolor quis sint. Est aliquip dolor exercitation incididunt id Lorem velit et ea laboris nisi. Anim adipisicing incididunt est eiusmod. Deserunt ullamco sint amet id nisi pariatur dolore ut ipsum velit mollit minim fugiat velit.\r\n", + "registered": "2021-04-13T01:08:59 -06:-30", + "latitude": 9.952211, + "longitude": 119.517541, + "tags": [ + "sint", + "ea", + "Lorem", + "quis", + "velit", + "cillum", + "excepteur" + ], + "friends": [ + { + "id": 0, + "name": "Berry Petersen" + }, + { + "id": 1, + "name": "Johanna Buck" + }, + { + "id": 2, + "name": "Dixon Mcguire" + } + ], + "greeting": "Hello, Lott Sargent! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bc56aa042e70f2566", + "index": 181, + "guid": "37f93242-58f9-4cb6-9cf3-1f07d1c53e72", + "isActive": true, + "balance": "$3,066.65", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Sampson Lara", + "gender": "male", + "company": "KIOSK", + "email": "sampsonlara@kiosk.com", + "phone": "+1 (877) 530-3536", + "address": "961 Varick Avenue, Kula, West Virginia, 2863", + "about": "Do magna irure aliquip eiusmod sit nisi ex. Tempor quis tempor nisi aliqua eu laborum ipsum anim minim deserunt nulla magna consequat qui. Adipisicing dolore pariatur culpa dolore nisi non esse tempor veniam deserunt sunt nostrud laborum.\r\n", + "registered": "2016-04-09T06:13:20 -06:-30", + "latitude": -76.824609, + "longitude": 148.364771, + "tags": [ + "nisi", + "nisi", + "Lorem", + "ut", + "labore", + "ad", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Blevins Benton" + }, + { + "id": 1, + "name": "Mildred Maddox" + }, + { + "id": 2, + "name": "Cherry Boyer" + } + ], + "greeting": "Hello, Sampson Lara! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb051ec283cb82cd1", + "index": 182, + "guid": "411731da-e938-444a-9980-432226166557", + "isActive": true, + "balance": "$3,283.56", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Elma Bowen", + "gender": "female", + "company": "UNEEQ", + "email": "elmabowen@uneeq.com", + "phone": "+1 (893) 560-3093", + "address": "480 Elton Street, Croom, Nevada, 8230", + "about": "Aliquip cillum do officia minim ex eu commodo duis et aliquip elit pariatur consectetur. Non incididunt non commodo irure amet. Enim ea irure nulla consequat amet fugiat nisi mollit incididunt ad amet Lorem dolore nulla. Qui dolore nulla quis sint et amet sunt anim. Incididunt officia ea culpa cillum excepteur aliquip tempor veniam qui do. Veniam tempor et minim nulla adipisicing duis pariatur quis commodo mollit. Elit elit irure tempor amet culpa.\r\n", + "registered": "2020-06-18T06:35:59 -06:-30", + "latitude": 61.226426, + "longitude": -56.395946, + "tags": [ + "commodo", + "fugiat", + "esse", + "esse", + "eiusmod", + "amet", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Nelda Gallegos" + }, + { + "id": 1, + "name": "Pearlie Cobb" + }, + { + "id": 2, + "name": "Shepard Joseph" + } + ], + "greeting": "Hello, Elma Bowen! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b95436e3f3e9a97f8", + "index": 183, + "guid": "528fe959-8817-433d-bedb-59e5a3c78daa", + "isActive": true, + "balance": "$3,282.33", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Patsy Hodges", + "gender": "female", + "company": "HAWKSTER", + "email": "patsyhodges@hawkster.com", + "phone": "+1 (829) 563-2558", + "address": "853 Cox Place, Detroit, Delaware, 7661", + "about": "Cupidatat ad veniam nostrud esse dolore qui. In culpa incididunt sint proident nisi deserunt magna cillum quis incididunt exercitation do dolore. Aliquip voluptate ea veniam mollit amet sint eiusmod tempor excepteur excepteur magna veniam dolor. Aliqua eu nulla do est. Qui irure sunt commodo minim magna.\r\n", + "registered": "2016-10-23T08:39:33 -06:-30", + "latitude": -86.964278, + "longitude": -22.040929, + "tags": [ + "consequat", + "consectetur", + "laborum", + "aliqua", + "aliqua", + "commodo", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Kate Campbell" + }, + { + "id": 1, + "name": "Blankenship Pennington" + }, + { + "id": 2, + "name": "Short Benson" + } + ], + "greeting": "Hello, Patsy Hodges! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b1b00c9e510e80f4b", + "index": 184, + "guid": "2b0d2fd8-b6a6-45c3-8d0a-281829f06896", + "isActive": false, + "balance": "$1,490.88", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Gardner Hanson", + "gender": "male", + "company": "OPPORTECH", + "email": "gardnerhanson@opportech.com", + "phone": "+1 (839) 431-2938", + "address": "781 Arkansas Drive, Elrama, Federated States Of Micronesia, 3885", + "about": "Ipsum excepteur aute commodo sit esse anim consectetur aute nulla ad Lorem. Et consequat laborum duis cillum consectetur voluptate elit laboris incididunt mollit mollit irure. Nulla reprehenderit occaecat cillum incididunt minim. Aute velit commodo esse ut reprehenderit ad dolor pariatur. Adipisicing dolore aute in exercitation velit ex. Nisi pariatur eiusmod labore eiusmod fugiat sit est minim reprehenderit proident. Incididunt ex incididunt Lorem do voluptate ea.\r\n", + "registered": "2014-07-28T04:03:17 -06:-30", + "latitude": -2.715831, + "longitude": 119.99923, + "tags": [ + "proident", + "occaecat", + "laborum", + "esse", + "mollit", + "do", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Talley Norman" + }, + { + "id": 1, + "name": "Bonner Stafford" + }, + { + "id": 2, + "name": "Henrietta Phillips" + } + ], + "greeting": "Hello, Gardner Hanson! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b90b692d4d5f86035", + "index": 185, + "guid": "5afbaef8-e4d0-4989-874d-c7ae235c9700", + "isActive": false, + "balance": "$1,433.83", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Erin Poole", + "gender": "female", + "company": "ZILLACON", + "email": "erinpoole@zillacon.com", + "phone": "+1 (836) 543-2901", + "address": "810 Bedford Place, Sterling, Pennsylvania, 9458", + "about": "Nostrud exercitation commodo cupidatat reprehenderit sunt proident pariatur. Ex dolore labore voluptate voluptate labore anim minim fugiat tempor. Do dolore est proident reprehenderit est do enim. Minim voluptate excepteur mollit enim laboris tempor sint irure. Amet velit eu aliqua velit occaecat ipsum. Consequat in sint aliquip non. Officia non esse irure mollit.\r\n", + "registered": "2021-04-25T07:27:05 -06:-30", + "latitude": -89.773441, + "longitude": 68.954632, + "tags": [ + "excepteur", + "mollit", + "excepteur", + "anim", + "aliquip", + "consequat", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Pollard Woodward" + }, + { + "id": 1, + "name": "Wiley Higgins" + }, + { + "id": 2, + "name": "Thelma Charles" + } + ], + "greeting": "Hello, Erin Poole! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd96e02c89b520546", + "index": 186, + "guid": "b1075d74-0a44-4d2e-97e3-b587dcbb6150", + "isActive": true, + "balance": "$1,919.87", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Teri Todd", + "gender": "female", + "company": "ZEDALIS", + "email": "teritodd@zedalis.com", + "phone": "+1 (802) 472-2845", + "address": "637 Cedar Street, Manchester, Connecticut, 2500", + "about": "Laborum ex veniam esse ipsum eu ad tempor Lorem incididunt cupidatat occaecat veniam. In sint ullamco id pariatur eiusmod magna cupidatat pariatur ullamco duis enim fugiat ad excepteur. Nisi anim officia ex et est culpa nisi ipsum cupidatat nostrud commodo. Id in elit est esse esse.\r\n", + "registered": "2020-02-26T06:26:33 -06:-30", + "latitude": -70.492639, + "longitude": -103.549422, + "tags": [ + "et", + "non", + "laborum", + "cillum", + "aliqua", + "reprehenderit", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Jill Weiss" + }, + { + "id": 1, + "name": "Parsons Whitney" + }, + { + "id": 2, + "name": "Joan Coffey" + } + ], + "greeting": "Hello, Teri Todd! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b1331744b777d952e", + "index": 187, + "guid": "570ba051-4c58-4ebf-a2b4-02833697581f", + "isActive": true, + "balance": "$2,221.51", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Grace Camacho", + "gender": "female", + "company": "TECHADE", + "email": "gracecamacho@techade.com", + "phone": "+1 (845) 404-2471", + "address": "459 Knickerbocker Avenue, Talpa, Louisiana, 6145", + "about": "Magna cillum incididunt est sit incididunt sit consectetur ea officia. Tempor consectetur culpa enim voluptate excepteur reprehenderit anim et commodo consequat do enim amet sit. Et enim aliqua aliqua aliquip reprehenderit eu ullamco anim non dolor officia sunt mollit ut. Duis esse occaecat cupidatat deserunt do amet consectetur eiusmod proident exercitation eiusmod aute voluptate. Dolore officia proident cillum et excepteur anim velit excepteur incididunt. Aute eu pariatur voluptate duis consectetur non excepteur elit ut aliquip dolore ad qui. Laborum fugiat mollit nostrud aute dolor aliquip est proident ullamco ex pariatur adipisicing occaecat.\r\n", + "registered": "2018-05-09T07:01:13 -06:-30", + "latitude": 51.755906, + "longitude": -147.17892, + "tags": [ + "ipsum", + "consequat", + "nisi", + "laboris", + "labore", + "eu", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Reed Randall" + }, + { + "id": 1, + "name": "Ellis Fletcher" + }, + { + "id": 2, + "name": "Mendez Barrera" + } + ], + "greeting": "Hello, Grace Camacho! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0d35e45d6644ba57", + "index": 188, + "guid": "31bd4cd1-6a49-4d35-918c-fb99da9cc894", + "isActive": false, + "balance": "$1,591.49", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Travis Abbott", + "gender": "male", + "company": "PRINTSPAN", + "email": "travisabbott@printspan.com", + "phone": "+1 (887) 583-3018", + "address": "616 Putnam Avenue, Dubois, Vermont, 1037", + "about": "Sint adipisicing minim proident duis ad minim velit. Ipsum duis minim pariatur anim Lorem. Ullamco labore esse enim culpa laborum sunt. Aliquip nulla officia laboris veniam ex adipisicing enim duis mollit incididunt amet fugiat anim cupidatat. Exercitation dolore magna aliqua aliquip nisi adipisicing sint reprehenderit sint pariatur ea commodo deserunt. Ad incididunt consequat cupidatat aliquip reprehenderit amet ex magna deserunt qui aliquip incididunt. Enim nostrud veniam deserunt culpa irure laboris irure Lorem laboris laborum fugiat mollit quis.\r\n", + "registered": "2015-11-11T02:57:08 -06:-30", + "latitude": 79.778232, + "longitude": -54.754761, + "tags": [ + "cupidatat", + "proident", + "veniam", + "eu", + "eu", + "consequat", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Randall Cannon" + }, + { + "id": 1, + "name": "Leonor Carey" + }, + { + "id": 2, + "name": "Rose Drake" + } + ], + "greeting": "Hello, Travis Abbott! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4f5d6ecc28f28ea1", + "index": 189, + "guid": "9f87d60a-95ad-4d58-a142-1240680e20db", + "isActive": true, + "balance": "$2,051.53", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Kellie Castillo", + "gender": "female", + "company": "ORONOKO", + "email": "kelliecastillo@oronoko.com", + "phone": "+1 (966) 525-2919", + "address": "307 Turner Place, Riner, Iowa, 5115", + "about": "Dolor adipisicing excepteur eu aliqua nisi ut aute in aliquip. Eu nostrud aliqua ea laboris commodo minim elit ipsum. Eiusmod non enim veniam duis mollit ullamco labore enim ad sit Lorem proident. Mollit ad irure aliqua aliquip velit commodo adipisicing nulla deserunt. Aute ex duis deserunt exercitation labore minim voluptate consectetur reprehenderit excepteur commodo consequat proident et. Fugiat officia eiusmod cupidatat Lorem enim fugiat tempor. Culpa reprehenderit aliqua dolor sunt pariatur consectetur esse consectetur fugiat velit consequat proident.\r\n", + "registered": "2022-10-03T02:50:55 -06:-30", + "latitude": -44.071797, + "longitude": 9.680767, + "tags": [ + "tempor", + "ut", + "minim", + "amet", + "exercitation", + "duis", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Sandy Stewart" + }, + { + "id": 1, + "name": "Lakisha Avery" + }, + { + "id": 2, + "name": "Carole Meyers" + } + ], + "greeting": "Hello, Kellie Castillo! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf20f9fadfd2d5afe", + "index": 190, + "guid": "aafd9892-03bb-4887-a56f-d8be0575f247", + "isActive": false, + "balance": "$2,911.16", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "brown", + "name": "Rasmussen Butler", + "gender": "male", + "company": "VIAGREAT", + "email": "rasmussenbutler@viagreat.com", + "phone": "+1 (959) 587-2910", + "address": "717 Summit Street, Lynn, Virginia, 6276", + "about": "Adipisicing minim ex proident exercitation est. Laboris aliquip fugiat nisi laborum ex sit. Aute ipsum enim officia magna elit et aliquip culpa. In adipisicing irure qui ex do deserunt irure reprehenderit ipsum occaecat ex ipsum incididunt officia. Consectetur culpa cillum irure quis esse proident aliquip commodo nisi tempor velit sit.\r\n", + "registered": "2016-02-03T12:18:46 -06:-30", + "latitude": 32.39676, + "longitude": 72.387162, + "tags": [ + "duis", + "officia", + "dolor", + "cillum", + "dolore", + "dolore", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Estelle Sexton" + }, + { + "id": 1, + "name": "Joni Harding" + }, + { + "id": 2, + "name": "Conner Livingston" + } + ], + "greeting": "Hello, Rasmussen Butler! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b8ef927d3aa38eae9", + "index": 191, + "guid": "98484414-5110-4cc6-b694-089fd0b1d67f", + "isActive": true, + "balance": "$1,264.39", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Jordan Fitzgerald", + "gender": "female", + "company": "DIGIGENE", + "email": "jordanfitzgerald@digigene.com", + "phone": "+1 (835) 496-3776", + "address": "991 Bay Parkway, Edgar, Maine, 9290", + "about": "Sint proident et mollit eu eu commodo consectetur. Nisi fugiat consequat minim do cillum cupidatat culpa eiusmod ea aute. Ut ad veniam amet irure labore velit incididunt aliquip culpa. Culpa deserunt et eu veniam reprehenderit sint esse eiusmod sit irure reprehenderit nisi non esse. Quis cupidatat aliqua commodo quis officia duis consequat nulla excepteur dolore Lorem excepteur aliquip. Ut adipisicing proident id irure minim adipisicing laboris eu reprehenderit.\r\n", + "registered": "2019-07-26T02:47:41 -06:-30", + "latitude": -63.391385, + "longitude": 25.369237, + "tags": [ + "occaecat", + "reprehenderit", + "adipisicing", + "sit", + "magna", + "non", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Roberts Wells" + }, + { + "id": 1, + "name": "Riddle Hardin" + }, + { + "id": 2, + "name": "Antonia Francis" + } + ], + "greeting": "Hello, Jordan Fitzgerald! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bb64622eb86324fbd", + "index": 192, + "guid": "4488ba49-f933-42c4-85e5-a43dd7cf584c", + "isActive": true, + "balance": "$3,718.01", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "green", + "name": "Sara Cook", + "gender": "female", + "company": "CALCULA", + "email": "saracook@calcula.com", + "phone": "+1 (974) 476-2635", + "address": "673 Bokee Court, Gorham, Nebraska, 6195", + "about": "Reprehenderit pariatur non tempor voluptate cillum enim reprehenderit laborum dolore dolor. Labore commodo in mollit incididunt cupidatat adipisicing labore cillum eiusmod proident sint laborum. Amet pariatur incididunt elit voluptate Lorem officia incididunt excepteur eu ullamco laborum aute enim. Cillum sunt amet incididunt aute. Exercitation duis veniam aliquip cupidatat incididunt aliquip ad ea cillum et consectetur elit.\r\n", + "registered": "2020-08-18T07:09:43 -06:-30", + "latitude": -43.612981, + "longitude": -127.352159, + "tags": [ + "sit", + "labore", + "non", + "dolore", + "elit", + "occaecat", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Valenzuela Gates" + }, + { + "id": 1, + "name": "Cohen Mccarthy" + }, + { + "id": 2, + "name": "Marissa Mccoy" + } + ], + "greeting": "Hello, Sara Cook! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b405cbfba73baf225", + "index": 193, + "guid": "fe73693c-897f-458a-af49-8984bdba42b3", + "isActive": true, + "balance": "$3,025.26", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Bettie Ryan", + "gender": "female", + "company": "CYTREK", + "email": "bettieryan@cytrek.com", + "phone": "+1 (935) 541-2939", + "address": "892 Harkness Avenue, Chamizal, Mississippi, 1222", + "about": "Irure aliqua sint aliquip labore commodo magna ut labore nisi in occaecat reprehenderit velit. Cillum aliqua amet ullamco in incididunt deserunt consequat enim consectetur excepteur ea. Cupidatat cupidatat nulla culpa ex deserunt officia voluptate cupidatat. Enim ea ullamco magna aute commodo nisi adipisicing quis dolore nisi. Dolore irure culpa eiusmod Lorem dolor occaecat culpa ea commodo sint minim. Eu ullamco labore ullamco nulla laborum nisi duis consequat aute elit sit exercitation. Cupidatat aliquip in laborum in laboris.\r\n", + "registered": "2017-12-24T07:44:48 -06:-30", + "latitude": 55.857929, + "longitude": 175.139979, + "tags": [ + "do", + "incididunt", + "qui", + "nulla", + "commodo", + "Lorem", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Francesca Berry" + }, + { + "id": 1, + "name": "Hampton Simmons" + }, + { + "id": 2, + "name": "Sonya Castaneda" + } + ], + "greeting": "Hello, Bettie Ryan! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4be25744beb52f4862", + "index": 194, + "guid": "ff2060ea-5afc-4018-bbbe-9adcc96078b5", + "isActive": false, + "balance": "$2,974.34", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Lamb Hyde", + "gender": "male", + "company": "GEOLOGIX", + "email": "lambhyde@geologix.com", + "phone": "+1 (817) 554-2595", + "address": "233 Paerdegat Avenue, Grill, Indiana, 3681", + "about": "Irure sunt et ut do irure laborum incididunt et. Et voluptate nulla commodo deserunt deserunt in enim pariatur magna. Incididunt laboris reprehenderit dolor veniam laborum aliquip. Duis laboris do ea consequat labore quis minim fugiat ipsum mollit deserunt cillum fugiat.\r\n", + "registered": "2022-08-20T10:36:58 -06:-30", + "latitude": -46.869313, + "longitude": 93.911219, + "tags": [ + "incididunt", + "nulla", + "commodo", + "sunt", + "ut", + "elit", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Leta Welch" + }, + { + "id": 1, + "name": "Finch Stuart" + }, + { + "id": 2, + "name": "Arline Macias" + } + ], + "greeting": "Hello, Lamb Hyde! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bdec8e1e8b8ba2564", + "index": 195, + "guid": "d171e6e1-de8b-4e0c-b662-6411127c792c", + "isActive": false, + "balance": "$1,011.66", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Potts Hale", + "gender": "male", + "company": "EYERIS", + "email": "pottshale@eyeris.com", + "phone": "+1 (940) 481-3394", + "address": "760 Montague Street, Galesville, Guam, 6006", + "about": "Non mollit cillum id amet sunt ut magna pariatur sint eu. Et enim anim officia Lorem irure ex velit ad consequat. Sunt do esse mollit ea nostrud enim ea. Sint ullamco reprehenderit dolor ipsum minim sit veniam culpa ea. Fugiat exercitation incididunt ut irure eu ullamco qui amet aliqua.\r\n", + "registered": "2021-05-21T02:50:39 -06:-30", + "latitude": 3.097701, + "longitude": -95.466453, + "tags": [ + "occaecat", + "minim", + "esse", + "ut", + "enim", + "ullamco", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Kathryn Dean" + }, + { + "id": 1, + "name": "Michael Franco" + }, + { + "id": 2, + "name": "Bailey Mercado" + } + ], + "greeting": "Hello, Potts Hale! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b75cbfd06e35dab9c", + "index": 196, + "guid": "2bf4c497-2979-44c5-a16d-1687c3e2526c", + "isActive": true, + "balance": "$2,334.62", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Kayla Brown", + "gender": "female", + "company": "NETERIA", + "email": "kaylabrown@neteria.com", + "phone": "+1 (845) 434-3121", + "address": "296 Bayview Place, Wyoming, Kentucky, 6928", + "about": "Reprehenderit consequat dolore anim ut ullamco proident proident laborum ad consectetur ea deserunt adipisicing commodo. Ut in magna sit consectetur laboris ea aute quis aute voluptate sint sunt in cillum. Deserunt magna occaecat quis esse excepteur consequat nostrud ullamco sit reprehenderit non.\r\n", + "registered": "2016-02-06T05:08:45 -06:-30", + "latitude": -78.739474, + "longitude": 71.692727, + "tags": [ + "irure", + "consectetur", + "tempor", + "aute", + "nisi", + "amet", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Deanne Simon" + }, + { + "id": 1, + "name": "Holcomb Walker" + }, + { + "id": 2, + "name": "Lily Chandler" + } + ], + "greeting": "Hello, Kayla Brown! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4becd050e97560a580", + "index": 197, + "guid": "66e12ade-d9c8-4c1e-92a4-3d151e87a706", + "isActive": false, + "balance": "$1,928.13", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Elva Merrill", + "gender": "female", + "company": "VOLAX", + "email": "elvamerrill@volax.com", + "phone": "+1 (830) 487-2208", + "address": "317 Ryder Street, Salix, Puerto Rico, 5600", + "about": "Deserunt excepteur eiusmod sit Lorem et eiusmod occaecat exercitation cillum. Incididunt commodo ex elit incididunt commodo non laborum proident. Magna laboris fugiat velit proident ex laboris quis exercitation id in sunt reprehenderit. Do minim laboris cupidatat voluptate amet culpa irure proident ullamco ex anim cupidatat. Do incididunt Lorem aliqua sit sunt dolore nulla dolore qui do aliqua commodo. Est enim labore minim sint duis nulla sit.\r\n", + "registered": "2019-12-12T02:22:12 -06:-30", + "latitude": 52.191293, + "longitude": 107.628537, + "tags": [ + "velit", + "pariatur", + "ipsum", + "fugiat", + "cillum", + "et", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Golden Rivas" + }, + { + "id": 1, + "name": "Yesenia Keith" + }, + { + "id": 2, + "name": "Stacey Mcpherson" + } + ], + "greeting": "Hello, Elva Merrill! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b3051e05c8a107e98", + "index": 198, + "guid": "75241852-a055-4cd9-8352-05e2b2f0b436", + "isActive": true, + "balance": "$2,926.47", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Chelsea Harper", + "gender": "female", + "company": "EQUICOM", + "email": "chelseaharper@equicom.com", + "phone": "+1 (816) 412-3056", + "address": "506 Stoddard Place, Whipholt, North Carolina, 6455", + "about": "Ad nulla exercitation commodo labore labore irure consequat duis sint non. Sunt deserunt anim do ea do dolore est deserunt Lorem. In esse esse aute id irure ea quis elit. Et sit voluptate aliqua sint consequat officia proident. Veniam laborum ex nisi et occaecat. Ullamco non ad ullamco fugiat proident velit ex laboris aliquip ad elit.\r\n", + "registered": "2020-07-11T07:18:03 -06:-30", + "latitude": 77.053235, + "longitude": -137.560189, + "tags": [ + "adipisicing", + "excepteur", + "enim", + "est", + "anim", + "labore", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Maryellen Baird" + }, + { + "id": 1, + "name": "Lee Wagner" + }, + { + "id": 2, + "name": "Holden Boyd" + } + ], + "greeting": "Hello, Chelsea Harper! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b56f1bbecd3b13207", + "index": 199, + "guid": "6b6fba9f-4f22-443d-bf2e-d0856448d245", + "isActive": true, + "balance": "$3,061.96", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Clark Dominguez", + "gender": "male", + "company": "CEMENTION", + "email": "clarkdominguez@cemention.com", + "phone": "+1 (804) 454-2949", + "address": "689 Court Street, Sisquoc, Tennessee, 448", + "about": "Ipsum nulla occaecat consequat sunt quis officia officia ea sint magna. Nisi elit nostrud ullamco ea aliquip sit consequat nulla. Exercitation aliqua qui laborum sint incididunt anim proident eu ea eiusmod enim pariatur irure nisi. Laborum qui ullamco nostrud est do aliqua sit ipsum exercitation veniam culpa qui dolor labore. Enim duis ipsum elit officia excepteur. Dolore consequat et do voluptate excepteur consequat est reprehenderit culpa. Cillum esse voluptate consequat mollit est exercitation cupidatat ea exercitation.\r\n", + "registered": "2016-12-06T08:16:34 -06:-30", + "latitude": 66.425764, + "longitude": -36.333379, + "tags": [ + "consequat", + "do", + "pariatur", + "ipsum", + "minim", + "deserunt", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Bean Moore" + }, + { + "id": 1, + "name": "Thomas Blackburn" + }, + { + "id": 2, + "name": "Roberson Pierce" + } + ], + "greeting": "Hello, Clark Dominguez! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b05ed2bee61dba436", + "index": 200, + "guid": "aded2bba-367a-4630-a955-17ff0ae4caf3", + "isActive": true, + "balance": "$1,288.41", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Glenna Griffin", + "gender": "female", + "company": "ZEROLOGY", + "email": "glennagriffin@zerology.com", + "phone": "+1 (884) 501-2836", + "address": "975 Dorchester Road, Tetherow, Arkansas, 8111", + "about": "Id consectetur ipsum tempor enim cillum irure commodo do est duis Lorem. Ullamco nulla eu ipsum minim aliqua qui nulla. Officia quis incididunt aliqua ut. Pariatur quis labore sunt aute.\r\n", + "registered": "2014-06-13T10:16:20 -06:-30", + "latitude": 57.133, + "longitude": -158.851456, + "tags": [ + "adipisicing", + "dolor", + "eiusmod", + "excepteur", + "cillum", + "eu", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Nixon Schroeder" + }, + { + "id": 1, + "name": "Hayden Garner" + }, + { + "id": 2, + "name": "Jordan Marquez" + } + ], + "greeting": "Hello, Glenna Griffin! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd686961c7870e7df", + "index": 201, + "guid": "f966e07e-b65f-4e5a-8fbc-b817827ce221", + "isActive": false, + "balance": "$3,261.53", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Katie Hudson", + "gender": "female", + "company": "TERRAGEN", + "email": "katiehudson@terragen.com", + "phone": "+1 (856) 544-2836", + "address": "419 Nassau Street, Accoville, Virgin Islands, 4633", + "about": "Lorem culpa adipisicing deserunt eu eu quis exercitation sunt magna. Aliqua anim ea incididunt aliquip dolor duis culpa sint exercitation reprehenderit minim quis elit minim. Esse est dolor aliqua tempor qui magna ipsum tempor. Veniam mollit et exercitation ea. Sint reprehenderit sit cupidatat ea laboris commodo ipsum.\r\n", + "registered": "2017-03-29T01:13:35 -06:-30", + "latitude": 61.659437, + "longitude": 35.430782, + "tags": [ + "cillum", + "ipsum", + "voluptate", + "velit", + "officia", + "ipsum", + "velit" + ], + "friends": [ + { + "id": 0, + "name": "Merritt Freeman" + }, + { + "id": 1, + "name": "Brandie Castro" + }, + { + "id": 2, + "name": "Foreman Bryan" + } + ], + "greeting": "Hello, Katie Hudson! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b4843fafb1a8fb6c1", + "index": 202, + "guid": "32981991-c005-4e9b-9e9a-1a369974f3ac", + "isActive": false, + "balance": "$3,884.93", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Aurelia Webster", + "gender": "female", + "company": "STRALOY", + "email": "aureliawebster@straloy.com", + "phone": "+1 (943) 493-3059", + "address": "766 Quincy Street, Hilltop, Oregon, 8254", + "about": "Sint ullamco aliqua officia culpa voluptate elit id officia ad mollit et nulla. Veniam adipisicing quis veniam occaecat ea qui tempor ex mollit nisi laborum. Ut est nostrud commodo amet eu minim veniam aliqua ad dolore commodo. Id anim Lorem culpa sunt et amet exercitation sit. Excepteur esse tempor reprehenderit exercitation adipisicing nulla consectetur qui in ad. Eu laboris qui ad esse mollit fugiat amet aliqua ex esse fugiat nulla deserunt.\r\n", + "registered": "2021-03-14T05:53:38 -06:-30", + "latitude": -58.226794, + "longitude": -50.861136, + "tags": [ + "sit", + "ex", + "incididunt", + "qui", + "aliqua", + "dolor", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Emily Franks" + }, + { + "id": 1, + "name": "Celina Bridges" + }, + { + "id": 2, + "name": "Jaclyn Keller" + } + ], + "greeting": "Hello, Aurelia Webster! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b41d4a1b27412f962", + "index": 203, + "guid": "9d9a2d16-f074-46d5-9922-ed7f42375fc3", + "isActive": true, + "balance": "$2,490.80", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Krystal Stokes", + "gender": "female", + "company": "BICOL", + "email": "krystalstokes@bicol.com", + "phone": "+1 (803) 520-3877", + "address": "892 Bergen Court, Breinigsville, District Of Columbia, 6451", + "about": "Cillum tempor fugiat duis pariatur quis mollit consequat culpa enim esse aliquip aute. Dolore aliqua veniam proident consectetur. Magna excepteur nostrud officia dolore aliquip enim ullamco consectetur laboris. Et nisi consectetur est non veniam occaecat magna sunt ad. Voluptate ea do nostrud veniam officia enim dolor. Nulla occaecat magna consequat labore anim aute pariatur reprehenderit dolor. Fugiat consectetur qui laborum aliquip anim deserunt ea excepteur in ex incididunt ullamco ad.\r\n", + "registered": "2016-10-16T04:47:31 -06:-30", + "latitude": -7.899553, + "longitude": -62.50176, + "tags": [ + "exercitation", + "occaecat", + "non", + "in", + "commodo", + "ipsum", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Serrano Hodge" + }, + { + "id": 1, + "name": "Elena Fisher" + }, + { + "id": 2, + "name": "Brandi Herring" + } + ], + "greeting": "Hello, Krystal Stokes! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b22d0a9e390786e5d", + "index": 204, + "guid": "761f5bf4-9bf7-4fdd-a34d-62e4b10bc28c", + "isActive": false, + "balance": "$3,816.63", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Lucia Morrow", + "gender": "female", + "company": "JUMPSTACK", + "email": "luciamorrow@jumpstack.com", + "phone": "+1 (803) 407-2138", + "address": "406 Adams Street, Hall, Florida, 1700", + "about": "In minim exercitation amet in excepteur commodo ullamco in nisi ipsum. Qui incididunt ea qui velit velit culpa do. Eiusmod ex id exercitation qui sint pariatur magna.\r\n", + "registered": "2017-01-21T09:12:58 -06:-30", + "latitude": 8.875525, + "longitude": -4.868289, + "tags": [ + "occaecat", + "dolore", + "sit", + "sunt", + "ut", + "sunt", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Olga Ramos" + }, + { + "id": 1, + "name": "Corinne Lawson" + }, + { + "id": 2, + "name": "Burch Carpenter" + } + ], + "greeting": "Hello, Lucia Morrow! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b4c4a47b9b3210ede", + "index": 205, + "guid": "d941b605-7a77-4773-934d-2bb910e8f130", + "isActive": false, + "balance": "$1,549.02", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Lillie Head", + "gender": "female", + "company": "KAGGLE", + "email": "lilliehead@kaggle.com", + "phone": "+1 (836) 476-3002", + "address": "624 Just Court, Faywood, Washington, 1671", + "about": "Laboris labore ad velit culpa minim nulla aute nulla reprehenderit aute culpa. Enim elit eu proident magna Lorem laboris sunt. Tempor exercitation aliquip minim anim ea elit anim mollit nostrud excepteur deserunt et duis non. Irure incididunt exercitation commodo dolor nisi mollit qui amet et ut. Cupidatat ipsum ullamco fugiat laboris aliquip adipisicing mollit sunt. Nostrud aliquip voluptate esse amet ipsum labore nisi Lorem ipsum et ullamco est minim. Excepteur laborum nulla commodo dolor proident et occaecat esse voluptate non id ipsum ea.\r\n", + "registered": "2016-10-02T04:24:28 -06:-30", + "latitude": 1.275736, + "longitude": 22.750018, + "tags": [ + "consectetur", + "culpa", + "nostrud", + "veniam", + "tempor", + "et", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Ray Galloway" + }, + { + "id": 1, + "name": "Hull Everett" + }, + { + "id": 2, + "name": "Trevino Mckinney" + } + ], + "greeting": "Hello, Lillie Head! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b798f34052e3c8d13", + "index": 206, + "guid": "a0e369bf-5fb0-4d8e-8cf5-4d9bf6050603", + "isActive": false, + "balance": "$1,192.19", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Salas Irwin", + "gender": "male", + "company": "KOOGLE", + "email": "salasirwin@koogle.com", + "phone": "+1 (890) 406-2735", + "address": "424 Otsego Street, Farmington, Montana, 2494", + "about": "Nostrud ipsum fugiat nisi cupidatat. Mollit labore fugiat labore laborum culpa aute ea ea officia ut occaecat do. Elit qui velit ea quis dolor sit sint nisi id enim. Culpa amet voluptate eu irure est reprehenderit Lorem amet esse et occaecat nisi. Non ut est cupidatat quis sunt ad culpa id do.\r\n", + "registered": "2019-08-14T12:53:52 -06:-30", + "latitude": -75.493248, + "longitude": 146.149892, + "tags": [ + "nisi", + "Lorem", + "anim", + "deserunt", + "sunt", + "qui", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Valeria Powers" + }, + { + "id": 1, + "name": "Petty Patton" + }, + { + "id": 2, + "name": "Dale Serrano" + } + ], + "greeting": "Hello, Salas Irwin! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bf5301f2aed6847f6", + "index": 207, + "guid": "2a9ef00b-5fdd-41ab-b25a-f88fd7356bd0", + "isActive": false, + "balance": "$2,963.32", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Maldonado Cabrera", + "gender": "male", + "company": "FISHLAND", + "email": "maldonadocabrera@fishland.com", + "phone": "+1 (966) 568-2103", + "address": "609 Devoe Street, Topaz, Hawaii, 131", + "about": "Aliquip labore reprehenderit id voluptate laborum qui. Cillum adipisicing eiusmod cupidatat occaecat incididunt enim cillum. Aliquip quis sunt reprehenderit consectetur fugiat quis mollit exercitation in fugiat enim mollit pariatur enim. Anim voluptate id laborum quis id. Sint dolore dolor cillum sint voluptate anim commodo laboris sunt officia deserunt ea. Elit pariatur sit anim dolore. Laborum dolore cillum veniam consectetur adipisicing reprehenderit.\r\n", + "registered": "2021-07-01T10:41:34 -06:-30", + "latitude": -62.312605, + "longitude": -54.742829, + "tags": [ + "magna", + "elit", + "occaecat", + "tempor", + "laboris", + "duis", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Levy Dennis" + }, + { + "id": 1, + "name": "Evelyn Figueroa" + }, + { + "id": 2, + "name": "Garrison Gardner" + } + ], + "greeting": "Hello, Maldonado Cabrera! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bffce2a9ad2d5b4cd", + "index": 208, + "guid": "203a585b-5cef-42ea-bcf8-5c0254e508fb", + "isActive": false, + "balance": "$3,678.77", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "green", + "name": "Boone Hinton", + "gender": "male", + "company": "VIRXO", + "email": "boonehinton@virxo.com", + "phone": "+1 (827) 448-3276", + "address": "207 Keap Street, Belleview, Michigan, 5274", + "about": "Quis sit mollit ad eu. Ipsum elit et voluptate laborum mollit duis adipisicing do nostrud minim. Commodo consequat est in ut sit. Nisi qui laboris consectetur pariatur. In cupidatat aliquip officia voluptate quis eu nostrud fugiat magna.\r\n", + "registered": "2020-08-18T02:29:31 -06:-30", + "latitude": -47.028963, + "longitude": -68.550152, + "tags": [ + "id", + "amet", + "culpa", + "aliqua", + "pariatur", + "nulla", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Marjorie Rios" + }, + { + "id": 1, + "name": "Sheri Mcclain" + }, + { + "id": 2, + "name": "Craig Hammond" + } + ], + "greeting": "Hello, Boone Hinton! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b45f5eb079f58e56a", + "index": 209, + "guid": "9c6c579f-1f53-4f5b-81c3-202f8b863ea3", + "isActive": false, + "balance": "$1,570.73", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Fern Cantu", + "gender": "female", + "company": "SOFTMICRO", + "email": "ferncantu@softmicro.com", + "phone": "+1 (961) 493-2203", + "address": "269 Wakeman Place, Corinne, Maryland, 2530", + "about": "Dolor sunt magna ullamco dolore. Magna in sit eiusmod ipsum sint ea aliquip est quis eiusmod elit nulla. Occaecat incididunt minim aliqua ipsum ullamco proident adipisicing consectetur in exercitation aute pariatur. Ullamco ad consectetur culpa culpa ad Lorem eiusmod dolore ipsum laboris.\r\n", + "registered": "2015-06-21T11:35:11 -06:-30", + "latitude": 10.038117, + "longitude": -177.403381, + "tags": [ + "consectetur", + "voluptate", + "et", + "exercitation", + "adipisicing", + "exercitation", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Sexton Mcintyre" + }, + { + "id": 1, + "name": "Dixie Goodman" + }, + { + "id": 2, + "name": "Candy Trevino" + } + ], + "greeting": "Hello, Fern Cantu! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bd13dfa8ee71fbf19", + "index": 210, + "guid": "c3a4d6ce-160e-4344-bf4f-b4de8b25b03c", + "isActive": false, + "balance": "$1,867.41", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Holder King", + "gender": "male", + "company": "BLEEKO", + "email": "holderking@bleeko.com", + "phone": "+1 (800) 456-2980", + "address": "544 Kossuth Place, Gouglersville, American Samoa, 8025", + "about": "Ut est cillum nisi elit proident. Ea aute elit reprehenderit excepteur veniam cupidatat irure dolore exercitation. Duis est veniam exercitation qui dolor. Pariatur et mollit ullamco ad elit fugiat. Sint quis non veniam aliquip sit magna aliqua dolor quis sunt eiusmod dolore fugiat Lorem. Labore voluptate commodo in consectetur sit nisi exercitation dolore irure.\r\n", + "registered": "2015-07-11T10:43:11 -06:-30", + "latitude": -11.805759, + "longitude": -70.233449, + "tags": [ + "sit", + "fugiat", + "adipisicing", + "nulla", + "dolore", + "laboris", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Eva Rodriquez" + }, + { + "id": 1, + "name": "Neal Case" + }, + { + "id": 2, + "name": "Tanya Copeland" + } + ], + "greeting": "Hello, Holder King! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bafe81c8bb1e2976c", + "index": 211, + "guid": "49633480-7eaa-41cd-b782-d08151a89b91", + "isActive": true, + "balance": "$1,023.96", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "brown", + "name": "Nancy Herrera", + "gender": "female", + "company": "SONGBIRD", + "email": "nancyherrera@songbird.com", + "phone": "+1 (838) 507-2826", + "address": "429 Huntington Street, Barclay, Illinois, 5486", + "about": "Quis aliqua ullamco Lorem officia irure reprehenderit consectetur tempor cillum labore do occaecat. Culpa ipsum qui non voluptate. Est ullamco laboris magna amet id veniam. Elit eiusmod aliqua sint sit sunt irure. Nisi elit reprehenderit ad et consectetur amet.\r\n", + "registered": "2015-06-08T10:00:46 -06:-30", + "latitude": -17.402294, + "longitude": 38.932106, + "tags": [ + "cupidatat", + "deserunt", + "Lorem", + "elit", + "est", + "officia", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Bridget Glass" + }, + { + "id": 1, + "name": "Mclean Salas" + }, + { + "id": 2, + "name": "Stella Greer" + } + ], + "greeting": "Hello, Nancy Herrera! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b91e3e7f6b6bd187a", + "index": 212, + "guid": "eaa46b40-8180-46cf-a8f5-7157c3eb9d58", + "isActive": true, + "balance": "$2,639.96", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "brown", + "name": "Wyatt Britt", + "gender": "male", + "company": "FURNAFIX", + "email": "wyattbritt@furnafix.com", + "phone": "+1 (974) 565-3410", + "address": "512 Linden Street, Sanborn, Missouri, 1507", + "about": "Nulla aute nostrud veniam id proident enim sint nostrud labore. Dolore consequat cupidatat dolor quis id quis laboris laboris dolor amet aliqua occaecat ea. Nisi veniam eiusmod laborum anim veniam. Culpa veniam mollit qui officia labore enim dolor pariatur incididunt aute. Laborum magna excepteur officia ut cupidatat nulla labore eu duis ea esse. Qui ullamco aliqua fugiat veniam occaecat aliquip aute reprehenderit laboris irure nisi irure qui ullamco.\r\n", + "registered": "2022-10-07T08:59:50 -06:-30", + "latitude": 50.056776, + "longitude": -35.948881, + "tags": [ + "enim", + "labore", + "ullamco", + "consequat", + "dolor", + "labore", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Tamera Leonard" + }, + { + "id": 1, + "name": "Tammy Mason" + }, + { + "id": 2, + "name": "Reyes Bishop" + } + ], + "greeting": "Hello, Wyatt Britt! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b4099cc866bd9baad", + "index": 213, + "guid": "75ad677f-1821-48c2-b434-3e3995edb11b", + "isActive": true, + "balance": "$1,817.28", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "blue", + "name": "Walter Hansen", + "gender": "male", + "company": "OMATOM", + "email": "walterhansen@omatom.com", + "phone": "+1 (973) 531-3620", + "address": "616 Pioneer Street, Shepardsville, Idaho, 9406", + "about": "Fugiat fugiat exercitation ut sit esse irure aliqua laboris ex dolor occaecat. Laborum ad nulla nulla id enim nisi laboris eu veniam anim. Id eiusmod labore est pariatur non ut esse veniam mollit in id occaecat. Labore deserunt non ex ut. Est occaecat mollit anim commodo veniam deserunt commodo ad enim. Aliquip aliqua non excepteur ex dolore qui non laborum pariatur ut do eiusmod.\r\n", + "registered": "2022-02-09T10:10:49 -06:-30", + "latitude": 80.119521, + "longitude": -67.582642, + "tags": [ + "exercitation", + "officia", + "aute", + "ad", + "aliquip", + "ea", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Leah Mendez" + }, + { + "id": 1, + "name": "Meyer Burks" + }, + { + "id": 2, + "name": "Mattie Shepard" + } + ], + "greeting": "Hello, Walter Hansen! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be0081dccdd034fa5", + "index": 214, + "guid": "f5756e79-95d4-4d45-b7b3-18f5d8b47848", + "isActive": true, + "balance": "$2,990.40", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Chandler Reynolds", + "gender": "male", + "company": "EXOTERIC", + "email": "chandlerreynolds@exoteric.com", + "phone": "+1 (829) 530-3921", + "address": "345 Roosevelt Court, Darrtown, South Carolina, 1776", + "about": "Eiusmod elit amet sit nulla id ex cillum aliquip irure velit aute mollit non. Est in id anim dolore cillum commodo. Reprehenderit mollit ad do occaecat ullamco laboris qui. Est eiusmod mollit deserunt velit mollit officia amet consectetur occaecat et dolore ex consectetur esse.\r\n", + "registered": "2018-10-09T02:14:35 -06:-30", + "latitude": -84.932883, + "longitude": -9.268858, + "tags": [ + "quis", + "et", + "sint", + "enim", + "sint", + "qui", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Huff Dunlap" + }, + { + "id": 1, + "name": "Elaine Tillman" + }, + { + "id": 2, + "name": "Cummings Bray" + } + ], + "greeting": "Hello, Chandler Reynolds! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bc7258dc744d3f5ba", + "index": 215, + "guid": "b50a51b6-d130-4dba-a362-d629fbd4c79c", + "isActive": true, + "balance": "$3,724.25", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Gwen Townsend", + "gender": "female", + "company": "EWAVES", + "email": "gwentownsend@ewaves.com", + "phone": "+1 (870) 557-3190", + "address": "347 Hubbard Place, Epworth, Colorado, 6455", + "about": "Amet consectetur ut et nulla magna qui. Dolor minim culpa occaecat in reprehenderit ut elit magna esse cupidatat. Minim ipsum fugiat occaecat in laborum. Adipisicing mollit amet non qui. Proident duis occaecat culpa enim tempor ipsum est quis consectetur tempor occaecat laboris.\r\n", + "registered": "2017-12-04T06:05:03 -06:-30", + "latitude": -3.670858, + "longitude": 145.368259, + "tags": [ + "magna", + "laboris", + "nisi", + "anim", + "sunt", + "ut", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Rosella Campos" + }, + { + "id": 1, + "name": "Dotson Santana" + }, + { + "id": 2, + "name": "Kane Vang" + } + ], + "greeting": "Hello, Gwen Townsend! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b5bde0130013c4745", + "index": 216, + "guid": "a64e7c84-5206-4d4a-afbc-16c17e1051a3", + "isActive": true, + "balance": "$3,837.58", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Debra Cunningham", + "gender": "female", + "company": "ENTALITY", + "email": "debracunningham@entality.com", + "phone": "+1 (898) 572-2796", + "address": "933 Dunham Place, Kohatk, New Hampshire, 7525", + "about": "Ea commodo nisi minim occaecat labore magna minim. Elit aliqua ipsum anim est amet. Amet esse tempor Lorem voluptate excepteur pariatur velit qui fugiat ex. Ex est non labore ex et elit id nisi nostrud ad voluptate. Dolor consequat elit ullamco nisi do minim amet ex fugiat culpa. Ipsum aliquip pariatur exercitation aliquip eiusmod elit consequat do laboris voluptate ut laborum.\r\n", + "registered": "2021-01-13T06:02:59 -06:-30", + "latitude": 32.439021, + "longitude": -81.749391, + "tags": [ + "veniam", + "do", + "ex", + "dolore", + "occaecat", + "enim", + "in" + ], + "friends": [ + { + "id": 0, + "name": "Diaz Burton" + }, + { + "id": 1, + "name": "Johnson Ratliff" + }, + { + "id": 2, + "name": "Ross Jimenez" + } + ], + "greeting": "Hello, Debra Cunningham! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be512da7cb7f74fff", + "index": 217, + "guid": "9f8d7248-1578-4f66-9460-3777d4ecb73f", + "isActive": true, + "balance": "$2,013.96", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Crane Houston", + "gender": "male", + "company": "RUGSTARS", + "email": "cranehouston@rugstars.com", + "phone": "+1 (837) 479-3832", + "address": "568 Remsen Street, Vowinckel, Minnesota, 706", + "about": "Adipisicing amet qui tempor cupidatat non ea commodo. Tempor amet consequat anim laboris ex nulla. Reprehenderit culpa excepteur est exercitation Lorem laboris. Laboris tempor fugiat elit quis cillum in pariatur esse est enim pariatur id. Est quis esse dolore laborum cillum enim velit exercitation est irure dolor non culpa fugiat. Adipisicing elit sint veniam ut aute fugiat. Cupidatat excepteur veniam adipisicing duis culpa in nisi occaecat nulla in culpa elit ut.\r\n", + "registered": "2021-01-15T11:24:55 -06:-30", + "latitude": 48.626303, + "longitude": 32.071564, + "tags": [ + "proident", + "enim", + "amet", + "tempor", + "exercitation", + "in", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Shepherd Garcia" + }, + { + "id": 1, + "name": "Parrish Klein" + }, + { + "id": 2, + "name": "Jolene Dixon" + } + ], + "greeting": "Hello, Crane Houston! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b21c0bcb2afcb785a", + "index": 218, + "guid": "56d5be4a-9e4e-4ba9-959d-776c0d547053", + "isActive": false, + "balance": "$2,516.31", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Patterson Golden", + "gender": "male", + "company": "EGYPTO", + "email": "pattersongolden@egypto.com", + "phone": "+1 (846) 562-3090", + "address": "252 Hopkins Street, Bagtown, Utah, 5836", + "about": "Consequat amet eiusmod consectetur aliqua quis sunt excepteur eiusmod. Aliquip aliquip laborum dolor occaecat eu. Consectetur deserunt minim veniam irure cupidatat aliqua et ad minim est cupidatat. Sint adipisicing laborum aliquip labore amet laboris ut reprehenderit amet sint. Officia consectetur velit id proident dolor magna sint elit laboris in deserunt. Excepteur irure cupidatat veniam mollit anim non fugiat ullamco eiusmod culpa velit. Et consequat ipsum officia in esse ad consequat cillum consequat dolor qui.\r\n", + "registered": "2014-01-19T10:15:35 -06:-30", + "latitude": 30.440313, + "longitude": 52.453754, + "tags": [ + "aliquip", + "esse", + "ad", + "elit", + "minim", + "anim", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Chasity Leon" + }, + { + "id": 1, + "name": "Priscilla Logan" + }, + { + "id": 2, + "name": "Jessie Leblanc" + } + ], + "greeting": "Hello, Patterson Golden! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b61a63cb08a70abfe", + "index": 219, + "guid": "4d7cbb92-bffb-4e8e-ac20-7981ff57e18f", + "isActive": true, + "balance": "$1,932.08", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Vaughan Sherman", + "gender": "male", + "company": "BIZMATIC", + "email": "vaughansherman@bizmatic.com", + "phone": "+1 (814) 476-2649", + "address": "202 Amboy Street, Colton, South Dakota, 2237", + "about": "Cupidatat sunt nisi enim ad exercitation. Ullamco cillum et occaecat adipisicing ea consequat pariatur adipisicing labore quis officia. Non veniam nostrud enim deserunt qui labore do.\r\n", + "registered": "2015-09-30T10:48:29 -06:-30", + "latitude": 12.059653, + "longitude": 4.384365, + "tags": [ + "aute", + "laborum", + "eu", + "culpa", + "exercitation", + "laboris", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Harrington Potts" + }, + { + "id": 1, + "name": "Gail Albert" + }, + { + "id": 2, + "name": "Marla Davidson" + } + ], + "greeting": "Hello, Vaughan Sherman! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bd75780c763122158", + "index": 220, + "guid": "53f9d7a3-0d9b-40e2-bc09-5b75713bc55b", + "isActive": false, + "balance": "$1,133.80", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Alston Mills", + "gender": "male", + "company": "SLAMBDA", + "email": "alstonmills@slambda.com", + "phone": "+1 (990) 499-2624", + "address": "837 Nolans Lane, Marenisco, Arizona, 1583", + "about": "Dolore tempor velit elit proident elit commodo minim irure nulla magna consequat voluptate. Enim eiusmod culpa dolor amet esse ea. Veniam exercitation do ex eu magna magna id exercitation sint. Dolore consectetur dolore sint nisi nulla nisi nulla dolore id culpa pariatur eiusmod mollit commodo. Eiusmod sint nulla nisi consequat eiusmod est anim tempor id Lorem.\r\n", + "registered": "2018-06-25T05:20:55 -06:-30", + "latitude": -31.745676, + "longitude": -156.363099, + "tags": [ + "Lorem", + "veniam", + "irure", + "adipisicing", + "anim", + "ad", + "irure" + ], + "friends": [ + { + "id": 0, + "name": "Reba Stark" + }, + { + "id": 1, + "name": "Kristina Curry" + }, + { + "id": 2, + "name": "Miranda Potter" + } + ], + "greeting": "Hello, Alston Mills! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b075cd19d64af4563", + "index": 221, + "guid": "f5603316-c052-44a0-8a92-b9e61ff3db14", + "isActive": false, + "balance": "$1,725.90", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Gallagher Guerrero", + "gender": "male", + "company": "DUFLEX", + "email": "gallagherguerrero@duflex.com", + "phone": "+1 (872) 483-3458", + "address": "669 Dekalb Avenue, Mammoth, Marshall Islands, 1051", + "about": "Proident cupidatat esse nulla laboris consectetur excepteur nostrud ipsum qui. Occaecat eu do culpa excepteur ad excepteur anim cupidatat ipsum consequat velit magna amet ipsum. Non adipisicing dolore ea exercitation enim in tempor consectetur eu et voluptate labore. Deserunt quis veniam quis velit ipsum cillum. Officia ut incididunt quis minim labore fugiat elit officia. Ut esse ea eu amet minim nostrud fugiat deserunt ipsum aliquip ipsum.\r\n", + "registered": "2018-08-15T08:46:45 -06:-30", + "latitude": -70.322842, + "longitude": -21.909698, + "tags": [ + "sit", + "culpa", + "pariatur", + "qui", + "tempor", + "enim", + "consectetur" + ], + "friends": [ + { + "id": 0, + "name": "Ina Richardson" + }, + { + "id": 1, + "name": "Johnnie Sandoval" + }, + { + "id": 2, + "name": "Whitney Dillon" + } + ], + "greeting": "Hello, Gallagher Guerrero! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bff58c6b3d4cdd9e4", + "index": 222, + "guid": "41793756-f418-436d-bf29-84c5f01e0c34", + "isActive": true, + "balance": "$2,175.31", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "green", + "name": "Constance Joyce", + "gender": "female", + "company": "GROK", + "email": "constancejoyce@grok.com", + "phone": "+1 (947) 467-2203", + "address": "466 Engert Avenue, Belgreen, Ohio, 5195", + "about": "Quis consequat velit enim dolore minim pariatur nulla culpa deserunt minim minim excepteur. Exercitation ut labore nisi ullamco consectetur aute ex laborum amet enim in. Reprehenderit id minim tempor reprehenderit enim id enim pariatur dolor anim. Incididunt labore laborum proident incididunt mollit ea culpa non ea magna duis labore sunt consequat.\r\n", + "registered": "2021-01-11T09:22:50 -06:-30", + "latitude": 38.331391, + "longitude": -133.051569, + "tags": [ + "proident", + "velit", + "aliqua", + "sunt", + "elit", + "adipisicing", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Ingrid Rodgers" + }, + { + "id": 1, + "name": "Lola Walton" + }, + { + "id": 2, + "name": "Hess Perry" + } + ], + "greeting": "Hello, Constance Joyce! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b356f9f4699e2b557", + "index": 223, + "guid": "46605ea1-03ad-4255-8eb6-7f4e655031e1", + "isActive": false, + "balance": "$3,277.42", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Jan Short", + "gender": "female", + "company": "RONELON", + "email": "janshort@ronelon.com", + "phone": "+1 (877) 488-2124", + "address": "981 Bartlett Street, Balm, Alabama, 2818", + "about": "Culpa veniam veniam ex exercitation. Nisi magna velit excepteur adipisicing eu eiusmod elit minim aute tempor aute eu qui dolor. Incididunt aliqua aliqua anim in eu esse pariatur nisi et minim consequat anim eiusmod fugiat. Eiusmod eiusmod Lorem eiusmod ullamco incididunt ut et magna aute ut laboris incididunt et aute. Quis culpa voluptate exercitation amet qui aliquip sint. Officia esse do voluptate dolor eu sunt ex duis consectetur dolore in velit. Lorem excepteur eiusmod aliqua sunt labore cillum anim exercitation dolor.\r\n", + "registered": "2014-10-08T07:58:24 -06:-30", + "latitude": 74.39662, + "longitude": 44.189216, + "tags": [ + "esse", + "velit", + "quis", + "aute", + "laborum", + "labore", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Gonzalez Goff" + }, + { + "id": 1, + "name": "Johnston Wolf" + }, + { + "id": 2, + "name": "Desiree Green" + } + ], + "greeting": "Hello, Jan Short! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b41c9dddb2180d350", + "index": 224, + "guid": "38d2e9a6-cc6f-4d7d-a073-dc32db514b5b", + "isActive": true, + "balance": "$3,966.89", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Clarice Robinson", + "gender": "female", + "company": "TERASCAPE", + "email": "claricerobinson@terascape.com", + "phone": "+1 (938) 442-3198", + "address": "903 Arion Place, Cotopaxi, Georgia, 4441", + "about": "Incididunt dolore duis qui reprehenderit do pariatur anim. Anim reprehenderit aliqua do occaecat elit. Adipisicing occaecat pariatur anim non commodo nostrud nostrud sint officia. Laborum esse officia officia dolore.\r\n", + "registered": "2014-08-13T10:57:27 -06:-30", + "latitude": -19.115478, + "longitude": -45.438159, + "tags": [ + "exercitation", + "in", + "reprehenderit", + "voluptate", + "consequat", + "est", + "velit" + ], + "friends": [ + { + "id": 0, + "name": "Long Mullen" + }, + { + "id": 1, + "name": "Gabrielle Manning" + }, + { + "id": 2, + "name": "Day Whitley" + } + ], + "greeting": "Hello, Clarice Robinson! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd99ada27e0acd21c", + "index": 225, + "guid": "0846617d-83a3-4bc2-8738-83dee9ee124e", + "isActive": true, + "balance": "$3,042.57", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Santana Odom", + "gender": "male", + "company": "ISOSURE", + "email": "santanaodom@isosure.com", + "phone": "+1 (923) 401-2143", + "address": "759 McKibben Street, Kansas, California, 7175", + "about": "Laborum quis ad ullamco fugiat ut adipisicing eu nulla ipsum ullamco nulla eiusmod deserunt. Sit anim culpa commodo sunt cillum laboris reprehenderit. Ipsum officia deserunt irure magna mollit.\r\n", + "registered": "2020-12-08T04:59:16 -06:-30", + "latitude": -73.194322, + "longitude": -32.54907, + "tags": [ + "ullamco", + "ipsum", + "Lorem", + "ut", + "Lorem", + "laboris", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Sherry Hooper" + }, + { + "id": 1, + "name": "Carney Gaines" + }, + { + "id": 2, + "name": "Charity Sanders" + } + ], + "greeting": "Hello, Santana Odom! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bca9c6e0af4f1d9c0", + "index": 226, + "guid": "96bd80fb-70cf-4e2b-aa35-228d0be0fb48", + "isActive": true, + "balance": "$3,389.64", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Roslyn Humphrey", + "gender": "female", + "company": "GENMEX", + "email": "roslynhumphrey@genmex.com", + "phone": "+1 (863) 571-2916", + "address": "799 Macon Street, Beaulieu, Northern Mariana Islands, 8311", + "about": "Enim nisi reprehenderit voluptate incididunt anim exercitation duis et consequat. Laboris officia sint ea elit est. In voluptate sit exercitation ipsum sit dolor laborum eu consectetur reprehenderit velit ipsum do fugiat. Sunt deserunt qui et reprehenderit aliquip id non ut proident commodo ipsum voluptate non cupidatat. Aliqua commodo cupidatat non laboris quis ut aliquip quis deserunt duis. Elit ea deserunt exercitation do Lorem nostrud do consectetur. Nisi cillum velit ex incididunt elit officia do et cupidatat eu in reprehenderit.\r\n", + "registered": "2015-09-12T10:28:11 -06:-30", + "latitude": 78.50592, + "longitude": -164.236001, + "tags": [ + "dolore", + "fugiat", + "non", + "nostrud", + "tempor", + "eu", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Jeri Velazquez" + }, + { + "id": 1, + "name": "Gibson Frazier" + }, + { + "id": 2, + "name": "Oliver Scott" + } + ], + "greeting": "Hello, Roslyn Humphrey! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9b1294fa2cd5a258", + "index": 227, + "guid": "6f0d2db1-ab61-4214-954b-a4e158d6caab", + "isActive": false, + "balance": "$3,857.68", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Hollie Le", + "gender": "female", + "company": "GRAINSPOT", + "email": "holliele@grainspot.com", + "phone": "+1 (900) 441-3115", + "address": "218 Bay Avenue, Temperanceville, Kansas, 8568", + "about": "Magna ex et commodo ut adipisicing veniam quis ad cillum velit. Voluptate reprehenderit esse irure fugiat tempor deserunt aliquip qui cillum sit enim sit. Dolore nostrud incididunt quis excepteur consequat do amet officia occaecat aliquip. Incididunt nostrud commodo est sit dolor ad anim deserunt aliquip sunt labore ad ullamco Lorem. Veniam deserunt voluptate laboris in magna nisi minim.\r\n", + "registered": "2016-12-23T04:35:41 -06:-30", + "latitude": -40.950966, + "longitude": 33.553427, + "tags": [ + "ullamco", + "dolor", + "commodo", + "et", + "sit", + "et", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Tiffany Acevedo" + }, + { + "id": 1, + "name": "Rutledge Glover" + }, + { + "id": 2, + "name": "Shelton Patrick" + } + ], + "greeting": "Hello, Hollie Le! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b1cfa4d7dc3c79077", + "index": 228, + "guid": "92bfae66-d8ec-459b-a1df-0f3dd0aa12a4", + "isActive": false, + "balance": "$1,612.74", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Eddie Craig", + "gender": "female", + "company": "ORBIFLEX", + "email": "eddiecraig@orbiflex.com", + "phone": "+1 (993) 531-2463", + "address": "556 Bragg Court, Itmann, North Dakota, 7710", + "about": "Non dolor irure minim reprehenderit tempor excepteur adipisicing velit ex. Cillum non cupidatat reprehenderit magna eu labore. Cupidatat exercitation aliqua sunt anim sit commodo nisi ex et cillum aute occaecat. Nisi magna adipisicing excepteur ad non officia quis consectetur minim Lorem labore. Non deserunt qui eiusmod deserunt adipisicing labore labore enim nisi ad occaecat. Tempor ex ullamco dolor irure eiusmod ipsum mollit laborum deserunt.\r\n", + "registered": "2017-01-05T05:10:18 -06:-30", + "latitude": -49.742611, + "longitude": -22.173281, + "tags": [ + "labore", + "ea", + "sunt", + "officia", + "fugiat", + "elit", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Susie Page" + }, + { + "id": 1, + "name": "Pierce Ashley" + }, + { + "id": 2, + "name": "Myrtle Spence" + } + ], + "greeting": "Hello, Eddie Craig! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b0e63a7863c5bba63", + "index": 229, + "guid": "dabaed19-25b4-456f-aa75-db3dbd58ce2f", + "isActive": false, + "balance": "$3,525.69", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Harriet Vasquez", + "gender": "female", + "company": "VELOS", + "email": "harrietvasquez@velos.com", + "phone": "+1 (909) 400-3743", + "address": "445 Guernsey Street, Catharine, New York, 4029", + "about": "Magna aute nostrud laboris Lorem aliquip dolore occaecat officia duis reprehenderit eu labore. Est do incididunt duis amet ex elit. Incididunt sunt exercitation in ut tempor nostrud cillum exercitation Lorem. Id qui nostrud quis id enim velit esse Lorem in et voluptate dolore aute. Velit exercitation ipsum eiusmod elit. Ipsum laborum laborum cupidatat mollit. Duis non dolore reprehenderit aute quis sint cillum non irure fugiat commodo anim exercitation culpa.\r\n", + "registered": "2017-05-21T08:43:56 -06:-30", + "latitude": 37.950637, + "longitude": 111.444887, + "tags": [ + "cillum", + "incididunt", + "sint", + "quis", + "enim", + "tempor", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Colette Stone" + }, + { + "id": 1, + "name": "Jacklyn Knowles" + }, + { + "id": 2, + "name": "Vicky Burns" + } + ], + "greeting": "Hello, Harriet Vasquez! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcdf327b3430f6e84", + "index": 230, + "guid": "0ec66971-43aa-464e-ace2-1003addb78b8", + "isActive": false, + "balance": "$1,591.36", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "brown", + "name": "Rhea Reid", + "gender": "female", + "company": "FLUMBO", + "email": "rheareid@flumbo.com", + "phone": "+1 (961) 436-3030", + "address": "699 Downing Street, Freetown, New Jersey, 8366", + "about": "Proident non do sit sint pariatur magna sint sunt qui ea aute. Reprehenderit occaecat fugiat ut aliqua aliqua nostrud. Qui qui cupidatat ullamco dolor tempor dolore ut magna sit ea fugiat. Qui enim exercitation cupidatat culpa id sint ea.\r\n", + "registered": "2016-04-19T09:18:31 -06:-30", + "latitude": -11.038611, + "longitude": -116.620642, + "tags": [ + "nostrud", + "Lorem", + "ad", + "veniam", + "nisi", + "dolor", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Alexandra Medina" + }, + { + "id": 1, + "name": "Aline Finley" + }, + { + "id": 2, + "name": "Silvia Sullivan" + } + ], + "greeting": "Hello, Rhea Reid! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bf6671dcc8cc93499", + "index": 231, + "guid": "a47f1117-7d48-4e5e-925c-81961456aa72", + "isActive": true, + "balance": "$3,477.74", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Angelina Wall", + "gender": "female", + "company": "ISOPOP", + "email": "angelinawall@isopop.com", + "phone": "+1 (860) 453-3676", + "address": "367 Berry Street, Nicut, Texas, 2985", + "about": "Est incididunt eiusmod enim id sunt proident non enim officia laborum irure. In commodo sint incididunt labore. Consectetur pariatur ut do id proident ad anim cupidatat ea mollit aliquip. Officia veniam laborum ex anim irure non eu nostrud nulla nostrud tempor est. Eiusmod culpa duis pariatur fugiat deserunt duis velit quis adipisicing velit eiusmod Lorem. Magna do excepteur minim fugiat. Magna consectetur occaecat veniam minim qui qui amet nisi ullamco voluptate ullamco deserunt do.\r\n", + "registered": "2014-01-07T04:05:10 -06:-30", + "latitude": 23.81348, + "longitude": -36.552296, + "tags": [ + "quis", + "labore", + "occaecat", + "pariatur", + "ex", + "deserunt", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Harriett Nguyen" + }, + { + "id": 1, + "name": "Suarez Levine" + }, + { + "id": 2, + "name": "Margret Phelps" + } + ], + "greeting": "Hello, Angelina Wall! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b41b04413dc7299df", + "index": 232, + "guid": "b363246f-0b8b-4506-a396-651b856fca12", + "isActive": false, + "balance": "$3,400.23", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Nikki Hess", + "gender": "female", + "company": "TRIBALOG", + "email": "nikkihess@tribalog.com", + "phone": "+1 (832) 483-2835", + "address": "298 Dwight Street, Roeville, Massachusetts, 3186", + "about": "Incididunt exercitation duis proident ullamco eiusmod Lorem cupidatat dolor consequat eu dolor deserunt incididunt. Officia velit consequat aliquip irure non irure eiusmod. Consequat quis ut nisi voluptate. Culpa culpa dolore aliquip mollit do elit amet velit cillum cillum dolor. Officia dolore exercitation in fugiat magna fugiat pariatur voluptate tempor irure adipisicing nisi cillum.\r\n", + "registered": "2016-06-19T08:21:38 -06:-30", + "latitude": 7.289274, + "longitude": -127.227993, + "tags": [ + "proident", + "mollit", + "dolore", + "cillum", + "et", + "voluptate", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Lilly York" + }, + { + "id": 1, + "name": "Delia Mendoza" + }, + { + "id": 2, + "name": "Cathleen Cline" + } + ], + "greeting": "Hello, Nikki Hess! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4ba0cd6ff9613e6d44", + "index": 233, + "guid": "2c2b6571-8015-40b9-b160-47e2b763da44", + "isActive": true, + "balance": "$3,907.09", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Kerry Melendez", + "gender": "female", + "company": "SILODYNE", + "email": "kerrymelendez@silodyne.com", + "phone": "+1 (872) 550-3563", + "address": "551 Aster Court, Fidelis, Palau, 6662", + "about": "Et est aute sit qui cupidatat culpa adipisicing irure velit tempor cillum labore dolor. Ut ullamco exercitation consequat est ipsum duis nostrud. Sit nisi eiusmod labore sunt velit enim esse dolore. Nostrud minim nostrud velit labore ullamco. Eiusmod amet anim amet reprehenderit do esse officia esse non amet. Eiusmod qui occaecat velit nostrud ut labore excepteur cupidatat.\r\n", + "registered": "2017-03-03T11:39:08 -06:-30", + "latitude": 76.762709, + "longitude": 90.571608, + "tags": [ + "reprehenderit", + "dolor", + "nostrud", + "consectetur", + "occaecat", + "Lorem", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Vera Walsh" + }, + { + "id": 1, + "name": "Josefina Hancock" + }, + { + "id": 2, + "name": "Rachael Santos" + } + ], + "greeting": "Hello, Kerry Melendez! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b9d6747e525ae41bc", + "index": 234, + "guid": "5723409a-fa8a-4bf9-8183-ba6e42d68c03", + "isActive": false, + "balance": "$1,715.42", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Maynard Grant", + "gender": "male", + "company": "EXOSPEED", + "email": "maynardgrant@exospeed.com", + "phone": "+1 (908) 595-2075", + "address": "363 Jackson Court, Bendon, Alaska, 1224", + "about": "Proident commodo anim ut sunt qui nostrud dolore amet tempor aliqua amet aliqua. In anim consectetur elit eiusmod voluptate dolore sunt. Fugiat commodo non elit anim.\r\n", + "registered": "2018-03-07T07:34:08 -06:-30", + "latitude": -66.937653, + "longitude": 117.943878, + "tags": [ + "incididunt", + "fugiat", + "eu", + "quis", + "ad", + "ad", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Edwina Chaney" + }, + { + "id": 1, + "name": "Claudia Lane" + }, + { + "id": 2, + "name": "Melendez Weaver" + } + ], + "greeting": "Hello, Maynard Grant! You have 5 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b9a17543a5c017c0b", + "index": 235, + "guid": "0f34d0e0-d563-4057-b596-b644ccd748dd", + "isActive": true, + "balance": "$2,727.18", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Rosa Morales", + "gender": "male", + "company": "ZENSUS", + "email": "rosamorales@zensus.com", + "phone": "+1 (881) 421-2240", + "address": "571 Radde Place, Hasty, Oklahoma, 6140", + "about": "Aliqua aliqua nostrud laboris quis fugiat fugiat dolore dolor pariatur officia culpa est aute excepteur. Ad magna in incididunt irure ullamco adipisicing esse sit ut non labore. Aliqua commodo fugiat cillum Lorem amet Lorem dolor. Excepteur esse ipsum sunt nostrud minim in sunt elit enim non irure reprehenderit. Ut proident consectetur et quis ut excepteur. Occaecat laborum labore sit labore fugiat enim laboris ut in voluptate ad ullamco eiusmod aute.\r\n", + "registered": "2019-08-25T05:28:27 -06:-30", + "latitude": -71.756417, + "longitude": -126.232156, + "tags": [ + "qui", + "in", + "cupidatat", + "excepteur", + "eu", + "laborum", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Patrice Arnold" + }, + { + "id": 1, + "name": "Crosby Mclean" + }, + { + "id": 2, + "name": "Kaitlin Ball" + } + ], + "greeting": "Hello, Rosa Morales! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b03542cc95eb20dbd", + "index": 236, + "guid": "cfc52981-1a1d-46b9-a142-8a43cf4cdaa4", + "isActive": true, + "balance": "$1,363.42", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Osborn Paul", + "gender": "male", + "company": "PORTALIS", + "email": "osbornpaul@portalis.com", + "phone": "+1 (972) 564-3058", + "address": "862 Kane Place, Gila, New Mexico, 8052", + "about": "Consequat incididunt tempor do cillum elit incididunt dolore. Lorem sint laborum veniam tempor aute esse est ut nisi do reprehenderit aliquip aliqua sit. Enim consectetur qui et do aliqua cupidatat aliqua enim.\r\n", + "registered": "2020-11-30T06:05:06 -06:-30", + "latitude": -36.062239, + "longitude": -176.007865, + "tags": [ + "aliqua", + "reprehenderit", + "voluptate", + "Lorem", + "laboris", + "laboris", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Annette Pearson" + }, + { + "id": 1, + "name": "Marks Roberts" + }, + { + "id": 2, + "name": "Buckner Wilkinson" + } + ], + "greeting": "Hello, Osborn Paul! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b12234ec9f30a87b8", + "index": 237, + "guid": "32391a74-a13d-4c80-a9ee-9832827e4174", + "isActive": true, + "balance": "$1,141.64", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "green", + "name": "Tamika Dillard", + "gender": "female", + "company": "FARMEX", + "email": "tamikadillard@farmex.com", + "phone": "+1 (823) 565-3851", + "address": "975 Cove Lane, Williamson, Wyoming, 6545", + "about": "Ipsum commodo occaecat elit mollit et nostrud reprehenderit laborum reprehenderit cillum commodo deserunt laborum esse. Do sit laboris labore fugiat velit culpa adipisicing velit est est adipisicing. Ea laborum officia deserunt pariatur.\r\n", + "registered": "2014-10-12T01:54:46 -06:-30", + "latitude": 57.434808, + "longitude": 15.893882, + "tags": [ + "enim", + "laborum", + "minim", + "velit", + "ea", + "nulla", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Kris Middleton" + }, + { + "id": 1, + "name": "Jana Michael" + }, + { + "id": 2, + "name": "Tabitha Sweeney" + } + ], + "greeting": "Hello, Tamika Dillard! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b8eec3d2bc2abddd0", + "index": 238, + "guid": "19bd36ea-a510-4753-9950-9f791e97802c", + "isActive": false, + "balance": "$2,006.40", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Carey Parks", + "gender": "male", + "company": "ZEAM", + "email": "careyparks@zeam.com", + "phone": "+1 (891) 489-3789", + "address": "476 Imlay Street, Lumberton, Rhode Island, 5813", + "about": "Consequat eu tempor velit veniam ipsum. Sit labore et excepteur deserunt voluptate Lorem incididunt elit id Lorem elit. Incididunt excepteur labore exercitation Lorem ipsum sint reprehenderit anim incididunt. Labore et occaecat anim sint officia est occaecat consequat cupidatat adipisicing.\r\n", + "registered": "2019-12-14T01:29:57 -06:-30", + "latitude": 64.631076, + "longitude": 160.654343, + "tags": [ + "commodo", + "tempor", + "eiusmod", + "id", + "do", + "non", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Luna Kane" + }, + { + "id": 1, + "name": "Robin Lucas" + }, + { + "id": 2, + "name": "Monica Rowland" + } + ], + "greeting": "Hello, Carey Parks! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bcaf7e1391238a933", + "index": 239, + "guid": "8e8112bd-249e-484f-8486-e6cb7ec86a41", + "isActive": true, + "balance": "$3,876.65", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Joseph Heath", + "gender": "male", + "company": "BUNGA", + "email": "josephheath@bunga.com", + "phone": "+1 (900) 424-3789", + "address": "730 Highland Place, Floriston, West Virginia, 9813", + "about": "Aliquip aute non deserunt nostrud Lorem. Enim cillum veniam est id dolor laboris excepteur fugiat laborum. Proident aute magna et nisi consectetur fugiat laborum. Consectetur aute minim nostrud occaecat laborum occaecat. Aute amet aliquip proident adipisicing. Sunt qui labore veniam voluptate.\r\n", + "registered": "2017-10-12T03:13:29 -06:-30", + "latitude": -44.912136, + "longitude": -84.36876, + "tags": [ + "mollit", + "eu", + "voluptate", + "ullamco", + "consectetur", + "laborum", + "eiusmod" + ], + "friends": [ + { + "id": 0, + "name": "Tasha Dawson" + }, + { + "id": 1, + "name": "Stanley Farmer" + }, + { + "id": 2, + "name": "Mccray Bowers" + } + ], + "greeting": "Hello, Joseph Heath! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3e02814b85fbdbc3", + "index": 240, + "guid": "c06183dd-e7af-42a2-8988-5f01b05e7dd1", + "isActive": true, + "balance": "$2,003.79", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "green", + "name": "Marshall Cash", + "gender": "male", + "company": "NEXGENE", + "email": "marshallcash@nexgene.com", + "phone": "+1 (913) 539-3829", + "address": "929 Story Street, Cazadero, Nevada, 1170", + "about": "Ad cillum eu minim eiusmod labore velit proident ad ullamco. Exercitation cupidatat id occaecat nostrud consequat non proident reprehenderit. Quis anim quis labore occaecat. Sit ad dolor aliquip cillum adipisicing sunt qui est voluptate irure incididunt consequat ad. Aute quis ut est eu dolore sunt et sint. Aliquip Lorem deserunt deserunt fugiat proident.\r\n", + "registered": "2020-03-07T05:09:27 -06:-30", + "latitude": 87.026493, + "longitude": 93.669157, + "tags": [ + "sunt", + "labore", + "laborum", + "labore", + "et", + "adipisicing", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Oconnor Morris" + }, + { + "id": 1, + "name": "Oneal Eaton" + }, + { + "id": 2, + "name": "Potter Ramirez" + } + ], + "greeting": "Hello, Marshall Cash! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b2a13b1b80ab90d1d", + "index": 241, + "guid": "2c1b5426-4758-4140-aa43-6f2689e1914b", + "isActive": true, + "balance": "$2,887.31", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Savannah Rowe", + "gender": "female", + "company": "ZANILLA", + "email": "savannahrowe@zanilla.com", + "phone": "+1 (865) 412-2746", + "address": "272 Hunterfly Place, Lopezo, Delaware, 2440", + "about": "Eu cupidatat proident fugiat cupidatat non. Fugiat veniam officia commodo quis ut id et nostrud duis. Lorem occaecat reprehenderit amet consectetur culpa reprehenderit culpa cillum nostrud.\r\n", + "registered": "2015-04-22T06:47:25 -06:-30", + "latitude": -18.004319, + "longitude": -123.564864, + "tags": [ + "proident", + "enim", + "quis", + "et", + "est", + "culpa", + "enim" + ], + "friends": [ + { + "id": 0, + "name": "Twila Morse" + }, + { + "id": 1, + "name": "Rosetta Vaughn" + }, + { + "id": 2, + "name": "Alyssa Chavez" + } + ], + "greeting": "Hello, Savannah Rowe! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4be34918425261cf14", + "index": 242, + "guid": "c41b0ea0-70f2-4d0a-9dee-8fd6aa73d0cb", + "isActive": true, + "balance": "$1,143.15", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Jarvis Simpson", + "gender": "male", + "company": "ZUVY", + "email": "jarvissimpson@zuvy.com", + "phone": "+1 (854) 573-3390", + "address": "235 Beekman Place, Oley, Federated States Of Micronesia, 337", + "about": "Do aliqua aliquip dolore incididunt veniam enim. Consequat velit minim officia anim qui ullamco laborum ut sit nostrud. Eu dolore tempor consequat et consectetur duis ex incididunt proident. Elit Lorem adipisicing aliquip anim voluptate nulla minim mollit aliqua excepteur adipisicing ad consequat sunt. Commodo adipisicing magna consectetur exercitation labore minim eiusmod et cillum tempor. Magna cillum excepteur laboris mollit nulla ipsum deserunt ullamco. Deserunt mollit aute in Lorem pariatur cillum Lorem pariatur incididunt veniam commodo et non aute.\r\n", + "registered": "2019-07-14T05:44:51 -06:-30", + "latitude": 0.122335, + "longitude": -78.987263, + "tags": [ + "eu", + "adipisicing", + "adipisicing", + "dolore", + "eiusmod", + "elit", + "cillum" + ], + "friends": [ + { + "id": 0, + "name": "Ethel Sykes" + }, + { + "id": 1, + "name": "Brennan Olson" + }, + { + "id": 2, + "name": "Josephine Kelley" + } + ], + "greeting": "Hello, Jarvis Simpson! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b521e9237a53a92de", + "index": 243, + "guid": "86785668-c684-457a-a732-c5d29d65aeba", + "isActive": false, + "balance": "$1,099.91", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "green", + "name": "Banks Holcomb", + "gender": "male", + "company": "ACCUPRINT", + "email": "banksholcomb@accuprint.com", + "phone": "+1 (815) 594-2964", + "address": "900 Lefferts Place, Clara, Pennsylvania, 4413", + "about": "Sint duis commodo fugiat enim qui quis nostrud. Enim et ut in non et mollit nulla consequat. Eiusmod commodo eu nisi magna id ut non. Irure duis aliqua proident ut. Dolor anim et magna mollit ea exercitation est incididunt do. Ipsum esse veniam officia minim eiusmod nulla ipsum.\r\n", + "registered": "2015-06-16T02:46:57 -06:-30", + "latitude": -14.332421, + "longitude": 125.975744, + "tags": [ + "nostrud", + "tempor", + "magna", + "aliqua", + "quis", + "pariatur", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Darla Martin" + }, + { + "id": 1, + "name": "Dalton Ochoa" + }, + { + "id": 2, + "name": "Brigitte Meadows" + } + ], + "greeting": "Hello, Banks Holcomb! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b88adcc3c44df808f", + "index": 244, + "guid": "55d642da-ed50-4dae-89af-9bb5ba983b73", + "isActive": true, + "balance": "$3,904.74", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "brown", + "name": "Velez Workman", + "gender": "male", + "company": "GEEKUS", + "email": "velezworkman@geekus.com", + "phone": "+1 (801) 408-2538", + "address": "653 Gates Avenue, Bartonsville, Connecticut, 3642", + "about": "Do duis qui aute occaecat voluptate. Incididunt do exercitation tempor eu. Proident amet nulla laboris enim consequat nulla cupidatat pariatur irure sint cillum eu officia. Et aute qui est nisi adipisicing dolor. Ex pariatur exercitation deserunt consequat laborum non excepteur fugiat adipisicing amet quis eu.\r\n", + "registered": "2017-09-01T02:44:43 -06:-30", + "latitude": 23.93446, + "longitude": -102.468239, + "tags": [ + "commodo", + "et", + "veniam", + "duis", + "adipisicing", + "id", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Mable Vincent" + }, + { + "id": 1, + "name": "Mullen Stephenson" + }, + { + "id": 2, + "name": "Ingram Montgomery" + } + ], + "greeting": "Hello, Velez Workman! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b132260f3f8fb7d77", + "index": 245, + "guid": "9bbfe6e9-f301-4010-b00f-71e2c9a0d743", + "isActive": true, + "balance": "$1,617.67", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "brown", + "name": "Cash Fernandez", + "gender": "male", + "company": "PROWASTE", + "email": "cashfernandez@prowaste.com", + "phone": "+1 (815) 476-3449", + "address": "758 Randolph Street, Allensworth, Louisiana, 5541", + "about": "Mollit cupidatat incididunt in reprehenderit ea deserunt duis nostrud excepteur cillum adipisicing non magna qui. Eiusmod eiusmod elit dolore sint et quis. Culpa voluptate laboris irure in aliquip. Irure tempor excepteur proident sunt cupidatat consectetur esse consectetur magna veniam anim eu incididunt. Nulla aliquip velit aliqua proident laboris reprehenderit qui et ad laboris.\r\n", + "registered": "2014-03-25T02:52:07 -06:-30", + "latitude": 62.127628, + "longitude": 136.878458, + "tags": [ + "aliqua", + "sit", + "magna", + "sit", + "laboris", + "do", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Kenya Gillespie" + }, + { + "id": 1, + "name": "William Bowman" + }, + { + "id": 2, + "name": "Lindsey Collins" + } + ], + "greeting": "Hello, Cash Fernandez! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbe7a25cb9b1b7cf0", + "index": 246, + "guid": "a4309df8-c5f3-4dff-aaf7-95006c7e0ee3", + "isActive": false, + "balance": "$2,946.23", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "York Madden", + "gender": "male", + "company": "SQUISH", + "email": "yorkmadden@squish.com", + "phone": "+1 (992) 512-3792", + "address": "785 Cherry Street, Tyro, Vermont, 6398", + "about": "Ut consequat mollit quis adipisicing do magna in qui nostrud. Consequat tempor velit officia in in ipsum do dolor sint labore nisi mollit. Deserunt ex occaecat aliqua laborum quis Lorem cupidatat duis incididunt dolor exercitation ea non culpa.\r\n", + "registered": "2021-01-14T12:35:55 -06:-30", + "latitude": -19.244388, + "longitude": -87.584901, + "tags": [ + "exercitation", + "amet", + "esse", + "excepteur", + "ipsum", + "nostrud", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Walls Ware" + }, + { + "id": 1, + "name": "Bowman Patterson" + }, + { + "id": 2, + "name": "Washington Pace" + } + ], + "greeting": "Hello, York Madden! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b623ca671812ed06c", + "index": 247, + "guid": "d913c63f-5041-450a-b69c-9f93d82bb32b", + "isActive": true, + "balance": "$1,003.87", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Meredith Valdez", + "gender": "female", + "company": "FUTURIS", + "email": "meredithvaldez@futuris.com", + "phone": "+1 (835) 547-3689", + "address": "719 Scholes Street, Sunnyside, Iowa, 3969", + "about": "Ex nisi Lorem deserunt aliqua mollit qui est sunt labore sint reprehenderit anim ut. Irure dolore consectetur ea Lorem consequat do commodo mollit veniam sunt non quis. Quis consequat eiusmod magna et. Elit elit commodo esse culpa in elit eiusmod culpa in enim sunt minim est. Ex aute aliquip adipisicing ex aute esse ex aute anim officia mollit eiusmod esse laborum. Occaecat in consequat esse ullamco sit. Dolor consequat eiusmod sint quis magna amet velit duis dolor pariatur.\r\n", + "registered": "2016-10-12T11:36:40 -06:-30", + "latitude": 68.439856, + "longitude": -133.16114, + "tags": [ + "incididunt", + "ullamco", + "excepteur", + "occaecat", + "esse", + "eiusmod", + "aute" + ], + "friends": [ + { + "id": 0, + "name": "Sargent Cotton" + }, + { + "id": 1, + "name": "Trisha Boone" + }, + { + "id": 2, + "name": "Lessie Stanley" + } + ], + "greeting": "Hello, Meredith Valdez! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b30948808a1704e43", + "index": 248, + "guid": "d87942b5-3bad-49ed-a953-cb7888bc643c", + "isActive": true, + "balance": "$2,005.64", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Catherine Mooney", + "gender": "female", + "company": "GLOBOIL", + "email": "catherinemooney@globoil.com", + "phone": "+1 (937) 435-3258", + "address": "466 Taylor Street, Retsof, Virginia, 5440", + "about": "Anim id cillum et minim adipisicing et. Deserunt deserunt deserunt ipsum ut aute nulla id eiusmod excepteur non ex. Incididunt occaecat et nisi reprehenderit labore sit. Ut adipisicing ad exercitation deserunt Lorem occaecat incididunt proident non est nostrud mollit eiusmod.\r\n", + "registered": "2021-05-25T04:26:32 -06:-30", + "latitude": -8.023004, + "longitude": 73.119767, + "tags": [ + "nostrud", + "proident", + "labore", + "nulla", + "quis", + "exercitation", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Burke Calhoun" + }, + { + "id": 1, + "name": "Estela Rush" + }, + { + "id": 2, + "name": "Faye Kaufman" + } + ], + "greeting": "Hello, Catherine Mooney! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b02c0f35b9cc1de44", + "index": 249, + "guid": "a0ec389d-efaa-4969-a7c7-f06c2cf88d78", + "isActive": true, + "balance": "$2,168.16", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Reyna Palmer", + "gender": "female", + "company": "OCTOCORE", + "email": "reynapalmer@octocore.com", + "phone": "+1 (902) 504-3918", + "address": "806 Bowne Street, Kieler, Maine, 9194", + "about": "Adipisicing nulla dolor tempor irure officia ea aliqua. Irure ullamco ex amet ullamco aliquip Lorem deserunt voluptate laborum laboris cupidatat veniam adipisicing. Aute mollit ex tempor aute est laboris enim sint tempor. Aute officia excepteur aliquip in. Magna anim dolor in est velit anim aliqua mollit duis.\r\n", + "registered": "2021-08-21T05:18:10 -06:-30", + "latitude": -49.303623, + "longitude": 167.345341, + "tags": [ + "in", + "ex", + "voluptate", + "ea", + "nisi", + "pariatur", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Wolf Ferrell" + }, + { + "id": 1, + "name": "Rhoda Callahan" + }, + { + "id": 2, + "name": "Mathews Johns" + } + ], + "greeting": "Hello, Reyna Palmer! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b42db31869f15467b", + "index": 250, + "guid": "fcfe3276-798d-459b-900e-0996864c597c", + "isActive": true, + "balance": "$3,932.25", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Lilian Strong", + "gender": "female", + "company": "CANOPOLY", + "email": "lilianstrong@canopoly.com", + "phone": "+1 (903) 539-3007", + "address": "658 Williams Place, Collins, Nebraska, 4820", + "about": "Ad reprehenderit amet commodo labore consequat deserunt laborum magna cupidatat. Lorem officia aliquip veniam eiusmod est est cupidatat. Eu laboris velit proident incididunt eiusmod. Nisi aute adipisicing esse dolore amet minim incididunt. Eu adipisicing enim laborum duis duis dolore exercitation id dolor magna excepteur nisi nisi.\r\n", + "registered": "2022-09-18T12:53:20 -06:-30", + "latitude": 78.171236, + "longitude": 13.592731, + "tags": [ + "consectetur", + "mollit", + "anim", + "ullamco", + "do", + "magna", + "veniam" + ], + "friends": [ + { + "id": 0, + "name": "Francisca Waller" + }, + { + "id": 1, + "name": "Robert Holland" + }, + { + "id": 2, + "name": "Rodriquez Mays" + } + ], + "greeting": "Hello, Lilian Strong! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bfe2ae4d47f031c59", + "index": 251, + "guid": "04f8ea81-408d-4d8a-9454-aa8a620da3cf", + "isActive": false, + "balance": "$1,488.26", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Carly Henderson", + "gender": "female", + "company": "VINCH", + "email": "carlyhenderson@vinch.com", + "phone": "+1 (876) 589-2008", + "address": "736 Havemeyer Street, Laurelton, Mississippi, 4031", + "about": "Aliqua minim reprehenderit duis labore proident nostrud voluptate elit duis culpa ullamco et. Pariatur culpa tempor non duis nulla. Aliquip laborum tempor duis proident exercitation. Incididunt id reprehenderit officia aliqua cupidatat sint commodo fugiat exercitation.\r\n", + "registered": "2015-10-07T01:24:27 -06:-30", + "latitude": -86.385773, + "longitude": -94.051637, + "tags": [ + "magna", + "ad", + "consectetur", + "sunt", + "Lorem", + "cupidatat", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Cruz Lee" + }, + { + "id": 1, + "name": "Tessa Hernandez" + }, + { + "id": 2, + "name": "Aileen Carter" + } + ], + "greeting": "Hello, Carly Henderson! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb2563d8431c5215a", + "index": 252, + "guid": "36982724-1303-4c7f-bdb2-b4ee9635bfab", + "isActive": true, + "balance": "$3,867.65", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Nguyen William", + "gender": "male", + "company": "ORBAXTER", + "email": "nguyenwilliam@orbaxter.com", + "phone": "+1 (893) 566-2281", + "address": "214 Knapp Street, Irwin, Indiana, 5770", + "about": "Amet nulla eu commodo incididunt aliqua anim eu non nisi nulla. Qui et sit duis ut fugiat reprehenderit excepteur mollit nostrud culpa. Sint minim Lorem cupidatat anim est esse veniam. Adipisicing fugiat incididunt tempor magna veniam reprehenderit in aliqua. Officia deserunt culpa irure sit occaecat cupidatat reprehenderit. Ut excepteur nulla nostrud ea tempor consectetur aliquip ex voluptate nisi velit dolor tempor. Id laborum nulla excepteur officia.\r\n", + "registered": "2017-10-15T08:09:56 -06:-30", + "latitude": 40.044867, + "longitude": -140.361768, + "tags": [ + "do", + "mollit", + "exercitation", + "eiusmod", + "adipisicing", + "in", + "quis" + ], + "friends": [ + { + "id": 0, + "name": "Crystal Flores" + }, + { + "id": 1, + "name": "Wendy Aguirre" + }, + { + "id": 2, + "name": "Nicholson Reese" + } + ], + "greeting": "Hello, Nguyen William! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba757a75d366a713e", + "index": 253, + "guid": "67667cf5-9c79-410b-b231-a27d7e0fe1b9", + "isActive": true, + "balance": "$3,303.73", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Shari Wilkerson", + "gender": "female", + "company": "ACCIDENCY", + "email": "shariwilkerson@accidency.com", + "phone": "+1 (995) 464-3837", + "address": "433 Willoughby Avenue, Belva, Guam, 8552", + "about": "Culpa adipisicing elit culpa exercitation. Anim esse est fugiat exercitation ea excepteur ut duis excepteur eiusmod. Culpa reprehenderit id occaecat irure incididunt veniam cillum sunt enim incididunt minim. Duis sit irure consequat ex minim dolore excepteur occaecat ullamco velit deserunt laborum. Aliquip adipisicing fugiat proident cupidatat laborum ea ea fugiat ex. Commodo ea cupidatat sint et elit commodo id. Incididunt minim reprehenderit eu dolor.\r\n", + "registered": "2022-03-17T08:52:46 -06:-30", + "latitude": -3.27947, + "longitude": -5.761517, + "tags": [ + "laboris", + "pariatur", + "eu", + "deserunt", + "esse", + "in", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Earlene Slater" + }, + { + "id": 1, + "name": "Camille Fuller" + }, + { + "id": 2, + "name": "Kelsey Sosa" + } + ], + "greeting": "Hello, Shari Wilkerson! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbcba35f34fbd85c2", + "index": 254, + "guid": "fb10f86d-1c22-4a26-95d5-441c88d4134b", + "isActive": false, + "balance": "$1,988.53", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "blue", + "name": "White Tyler", + "gender": "male", + "company": "POSHOME", + "email": "whitetyler@poshome.com", + "phone": "+1 (901) 405-2645", + "address": "668 Chestnut Avenue, Dundee, Kentucky, 6116", + "about": "Est est eu reprehenderit nostrud voluptate nisi occaecat enim mollit labore mollit labore enim enim. Velit aliqua consectetur incididunt et. Tempor consectetur voluptate irure officia aute aliqua duis ea et. Aute cillum exercitation veniam culpa nostrud sint. Occaecat voluptate occaecat fugiat qui laborum nulla sit eiusmod. Commodo elit occaecat proident qui non qui enim cillum eu culpa cillum id culpa.\r\n", + "registered": "2019-04-18T12:17:16 -06:-30", + "latitude": -59.592237, + "longitude": 141.672235, + "tags": [ + "et", + "amet", + "et", + "aliquip", + "quis", + "proident", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Castillo Farrell" + }, + { + "id": 1, + "name": "Beard Murray" + }, + { + "id": 2, + "name": "Shana Gonzales" + } + ], + "greeting": "Hello, White Tyler! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b99b9a1bfddd08157", + "index": 255, + "guid": "44abaf7c-a6d8-4a04-ad0d-4e1f12c21ba1", + "isActive": true, + "balance": "$3,937.81", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "green", + "name": "Morton Langley", + "gender": "male", + "company": "ENTROPIX", + "email": "mortonlangley@entropix.com", + "phone": "+1 (971) 484-2183", + "address": "235 Louis Place, Cawood, Puerto Rico, 4323", + "about": "Exercitation dolor ipsum adipisicing veniam. Labore consectetur laborum aliquip non incididunt irure labore culpa ullamco velit esse proident. Pariatur labore non ut tempor minim. Eiusmod cupidatat tempor elit irure fugiat aliqua pariatur occaecat sint ex. Magna pariatur consectetur Lorem culpa nulla laboris. Ex veniam enim quis labore nostrud occaecat pariatur anim fugiat nostrud esse adipisicing. Culpa veniam cupidatat culpa eu anim proident ex.\r\n", + "registered": "2015-09-03T03:09:39 -06:-30", + "latitude": -30.877912, + "longitude": 174.931466, + "tags": [ + "dolor", + "incididunt", + "ullamco", + "laborum", + "magna", + "ad", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Chen Frye" + }, + { + "id": 1, + "name": "Wade Johnson" + }, + { + "id": 2, + "name": "Allison Anderson" + } + ], + "greeting": "Hello, Morton Langley! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b7862ba9ef15fc8d2", + "index": 256, + "guid": "1f743366-809d-493e-93ab-0b4ddeb3135c", + "isActive": false, + "balance": "$2,925.03", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Traci Whitfield", + "gender": "female", + "company": "ENDIPIN", + "email": "traciwhitfield@endipin.com", + "phone": "+1 (831) 430-2365", + "address": "705 Cypress Court, Harborton, North Carolina, 7137", + "about": "Ullamco aliqua occaecat reprehenderit tempor pariatur adipisicing labore. Veniam et pariatur exercitation non sit. Dolore magna eiusmod non minim quis irure minim eiusmod mollit ea officia eiusmod dolor deserunt.\r\n", + "registered": "2018-07-03T06:43:54 -06:-30", + "latitude": 23.024835, + "longitude": 19.720874, + "tags": [ + "magna", + "deserunt", + "et", + "officia", + "qui", + "consequat", + "aliquip" + ], + "friends": [ + { + "id": 0, + "name": "Solomon Gilbert" + }, + { + "id": 1, + "name": "Dawson Bentley" + }, + { + "id": 2, + "name": "Pope Blanchard" + } + ], + "greeting": "Hello, Traci Whitfield! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b5f34c02922c6942c", + "index": 257, + "guid": "b73b97ee-5de1-4ce3-8889-8034d774f7ec", + "isActive": false, + "balance": "$3,241.81", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Callie Cox", + "gender": "female", + "company": "IRACK", + "email": "calliecox@irack.com", + "phone": "+1 (959) 567-3841", + "address": "729 Seagate Avenue, Kennedyville, Tennessee, 2587", + "about": "Proident nisi velit ullamco cillum id aliquip eiusmod officia. Amet ullamco laboris dolore commodo pariatur. Ex aliquip et eiusmod incididunt est. Pariatur veniam eiusmod id consectetur elit.\r\n", + "registered": "2022-06-01T07:32:57 -06:-30", + "latitude": 53.031852, + "longitude": 58.454114, + "tags": [ + "id", + "enim", + "ad", + "exercitation", + "exercitation", + "aliqua", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Helena Robles" + }, + { + "id": 1, + "name": "Ochoa Koch" + }, + { + "id": 2, + "name": "Burgess Navarro" + } + ], + "greeting": "Hello, Callie Cox! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4be4185efc22622202", + "index": 258, + "guid": "8390806a-66c4-4fc1-8e0a-7b0485ef7388", + "isActive": false, + "balance": "$1,542.65", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "blue", + "name": "Deidre Kidd", + "gender": "female", + "company": "AQUASSEUR", + "email": "deidrekidd@aquasseur.com", + "phone": "+1 (967) 575-3114", + "address": "327 Story Court, Russellville, Arkansas, 2442", + "about": "Irure commodo tempor exercitation et deserunt elit officia. Officia culpa sit ad minim non mollit ad laborum. Nostrud irure eu qui consectetur fugiat exercitation nulla ea adipisicing laboris Lorem. Eu consectetur dolor id eiusmod quis veniam ex aliquip irure laboris reprehenderit sit amet qui. Laboris exercitation officia proident voluptate officia occaecat non non amet occaecat consequat nulla ad. Pariatur aute ex irure enim occaecat deserunt reprehenderit deserunt velit incididunt qui in culpa veniam.\r\n", + "registered": "2019-11-02T09:24:53 -06:-30", + "latitude": -45.192039, + "longitude": 33.867418, + "tags": [ + "nisi", + "nisi", + "aute", + "in", + "magna", + "do", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Ferguson Kemp" + }, + { + "id": 1, + "name": "Macias Duncan" + }, + { + "id": 2, + "name": "Rose Hicks" + } + ], + "greeting": "Hello, Deidre Kidd! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4be660efc30950b2b1", + "index": 259, + "guid": "d58b1f18-2a4c-4f5d-b633-bd809d9cf3d5", + "isActive": true, + "balance": "$2,427.13", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Peters Rivers", + "gender": "male", + "company": "EPLOSION", + "email": "petersrivers@eplosion.com", + "phone": "+1 (916) 448-3796", + "address": "240 Fayette Street, Lacomb, Virgin Islands, 2251", + "about": "Lorem ipsum eiusmod deserunt anim magna occaecat ipsum deserunt excepteur incididunt. Lorem excepteur ut adipisicing mollit laboris anim labore excepteur non. Consequat minim esse cupidatat in.\r\n", + "registered": "2019-08-04T08:06:46 -06:-30", + "latitude": 11.153154, + "longitude": -155.475031, + "tags": [ + "non", + "consequat", + "enim", + "exercitation", + "occaecat", + "amet", + "est" + ], + "friends": [ + { + "id": 0, + "name": "Dolores Norton" + }, + { + "id": 1, + "name": "Millicent Ellis" + }, + { + "id": 2, + "name": "Lou Benjamin" + } + ], + "greeting": "Hello, Peters Rivers! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6e977bec1eb257f1", + "index": 260, + "guid": "f5dd627c-6a37-46ff-b156-372b9b2dd6c7", + "isActive": true, + "balance": "$2,742.17", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Doris Whitehead", + "gender": "female", + "company": "QUIZMO", + "email": "doriswhitehead@quizmo.com", + "phone": "+1 (844) 534-2516", + "address": "720 Brown Street, Bowie, Oregon, 2354", + "about": "Amet incididunt ipsum id exercitation laboris eu aliquip magna ut sit sunt. Aliquip id anim sint quis sit ad cillum. Eiusmod deserunt commodo qui nulla commodo dolor consectetur incididunt.\r\n", + "registered": "2018-10-03T03:34:50 -06:-30", + "latitude": 31.255902, + "longitude": -110.729525, + "tags": [ + "minim", + "aliqua", + "nisi", + "officia", + "duis", + "consectetur", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Maricela Underwood" + }, + { + "id": 1, + "name": "Barton Mullins" + }, + { + "id": 2, + "name": "Alexander Joyner" + } + ], + "greeting": "Hello, Doris Whitehead! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb48211d0a6fe2964", + "index": 261, + "guid": "e4685cf9-e897-4c07-ae49-12ecade5fe32", + "isActive": false, + "balance": "$3,773.77", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Jannie Tate", + "gender": "female", + "company": "SEALOUD", + "email": "jannietate@sealoud.com", + "phone": "+1 (802) 416-2272", + "address": "629 Bogart Street, Neahkahnie, District Of Columbia, 4993", + "about": "Sit nostrud est ex laborum nostrud culpa pariatur qui eu pariatur sint anim nostrud. Dolor elit amet proident nisi proident. Deserunt amet nisi deserunt irure non laboris ullamco non duis. Id in in consectetur minim sint minim pariatur nulla proident officia adipisicing quis cupidatat veniam. Enim laborum in ex ad qui dolore irure consequat.\r\n", + "registered": "2016-03-07T04:39:57 -06:-30", + "latitude": -0.907577, + "longitude": 62.486206, + "tags": [ + "nisi", + "velit", + "consequat", + "enim", + "ullamco", + "adipisicing", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Fletcher Garrett" + }, + { + "id": 1, + "name": "Tisha Bradford" + }, + { + "id": 2, + "name": "Taylor Vance" + } + ], + "greeting": "Hello, Jannie Tate! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4beb6d27fe4a4218c8", + "index": 262, + "guid": "5e6bd48f-773e-4316-b77b-ce8d36f7b50d", + "isActive": false, + "balance": "$1,763.62", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Dianna Larsen", + "gender": "female", + "company": "EXOBLUE", + "email": "diannalarsen@exoblue.com", + "phone": "+1 (984) 512-2809", + "address": "965 Nassau Avenue, Hollins, Florida, 1199", + "about": "Id aliquip minim velit ut exercitation. Sunt in consectetur incididunt eiusmod fugiat sunt quis consectetur velit Lorem occaecat ea cupidatat. Proident qui ut incididunt magna cillum aliqua aliquip cillum. Lorem ex tempor culpa veniam culpa labore et consectetur excepteur. Consectetur ullamco ad voluptate ipsum velit magna. Exercitation aliqua ex velit sit nulla consectetur ullamco magna magna sunt. Sint enim tempor velit quis est cillum occaecat amet sunt proident.\r\n", + "registered": "2016-12-18T10:09:53 -06:-30", + "latitude": -21.847924, + "longitude": -64.496983, + "tags": [ + "id", + "aliqua", + "magna", + "velit", + "irure", + "exercitation", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Alissa Cameron" + }, + { + "id": 1, + "name": "Elinor Mclaughlin" + }, + { + "id": 2, + "name": "Rosalie Pickett" + } + ], + "greeting": "Hello, Dianna Larsen! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b29c2d898ee45ad32", + "index": 263, + "guid": "9e1574c3-84d2-406b-92f3-af34ea1f5417", + "isActive": true, + "balance": "$2,349.01", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "blue", + "name": "Dyer Justice", + "gender": "male", + "company": "INEAR", + "email": "dyerjustice@inear.com", + "phone": "+1 (878) 419-2030", + "address": "373 Brevoort Place, Highland, Washington, 7770", + "about": "Duis proident in proident eiusmod. Nisi occaecat ex incididunt laboris nisi proident incididunt officia ipsum. Elit aliqua et culpa culpa voluptate eiusmod amet adipisicing ex mollit est ullamco. Velit proident ea sint dolor enim reprehenderit anim fugiat amet nulla. Consequat non voluptate fugiat sit excepteur non laborum do qui adipisicing.\r\n", + "registered": "2014-09-06T01:54:01 -06:-30", + "latitude": 42.781377, + "longitude": 158.987247, + "tags": [ + "aliqua", + "non", + "sint", + "qui", + "consequat", + "velit", + "laboris" + ], + "friends": [ + { + "id": 0, + "name": "Guzman Hutchinson" + }, + { + "id": 1, + "name": "Graciela Olsen" + }, + { + "id": 2, + "name": "Herman Robertson" + } + ], + "greeting": "Hello, Dyer Justice! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4ba6c52669a3cc38be", + "index": 264, + "guid": "93b27237-2d5c-45bc-9d6b-50a698343b63", + "isActive": false, + "balance": "$1,953.85", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Ivy Contreras", + "gender": "female", + "company": "UXMOX", + "email": "ivycontreras@uxmox.com", + "phone": "+1 (995) 408-3368", + "address": "427 Applegate Court, Diaperville, Montana, 3882", + "about": "Elit laborum excepteur mollit voluptate et. Commodo laborum aliqua eu fugiat adipisicing aliquip eiusmod. Quis aute ad qui non voluptate esse aute dolor in cupidatat. Irure pariatur exercitation labore officia sint aliquip qui sit deserunt commodo amet nulla minim elit. Labore eiusmod voluptate velit proident deserunt excepteur nulla cillum anim adipisicing elit voluptate id.\r\n", + "registered": "2017-09-01T09:46:10 -06:-30", + "latitude": -69.140954, + "longitude": 94.018409, + "tags": [ + "est", + "aute", + "laboris", + "culpa", + "eiusmod", + "dolore", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Althea Price" + }, + { + "id": 1, + "name": "Vanessa Conner" + }, + { + "id": 2, + "name": "Darlene Warner" + } + ], + "greeting": "Hello, Ivy Contreras! You have 8 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b6159d43e7f9e3e4e", + "index": 265, + "guid": "15ab856a-e577-4f1e-843c-ec37401d1a93", + "isActive": false, + "balance": "$1,927.09", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Lottie Blair", + "gender": "female", + "company": "QUIZKA", + "email": "lottieblair@quizka.com", + "phone": "+1 (967) 478-3513", + "address": "496 Williamsburg Street, Lodoga, Hawaii, 9917", + "about": "In velit tempor ea reprehenderit ex reprehenderit amet. Culpa quis consequat sint fugiat consequat cillum ut qui cillum fugiat. Sunt exercitation Lorem adipisicing pariatur culpa esse ex. Velit nisi eu in voluptate laboris incididunt non adipisicing irure in qui qui cillum fugiat.\r\n", + "registered": "2020-08-21T03:02:53 -06:-30", + "latitude": -59.572538, + "longitude": 18.393405, + "tags": [ + "ex", + "ex", + "sunt", + "Lorem", + "qui", + "Lorem", + "esse" + ], + "friends": [ + { + "id": 0, + "name": "Emerson Bender" + }, + { + "id": 1, + "name": "Burt Booth" + }, + { + "id": 2, + "name": "Terry Hopper" + } + ], + "greeting": "Hello, Lottie Blair! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b26e561d36947f402", + "index": 266, + "guid": "4ec0f65d-6853-4ed9-a2ba-8a98ce5fc69b", + "isActive": true, + "balance": "$1,885.94", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "brown", + "name": "Vega House", + "gender": "male", + "company": "NETPLAX", + "email": "vegahouse@netplax.com", + "phone": "+1 (854) 440-2754", + "address": "394 Beard Street, Moscow, Michigan, 4895", + "about": "Sit labore nostrud velit voluptate tempor labore proident. Ex esse anim culpa est proident non aliqua proident incididunt ex reprehenderit officia Lorem. Adipisicing nostrud voluptate eiusmod velit tempor non anim dolor mollit aliquip non ut mollit ea. Amet aute aute do est velit aliquip velit nostrud ex eiusmod sit occaecat irure sint.\r\n", + "registered": "2020-04-25T09:17:36 -06:-30", + "latitude": -22.960241, + "longitude": -58.216309, + "tags": [ + "irure", + "officia", + "ad", + "laborum", + "amet", + "ad", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Carter Cleveland" + }, + { + "id": 1, + "name": "Amalia Taylor" + }, + { + "id": 2, + "name": "Terri Crane" + } + ], + "greeting": "Hello, Vega House! You have 4 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b97cf4a88612f0971", + "index": 267, + "guid": "0c451176-d08d-4a6d-bc67-2324008a2d15", + "isActive": false, + "balance": "$2,012.07", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "blue", + "name": "Malinda Howard", + "gender": "female", + "company": "OPTICON", + "email": "malindahoward@opticon.com", + "phone": "+1 (958) 567-3195", + "address": "423 Ridgewood Avenue, Vandiver, Maryland, 4623", + "about": "Proident do est labore enim eu fugiat dolor do proident. Et consectetur et esse sunt nostrud reprehenderit veniam proident mollit ut. Excepteur officia in mollit occaecat mollit tempor veniam veniam voluptate amet pariatur laborum aliqua est. Sunt tempor dolore minim exercitation exercitation proident non. Anim quis dolore consequat nostrud veniam esse magna deserunt irure. Tempor aliquip ex ut eu incididunt.\r\n", + "registered": "2019-11-17T03:15:25 -06:-30", + "latitude": 73.518036, + "longitude": -79.403601, + "tags": [ + "ex", + "mollit", + "reprehenderit", + "proident", + "laborum", + "minim", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Casandra Hart" + }, + { + "id": 1, + "name": "Jodi Walls" + }, + { + "id": 2, + "name": "Tanner Howe" + } + ], + "greeting": "Hello, Malinda Howard! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b511a6c10b1e1168a", + "index": 268, + "guid": "ab8fe8e7-a75a-4289-a4ec-c7618c576a2d", + "isActive": false, + "balance": "$3,330.92", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "blue", + "name": "Kinney Kerr", + "gender": "male", + "company": "ISOLOGICA", + "email": "kinneykerr@isologica.com", + "phone": "+1 (867) 432-3283", + "address": "893 Ridgewood Place, Washington, American Samoa, 9609", + "about": "Ea consectetur id laboris anim dolor magna veniam laborum nostrud aliqua fugiat pariatur. Elit veniam sit eu mollit esse do proident ad et voluptate excepteur aliqua est. Proident dolore laboris sunt commodo aliqua pariatur consequat laborum id magna cupidatat.\r\n", + "registered": "2015-09-18T07:13:10 -06:-30", + "latitude": 30.338159, + "longitude": -107.324039, + "tags": [ + "veniam", + "sit", + "commodo", + "incididunt", + "occaecat", + "duis", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Mallory Pacheco" + }, + { + "id": 1, + "name": "Caroline Lyons" + }, + { + "id": 2, + "name": "Liza Carrillo" + } + ], + "greeting": "Hello, Kinney Kerr! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bb563b32513b4f1bc", + "index": 269, + "guid": "330677cb-e1a4-4725-9e12-23206b25bd78", + "isActive": false, + "balance": "$2,867.96", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "blue", + "name": "Barrera Huffman", + "gender": "male", + "company": "CENTICE", + "email": "barrerahuffman@centice.com", + "phone": "+1 (909) 528-2447", + "address": "234 Division Place, Kraemer, Illinois, 6866", + "about": "Commodo do quis ea velit. Officia anim et non nostrud aliquip sit anim officia sunt. Id veniam eu enim Lorem.\r\n", + "registered": "2022-09-08T12:01:27 -06:-30", + "latitude": 57.638606, + "longitude": -152.47675, + "tags": [ + "nulla", + "voluptate", + "amet", + "in", + "tempor", + "incididunt", + "do" + ], + "friends": [ + { + "id": 0, + "name": "Bennett Rich" + }, + { + "id": 1, + "name": "Manning Grimes" + }, + { + "id": 2, + "name": "Reese Mcgowan" + } + ], + "greeting": "Hello, Barrera Huffman! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b0ce56561b67be377", + "index": 270, + "guid": "805d20e6-dabd-42d0-ae31-cb74eff6dd7d", + "isActive": false, + "balance": "$1,575.90", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "brown", + "name": "Nora Mcknight", + "gender": "female", + "company": "NEUROCELL", + "email": "noramcknight@neurocell.com", + "phone": "+1 (979) 531-2754", + "address": "192 Coffey Street, Urie, Missouri, 1402", + "about": "Aliqua ea laboris aliquip eu Lorem incididunt commodo veniam enim velit consequat dolor exercitation. Voluptate cupidatat consectetur irure dolor minim fugiat proident nisi ea. Aute et qui sit elit ex magna mollit proident nostrud ullamco minim. Magna enim anim consequat incididunt culpa cillum cupidatat id fugiat id occaecat magna Lorem incididunt. Nostrud pariatur eu deserunt ipsum voluptate pariatur laboris quis. Qui do ut voluptate dolor ullamco laboris pariatur laboris sint duis.\r\n", + "registered": "2021-02-15T05:09:37 -06:-30", + "latitude": -75.221683, + "longitude": 153.792124, + "tags": [ + "Lorem", + "id", + "magna", + "laboris", + "adipisicing", + "laboris", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Pat Terrell" + }, + { + "id": 1, + "name": "Garza Weeks" + }, + { + "id": 2, + "name": "Young Gay" + } + ], + "greeting": "Hello, Nora Mcknight! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b081625a886c437be", + "index": 271, + "guid": "63d53cd1-43c4-49b4-a98b-f899c6fc4589", + "isActive": false, + "balance": "$3,562.11", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Ortiz Quinn", + "gender": "male", + "company": "XPLOR", + "email": "ortizquinn@xplor.com", + "phone": "+1 (860) 478-2625", + "address": "109 Ridge Boulevard, Aberdeen, Idaho, 7438", + "about": "Amet sunt laborum minim labore enim elit. Laboris dolore velit est ex qui eu exercitation elit nulla mollit. Enim exercitation est commodo amet aliqua occaecat aliqua nostrud exercitation est.\r\n", + "registered": "2014-08-20T06:51:40 -06:-30", + "latitude": -15.0285, + "longitude": 137.809822, + "tags": [ + "sit", + "qui", + "esse", + "ullamco", + "enim", + "ut", + "elit" + ], + "friends": [ + { + "id": 0, + "name": "Rush Armstrong" + }, + { + "id": 1, + "name": "Kathie Kirk" + }, + { + "id": 2, + "name": "Janell Bennett" + } + ], + "greeting": "Hello, Ortiz Quinn! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bbe96e8a9c5e57a8c", + "index": 272, + "guid": "3d5e7c29-db64-43fc-8a88-1788f41066db", + "isActive": false, + "balance": "$1,965.52", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Lane Hawkins", + "gender": "male", + "company": "KRAG", + "email": "lanehawkins@krag.com", + "phone": "+1 (948) 422-2088", + "address": "196 Wogan Terrace, Wollochet, South Carolina, 2562", + "about": "Pariatur ex incididunt adipisicing id non Lorem. Voluptate incididunt aute velit dolore proident id elit adipisicing. Fugiat aute aute non qui est irure nisi laborum. Nostrud anim dolor Lorem est velit sit occaecat sunt nisi ipsum.\r\n", + "registered": "2017-04-08T04:10:19 -06:-30", + "latitude": -17.492173, + "longitude": -102.104486, + "tags": [ + "amet", + "sit", + "irure", + "quis", + "ipsum", + "sit", + "non" + ], + "friends": [ + { + "id": 0, + "name": "Conley Duran" + }, + { + "id": 1, + "name": "Manuela Landry" + }, + { + "id": 2, + "name": "Mai Christian" + } + ], + "greeting": "Hello, Lane Hawkins! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bd77184797e4c3e30", + "index": 273, + "guid": "2f20945d-5494-420b-9f2a-2c207bfe431e", + "isActive": true, + "balance": "$2,850.40", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Gregory Gallagher", + "gender": "male", + "company": "GREEKER", + "email": "gregorygallagher@greeker.com", + "phone": "+1 (881) 516-2484", + "address": "692 Everit Street, Westwood, Colorado, 8209", + "about": "Aute non reprehenderit eu fugiat consectetur ad culpa in. Fugiat nostrud non do cillum quis ex elit sit sunt. Elit culpa culpa commodo consectetur voluptate voluptate ex culpa ex proident id laborum occaecat. Ad adipisicing non consectetur culpa ullamco velit eu id aliquip non sunt minim cillum Lorem.\r\n", + "registered": "2018-09-29T12:30:22 -06:-30", + "latitude": 48.174766, + "longitude": 126.775643, + "tags": [ + "mollit", + "in", + "Lorem", + "duis", + "magna", + "Lorem", + "commodo" + ], + "friends": [ + { + "id": 0, + "name": "Sandoval Morin" + }, + { + "id": 1, + "name": "Heather Gonzalez" + }, + { + "id": 2, + "name": "Finley Cochran" + } + ], + "greeting": "Hello, Gregory Gallagher! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b2be0d67558a4ad9f", + "index": 274, + "guid": "d309864a-72d1-4233-82ec-c678bc41687f", + "isActive": false, + "balance": "$3,539.33", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Zelma Cooper", + "gender": "female", + "company": "WRAPTURE", + "email": "zelmacooper@wrapture.com", + "phone": "+1 (885) 597-2476", + "address": "110 Centre Street, Robinson, New Hampshire, 6677", + "about": "Et cillum est exercitation dolore. Exercitation sit id amet commodo est exercitation excepteur tempor nulla occaecat esse mollit irure. Ad tempor cupidatat elit duis proident est ipsum qui anim exercitation voluptate proident. Dolore ut tempor fugiat deserunt fugiat aute ipsum laborum cillum elit. Nisi cillum et esse et aliqua ipsum laboris. Quis excepteur deserunt aute ad incididunt sunt incididunt enim ex non. Adipisicing veniam anim magna magna quis officia labore esse consectetur laborum nisi irure exercitation.\r\n", + "registered": "2022-04-16T10:18:25 -06:-30", + "latitude": 51.696195, + "longitude": 68.580932, + "tags": [ + "mollit", + "laboris", + "consectetur", + "deserunt", + "officia", + "tempor", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Gilmore Sutton" + }, + { + "id": 1, + "name": "Miriam Riddle" + }, + { + "id": 2, + "name": "Erna Thomas" + } + ], + "greeting": "Hello, Zelma Cooper! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b85e93a51154a8542", + "index": 275, + "guid": "45e484c9-e61a-40ac-8bf5-cfedc5d505ea", + "isActive": false, + "balance": "$2,702.57", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Jenny Dale", + "gender": "female", + "company": "INDEXIA", + "email": "jennydale@indexia.com", + "phone": "+1 (855) 441-2012", + "address": "180 Roder Avenue, Chumuckla, Minnesota, 150", + "about": "Labore aliqua enim incididunt deserunt officia. Non dolore dolor aute dolore cupidatat culpa adipisicing ut mollit minim. Aliquip officia proident dolore sit nostrud ipsum consectetur exercitation eiusmod aute voluptate pariatur amet qui. Non cillum sunt incididunt pariatur quis dolor voluptate dolore do incididunt.\r\n", + "registered": "2020-07-05T06:44:46 -06:-30", + "latitude": 72.877526, + "longitude": 77.280833, + "tags": [ + "exercitation", + "eu", + "pariatur", + "commodo", + "nulla", + "anim", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Leann Burris" + }, + { + "id": 1, + "name": "Willie Chase" + }, + { + "id": 2, + "name": "Kim Bradshaw" + } + ], + "greeting": "Hello, Jenny Dale! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4bdc5907085de99627", + "index": 276, + "guid": "f22850bb-c61b-4720-9782-d9f758077a77", + "isActive": true, + "balance": "$3,118.81", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Dawn Little", + "gender": "female", + "company": "ETERNIS", + "email": "dawnlittle@eternis.com", + "phone": "+1 (917) 536-3136", + "address": "359 Sullivan Place, Singer, Utah, 120", + "about": "Ad consequat laborum pariatur mollit ipsum proident qui do laborum duis. Sunt nisi est do ex in commodo duis mollit consectetur. Aute occaecat et est qui tempor officia elit aute pariatur nulla. Ea commodo aliqua Lorem dolor non aliquip. Nisi officia dolor eu nulla occaecat Lorem ea cupidatat laboris consectetur. Nulla anim ad amet sit culpa cillum fugiat. Nisi quis id voluptate labore mollit enim Lorem velit irure ex.\r\n", + "registered": "2020-01-04T03:21:49 -06:-30", + "latitude": -30.433769, + "longitude": -89.423016, + "tags": [ + "ut", + "exercitation", + "cillum", + "culpa", + "et", + "enim", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Therese Bradley" + }, + { + "id": 1, + "name": "Glenn Allison" + }, + { + "id": 2, + "name": "Woodward Branch" + } + ], + "greeting": "Hello, Dawn Little! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4bfa1c3e93899233e9", + "index": 277, + "guid": "4dd8e63d-f792-4233-9948-da9a23cbbe27", + "isActive": true, + "balance": "$3,289.46", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Richardson Blake", + "gender": "male", + "company": "IMANT", + "email": "richardsonblake@imant.com", + "phone": "+1 (955) 477-3053", + "address": "735 Homecrest Court, Jacksonburg, South Dakota, 5993", + "about": "Dolore veniam qui excepteur labore reprehenderit et fugiat laborum. Ut ut occaecat consectetur reprehenderit cillum reprehenderit cupidatat. Est commodo incididunt sint voluptate magna mollit qui.\r\n", + "registered": "2014-10-17T04:35:01 -06:-30", + "latitude": 48.332012, + "longitude": 140.945931, + "tags": [ + "ex", + "enim", + "sint", + "aliqua", + "deserunt", + "duis", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Francis Massey" + }, + { + "id": 1, + "name": "Rice Blankenship" + }, + { + "id": 2, + "name": "Eliza Brooks" + } + ], + "greeting": "Hello, Richardson Blake! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b6c86d076eb09ec28", + "index": 278, + "guid": "46e50265-ae28-4c7b-811f-97fddde001ad", + "isActive": false, + "balance": "$3,204.94", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Schneider Cooke", + "gender": "male", + "company": "DOGNOSIS", + "email": "schneidercooke@dognosis.com", + "phone": "+1 (820) 478-2187", + "address": "997 Dodworth Street, Century, Arizona, 4663", + "about": "Excepteur non ea eiusmod eiusmod ad ipsum sint cillum amet aute nostrud. Ea cupidatat enim laborum consequat ea elit exercitation id anim magna nulla anim. Labore veniam in consectetur irure. Ullamco quis et incididunt ut.\r\n", + "registered": "2019-11-29T04:49:37 -06:-30", + "latitude": -20.800462, + "longitude": 166.287914, + "tags": [ + "voluptate", + "est", + "non", + "nulla", + "anim", + "ipsum", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Martinez Shelton" + }, + { + "id": 1, + "name": "Moody Jefferson" + }, + { + "id": 2, + "name": "Tracey Downs" + } + ], + "greeting": "Hello, Schneider Cooke! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b19702781e2085843", + "index": 279, + "guid": "49da74d3-8e54-47b8-99b9-45c155cb619b", + "isActive": false, + "balance": "$1,213.80", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Diann Roy", + "gender": "female", + "company": "DANCERITY", + "email": "diannroy@dancerity.com", + "phone": "+1 (953) 477-2517", + "address": "824 Grace Court, Macdona, Marshall Islands, 5181", + "about": "Laborum ex adipisicing qui cillum fugiat veniam voluptate. Nisi labore ad cupidatat irure. Eu cillum qui aliqua consequat nisi dolor anim aute nisi.\r\n", + "registered": "2016-09-08T06:08:06 -06:-30", + "latitude": -27.641694, + "longitude": -92.358793, + "tags": [ + "sint", + "cupidatat", + "ad", + "proident", + "in", + "aute", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Maura Matthews" + }, + { + "id": 1, + "name": "Mccullough Riggs" + }, + { + "id": 2, + "name": "Julianne Baxter" + } + ], + "greeting": "Hello, Diann Roy! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b3872c7b8a2a79958", + "index": 280, + "guid": "3f35c175-bd5a-43f5-a7c0-df3eb3b5eb89", + "isActive": true, + "balance": "$1,840.22", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "brown", + "name": "Elliott Chapman", + "gender": "male", + "company": "SUREPLEX", + "email": "elliottchapman@sureplex.com", + "phone": "+1 (906) 570-2182", + "address": "840 Graham Avenue, Wanship, Ohio, 8118", + "about": "Aliquip id in sunt voluptate excepteur deserunt eu aliquip aute. Pariatur voluptate cupidatat adipisicing deserunt excepteur duis enim. Enim sit fugiat nisi aliquip nostrud duis incididunt duis sint ullamco anim ipsum.\r\n", + "registered": "2017-01-19T02:26:31 -06:-30", + "latitude": 31.989451, + "longitude": -31.517905, + "tags": [ + "exercitation", + "pariatur", + "irure", + "duis", + "laborum", + "quis", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Lindsay Lindsay" + }, + { + "id": 1, + "name": "Rollins Small" + }, + { + "id": 2, + "name": "Mary Kline" + } + ], + "greeting": "Hello, Elliott Chapman! You have 3 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b19b17294c6f492c6", + "index": 281, + "guid": "1aee0e3f-125b-4d83-aa16-2dccd2ca60e0", + "isActive": false, + "balance": "$2,834.47", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "green", + "name": "Sparks Stout", + "gender": "male", + "company": "ASIMILINE", + "email": "sparksstout@asimiline.com", + "phone": "+1 (933) 471-2438", + "address": "376 Norfolk Street, Stagecoach, Alabama, 8135", + "about": "Irure ipsum minim veniam amet aliquip laboris dolore ullamco exercitation duis tempor esse minim ullamco. Duis voluptate ex id aute fugiat ad voluptate commodo laboris ex Lorem ullamco ex in. Eiusmod tempor ipsum dolor labore tempor magna. Ad deserunt magna ut et cupidatat qui mollit deserunt laborum ex nostrud. Tempor anim culpa ipsum velit incididunt esse irure dolore ex labore adipisicing enim nostrud.\r\n", + "registered": "2016-02-13T04:07:21 -06:-30", + "latitude": 14.379024, + "longitude": -167.78528, + "tags": [ + "ad", + "id", + "ea", + "officia", + "non", + "dolor", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Hester Soto" + }, + { + "id": 1, + "name": "Elsa Osborn" + }, + { + "id": 2, + "name": "Ila White" + } + ], + "greeting": "Hello, Sparks Stout! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b4c24d4b1a42eb4aa", + "index": 282, + "guid": "5dcffabc-7651-477b-be2a-2a0653376d01", + "isActive": true, + "balance": "$1,304.85", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "green", + "name": "Georgia Winters", + "gender": "female", + "company": "NEWCUBE", + "email": "georgiawinters@newcube.com", + "phone": "+1 (884) 577-3851", + "address": "557 Gain Court, Websterville, Georgia, 9055", + "about": "Excepteur sint dolore deserunt ut fugiat sunt eu eu qui aliquip deserunt. Do elit occaecat veniam eiusmod ex veniam do irure excepteur in. Irure deserunt elit id culpa commodo tempor cupidatat incididunt in. Officia in non mollit aute Lorem. Ex et sunt ea cillum officia mollit mollit est.\r\n", + "registered": "2019-05-29T06:29:28 -06:-30", + "latitude": -22.247023, + "longitude": 112.605193, + "tags": [ + "enim", + "nisi", + "non", + "commodo", + "tempor", + "non", + "anim" + ], + "friends": [ + { + "id": 0, + "name": "Burnett Colon" + }, + { + "id": 1, + "name": "Lacy Good" + }, + { + "id": 2, + "name": "Carson Jarvis" + } + ], + "greeting": "Hello, Georgia Winters! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4bae4b8a9e57a2d3df", + "index": 283, + "guid": "6d9fd2d9-4735-4e1e-896c-ef2ec6422a54", + "isActive": false, + "balance": "$1,592.27", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "brown", + "name": "Knapp Bright", + "gender": "male", + "company": "EARGO", + "email": "knappbright@eargo.com", + "phone": "+1 (977) 586-3480", + "address": "445 Maple Street, Shelby, California, 4050", + "about": "Mollit ut enim reprehenderit aliqua qui elit. Excepteur exercitation consectetur sunt adipisicing enim aute amet nulla cillum laborum do anim dolor amet. Eiusmod dolor reprehenderit duis cillum eiusmod tempor irure ut consectetur dolore quis.\r\n", + "registered": "2018-08-31T06:16:57 -06:-30", + "latitude": 48.991183, + "longitude": 47.095639, + "tags": [ + "minim", + "sint", + "ea", + "commodo", + "culpa", + "in", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Mays Conley" + }, + { + "id": 1, + "name": "Hoffman Lewis" + }, + { + "id": 2, + "name": "Noel French" + } + ], + "greeting": "Hello, Knapp Bright! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b5acd5ba97913e3fb", + "index": 284, + "guid": "b1b627df-d06d-4a2c-84e2-20da6977b587", + "isActive": false, + "balance": "$3,871.69", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Patty Harris", + "gender": "female", + "company": "ISOSPHERE", + "email": "pattyharris@isosphere.com", + "phone": "+1 (897) 439-3824", + "address": "997 Sumner Place, Concho, Northern Mariana Islands, 3965", + "about": "Exercitation laborum deserunt aliqua et aliquip consequat est velit et labore elit velit minim ullamco. Et officia eu incididunt anim. Dolore ullamco sint amet id et veniam commodo minim non enim occaecat.\r\n", + "registered": "2017-01-10T06:27:38 -06:-30", + "latitude": -35.533226, + "longitude": -91.678584, + "tags": [ + "cupidatat", + "dolor", + "occaecat", + "incididunt", + "anim", + "sint", + "dolore" + ], + "friends": [ + { + "id": 0, + "name": "Allison Woodard" + }, + { + "id": 1, + "name": "Victoria Glenn" + }, + { + "id": 2, + "name": "Deena Fuentes" + } + ], + "greeting": "Hello, Patty Harris! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "63443d4b4f4c251bb21830e7", + "index": 285, + "guid": "e9b13a45-cb6b-4669-ae83-12edd47a2f28", + "isActive": true, + "balance": "$3,716.22", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Betsy Hill", + "gender": "female", + "company": "EPLODE", + "email": "betsyhill@eplode.com", + "phone": "+1 (897) 587-2665", + "address": "467 Maujer Street, Wright, Kansas, 3146", + "about": "Officia voluptate nisi qui cillum deserunt voluptate ullamco quis reprehenderit dolore. Incididunt sint cillum dolore quis dolore proident sunt mollit. Culpa dolore ipsum anim sunt. Elit quis Lorem et et nisi dolor. Nulla ea nisi Lorem ut aliquip fugiat. Non in qui id nostrud officia eiusmod voluptate. Incididunt aute excepteur commodo non in non elit aute id.\r\n", + "registered": "2018-05-27T12:41:40 -06:-30", + "latitude": 47.115066, + "longitude": 34.428528, + "tags": [ + "ea", + "adipisicing", + "aute", + "enim", + "do", + "incididunt", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Kirkland Conway" + }, + { + "id": 1, + "name": "Jerri Thompson" + }, + { + "id": 2, + "name": "Sellers Reed" + } + ], + "greeting": "Hello, Betsy Hill! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "63443d4b356c480c42968ba3", + "index": 286, + "guid": "367c645b-ecc6-46ef-bc74-b91f9299e6ba", + "isActive": true, + "balance": "$2,545.62", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Leanna Nielsen", + "gender": "female", + "company": "DANCITY", + "email": "leannanielsen@dancity.com", + "phone": "+1 (966) 510-3280", + "address": "758 Dennett Place, Dola, North Dakota, 9945", + "about": "Eiusmod veniam eiusmod sint eu labore minim amet minim laborum eiusmod occaecat veniam culpa adipisicing. Cupidatat ea aliqua proident est nulla dolore sunt elit dolor in. Fugiat id nulla sint labore.\r\n", + "registered": "2021-08-18T04:57:05 -06:-30", + "latitude": 64.771707, + "longitude": 34.254386, + "tags": [ + "dolore", + "pariatur", + "officia", + "irure", + "commodo", + "Lorem", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Jacqueline Delgado" + }, + { + "id": 1, + "name": "Jessica Greene" + }, + { + "id": 2, + "name": "Mccall Padilla" + } + ], + "greeting": "Hello, Leanna Nielsen! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "63443d4b79752d7e08d02b64", + "index": 287, + "guid": "39cf955d-99da-48e9-8cbc-8551cc87cd13", + "isActive": true, + "balance": "$1,909.58", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "green", + "name": "Battle Chang", + "gender": "male", + "company": "XELEGYL", + "email": "battlechang@xelegyl.com", + "phone": "+1 (881) 476-2026", + "address": "278 Linden Boulevard, Vaughn, New York, 3139", + "about": "Eiusmod labore voluptate labore sint nisi nostrud cupidatat ex cillum ad minim amet minim ut. Dolore quis fugiat et officia nostrud labore quis dolor nisi deserunt. Reprehenderit aute in laboris sint deserunt.\r\n", + "registered": "2015-06-03T07:30:42 -06:-30", + "latitude": 64.581001, + "longitude": -114.57166, + "tags": [ + "adipisicing", + "nisi", + "enim", + "adipisicing", + "consectetur", + "deserunt", + "duis" + ], + "friends": [ + { + "id": 0, + "name": "Kirk Hurley" + }, + { + "id": 1, + "name": "Angie Malone" + }, + { + "id": 2, + "name": "Snow Steele" + } + ], + "greeting": "Hello, Battle Chang! You have 3 unread messages.", + "favoriteFruit": "strawberry" + } + ] +} \ No newline at end of file diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml index 1e0ae825e1..bef6d148be 100644 --- a/spring-security-modules/pom.xml +++ b/spring-security-modules/pom.xml @@ -47,7 +47,7 @@ spring-security-web-thymeleaf spring-security-web-x509 spring-security-opa - spring-security-pkce + spring-security-pkce \ No newline at end of file diff --git a/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java b/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java index ba0436d20d..62cdd7c73c 100644 --- a/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java @@ -1,14 +1,15 @@ package com.baeldung.cognito; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf() .and() .authorizeRequests(authz -> authz.mvcMatchers("/") @@ -19,5 +20,6 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .and() .logout() .logoutSuccessUrl("/"); + return http.build(); } } \ No newline at end of file diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/authresolver/CustomWebSecurityConfigurer.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/authresolver/CustomWebSecurityConfigurer.java index 33ef692173..b2450546b0 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/authresolver/CustomWebSecurityConfigurer.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/authresolver/CustomWebSecurityConfigurer.java @@ -2,22 +2,23 @@ package com.baeldung.authresolver; import java.util.Collections; import javax.servlet.http.HttpServletRequest; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManagerResolver; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationConverter; import org.springframework.security.web.authentication.AuthenticationFilter; import org.springframework.security.web.authentication.www.BasicAuthenticationConverter; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; @Configuration -public class CustomWebSecurityConfigurer extends WebSecurityConfigurerAdapter { +public class CustomWebSecurityConfigurer { public AuthenticationConverter authenticationConverter() { return new BasicAuthenticationConverter(); @@ -85,12 +86,10 @@ public class CustomWebSecurityConfigurer extends WebSecurityConfigurerAdapter { }; } - @Override - protected void configure(HttpSecurity http) { - http.addFilterBefore( - authenticationFilter(), - BasicAuthenticationFilter.class - ); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.addFilterBefore(authenticationFilter(), BasicAuthenticationFilter.class); + return http.build(); } } diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/dsl/SecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/dsl/SecurityConfig.java index 382e222f64..7148ee0956 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/dsl/SecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/dsl/SecurityConfig.java @@ -2,17 +2,19 @@ package com.baeldung.dsl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin*") .hasAnyRole("ADMIN") @@ -22,6 +24,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .formLogin() .and() .apply(clientErrorLogging()); + return http.build(); } @Bean @@ -29,17 +32,17 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { return new ClientErrorLoggingConfigurer(); } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .passwordEncoder(passwordEncoder()) - .withUser("user1") + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user1 = User.withUsername("user1") .password(passwordEncoder().encode("user")) .roles("USER") - .and() - .withUser("admin") + .build(); + UserDetails admin = User.withUsername("admin") .password(passwordEncoder().encode("admin")) - .roles("ADMIN"); + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(user1, admin); } @Bean diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java index 71ded0f131..8cb855a365 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/exceptionhandler/security/SecurityConfig.java @@ -1,21 +1,20 @@ package com.baeldung.exceptionhandler.security; import org.springframework.context.annotation.Bean; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; @EnableWebSecurity -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { @Bean public UserDetailsService userDetailsService() { @@ -40,20 +39,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { return userDetailsManager; } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("user") - .password("{noop}password") - .roles("USER") - .and() - .withUser("admin") - .password("{noop}password") - .roles("ADMIN"); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf() .disable() .httpBasic() @@ -78,6 +65,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .accessDeniedHandler(accessDeniedHandler()) .and() .logout(); + return http.build(); } @Bean diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/CustomSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/CustomSecurityConfig.java index cee3e9b62b..7f84b08144 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/CustomSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/CustomSecurityConfig.java @@ -4,19 +4,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity -public class CustomSecurityConfig extends WebSecurityConfigurerAdapter { +public class CustomSecurityConfig { @Autowired @Qualifier("customAuthenticationEntryPoint") @@ -33,8 +32,8 @@ public class CustomSecurityConfig extends WebSecurityConfigurerAdapter { return userDetailsManager; } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.requestMatchers() .antMatchers("/login") .and() @@ -46,13 +45,7 @@ public class CustomSecurityConfig extends WebSecurityConfigurerAdapter { .and() .exceptionHandling() .authenticationEntryPoint(authEntryPoint); + return http.build(); } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("admin") - .password("password") - .roles("ADMIN"); - } } diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/DelegatedSecurityConfig.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/DelegatedSecurityConfig.java index 45582d3f5e..032ce82925 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/DelegatedSecurityConfig.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/global/exceptionhandler/security/DelegatedSecurityConfig.java @@ -2,25 +2,28 @@ package com.baeldung.global.exceptionhandler.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @Order(101) -public class DelegatedSecurityConfig extends WebSecurityConfigurerAdapter { +public class DelegatedSecurityConfig { @Autowired @Qualifier("delegatedAuthenticationEntryPoint") AuthenticationEntryPoint authEntryPoint; - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.requestMatchers() .antMatchers("/login-handler") .and() @@ -32,13 +35,15 @@ public class DelegatedSecurityConfig extends WebSecurityConfigurerAdapter { .and() .exceptionHandling() .authenticationEntryPoint(authEntryPoint); + return http.build(); } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("admin") + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails admin = User.withUsername("admin") .password("password") - .roles("ADMIN"); + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(admin); } } diff --git a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/xss/SecurityConf.java b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/xss/SecurityConf.java index 25d8026e4a..498d09194c 100644 --- a/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/xss/SecurityConf.java +++ b/spring-security-modules/spring-security-core-2/src/main/java/com/baeldung/xss/SecurityConf.java @@ -1,25 +1,27 @@ package com.baeldung.xss; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class SecurityConf extends WebSecurityConfigurerAdapter { +public class SecurityConf { - @Override - public void configure(WebSecurity web) { + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { // Ignoring here is only for this example. Normally people would apply their own authentication/authorization policies - web.ignoring().antMatchers("/**"); + return (web) -> web.ignoring() + .antMatchers("/**"); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .headers() + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.headers() .xssProtection() .and() .contentSecurityPolicy("script-src 'self'"); + return http.build(); } } diff --git a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java index 69f90d9de9..78e4dff29c 100644 --- a/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-ldap/src/main/java/com/baeldung/config/SecurityConfig.java @@ -1,39 +1,58 @@ package com.baeldung.config; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.ldap.core.support.BaseLdapPathContextSource; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.ldap.LdapBindAuthenticationManagerFactory; +import org.springframework.security.ldap.server.ApacheDSContainer; +import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator; +import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; +import org.springframework.security.web.SecurityFilterChain; /** * Security Configuration - LDAP and HTTP Authorizations. */ @Configuration // @ImportResource({ "classpath:webSecurityConfig.xml" }) //=> uncomment to use equivalent xml config -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.ldapAuthentication() - .userSearchBase("ou=people") - .userSearchFilter("(uid={0})") - .groupSearchBase("ou=groups") - .groupSearchFilter("(member={0})") - .contextSource() - .root("dc=baeldung,dc=com") - .ldif("classpath:users.ldif"); + @Bean + ApacheDSContainer ldapContainer() throws Exception { + return new ApacheDSContainer("dc=baeldung,dc=com", "classpath:users.ldif"); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/", "/home", "/css/**") - .permitAll() - .anyRequest() - .authenticated() - .and().formLogin().loginPage("/login").permitAll() - .and().logout().logoutSuccessUrl("/"); + @Bean + LdapAuthoritiesPopulator authorities(BaseLdapPathContextSource contextSource) { + String groupSearchBase = "ou=groups"; + DefaultLdapAuthoritiesPopulator authorities = new DefaultLdapAuthoritiesPopulator(contextSource, groupSearchBase); + authorities.setGroupSearchFilter("(member={0})"); + return authorities; } + @Bean + AuthenticationManager authenticationManager(BaseLdapPathContextSource contextSource, LdapAuthoritiesPopulator authorities) { + LdapBindAuthenticationManagerFactory factory = new LdapBindAuthenticationManagerFactory(contextSource); + factory.setUserSearchBase("ou=people"); + factory.setUserSearchFilter("(uid={0})"); + return factory.createAuthenticationManager(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/", "/home", "/css/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage("/login") + .permitAll() + .and() + .logout() + .logoutSuccessUrl("/"); + return http.build(); + } } diff --git a/spring-security-modules/spring-security-legacy-oidc/src/main/java/com/baeldung/openid/oidc/SecurityConfig.java b/spring-security-modules/spring-security-legacy-oidc/src/main/java/com/baeldung/openid/oidc/SecurityConfig.java index fc5397a35b..073989c2f8 100644 --- a/spring-security-modules/spring-security-legacy-oidc/src/main/java/com/baeldung/openid/oidc/SecurityConfig.java +++ b/spring-security-modules/spring-security-legacy-oidc/src/main/java/com/baeldung/openid/oidc/SecurityConfig.java @@ -4,23 +4,24 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter; @Configuration @EnableWebSecurity -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { @Autowired private OAuth2RestTemplate restTemplate; - @Override - public void configure(WebSecurity web) throws Exception { - web.ignoring().antMatchers("/resources/**"); + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + return (web) -> web.ignoring() + .antMatchers("/resources/**"); } @Bean @@ -30,19 +31,17 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { return filter; } - @Override - protected void configure(HttpSecurity http) throws Exception { - // @formatter:off - http - .addFilterAfter(new OAuth2ClientContextFilter(), AbstractPreAuthenticatedProcessingFilter.class) - .addFilterAfter(myFilter(), OAuth2ClientContextFilter.class) - .httpBasic().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/google-login")) - .and() - .authorizeRequests() - // .antMatchers("/","/index*").permitAll() - .anyRequest().authenticated() - ; - - // @formatter:on + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.addFilterAfter(new OAuth2ClientContextFilter(), AbstractPreAuthenticatedProcessingFilter.class) + .addFilterAfter(myFilter(), OAuth2ClientContextFilter.class) + .httpBasic() + .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/google-login")) + .and() + .authorizeRequests() + // .antMatchers("/","/index*").permitAll() + .anyRequest() + .authenticated(); + return http.build(); } } \ No newline at end of file diff --git a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/com/baeldung/intro/config/WebSecurityConfig.java b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/com/baeldung/intro/config/WebSecurityConfig.java index cc694a3b83..368d6e471f 100644 --- a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/com/baeldung/intro/config/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/com/baeldung/intro/config/WebSecurityConfig.java @@ -6,39 +6,47 @@ import org.springframework.core.io.FileSystemResource; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.kerberos.authentication.KerberosAuthenticationProvider; import org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider; import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosClient; import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator; import org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter; import org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; import com.baeldung.intro.security.DummyUserDetailsService; @Configuration -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +public class WebSecurityConfig extends AbstractHttpConfigurer { - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests() - .anyRequest() - .authenticated() - .and() - .addFilterBefore(spnegoAuthenticationProcessingFilter(authenticationManagerBean()), BasicAuthenticationFilter.class); + public static WebSecurityConfig securityConfig() { + return new WebSecurityConfig(); } @Override + public void configure(HttpSecurity http) throws Exception { + AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); + http.addFilterBefore(spnegoAuthenticationProcessingFilter(authenticationManager), BasicAuthenticationFilter.class); + } + @Bean - public AuthenticationManager authenticationManagerBean() throws Exception { - return super.authenticationManagerBean(); + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .apply(securityConfig()); + return http.build(); } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.authenticationProvider(kerberosAuthenticationProvider()) - .authenticationProvider(kerberosServiceAuthenticationProvider()); + @Bean + public AuthenticationManager authManager(HttpSecurity http) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class) + .authenticationProvider(kerberosAuthenticationProvider()) + .authenticationProvider(kerberosServiceAuthenticationProvider()) + .build(); } @Bean diff --git a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/kerberos/server/config/WebSecurityConfig.java b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/kerberos/server/config/WebSecurityConfig.java index 5d241c5823..80d81dd268 100644 --- a/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/kerberos/server/config/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2-sso/spring-security-sso-kerberos/src/main/java/kerberos/server/config/WebSecurityConfig.java @@ -9,18 +9,19 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.kerberos.authentication.KerberosAuthenticationProvider; import org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider; import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosClient; import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator; import org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter; import org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; @Configuration @EnableWebSecurity -class WebSecurityConfig extends WebSecurityConfigurerAdapter { +class WebSecurityConfig extends AbstractHttpConfigurer { @Value("${app.service-principal}") private String servicePrincipal; @@ -28,32 +29,45 @@ class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Value("${app.keytab-location}") private String keytabLocation; - @Override - protected void configure(HttpSecurity http) throws Exception { - http.exceptionHandling() - .authenticationEntryPoint(spnegoEntryPoint()) - .and() - .authorizeRequests().antMatchers("/", "/home").permitAll() - .anyRequest().authenticated() - .and() - .formLogin().loginPage("/login").permitAll() - .and() - .logout().permitAll() - .and() - .addFilterBefore(spnegoAuthenticationProcessingFilter(authenticationManagerBean()), - BasicAuthenticationFilter.class); - } + public static WebSecurityConfig securityConfig() { + return new WebSecurityConfig(); + } - @Bean - public AuthenticationManager anAuthenticationManager() throws Exception { - return authenticationManager(); - } + @Override + public void configure(HttpSecurity http) throws Exception { + AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); + http.addFilterBefore(spnegoAuthenticationProcessingFilter(authenticationManager), BasicAuthenticationFilter.class); + } - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.authenticationProvider(kerberosAuthenticationProvider()) - .authenticationProvider(kerberosServiceAuthenticationProvider()); - } + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.exceptionHandling() + .authenticationEntryPoint(spnegoEntryPoint()) + .and() + .authorizeRequests() + .antMatchers("/", "/home") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage("/login") + .permitAll() + .and() + .logout() + .permitAll() + .and() + .apply(securityConfig()); + return http.build(); + } + + @Bean + public AuthenticationManager authManager(HttpSecurity http) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class) + .authenticationProvider(kerberosAuthenticationProvider()) + .authenticationProvider(kerberosServiceAuthenticationProvider()) + .build(); + } @Bean public KerberosAuthenticationProvider kerberosAuthenticationProvider() { diff --git a/spring-security-modules/spring-security-oauth2/pom.xml b/spring-security-modules/spring-security-oauth2/pom.xml index 11c9ec0c37..1b30f6685d 100644 --- a/spring-security-modules/spring-security-oauth2/pom.xml +++ b/spring-security-modules/spring-security-oauth2/pom.xml @@ -53,7 +53,7 @@ org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure - ${spring-boot.version} + ${spring-security-oauth2-autoconfigure.version} org.springframework.security @@ -80,9 +80,7 @@ - - - 2.5.2 + 2.6.8 com.baeldung.oauth2.SpringOAuthApplication 2.17.1 diff --git a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/SecurityConfig.java index 5644856695..ff957d91b3 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/SecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/jersey/SecurityConfig.java @@ -1,21 +1,23 @@ package com.baeldung.jersey; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .antMatchers("/login") - .permitAll() - .anyRequest() - .authenticated() - .and() - .oauth2Login() - .loginPage("/login"); +public class SecurityConfig { + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/login") + .permitAll() + .anyRequest() + .authenticated() + .and() + .oauth2Login() + .loginPage("/login"); + return http.build(); } } diff --git a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java index 2aba5a82ac..e0976a34b2 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java @@ -10,7 +10,6 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; @@ -23,6 +22,7 @@ import org.springframework.security.oauth2.client.web.AuthorizationRequestReposi import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.web.client.RestTemplate; import com.baeldung.oauth2request.CustomAuthorizationRequestResolver; @@ -31,10 +31,10 @@ import com.baeldung.oauth2request.CustomTokenResponseConverter; //@Configuration @PropertySource("application-oauth2.properties") -public class CustomRequestSecurityConfig extends WebSecurityConfigurerAdapter { +public class CustomRequestSecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/oauth_login", "/loginFailure", "/") .permitAll() @@ -44,8 +44,7 @@ public class CustomRequestSecurityConfig extends WebSecurityConfigurerAdapter { .oauth2Login() .loginPage("/oauth_login") .authorizationEndpoint() - .authorizationRequestResolver( new CustomAuthorizationRequestResolver(clientRegistrationRepository(),"/oauth2/authorize-client")) - + .authorizationRequestResolver(new CustomAuthorizationRequestResolver(clientRegistrationRepository(), "/oauth2/authorize-client")) .baseUri("/oauth2/authorize-client") .authorizationRequestRepository(authorizationRequestRepository()) .and() @@ -54,6 +53,7 @@ public class CustomRequestSecurityConfig extends WebSecurityConfigurerAdapter { .and() .defaultSuccessUrl("/loginSuccess") .failureUrl("/loginFailure"); + return http.build(); } @Bean diff --git a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SecurityConfig.java index c9164e2215..a33ca5e4c1 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2/SecurityConfig.java @@ -10,7 +10,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; @@ -23,13 +22,14 @@ import org.springframework.security.oauth2.client.registration.InMemoryClientReg import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; +import org.springframework.security.web.SecurityFilterChain; @Configuration @PropertySource("application-oauth2.properties") -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/oauth_login", "/loginFailure", "/") .permitAll() @@ -47,8 +47,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .and() .defaultSuccessUrl("/loginSuccess") .failureUrl("/loginFailure"); + return http.build(); } - + @Bean public AuthorizationRequestRepository authorizationRequestRepository() { return new HttpSessionOAuth2AuthorizationRequestRepository(); diff --git a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java index b2ea19c008..3347dd4fc2 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java @@ -4,29 +4,30 @@ import com.baeldung.oauth2extractors.extractor.custom.BaeldungAuthoritiesExtract import com.baeldung.oauth2extractors.extractor.custom.BaeldungPrincipalExtractor; import com.baeldung.oauth2extractors.extractor.github.GithubAuthoritiesExtractor; import com.baeldung.oauth2extractors.extractor.github.GithubPrincipalExtractor; -import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.boot.autoconfigure.security.oauth2.resource.AuthoritiesExtractor; import org.springframework.boot.autoconfigure.security.oauth2.resource.PrincipalExtractor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration -@EnableOAuth2Sso -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.antMatcher("/**") - .authorizeRequests() - .antMatchers("/login**") - .permitAll() - .anyRequest() - .authenticated() - .and() - .formLogin().disable(); + .authorizeRequests() + .antMatchers("/login**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .disable() + .oauth2Login(); + return http.build(); } @Bean diff --git a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java index fa274d1c9b..1fb9a6773a 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java +++ b/spring-security-modules/spring-security-oauth2/src/main/java/com/baeldung/oauth2resttemplate/SecurityConfig.java @@ -15,25 +15,34 @@ import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticat import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter; import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; import javax.servlet.Filter; @Configuration @EnableOAuth2Client -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { OAuth2ClientContext oauth2ClientContext; public SecurityConfig(OAuth2ClientContext oauth2ClientContext) { this.oauth2ClientContext = oauth2ClientContext; } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests().antMatchers("/", "/login**", "/error**") - .permitAll().anyRequest().authenticated() - .and().logout().logoutUrl("/logout").logoutSuccessUrl("/") - .and().addFilterBefore(oauth2ClientFilter(), BasicAuthenticationFilter.class); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/", "/login**", "/error**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .logout() + .logoutUrl("/logout") + .logoutSuccessUrl("/") + .and() + .addFilterBefore(oauth2ClientFilter(), BasicAuthenticationFilter.class); + return http.build(); } @Bean diff --git a/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-baeldung.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-baeldung.properties index 6ef0f5000b..451d8f860e 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-baeldung.properties +++ b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-baeldung.properties @@ -1,6 +1,10 @@ server.port=8082 -security.oauth2.client.client-id=SampleClientId -security.oauth2.client.client-secret=secret -security.oauth2.client.access-token-uri=http://localhost:8081/auth/oauth/token -security.oauth2.client.user-authorization-uri=http://localhost:8081/auth/oauth/authorize -security.oauth2.resource.user-info-uri=http://localhost:8081/auth/user/me \ No newline at end of file + +spring.security.oauth2.client.registration.baeldung.client-id=SampleClientId +spring.security.oauth2.client.registration.baeldung.client-secret=secret +spring.security.oauth2.client.registration.baeldung.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.baeldung.redirect-uri={baseUrl}/login/oauth2/code/{registrationId} + +spring.security.oauth2.client.provider.baeldung.token-uri=http://localhost:8081/auth/oauth/token +spring.security.oauth2.client.provider.baeldung.authorization-uri=http://localhost:8081/auth/oauth/authorize +spring.security.oauth2.client.provider.baeldung.user-info-uri=http://localhost:8081/auth/user/me diff --git a/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-github.properties b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-github.properties index 8a151dcb98..018d72bf0f 100644 --- a/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-github.properties +++ b/spring-security-modules/spring-security-oauth2/src/main/resources/application-oauth2-extractors-github.properties @@ -1,7 +1,9 @@ server.port=8082 -security.oauth2.client.client-id=89a7c4facbb3434d599d -security.oauth2.client.client-secret=9b3b08e4a340bd20e866787e4645b54f73d74b6a -security.oauth2.client.access-token-uri=https://github.com/login/oauth/access_token -security.oauth2.client.user-authorization-uri=https://github.com/login/oauth/authorize -security.oauth2.client.scope=read:user,user:email -security.oauth2.resource.user-info-uri=https://api.github.com/user \ No newline at end of file + +spring.security.oauth2.client.registration.github.client-id=368238083842-3d4gc7p54rs6bponn0qhn4nmf6apf24a.apps.googleusercontent.com +spring.security.oauth2.client.registration.github.client-secret=2RM2QkEaf3A8-iCNqSfdG8wP +spring.security.oauth2.client.registration.github.scope=read:user,user:email + +spring.security.oauth2.client.provider.github.token-uri=https://github.com/login/oauth/access_token +spring.security.oauth2.client.provider.github.authorization-uri=https://github.com/login/oauth/authorize +spring.security.oauth2.client.provider.github.user-info-uri=https://api.github.com/user diff --git a/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/login/config/OAuth2LoginSecurityConfig.java b/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/login/config/OAuth2LoginSecurityConfig.java index 5bb5cef58c..6f39ed8283 100644 --- a/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/login/config/OAuth2LoginSecurityConfig.java +++ b/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/login/config/OAuth2LoginSecurityConfig.java @@ -3,16 +3,17 @@ package com.baeldung.openid.oidc.login.config; import java.util.HashSet; import java.util.Set; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService; +import org.springframework.security.web.SecurityFilterChain; @Configuration -public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {// @formatter:off +public class OAuth2LoginSecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { Set googleScopes = new HashSet<>(); googleScopes.add("https://www.googleapis.com/auth/userinfo.email"); googleScopes.add("https://www.googleapis.com/auth/userinfo.profile"); @@ -21,8 +22,9 @@ public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {// googleUserService.setAccessibleScopes(googleScopes); http.authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest() - .authenticated()) + .authenticated()) .oauth2Login(oauthLogin -> oauthLogin.userInfoEndpoint() - .oidcUserService(googleUserService)); - }// @formatter:on + .oidcUserService(googleUserService)); + return http.build(); + } } \ No newline at end of file diff --git a/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/sessionmanagement/config/OAuth2SessionManagementSecurityConfig.java b/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/sessionmanagement/config/OAuth2SessionManagementSecurityConfig.java index 5a55c89b05..9d3b27296e 100644 --- a/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/sessionmanagement/config/OAuth2SessionManagementSecurityConfig.java +++ b/spring-security-modules/spring-security-oidc/src/main/java/com/baeldung/openid/oidc/sessionmanagement/config/OAuth2SessionManagementSecurityConfig.java @@ -3,29 +3,30 @@ package com.baeldung.openid.oidc.sessionmanagement.config; import java.net.URI; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; @Configuration -public class OAuth2SessionManagementSecurityConfig extends WebSecurityConfigurerAdapter { +public class OAuth2SessionManagementSecurityConfig { @Autowired private ClientRegistrationRepository clientRegistrationRepository; - @Override - protected void configure(HttpSecurity http) throws Exception { // @formatter:off + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests(authorizeRequests -> authorizeRequests.mvcMatchers("/home") - .permitAll() - .anyRequest() - .authenticated()) + .permitAll() + .anyRequest() + .authenticated()) .oauth2Login(oauthLogin -> oauthLogin.permitAll()) .logout(logout -> logout.logoutSuccessHandler(oidcLogoutSuccessHandler())); - } // @formatter:on - + return http.build(); + } private LogoutSuccessHandler oidcLogoutSuccessHandler() { OidcClientInitiatedLogoutSuccessHandler oidcLogoutSuccessHandler = new OidcClientInitiatedLogoutSuccessHandler(this.clientRegistrationRepository); diff --git a/spring-security-modules/spring-security-pkce/pom.xml b/spring-security-modules/spring-security-pkce/pom.xml index aca19bee80..5899b297b4 100644 --- a/spring-security-modules/spring-security-pkce/pom.xml +++ b/spring-security-modules/spring-security-pkce/pom.xml @@ -69,9 +69,4 @@ - - - 2.7.2 - - \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-angular/pom.xml b/spring-security-modules/spring-security-web-angular/pom.xml index 15dc4d007c..2a745bc6cc 100644 --- a/spring-security-modules/spring-security-web-angular/pom.xml +++ b/spring-security-modules/spring-security-web-angular/pom.xml @@ -10,8 +10,9 @@ com.baeldung - spring-security-modules + parent-boot-2 0.0.1-SNAPSHOT + ../../parent-boot-2 diff --git a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/pom.xml b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/pom.xml index c188541bbb..b33e0925a3 100644 --- a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/pom.xml +++ b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/pom.xml @@ -14,18 +14,6 @@ 0.0.1-SNAPSHOT - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - @@ -60,8 +48,4 @@ - - 1.5.9.RELEASE - - \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java index 3ed301439c..504dbf63e3 100644 --- a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java +++ b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/main/java/com/baeldung/springbootsecurityrest/basicauth/config/BasicAuthConfiguration.java @@ -1,34 +1,41 @@ package com.baeldung.springbootsecurityrest.basicauth.config; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity -public class BasicAuthConfiguration extends WebSecurityConfigurerAdapter { +public class BasicAuthConfiguration { - @Override - protected void configure(AuthenticationManagerBuilder auth) throws Exception { - auth - .inMemoryAuthentication() - .withUser("user") - .password("password") - .roles("USER"); + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user = User.withUsername("user") + .password("{noop}password") + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.csrf().disable() - .authorizeRequests() - .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() - .antMatchers("/login").permitAll() - .anyRequest() - .authenticated() - .and() - .httpBasic(); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers(HttpMethod.OPTIONS, "/**") + .permitAll() + .antMatchers("/login") + .permitAll() + .anyRequest() + .authenticated() + .and() + .httpBasic(); + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/test/java/com/baeldung/springbootsecurityrest/BasicAuthConfigurationIntegrationTest.java b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/test/java/com/baeldung/springbootsecurityrest/BasicAuthConfigurationIntegrationTest.java index 952a0806a1..671d8ac88b 100644 --- a/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/test/java/com/baeldung/springbootsecurityrest/BasicAuthConfigurationIntegrationTest.java +++ b/spring-security-modules/spring-security-web-angular/spring-security-web-angular-server/src/test/java/com/baeldung/springbootsecurityrest/BasicAuthConfigurationIntegrationTest.java @@ -11,7 +11,7 @@ import java.net.URL; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.http.HttpStatus; @@ -80,8 +80,5 @@ public class BasicAuthConfigurationIntegrationTest { ResponseEntity response = restTemplate.getForEntity(base.toString()+"/user", String.class); assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode()); - assertTrue(response - .getBody() - .contains("Unauthorized")); } } diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java index b4127e9b71..ff01157c7b 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cachecontrol/config/SpringSecurityConfig.java @@ -1,17 +1,20 @@ package com.baeldung.cachecontrol.config; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) -public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { +public class SpringSecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception {} + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + return http.build(); + } } diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicySecurityConfiguration.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicySecurityConfiguration.java index 1593af9c66..7274b97320 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicySecurityConfiguration.java +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicySecurityConfiguration.java @@ -1,26 +1,28 @@ package com.baeldung.contentsecuritypolicy; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.header.writers.StaticHeadersWriter; @Configuration -public class ContentSecurityPolicySecurityConfiguration extends WebSecurityConfigurerAdapter { +public class ContentSecurityPolicySecurityConfiguration { private static final String REPORT_TO = "{\"group\":\"csp-violation-report\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://localhost:8080/report\"}]}"; - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf() - .disable() - .authorizeRequests() - .antMatchers("/**") - .permitAll() - .and() - .headers() - .addHeaderWriter(new StaticHeadersWriter("Report-To", REPORT_TO)) - .xssProtection() - .and() - .contentSecurityPolicy("form-action 'self'; report-uri /report; report-to csp-violation-report"); + .disable() + .authorizeRequests() + .antMatchers("/**") + .permitAll() + .and() + .headers() + .addHeaderWriter(new StaticHeadersWriter("Report-To", REPORT_TO)) + .xssProtection() + .and() + .contentSecurityPolicy("form-action 'self'; report-uri /report; report-to csp-violation-report"); + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cors/basicauth/config/WebSecurityConfig.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cors/basicauth/config/WebSecurityConfig.java index 806fb9fca5..cd5fe09b85 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cors/basicauth/config/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/cors/basicauth/config/WebSecurityConfig.java @@ -1,19 +1,21 @@ package com.baeldung.cors.basicauth.config; +import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { +public class WebSecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .authorizeRequests() - .anyRequest().authenticated() - .and() + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() .httpBasic(); - http.cors(); //disable this line to reproduce the CORS 401 + http.cors(); // disable this line to reproduce the CORS 401 + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/httpfirewall/HttpFirewallConfiguration.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/httpfirewall/HttpFirewallConfiguration.java index 3147b962a3..acb9dcca88 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/httpfirewall/HttpFirewallConfiguration.java +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/httpfirewall/HttpFirewallConfiguration.java @@ -1,33 +1,31 @@ package com.baeldung.httpfirewall; +import java.util.Arrays; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.firewall.HttpFirewall; import org.springframework.security.web.firewall.HttpStatusRequestRejectedHandler; import org.springframework.security.web.firewall.RequestRejectedHandler; import org.springframework.security.web.firewall.StrictHttpFirewall; -import java.util.Arrays; - @Configuration -public class HttpFirewallConfiguration extends WebSecurityConfigurerAdapter { +public class HttpFirewallConfiguration { - @Override - protected void configure(HttpSecurity http) throws Exception { - //@formatter:off - http - .csrf() - .disable() - .authorizeRequests() - .antMatchers("/error") - .permitAll() - .anyRequest() - .authenticated() - .and() - .httpBasic(); - //@formatter:on + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/error") + .permitAll() + .anyRequest() + .authenticated() + .and() + .httpBasic(); + return http.build(); } @Bean diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityConfig.java index f48f817dd2..41c2d2dfd8 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityConfig.java @@ -1,26 +1,28 @@ package com.baeldung.logging; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { @Value("${spring.websecurity.debug:false}") boolean webSecurityDebug; - @Override - public void configure(WebSecurity web) { - web.debug(webSecurityDebug); + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + return (web) -> web.debug(webSecurityDebug); } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/**") .permitAll(); + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/mongoauth/config/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/mongoauth/config/SecurityConfig.java index 050d917492..888ada8eba 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/mongoauth/config/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/mongoauth/config/SecurityConfig.java @@ -1,6 +1,5 @@ package com.baeldung.mongoauth.config; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; @@ -8,15 +7,15 @@ import org.springframework.security.config.annotation.authentication.builders.Au import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true) -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { private final UserDetailsService userDetailsService; @@ -25,8 +24,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { } @Bean - public AuthenticationManager customAuthenticationManager() throws Exception { - return authenticationManager(); + public AuthenticationManager customAuthenticationManager(HttpSecurity http) throws Exception { + AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class); + authenticationManagerBuilder.userDetailsService(userDetailsService) + .passwordEncoder(bCryptPasswordEncoder()); + return authenticationManagerBuilder.build(); } @Bean @@ -34,26 +36,21 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { return new BCryptPasswordEncoder(); } - @Override - protected void configure(@Autowired AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(userDetailsService) - .passwordEncoder(bCryptPasswordEncoder()); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf() - .disable() - .authorizeRequests() - .and() - .httpBasic() - .and() - .authorizeRequests() - .anyRequest() - .permitAll() - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + .disable() + .authorizeRequests() + .and() + .httpBasic() + .and() + .authorizeRequests() + .anyRequest() + .permitAll() + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/SecurityConfig.java index 63b59b8cc8..e00e27664a 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/tls/SecurityConfig.java @@ -1,16 +1,18 @@ package com.baeldung.tls; +import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() - .antMatchers("/**") - .permitAll(); + .antMatchers("/**") + .permitAll(); + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicyUnitTest.java b/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicyUnitTest.java index 0e06a7ef35..d397b20fe3 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicyUnitTest.java +++ b/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/contentsecuritypolicy/ContentSecurityPolicyUnitTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; - +import org.springframework.context.annotation.Import; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -25,6 +25,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder @WebMvcTest @AutoConfigureMockMvc @DisplayName("Content Security Policy Unit Tests") +@Import(ContentSecurityPolicySecurityConfiguration.class) class ContentSecurityPolicyUnitTest { @Autowired diff --git a/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/httpfirewall/api/UserApiUnitTest.java b/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/httpfirewall/api/UserApiUnitTest.java index 4f6217ade2..b328a6c98d 100644 --- a/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/httpfirewall/api/UserApiUnitTest.java +++ b/spring-security-modules/spring-security-web-boot-3/src/test/java/com/baeldung/httpfirewall/api/UserApiUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.httpfirewall.api; +import com.baeldung.httpfirewall.HttpFirewallConfiguration; import com.baeldung.httpfirewall.model.User; import com.baeldung.httpfirewall.service.UserServiceImpl; import com.baeldung.httpfirewall.utility.UserTestUtility; @@ -10,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; import org.springframework.http.HttpStatus; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; @@ -29,6 +31,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @WebMvcTest @AutoConfigureMockMvc @DisplayName("User API Unit Tests") +@Import(HttpFirewallConfiguration.class) class UserApiUnitTest { @Autowired diff --git a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java index 64141f63d8..ae2cdc20ec 100644 --- a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java +++ b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java @@ -2,17 +2,18 @@ package com.baeldung.logoutredirects.securityconfig; import javax.servlet.http.HttpServletResponse; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity -public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { +public class SpringSecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests(authz -> authz.mvcMatchers("/login") .permitAll() .anyRequest() @@ -21,7 +22,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { .logoutSuccessHandler((request, response, authentication) -> { response.setStatus(HttpServletResponse.SC_OK); })); - + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java index 303a139215..3991d9a264 100644 --- a/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java +++ b/spring-security-modules/spring-security-web-login-2/src/main/java/com/baeldung/manuallogout/SimpleSecurityConfiguration.java @@ -10,11 +10,12 @@ import javax.servlet.http.Cookie; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.logout.HeaderWriterLogoutHandler; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.security.web.header.writers.ClearSiteDataHeaderWriter; @@ -27,9 +28,10 @@ public class SimpleSecurityConfiguration { @Order(4) @Configuration - public static class LogoutOnRequestConfiguration extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { + public static class LogoutOnRequestConfiguration { + + @Bean + public SecurityFilterChain filterChainLogoutOnRequest(HttpSecurity http) throws Exception { http.antMatcher("/request/**") .authorizeRequests(authz -> authz.anyRequest() .permitAll()) @@ -41,26 +43,30 @@ public class SimpleSecurityConfiguration { logger.error(e.getMessage()); } })); + return http.build(); } } @Order(3) @Configuration - public static class DefaultLogoutConfiguration extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { + public static class DefaultLogoutConfiguration { + + @Bean + public SecurityFilterChain filterChainDefaultLogout(HttpSecurity http) throws Exception { http.antMatcher("/basic/**") - .authorizeRequests(authz -> authz.anyRequest() - .permitAll()) - .logout(logout -> logout.logoutUrl("/basic/basiclogout")); + .authorizeRequests(authz -> authz.anyRequest() + .permitAll()) + .logout(logout -> logout.logoutUrl("/basic/basiclogout")); + return http.build(); } } @Order(2) @Configuration - public static class AllCookieClearingLogoutConfiguration extends WebSecurityConfigurerAdapter { - @Override - protected void configure(HttpSecurity http) throws Exception { + public static class AllCookieClearingLogoutConfiguration { + + @Bean + public SecurityFilterChain filterChainAllCookieClearing(HttpSecurity http) throws Exception { http.antMatcher("/cookies/**") .authorizeRequests(authz -> authz.anyRequest() .permitAll()) @@ -74,22 +80,24 @@ public class SimpleSecurityConfiguration { response.addCookie(cookieToDelete); } })); + return http.build(); } } @Order(1) @Configuration - public static class ClearSiteDataHeaderLogoutConfiguration extends WebSecurityConfigurerAdapter { + public static class ClearSiteDataHeaderLogoutConfiguration { private static final ClearSiteDataHeaderWriter.Directive[] SOURCE = { CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS }; - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChainClearSiteDataHeader(HttpSecurity http) throws Exception { http.antMatcher("/csd/**") .authorizeRequests(authz -> authz.anyRequest() .permitAll()) .logout(logout -> logout.logoutUrl("/csd/csdlogout") .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE)))); + return http.build(); } } } diff --git a/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/logoutredirects/LogoutApplicationUnitTest.java b/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/logoutredirects/LogoutApplicationUnitTest.java index 519a6bdc99..2c37303d81 100644 --- a/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/logoutredirects/LogoutApplicationUnitTest.java +++ b/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/logoutredirects/LogoutApplicationUnitTest.java @@ -8,13 +8,14 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import com.baeldung.logoutredirects.securityconfig.SpringSecurityConfig; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @RunWith(SpringRunner.class) -@WebMvcTest() +@WebMvcTest(SpringSecurityConfig.class) public class LogoutApplicationUnitTest { @Autowired diff --git a/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java b/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java index 06dc01e116..a9ad907c30 100644 --- a/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java +++ b/spring-security-modules/spring-security-web-login-2/src/test/java/com/baeldung/manuallogout/ManualLogoutIntegrationTest.java @@ -23,7 +23,7 @@ import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; @RunWith(SpringRunner.class) -@WebMvcTest() +@WebMvcTest(SimpleSecurityConfiguration.class) public class ManualLogoutIntegrationTest { private static final String CLEAR_SITE_DATA_HEADER = "Clear-Site-Data"; diff --git a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java index d20b7a10dc..fff9ade486 100644 --- a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java @@ -3,19 +3,20 @@ package com.baeldung.loginextrafieldscustom; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @EnableWebSecurity @PropertySource("classpath:/application-extrafields.properties") -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig extends AbstractHttpConfigurer { @Autowired private CustomUserDetailsService userDetailsService; @@ -24,23 +25,36 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { private PasswordEncoder passwordEncoder; @Override - protected void configure(HttpSecurity http) throws Exception { - - http - .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) - .authorizeRequests() - .antMatchers("/css/**", "/index").permitAll() - .antMatchers("/user/**").authenticated() - .and() - .formLogin().loginPage("/login") - .and() - .logout() - .logoutUrl("/logout"); + public void configure(HttpSecurity http) throws Exception { + AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); + http.addFilterBefore(authenticationFilter(authenticationManager), UsernamePasswordAuthenticationFilter.class); } - public CustomAuthenticationFilter authenticationFilter() throws Exception { + public static SecurityConfig securityConfig() { + return new SecurityConfig(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/css/**", "/index") + .permitAll() + .antMatchers("/user/**") + .authenticated() + .and() + .formLogin() + .loginPage("/login") + .and() + .logout() + .logoutUrl("/logout") + .and() + .apply(securityConfig()); + return http.build(); + } + + public CustomAuthenticationFilter authenticationFilter(AuthenticationManager authenticationManager) throws Exception { CustomAuthenticationFilter filter = new CustomAuthenticationFilter(); - filter.setAuthenticationManager(authenticationManagerBean()); + filter.setAuthenticationManager(authenticationManager); filter.setAuthenticationFailureHandler(failureHandler()); return filter; } diff --git a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java index 2989a4bbc6..dbe126b751 100644 --- a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java @@ -3,21 +3,22 @@ package com.baeldung.loginextrafieldssimple; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @EnableWebSecurity @PropertySource("classpath:/application-extrafields.properties") -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig extends AbstractHttpConfigurer { @Autowired private UserDetailsService userDetailsService; @@ -26,23 +27,36 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { private PasswordEncoder passwordEncoder; @Override - protected void configure(HttpSecurity http) throws Exception { - - http - .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) - .authorizeRequests() - .antMatchers("/css/**", "/index").permitAll() - .antMatchers("/user/**").authenticated() - .and() - .formLogin().loginPage("/login") - .and() - .logout() - .logoutUrl("/logout"); + public void configure(HttpSecurity http) throws Exception { + AuthenticationManager authenticationManager = http.getSharedObject(AuthenticationManager.class); + http.addFilterBefore(authenticationFilter(authenticationManager), UsernamePasswordAuthenticationFilter.class); } - public SimpleAuthenticationFilter authenticationFilter() throws Exception { + public static SecurityConfig securityConfig() { + return new SecurityConfig(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/css/**", "/index") + .permitAll() + .antMatchers("/user/**") + .authenticated() + .and() + .formLogin() + .loginPage("/login") + .and() + .logout() + .logoutUrl("/logout") + .and() + .apply(securityConfig()); + return http.getOrBuild(); + } + + public SimpleAuthenticationFilter authenticationFilter(AuthenticationManager authenticationManager) throws Exception { SimpleAuthenticationFilter filter = new SimpleAuthenticationFilter(); - filter.setAuthenticationManager(authenticationManagerBean()); + filter.setAuthenticationManager(authenticationManager); filter.setAuthenticationFailureHandler(failureHandler()); return filter; } diff --git a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java index cfdaf7a13e..0a4f8ad4e4 100644 --- a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java @@ -3,12 +3,14 @@ package com.baeldung.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; @@ -21,46 +23,54 @@ import com.baeldung.security.CustomLogoutSuccessHandler; // @ImportResource({ "classpath:webSecurityConfig.xml" }) @EnableWebSecurity @Profile("!https") -public class SecSecurityConfig extends WebSecurityConfigurerAdapter { +public class SecSecurityConfig { - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - // @formatter:off - auth.inMemoryAuthentication() - .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER") - .and() - .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER") - .and() - .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN"); - // @formatter:on + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user1 = User.withUsername("user1") + .password(passwordEncoder().encode("user1Pass")) + .roles("USER") + .build(); + UserDetails user2 = User.withUsername("user2") + .password(passwordEncoder().encode("user2Pass")) + .roles("USER") + .build(); + UserDetails admin = User.withUsername("admin") + .password(passwordEncoder().encode("adminPass")) + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(user1, user2, admin); } - @Override - protected void configure(final HttpSecurity http) throws Exception { - // @formatter:off - http - .csrf().disable() - .authorizeRequests() - .antMatchers("/admin/**").hasRole("ADMIN") - .antMatchers("/anonymous*").anonymous() - .antMatchers("/login*").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/login.html") - .loginProcessingUrl("/perform_login") - .defaultSuccessUrl("/homepage.html", true) - //.failureUrl("/login.html?error=true") - .failureHandler(authenticationFailureHandler()) - .and() - .logout() - .logoutUrl("/perform_logout") - .deleteCookies("JSESSIONID") - .logoutSuccessHandler(logoutSuccessHandler()); - //.and() - //.exceptionHandling().accessDeniedPage("/accessDenied"); - //.exceptionHandling().accessDeniedHandler(accessDeniedHandler()); - // @formatter:on + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/admin/**") + .hasRole("ADMIN") + .antMatchers("/anonymous*") + .anonymous() + .antMatchers("/login*") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage("/login.html") + .loginProcessingUrl("/perform_login") + .defaultSuccessUrl("/homepage.html", true) + // .failureUrl("/login.html?error=true") + .failureHandler(authenticationFailureHandler()) + .and() + .logout() + .logoutUrl("/perform_logout") + .deleteCookies("JSESSIONID") + .logoutSuccessHandler(logoutSuccessHandler()); + // .and() + // .exceptionHandling().accessDeniedPage("/accessDenied"); + // .exceptionHandling().accessDeniedHandler(accessDeniedHandler()); + return http.build(); } @Bean diff --git a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/ChannelSecSecurityConfig.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/ChannelSecSecurityConfig.java index 151df18d11..4cf9765b59 100644 --- a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/ChannelSecSecurityConfig.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/ChannelSecSecurityConfig.java @@ -3,10 +3,12 @@ package com.baeldung.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import com.baeldung.security.CustomLogoutSuccessHandler; @@ -15,47 +17,54 @@ import com.baeldung.security.CustomLogoutSuccessHandler; // @ImportResource({ "classpath:channelWebSecurityConfig.xml" }) @EnableWebSecurity @Profile("https") -public class ChannelSecSecurityConfig extends WebSecurityConfigurerAdapter { +public class ChannelSecSecurityConfig { - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - // @formatter:off - auth.inMemoryAuthentication() - .withUser("user1").password("user1Pass").roles("USER") - .and() - .withUser("user2").password("user2Pass").roles("USER"); - // @formatter:on + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user1 = User.withUsername("user1") + .password("user1Pass") + .roles("USER") + .build(); + UserDetails user2 = User.withUsername("user2") + .password("user2Pass") + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user1, user2); } - @Override - protected void configure(final HttpSecurity http) throws Exception { - // @formatter:off - http - .csrf().disable() - .authorizeRequests() - .antMatchers("/anonymous*").anonymous() - .antMatchers("/login*").permitAll() - .anyRequest().authenticated() - .and() - .requiresChannel() - .antMatchers("/login*", "/perform_login").requiresSecure() - .anyRequest().requiresInsecure() - .and() - .sessionManagement() - .sessionFixation() - .none() - .and() - .formLogin() - .loginPage("/login.html") - .loginProcessingUrl("/perform_login") - .defaultSuccessUrl("/homepage.html",true) - .failureUrl("/login.html?error=true") - .and() - .logout() - .logoutUrl("/perform_logout") - .deleteCookies("JSESSIONID") - .logoutSuccessHandler(logoutSuccessHandler()); - // @formatter:on + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/anonymous*") + .anonymous() + .antMatchers("/login*") + .permitAll() + .anyRequest() + .authenticated() + .and() + .requiresChannel() + .antMatchers("/login*", "/perform_login") + .requiresSecure() + .anyRequest() + .requiresInsecure() + .and() + .sessionManagement() + .sessionFixation() + .none() + .and() + .formLogin() + .loginPage("/login.html") + .loginProcessingUrl("/perform_login") + .defaultSuccessUrl("/homepage.html", true) + .failureUrl("/login.html?error=true") + .and() + .logout() + .logoutUrl("/perform_logout") + .deleteCookies("JSESSIONID") + .logoutSuccessHandler(logoutSuccessHandler()); + return http.build(); } @Bean diff --git a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/RedirectionSecurityConfig.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/RedirectionSecurityConfig.java index b27d999d56..f4ca880aeb 100644 --- a/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/RedirectionSecurityConfig.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/spring/RedirectionSecurityConfig.java @@ -1,26 +1,30 @@ package com.baeldung.spring; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; //@Configuration //@ImportResource({ "classpath:RedirectionWebSecurityConfig.xml" }) //@EnableWebSecurity //@Profile("!https") -public class RedirectionSecurityConfig extends WebSecurityConfigurerAdapter { +public class RedirectionSecurityConfig { - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication() - .withUser("user1") + @Bean + public InMemoryUserDetailsManager userDetailsService() { + UserDetails user1 = User.withUsername("user1") .password("user1Pass") - .roles("USER"); + .roles("USER") + .build(); + return new InMemoryUserDetailsManager(user1); } - @Override - protected void configure(final HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login*") .permitAll() @@ -30,6 +34,7 @@ public class RedirectionSecurityConfig extends WebSecurityConfigurerAdapter { .formLogin() .successHandler(new SavedRequestAwareAuthenticationSuccessHandler()); // .successHandler(new RefererAuthenticationSuccessHandler()) + return http.build(); } } diff --git a/spring-security-modules/spring-security-web-react/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-modules/spring-security-web-react/src/main/java/com/baeldung/spring/SecSecurityConfig.java index d560589cce..7e588f4d97 100644 --- a/spring-security-modules/spring-security-web-react/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-modules/spring-security-web-react/src/main/java/com/baeldung/spring/SecSecurityConfig.java @@ -1,57 +1,65 @@ package com.baeldung.spring; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.provisioning.InMemoryUserDetailsManager; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; @Configuration @EnableWebSecurity @Profile("!https") -public class SecSecurityConfig extends WebSecurityConfigurerAdapter { +public class SecSecurityConfig { - public SecSecurityConfig() { - super(); + @Bean + public InMemoryUserDetailsManager userDetailsService() throws Exception { + UserDetails user1 = User.withUsername("user1") + .password("{noop}user1Pass") + .roles("USER") + .build(); + + UserDetails user2 = User.withUsername("user2") + .password("{noop}user2Pass") + .roles("USER") + .build(); + + UserDetails admin = User.withUsername("admin") + .password("{noop}admin0Pass") + .roles("ADMIN") + .build(); + return new InMemoryUserDetailsManager(user1, user2, admin); } - @Override - protected void configure(final AuthenticationManagerBuilder auth) throws Exception { - // @formatter:off - auth.inMemoryAuthentication() - .withUser("user1").password("{noop}user1Pass").roles("USER") - .and() - .withUser("user2").password("{noop}user2Pass").roles("USER") - .and() - .withUser("admin").password("{noop}admin0Pass").roles("ADMIN"); - // @formatter:on + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.csrf() + .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) + .and() + .authorizeRequests() + .antMatchers("/admin/**") + .hasRole("ADMIN") + .antMatchers("/anonymous*") + .anonymous() + .antMatchers(HttpMethod.GET, "/index*", "/static/**", "/*.js", "/*.json", "/*.ico", "/rest") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage("/index.html") + .loginProcessingUrl("/perform_login") + .defaultSuccessUrl("/homepage.html", true) + .failureUrl("/index.html?error=true") + .and() + .logout() + .logoutUrl("/perform_logout") + .deleteCookies("JSESSIONID"); + return http.build(); } - - @Override - protected void configure(final HttpSecurity http) throws Exception { - // @formatter:off - http - .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and() - .authorizeRequests() - .antMatchers("/admin/**").hasRole("ADMIN") - .antMatchers("/anonymous*").anonymous() - .antMatchers(HttpMethod.GET, "/index*", "/static/**", "/*.js", "/*.json", "/*.ico", "/rest").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .loginPage("/index.html") - .loginProcessingUrl("/perform_login") - .defaultSuccessUrl("/homepage.html",true) - .failureUrl("/index.html?error=true") - .and() - .logout() - .logoutUrl("/perform_logout") - .deleteCookies("JSESSIONID"); - // @formatter:on - } - - } diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/README.md b/spring-security-modules/spring-security-web-rest-basic-auth/README.md index cd79e052b2..097e89b138 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/README.md +++ b/spring-security-modules/spring-security-web-rest-basic-auth/README.md @@ -13,5 +13,5 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Spring Security Basic Authentication](https://www.baeldung.com/spring-security-basic-authentication) - [New Password Storage In Spring Security 5](https://www.baeldung.com/spring-security-5-password-storage) - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder) -- [Basic Authentication With Postman](https://www.baeldung.com/java-postman-authentication/) +- [Basic Authentication With Postman](https://www.baeldung.com/java-postman-authentication) diff --git a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java index 5d5863a564..cfec910ce9 100644 --- a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/customuserdetails/SecurityConfiguration.java @@ -1,15 +1,16 @@ package com.baeldung.customuserdetails; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { private final UserDetailsService userDetailsService; @@ -17,8 +18,8 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { this.userDetailsService = userDetailsService; } - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.userDetailsService(userDetailsService) .authorizeRequests() .anyRequest() @@ -33,6 +34,6 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .permitAll() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/login"); + return http.build(); } - } diff --git a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java index 8e9047f629..b0478ed01c 100644 --- a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java @@ -6,17 +6,16 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @EnableWebSecurity -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { +public class SecurityConfiguration { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest() .authenticated() @@ -30,6 +29,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .permitAll() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/login"); + return http.build(); } @Autowired diff --git a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java index b99c242408..29beeef94c 100644 --- a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java +++ b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-basic-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java @@ -3,11 +3,10 @@ package com.baeldung.spring.security.x509; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @SpringBootApplication @EnableWebSecurity -public class X509AuthenticationServer extends WebSecurityConfigurerAdapter { +public class X509AuthenticationServer { public static void main(String[] args) { SpringApplication.run(X509AuthenticationServer.class, args); diff --git a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java index 18bbfba835..7fc66a19bb 100644 --- a/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java +++ b/spring-security-modules/spring-security-web-x509/spring-security-web-x509-client-auth/src/main/java/com/baeldung/spring/security/x509/X509AuthenticationServer.java @@ -6,28 +6,31 @@ import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.web.SecurityFilterChain; @SpringBootApplication @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) -public class X509AuthenticationServer extends WebSecurityConfigurerAdapter { +public class X509AuthenticationServer { public static void main(String[] args) { SpringApplication.run(X509AuthenticationServer.class, args); } - @Override - protected void configure(HttpSecurity http) throws Exception { - http.authorizeRequests().anyRequest().authenticated() - .and() - .x509() - .subjectPrincipalRegex("CN=(.*?)(?:,|$)") - .userDetailsService(userDetailsService()); + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http.authorizeRequests() + .anyRequest() + .authenticated() + .and() + .x509() + .subjectPrincipalRegex("CN=(.*?)(?:,|$)") + .userDetailsService(userDetailsService()); + return http.build(); } @Bean diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index 62be6fbb3c..a676a86d80 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -34,6 +34,7 @@ spring-rest-angular spring-rest-http spring-rest-http-2 + spring-rest-http-3 spring-rest-query-language spring-rest-shell spring-rest-simple diff --git a/spring-web-modules/spring-rest-http-2/README.md b/spring-web-modules/spring-rest-http-2/README.md index 2c1b1f76f7..cf9ca17077 100644 --- a/spring-web-modules/spring-rest-http-2/README.md +++ b/spring-web-modules/spring-rest-http-2/README.md @@ -14,4 +14,4 @@ The "REST With Spring 2" Classes: http://bit.ly/restwithspring - [Get All Endpoints in Spring Boot](https://www.baeldung.com/spring-boot-get-all-endpoints) - [HTTP PUT vs. POST in REST API](https://www.baeldung.com/rest-http-put-vs-post) - [415 Unsupported MediaType in Spring Application](https://www.baeldung.com/spring-415-unsupported-mediatype) -- More articles: [[<-- prev]](../spring-rest-http) +- More articles: [[next -->]](../spring-rest-http-3) diff --git a/spring-web-modules/spring-rest-http-3/README.md b/spring-web-modules/spring-rest-http-3/README.md new file mode 100644 index 0000000000..a5b3d51e93 --- /dev/null +++ b/spring-web-modules/spring-rest-http-3/README.md @@ -0,0 +1,10 @@ +## Spring REST HTTP 3 + +This module contains articles about HTTP in REST APIs with Spring. + +### The Course +The "REST With Spring 3" Classes: http://bit.ly/restwithspring + +### Relevant Articles: +- [Send Array as Part of x-www-form-urlencoded Using Postman](https://www.baeldung.com/java-postman-send-array) +- More articles: [[<-- prev]](../spring-rest-http) diff --git a/spring-web-modules/spring-rest-http-3/pom.xml b/spring-web-modules/spring-rest-http-3/pom.xml new file mode 100644 index 0000000000..1f2c66e999 --- /dev/null +++ b/spring-web-modules/spring-rest-http-3/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + spring-rest-http-3 + 0.1-SNAPSHOT + spring-rest-http-3 + war + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + \ No newline at end of file diff --git a/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/SpringBootRest3Application.java b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/SpringBootRest3Application.java new file mode 100644 index 0000000000..3203f6e105 --- /dev/null +++ b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/SpringBootRest3Application.java @@ -0,0 +1,12 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootRest3Application { + + public static void main(String[] args) { + SpringApplication.run(SpringBootRest3Application.class, args); + } +} diff --git a/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/Course.java b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/Course.java new file mode 100644 index 0000000000..0ce6f17786 --- /dev/null +++ b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/Course.java @@ -0,0 +1,24 @@ +package com.baeldung.xwwwformurlencoded; + +class Course { + + private String name; + private int hours; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getHours() { + return hours; + } + + public void setHours(int hours) { + this.hours = hours; + } + +} diff --git a/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentComplex.java b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentComplex.java new file mode 100644 index 0000000000..240d0b38c9 --- /dev/null +++ b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentComplex.java @@ -0,0 +1,32 @@ +package com.baeldung.xwwwformurlencoded; + +class StudentComplex { + + private String firstName; + private String lastName; + private Course[] courses; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Course[] getCourses() { + return courses; + } + + public void setCourses(Course[] courses) { + this.courses = courses; + } +} diff --git a/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentController.java b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentController.java new file mode 100644 index 0000000000..3e007b9a55 --- /dev/null +++ b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentController.java @@ -0,0 +1,24 @@ +package com.baeldung.xwwwformurlencoded; + +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/students") +public class StudentController { + + @PostMapping(path = "/simple", + consumes = { MediaType.APPLICATION_FORM_URLENCODED_VALUE }) + public ResponseEntity createStudentSimple(StudentSimple student) { + return ResponseEntity.ok(student); + } + + @PostMapping(path = "/complex", + consumes = { MediaType.APPLICATION_FORM_URLENCODED_VALUE }) + public ResponseEntity createStudentComplex(StudentComplex student) { + return ResponseEntity.ok(student); + } +} diff --git a/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentSimple.java b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentSimple.java new file mode 100644 index 0000000000..e109000e1e --- /dev/null +++ b/spring-web-modules/spring-rest-http-3/src/main/java/com/baeldung/xwwwformurlencoded/StudentSimple.java @@ -0,0 +1,32 @@ +package com.baeldung.xwwwformurlencoded; + +class StudentSimple { + + private String firstName; + private String lastName; + private String[] courses; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String[] getCourses() { + return courses; + } + + public void setCourses(String[] courses) { + this.courses = courses; + } +} diff --git a/spring-boot-modules/spring-boot-libraries-comparison/src/main/resources/application.properties b/spring-web-modules/spring-rest-http-3/src/main/resources/application.properties similarity index 100% rename from spring-boot-modules/spring-boot-libraries-comparison/src/main/resources/application.properties rename to spring-web-modules/spring-rest-http-3/src/main/resources/application.properties diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index 23b52fc9c4..ae6fd1559e 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/pom.xml @@ -14,4 +14,36 @@ 1.0.0-SNAPSHOT + + + com.github.stefanbirkner + system-lambda + 1.2.1 + test + + + org.jmockit + jmockit + ${jmockit.version} + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + true + + + + + + 1.49 + \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/Task.java b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/Task.java new file mode 100644 index 0000000000..06fd43ee5a --- /dev/null +++ b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/Task.java @@ -0,0 +1,17 @@ +package com.baeldung.systemexit; + +public class Task { + private String name; + + public Task(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/TaskDAO.java b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/TaskDAO.java new file mode 100644 index 0000000000..85415336b6 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/TaskDAO.java @@ -0,0 +1,8 @@ +package com.baeldung.systemexit; + +import java.io.IOException; + +public class TaskDAO { + public void save(Task task) throws Exception { + } +} diff --git a/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/TaskService.java b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/TaskService.java new file mode 100644 index 0000000000..8f15781a11 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/systemexit/TaskService.java @@ -0,0 +1,18 @@ +package com.baeldung.systemexit; + +public class TaskService { + + private final TaskDAO taskDAO; + + public TaskService(TaskDAO taskDAO) { + this.taskDAO = taskDAO; + } + + public void saveTask(Task task) { + try { + taskDAO.save(task); + } catch (Exception e) { + System.exit(1); + } + } +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceJMockitUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceJMockitUnitTest.java new file mode 100644 index 0000000000..d1dd6956fc --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceJMockitUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.systemexit; + +import mockit.Mock; +import mockit.MockUp; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; + +public class TaskServiceJMockitUnitTest { + + @Test + public void givenDAOThrowsException_whenSaveTaskIsCalled_thenSystemExitIsCalled() throws Exception { + + new MockUp() { + @Mock + public void exit(int value) { + throw new RuntimeException(String.valueOf(value)); + } + }; + + Task task = new Task("test"); + TaskDAO taskDAO = mock(TaskDAO.class); + TaskService service = new TaskService(taskDAO); + try { + doThrow(new NullPointerException()).when(taskDAO).save(task); + service.saveTask(task); + } catch (RuntimeException runtimeException) { + Assertions.assertEquals("1", runtimeException.getMessage()); + } + } +} diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceSecurityManagerUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceSecurityManagerUnitTest.java new file mode 100644 index 0000000000..c774f94ca5 --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceSecurityManagerUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.systemexit; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.security.Permission; + +import static org.mockito.Mockito.*; + +class TaskServiceSecurityManagerUnitTest { + + @BeforeEach + void setUp() { + System.setSecurityManager(new NoExitSecurityManager()); + } + + @Test + void givenDAOThrowsException_whenSaveTaskIsCalled_thenSystemExitIsCalled() throws Exception { + Task task = new Task("test"); + TaskDAO taskDAO = mock(TaskDAO.class); + TaskService service = new TaskService(taskDAO); + try { + doThrow(new NullPointerException()).when(taskDAO).save(task); + service.saveTask(task); + } catch (RuntimeException e) { + Assertions.assertEquals("1", e.getMessage()); + } + } + + private static class NoExitSecurityManager extends SecurityManager { + @Override + public void checkPermission(Permission perm) { + } + + @Override + public void checkExit(int status) { + super.checkExit(status); + throw new RuntimeException(String.valueOf(status)); + } + } +} \ No newline at end of file diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceSystemLambdaUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceSystemLambdaUnitTest.java new file mode 100644 index 0000000000..4cdcb5470f --- /dev/null +++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/systemexit/TaskServiceSystemLambdaUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.systemexit; + +import org.junit.jupiter.api.Assertions; +import org.junit.Test; + +import static com.github.stefanbirkner.systemlambda.SystemLambda.catchSystemExit; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; + +public class TaskServiceSystemLambdaUnitTest { + + @Test + public void givenDAOThrowsException_whenSaveTaskIsCalled_thenSystemExitIsCalled() throws Exception { + int statusCode = catchSystemExit(() -> { + Task task = new Task("test"); + TaskDAO taskDAO = mock(TaskDAO.class); + TaskService service = new TaskService(taskDAO); + doThrow(new NullPointerException()).when(taskDAO).save(task); + service.saveTask(task); + }); + Assertions.assertEquals(1, statusCode); + } +} diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md index cefc8e1707..9f1fd53ee5 100644 --- a/testing-modules/junit-5/README.md +++ b/testing-modules/junit-5/README.md @@ -8,3 +8,4 @@ - [Determine the Execution Time of JUnit Tests](https://www.baeldung.com/junit-test-execution-time) - [@BeforeAll and @AfterAll in Non-Static Methods](https://www.baeldung.com/java-beforeall-afterall-non-static) - [The java.lang.NoClassDefFoundError in JUnit](https://www.baeldung.com/junit-noclassdeffounderror) +- [assertAll() vs Multiple Assertions in JUnit5](https://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5) diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/groupedvsmultipleassertions/User.java b/testing-modules/junit-5/src/main/java/com/baeldung/groupedvsmultipleassertions/User.java new file mode 100644 index 0000000000..81ed106784 --- /dev/null +++ b/testing-modules/junit-5/src/main/java/com/baeldung/groupedvsmultipleassertions/User.java @@ -0,0 +1,37 @@ +package com.baeldung.groupedvsmultipleassertions; + +public class User { + private String username; + private String email; + private boolean activated; + + public User(String username, String email, boolean activated) { + this.username = username; + this.email = email; + this.activated = activated; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public boolean getActivated() { + return activated; + } + + public void setActivated(boolean activated) { + this.activated = activated; + } +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/groupedvsmultipleassertions/GroupedvsMultipleAssertionsUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/groupedvsmultipleassertions/GroupedvsMultipleAssertionsUnitTest.java new file mode 100644 index 0000000000..fcde774e6e --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/groupedvsmultipleassertions/GroupedvsMultipleAssertionsUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.groupedvsmultipleassertions; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class GroupedvsMultipleAssertionsUnitTest { + + @Disabled + @Test + void givenAssertAll_whenSingleAssertStatementFails_thenRestWillStillBeExecuted() { + User user = new User("baeldung", "support@baeldung.com", false); + assertAll( + "Grouped Assertions of User", + () -> assertEquals("admin", user.getUsername(), "Username should be admin"), + () -> assertEquals("admin@baeldung.com", user.getEmail(), "Email should be admin@baeldung.com"), + () -> assertTrue(user.getActivated(), "User should be activated") + ); + } + + @Disabled + @Test + void givenMultipleAssertions_whenSingleAssertStatementFails_thenRestWillNotBeExecuted() { + User user = new User("baeldung", "support@baeldung.com", false); + assertEquals("admin", user.getUsername(), "Username should be admin"); + assertEquals("admin@baeldung.com", user.getEmail(), "Email should be admin@baeldung.com"); + assertTrue(user.getActivated(), "User should be activated"); + } +} diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md new file mode 100644 index 0000000000..08ce9910b5 --- /dev/null +++ b/testing-modules/mockito-2/README.md @@ -0,0 +1,5 @@ +## Mockito 2 + +This module contains articles about Mockito + +### Relevant Articles: diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml new file mode 100644 index 0000000000..6ce6e8fca0 --- /dev/null +++ b/testing-modules/mockito-2/pom.xml @@ -0,0 +1,30 @@ + + + + testing-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + mockito-2 + + + 8 + 8 + UTF-8 + 4.8.1 + + + + + org.mockito + mockito-inline + ${mockito-inline.version} + test + + + + \ No newline at end of file diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/CacheManager.java b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/CacheManager.java new file mode 100644 index 0000000000..51aea926b4 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/CacheManager.java @@ -0,0 +1,29 @@ +package com.baeldung.singleton; + +import java.util.HashMap; + +public class CacheManager { + private final HashMap map; + + private static CacheManager instance; + + private CacheManager() { + map = new HashMap<>(); + } + + public static CacheManager getInstance() { + if(instance == null) { + instance = new CacheManager(); + } + + return instance; + } + + public T getValue(String key, Class clazz) { + return clazz.cast(map.get(key)); + } + + public Object setValue(String key, Object value) { + return map.put(key, value); + } +} \ No newline at end of file diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/Product.java b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/Product.java new file mode 100644 index 0000000000..58905e3488 --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/Product.java @@ -0,0 +1,27 @@ +package com.baeldung.singleton; + +public class Product { + private String name; + private String description; + + public Product(String name, String description) { + this.name = name; + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/ProductDAO.java b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/ProductDAO.java new file mode 100644 index 0000000000..ae9562561b --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/ProductDAO.java @@ -0,0 +1,8 @@ +package com.baeldung.singleton; + +public class ProductDAO { + public Product getProduct(String productName) { + + return new Product(productName, "description"); + } +} diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/ProductService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/ProductService.java new file mode 100644 index 0000000000..382087d96d --- /dev/null +++ b/testing-modules/mockito-2/src/main/java/com/baeldung/singleton/ProductService.java @@ -0,0 +1,26 @@ +package com.baeldung.singleton; + +public class ProductService { + + private final ProductDAO productDAO; + private final CacheManager cacheManager; + + public ProductService(ProductDAO productDAO) { + this.productDAO = productDAO; + this.cacheManager = CacheManager.getInstance(); + } + + public ProductService(ProductDAO productDAO, CacheManager cacheManager) { + this.productDAO = productDAO; + this.cacheManager = cacheManager; + } + + public Product getProduct(String productName) { + Product product = cacheManager.getValue(productName, Product.class); + if (product == null) { + product = productDAO.getProduct(productName); + } + + return product; + } +} diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/singleton/ProductServiceTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/singleton/ProductServiceTest.java new file mode 100644 index 0000000000..792d472f94 --- /dev/null +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/singleton/ProductServiceTest.java @@ -0,0 +1,40 @@ +package com.baeldung.singleton; + +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +class ProductServiceUnitTest { + + @Test + void givenValueExistsInCache_whenGetProduct_thenDAOIsNotCalled() { + ProductDAO productDAO = mock(ProductDAO.class); + CacheManager cacheManager = mock(CacheManager.class); + Product product = new Product("product1", "description"); + ProductService productService = new ProductService(productDAO, cacheManager); + + when(cacheManager.getValue(any(), any())).thenReturn(product); + + productService.getProduct("product1"); + + Mockito.verify(productDAO, times(0)).getProduct(any()); + } + + @Test + void givenValueExistsInCache_whenGetProduct_thenDAOIsNotCalled_mockingStatic() { + ProductDAO productDAO = mock(ProductDAO.class); + CacheManager cacheManager = mock(CacheManager.class); + Product product = new Product("product1", "description"); + + try (MockedStatic cacheManagerMock = mockStatic(CacheManager.class)) { + cacheManagerMock.when(CacheManager::getInstance).thenReturn(cacheManager); + when(cacheManager.getValue(any(), any())).thenReturn(product); + ProductService productService = new ProductService(productDAO); + productService.getProduct("product1"); + Mockito.verify(productDAO, times(0)).getProduct(any()); + } + } +} \ No newline at end of file diff --git a/testing-modules/mockito-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/testing-modules/mockito-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 0000000000..ca6ee9cea8 --- /dev/null +++ b/testing-modules/mockito-2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1 @@ +mock-maker-inline \ No newline at end of file diff --git a/testing-modules/mocks-2/README.md b/testing-modules/mocks-2/README.md new file mode 100644 index 0000000000..5746da09bb --- /dev/null +++ b/testing-modules/mocks-2/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Introduction to Datafaker](https://www.baeldung.com/java-datafaker) + diff --git a/testing-modules/mocks-2/pom.xml b/testing-modules/mocks-2/pom.xml new file mode 100644 index 0000000000..7817145173 --- /dev/null +++ b/testing-modules/mocks-2/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + mocks-2 + mocks-2 + + + testing-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + net.datafaker + datafaker + ${datafaker.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + 1.6.0 + 2.13.4 + + + \ No newline at end of file diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Collection.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Collection.java new file mode 100644 index 0000000000..1133480c34 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Collection.java @@ -0,0 +1,22 @@ +package com.baeldung.datafaker; + +import java.util.List; +import net.datafaker.Faker; + +public class Collection { + public static final int MIN = 1; + public static final int MAX = 100; + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println(getFictionalCharacters()); + } + + static List getFictionalCharacters() { + return faker.collection( + () -> faker.starWars().character(), + () -> faker.starTrek().character()) + .len(MIN, MAX) + .generate(); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Csv.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Csv.java new file mode 100644 index 0000000000..19bdbc236e --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Csv.java @@ -0,0 +1,25 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +public class Csv { + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println("First expression:\n" + getFirstExpression()); + System.out.println("Second expression:\n" + getSecondExpression()); + } + + static String getSecondExpression() { + final String secondExpressionString + = "#{csv ',','\"','true','4','name_column','#{Name.first_name}','last_name_column','#{Name.last_name}'}"; + return faker.expression(secondExpressionString); + } + + static String getFirstExpression() { + final String firstExpressionString + = "#{csv '4','name_column','#{Name.first_name}','last_name_column','#{Name.last_name}'}"; + return faker.expression(firstExpressionString); + } + +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Examplify.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Examplify.java new file mode 100644 index 0000000000..87cac49284 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Examplify.java @@ -0,0 +1,21 @@ +package com.baeldung.datafaker; + + +import net.datafaker.Faker; + +public class Examplify { + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println("Expression: " + getExpression()); + System.out.println("Number expression: " + getNumberExpression()); + } + + static String getNumberExpression() { + return faker.expression("#{examplify '123-123-123'}"); + } + + static String getExpression() { + return faker.expression("#{examplify 'Cat in the Hat'}"); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Json.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Json.java new file mode 100644 index 0000000000..0ee2fc547e --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Json.java @@ -0,0 +1,19 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +public class Json { + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println(getExpression()); + } + + static String getExpression() { + return faker.expression( + "#{json 'person'," + + "'#{json ''first_name'',''#{Name.first_name}'',''last_name'',''#{Name.last_name}''}'," + + "'address'," + + "'#{json ''country'',''#{Address.country}'',''city'',''#{Address.city}''}'}"); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MethodInvocation.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MethodInvocation.java new file mode 100644 index 0000000000..3f719a59d8 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MethodInvocation.java @@ -0,0 +1,20 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +public class MethodInvocation { + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println("Name from a method: " + getNameFromMethod()); + System.out.println("Name from an expression: " + getNameFromExpression()); + } + + static String getNameFromExpression() { + return faker.expression("#{Name.first_Name}"); + } + + static String getNameFromMethod() { + return faker.name().firstName(); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MethodInvocationWithParams.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MethodInvocationWithParams.java new file mode 100644 index 0000000000..aaec458724 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MethodInvocationWithParams.java @@ -0,0 +1,25 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +import java.time.Duration; + +public class MethodInvocationWithParams { + public static final int MIN = 1; + public static final int MAX = 10; + public static final String UNIT = "SECONDS"; + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println("Duration from the method :" + getDurationFromMethod()); + System.out.println("Duration from the expression: " + getDurationFromExpression()); + } + + static String getDurationFromExpression() { + return faker.expression("#{date.duration '1', '10', 'SECONDS'}"); + } + + static Duration getDurationFromMethod() { + return faker.date().duration(MIN, MAX, UNIT); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MixedCollection.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MixedCollection.java new file mode 100644 index 0000000000..fa7513d5b6 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/MixedCollection.java @@ -0,0 +1,25 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +import java.io.Serializable; +import java.util.List; + +public class MixedCollection { + public static final int MIN = 1; + public static final int MAX = 20; + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println(getMixedCollection()); + } + + static List getMixedCollection() { + return faker.collection( + () -> faker.date().birthday(), + () -> faker.name().fullName() + ) + .len(MIN, MAX) + .generate(); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Option.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Option.java new file mode 100644 index 0000000000..489af6d243 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Option.java @@ -0,0 +1,25 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +public class Option { + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println("First expression: " + getFirstExpression()); + System.out.println("Second expression: " + getSecondExpression()); + System.out.println("Third expression: " + getThirdExpression()); + } + + static String getThirdExpression() { + return faker.expression("#{regexify '(Hi|Hello|Hey)'}"); + } + + static String getSecondExpression() { + return faker.expression("#{options.option '1','2','3','4','*'}"); + } + + static String getFirstExpression() { + return faker.expression("#{options.option 'Hi','Hello','Hey'}"); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Regexify.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Regexify.java new file mode 100644 index 0000000000..921b2e725e --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Regexify.java @@ -0,0 +1,20 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +public class Regexify { + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println("Expression: " + getExpression()); + System.out.println("Regexify with a method: " + getMethodExpression()); + } + + static String getMethodExpression() { + return faker.regexify("[A-D]{4,10}"); + } + + static String getExpression() { + return faker.expression("#{regexify '(hello|bye|hey)'}"); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Templatify.java b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Templatify.java new file mode 100644 index 0000000000..6159244c73 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/datafaker/Templatify.java @@ -0,0 +1,21 @@ +package com.baeldung.datafaker; + +import net.datafaker.Faker; + +public class Templatify { + private static final Faker faker = new Faker(); + + public static void main(String[] args) { + System.out.println("Expression: " + getExpression()); + System.out.println("Expression with a placeholder: " + getExpressionWithPlaceholder()); + } + + static String getExpressionWithPlaceholder() { + return faker.expression("#{templatify '#ight', '#', 'f', 'l', 'm', 'n'}"); + } + + static String getExpression() { + return faker.expression("#{templatify 'test','t','j','r'}"); + } +} + diff --git a/testing-modules/mocks-2/src/main/resources/logback.xml b/testing-modules/mocks-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/testing-modules/mocks-2/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/CollectionUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/CollectionUnitTest.java new file mode 100644 index 0000000000..95e61c795a --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/CollectionUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +class CollectionUnitTest { + + @Test + void whenGettingFictionaCharacters_thenResultNotEmptyAndOfCorrectSize() { + assertAll( + () -> assertThat(Collection.getFictionalCharacters()).isNotEmpty(), + () -> assertThat(Collection.getFictionalCharacters()).size().isGreaterThanOrEqualTo(Collection.MIN), + () -> assertThat(Collection.getFictionalCharacters()).size().isLessThanOrEqualTo(Collection.MAX) + ); + + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/CsvUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/CsvUnitTest.java new file mode 100644 index 0000000000..fb78a1689d --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/CsvUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +class CsvUnitTest { + + @Test + void whenGettingFirstExpression_thenResultNotEmptyAndOfCorrectSizeAndFormat() { + assertAll( + () -> assertThat(Csv.getFirstExpression()).isNotBlank(), + () -> assertThat(Csv.getFirstExpression().split("\n")).hasSize(5), + () -> assertThat(Csv.getFirstExpression().split("\n")[0]).isEqualTo("\"name_column\",\"last_name_column\"") + ); + } + + @Test + void whenGettingSecondExpression_thenResultNotEmptyAndOfCorrectSizeAndFormat() { + assertAll( + () -> assertThat(Csv.getFirstExpression()).isNotBlank(), + () -> assertThat(Csv.getFirstExpression().split("\n")).hasSize(5), + () -> assertThat(Csv.getFirstExpression().split("\n")[0]).isEqualTo("\"name_column\",\"last_name_column\"") + ); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/ExamplifyUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/ExamplifyUnitTest.java new file mode 100644 index 0000000000..fb633a18fd --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/ExamplifyUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class ExamplifyUnitTest { + + @Test + void whenGettingNumberExpression_thenResultNotEmptyAndMathesRegex() { + assertAll( + () -> assertThat(Examplify.getNumberExpression()).isNotBlank(), + () -> assertThat(Examplify.getNumberExpression()).matches("\\d{3}-\\d{3}-\\d{3}") + ); + } + + @Test + void whenGettingExpression_thenResultNotEmptyAndMathesRegex() { + assertAll( + () -> assertThat(Examplify.getExpression()).isNotBlank(), + () -> assertThat(Examplify.getExpression()) + .matches("[A-Z][a-z]{2} [a-z]{2} [a-z]{3} [A-Z][a-z]{2}") + ); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/JsonUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/JsonUnitTest.java new file mode 100644 index 0000000000..7da3448efb --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/JsonUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.datafaker; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.junit.jupiter.api.Assertions.*; + +class JsonUnitTest { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Test + void whenGettingJsonExpression_thenResultIsValidJson() { + assertAll( + () -> assertThatNoException().isThrownBy(() -> objectMapper.readTree(Json.getExpression())), + () -> assertThat(Json.getExpression()).isNotBlank() + ); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MethodInvocationUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MethodInvocationUnitTest.java new file mode 100644 index 0000000000..f2a1bebab4 --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MethodInvocationUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class MethodInvocationUnitTest { + + @Test + void whenGettingNameFromExpression_thenResultNotEmpty() { + assertThat(MethodInvocation.getNameFromMethod()).isNotBlank(); + } + + @Test + void whenGettingNameFromMethod_thenResultNotEmpty() { + assertThat(MethodInvocation.getNameFromExpression()).isNotBlank(); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MethodInvocationWithParamsUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MethodInvocationWithParamsUnitTest.java new file mode 100644 index 0000000000..1a31ade31d --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MethodInvocationWithParamsUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import java.time.Duration; + +import static org.assertj.core.api.Assertions.assertThat; + +class MethodInvocationWithParamsUnitTest { + + @Test + void whenGettingDurationFromExpression_thenResultNotEmpty() { + assertThat(MethodInvocationWithParams.getDurationFromExpression()).isNotBlank(); + } + + @Test + void whenGettingDurationFromMethod_thenResultNotNullAndInBoundaries() { + assertThat(MethodInvocationWithParams.getDurationFromMethod()) + .isNotNull() + .isBetween(Duration.ofSeconds(MethodInvocationWithParams.MIN), + Duration.ofSeconds(MethodInvocationWithParams.MAX)); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MixedCollectionUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MixedCollectionUnitTest.java new file mode 100644 index 0000000000..07c8e07c3a --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/MixedCollectionUnitTest.java @@ -0,0 +1,18 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +class MixedCollectionUnitTest { + + @Test + void whenGettingMixedCollection_thenResultNotEmptyAndOfCorrectSize() { + assertAll( + () -> assertThat(MixedCollection.getMixedCollection()).isNotEmpty(), + () -> assertThat(MixedCollection.getMixedCollection()).size().isGreaterThanOrEqualTo(MixedCollection.MIN), + () -> assertThat(MixedCollection.getMixedCollection()).size().isLessThanOrEqualTo(MixedCollection.MAX) + ); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/OptionUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/OptionUnitTest.java new file mode 100644 index 0000000000..8e3a38958e --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/OptionUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class OptionUnitTest { + @Test + void whenGettingThirdExpression_thenResultNotBlankAndMatchesRegex() { + assertThat(Option.getThirdExpression()).isNotBlank() + .matches("(Hi|Hello|Hey)"); + } + + @Test + void whenGettingSecondExpression_thenResultNotBlankAndMatchesRegex() { + assertThat(Option.getSecondExpression()).isNotBlank() + .matches("(1|2|3|4|\\*)"); + } + + @Test + void whenGettingFirstExpression_thenResultNotBlankAndMatchesRegex() { + assertThat(Option.getFirstExpression()).isNotBlank() + .matches("(Hi|Hello|Hey)"); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/RegexifyUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/RegexifyUnitTest.java new file mode 100644 index 0000000000..98d4e9e85c --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/RegexifyUnitTest.java @@ -0,0 +1,20 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class RegexifyUnitTest { + + @Test + void whenGettingMethidExpression_thenResultNotBlankAndMatchesRegex() { + assertThat(Regexify.getMethodExpression()).isNotBlank() + .matches("[A-D]{4,10}"); + } + + @Test + void whenGettingExpression_thenResultNotBlankAndMatchesRegex() { + assertThat(Regexify.getExpression()).isNotBlank() + .matches("(hello|bye|hey)"); + } +} \ No newline at end of file diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/TemplatifyUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/TemplatifyUnitTest.java new file mode 100644 index 0000000000..491c3b6929 --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/datafaker/TemplatifyUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.datafaker; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class TemplatifyUnitTest { + @Test + void whenGettingPlaceholderExpression_thenResultNotBlankAndMatchesRegex() { + assertThat(Templatify.getExpressionWithPlaceholder()).isNotBlank() + .matches(".ight"); + } + + @Test + void whenGettingExpression_thenResultNotBlankAndMatchesRegex() { + assertThat(Templatify.getExpression()).isNotBlank() + .matches(".es."); + } +} \ No newline at end of file diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index e447639288..577e2f9301 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -41,6 +41,7 @@ jimfs ${jimf.version} + diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 731d61204f..f237d2d6fc 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -32,6 +32,7 @@ mockito mockito-simple mocks + mocks-2 mockserver parallel-tests-junit powermock @@ -48,6 +49,7 @@ testng-command-line xmlunit-2 zerocode + mockito-2 \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Generated.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Generated.java index 93be21e32d..4781c5a613 100644 --- a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Generated.java +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/generated/Generated.java @@ -4,12 +4,13 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; +import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Documented @Retention(RUNTIME) -@Target({TYPE, METHOD}) +@Target({TYPE, METHOD, CONSTRUCTOR}) public @interface Generated { } \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/CustomerService.java b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/CustomerService.java index 889153ba0a..54cba300af 100644 --- a/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/CustomerService.java +++ b/testing-modules/testing-libraries-2/src/main/java/com/baeldung/jacocoexclusions/service/CustomerService.java @@ -4,6 +4,11 @@ import com.baeldung.jacocoexclusions.generated.Generated; public class CustomerService { + @Generated + public CustomerService(){ + //constructor excluded form coverage report + } + //this method will be excluded from coverage due to @Generated. @Generated public String getProductId() { diff --git a/vavr-modules/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java b/vavr-modules/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java index b1a9405605..39bcbea1de 100644 --- a/vavr-modules/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java +++ b/vavr-modules/vavr/src/test/java/com/baeldung/vavr/VavrUnitTest.java @@ -323,13 +323,13 @@ public class VavrUnitTest { if (input == 0) { output = "zero"; } - if (input == 1) { + else if (input == 1) { output = "one"; } - if (input == 2) { + else if (input == 2) { output = "two"; } - if (input == 3) { + else if (input == 3) { output = "three"; } else { output = "unknown"; diff --git a/web-modules/jakarta-ee/pom.xml b/web-modules/jakarta-ee/pom.xml index afd31d7ece..82993103c8 100644 --- a/web-modules/jakarta-ee/pom.xml +++ b/web-modules/jakarta-ee/pom.xml @@ -8,6 +8,12 @@ jakarta-ee war + + com.baeldung + web-modules + 1.0.0-SNAPSHOT + + jakarta.platform diff --git a/web-modules/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppTest.java b/web-modules/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppUnitTest.java similarity index 89% rename from web-modules/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppTest.java rename to web-modules/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppUnitTest.java index 6934d1fca2..8c77a75318 100644 --- a/web-modules/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppTest.java +++ b/web-modules/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppUnitTest.java @@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; /** * Dummy Test */ -public class AppTest { +public class AppUnitTest { @Test public void test() { diff --git a/web-modules/ninja/pom.xml b/web-modules/ninja/pom.xml index 36a28a0977..eb59a0ff9e 100644 --- a/web-modules/ninja/pom.xml +++ b/web-modules/ninja/pom.xml @@ -3,12 +3,17 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 - com.baeldung ninja 1.0.0 jar http://www.ninjaframework.org + + com.baeldung + web-modules + 1.0.0-SNAPSHOT + + org.webjars @@ -200,7 +205,6 @@ 9.4.18.v20190429 3.3.4 2.1.3 - 1.4.186 3.2 1.8 1.8 diff --git a/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterTest.java b/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterManualTest.java similarity index 91% rename from web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterTest.java rename to web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterManualTest.java index d5f4f1811c..b77901c8e2 100644 --- a/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterTest.java +++ b/web-modules/ninja/src/test/java/controllers/ApiControllerDocTesterManualTest.java @@ -7,7 +7,7 @@ import org.doctester.testbrowser.Response; import org.junit.Test; import ninja.NinjaDocTester; -public class ApiControllerDocTesterTest extends NinjaDocTester { +public class ApiControllerDocTesterManualTest extends NinjaDocTester { String URL_INDEX = "/"; String URL_HELLO = "/hello"; diff --git a/web-modules/ninja/src/test/java/controllers/ApiControllerMockUnitTest.java b/web-modules/ninja/src/test/java/controllers/ApiControllerMockManualTest.java similarity index 94% rename from web-modules/ninja/src/test/java/controllers/ApiControllerMockUnitTest.java rename to web-modules/ninja/src/test/java/controllers/ApiControllerMockManualTest.java index cb53965678..2fa76bca4e 100644 --- a/web-modules/ninja/src/test/java/controllers/ApiControllerMockUnitTest.java +++ b/web-modules/ninja/src/test/java/controllers/ApiControllerMockManualTest.java @@ -10,7 +10,7 @@ import ninja.Result; import services.UserService; @RunWith(NinjaRunner.class) -public class ApiControllerMockUnitTest { +public class ApiControllerMockManualTest { @Inject private UserService userService;