From 10381e58e0fcefcd928a203f5e8ec823c66c38c3 Mon Sep 17 00:00:00 2001 From: Jennifer Reif Date: Wed, 24 Jun 2020 16:50:45 -0500 Subject: [PATCH 1/3] Add resources for 4.0 and 4.1 on neo4j-database page --- .../neo4j-database/neo4j-database.adoc | 44 +++++++++++++------ language-guides/_includes/python-driver.adoc | 2 +- language-guides/_includes/versions.txt | 10 ++--- language-guides/python/python.adoc | 9 +++- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/graph-platform/neo4j-database/neo4j-database.adoc b/graph-platform/neo4j-database/neo4j-database.adoc index 4bf9a020..8197c464 100644 --- a/graph-platform/neo4j-database/neo4j-database.adoc +++ b/graph-platform/neo4j-database/neo4j-database.adoc @@ -90,29 +90,45 @@ The table below shows the latest releases and planned support timelines and exte [%autowidth.spread] |=== |*Version* |*Support category* |*Support Start* |*Support End* |*Extended support end* -//|version 4.1 |Short-term support |June 2020 |December 2021 |June 2023 +|version 4.1 |Short-term support |June 2020 |December 2021 |June 2023 |version 4.0 |Short-term support |January 2020 |June 2021 |December 2022 |version 3.5 |Long-term support |November 2018 |December 2021 |N/A |=== -//// === Neo4j 4.1 (June 2020) -Documentation link + -Release notes? + -YouTube playlist + -Blog post from Ivan? + -Blog post from Adam (Medium) + -Other resources -//// + + +link:/blog/introducing-neo4j-4-1/[Blog post: 4.1 Announcement^] + +link:/docs/operations-manual/current/[Neo4j 4.1 Docs^] + +link:/release-notes/neo4j-4-1-0/[Release Notes^] + +https://github.com/neo4j/neo4j/wiki/Neo4j-4.1-changelog[4.1 Changelog^] + +https://www.youtube.com/playlist?list=PL9Hl4pk2FsvV__9u8fho4oVpP1DvJAZhm[YouTube playlist: 4.1 Features presented by the engineers who built them^] + +https://youtu.be/of53lUFs5hc[Video: 4.1 Whirlwind Tour with Michael Hunger^] === Neo4j 4.0 (January 2020) -link:/docs/operations-manual/4.0/[Neo4j 4.0 Docs^] + -link:/release-notes/neo4j-4-0-0/[Initial Release Notes^] + -https://dzone.com/articles/see-whats-new-in-neo4j-40[DZone article: What's new in 4.0^] + -https://medium.com/neo4j/neo4j-treasure-map-where-to-find-all-of-the-4-0-resources-you-need-948cf71004f9[Blog post: 4.0 Resource Treasure Map^] + -https://medium.com/neo4j/new-neo4j-4-0-features-copy-a-database-and-more-c51d1744a7e3[Blog post: Copy a database^] +Official documentation - +* link:/docs/operations-manual/4.0/[Docs: Neo4j 4.0 Operations^] +* link:/docs/cypher-manual/4.0/[Docs: 4.0 Cypher^] +* link:/docs/driver-manual/4.0/[Docs: 4.0 Drivers^] +* link:/docs/migration-guide/4.0/[Migration guide^] + +Feature highlights - +* link:/release-notes/neo4j-4-0-0/[Initial Release Notes^] +* https://dzone.com/articles/see-whats-new-in-neo4j-40[DZone article: What's new in 4.0^] +* https://medium.com/neo4j/neo4j-treasure-map-where-to-find-all-of-the-4-0-resources-you-need-948cf71004f9[Blog post: 4.0 Resource Treasure Map^] + +Technical deep-dives - +* Developer guides: link:/developer/manage-multiple-databases/[multiple databases], link:/developer/neo4j-fabric-sharding/[Neo4j sharding], link:/developer/multi-tenancy-worked-example/[multi-tenancy example], link:/developer/subqueries/[Cypher subqueries] +* https://youtu.be/GcaJ-aVLzr4[Video: Migrating from Neo4j 3.5 to 4.0^] +* https://medium.com/neo4j/new-neo4j-4-0-features-copy-a-database-and-more-c51d1744a7e3[Blog post: Copy a database^] +* NODES online developer conference sessions: https://youtu.be/jQIqXVVYPE0[4.0 security^], https://youtu.be/mrs4TQwNo6g[Spring Data Neo4j Reactive^], https://youtu.be/AfhJcyys108?t=1504[Behind-the-Tech in 4.0^] +* https://medium.com/neo4j/introducing-neo4j-drivers-for-the-next-gen-database-96981f65e8b8[Drivers for Neo4j 4.0^] +* https://markhneedham.com/blog/2020/01/28/neo4j-database-dump-docker-container/[Blog post: Database dump in a Docker container^] +* https://adamcowley.co.uk/neo4j/multi-tenancy-neo4j-4.0/[Blog post: Connecting an application with multi-tenancy and multi-db^] +* https://adamcowley.co.uk/neo4j/sharding-neo4j-4.0/[Blog post: How and when to implement sharding^] +* https://blog.bruggen.com/2020/02/securing-sample-fraud-graph-with-neo4j.html[Blog post: Securing a fraud graph^] === Neo4j 3.5 (November 2018) diff --git a/language-guides/_includes/python-driver.adoc b/language-guides/_includes/python-driver.adoc index 2f3d21bd..adf4ae35 100644 --- a/language-guides/_includes/python-driver.adoc +++ b/language-guides/_includes/python-driver.adoc @@ -7,7 +7,7 @@ include::versions.txt[] The Neo4j Python driver is *officially supported* by Neo4j and connects to the database using the binary protocol. It aims to be minimal, while being idiomatic to Python. -WARNING: Support for Python 2 will be removed in the upcoming 2.0 release of the driver. +WARNING: Python 2.7 support has been dropped as of the Neo4j 4.0 release. [source, shell, subs=attributes,specialcharacters] ---- diff --git a/language-guides/_includes/versions.txt b/language-guides/_includes/versions.txt index ff8644fa..5aa3291c 100644 --- a/language-guides/_includes/versions.txt +++ b/language-guides/_includes/versions.txt @@ -1,11 +1,11 @@ :neo4j-ogm-version: 3.1.6 :spring-data-neo4j-version: 5.1.3.RELEASE -:neo4j-stable-version: 4.0.3 +:neo4j-stable-version: 4.1.0 :bolt-driver-version: 1.7.0 -:java-driver-version: 4.0.1 -:javascript-driver-version: 4.0.2 -:python-driver-version: 1.7.1 -:dotnet-driver-version: 4.0 +:java-driver-version: 4.1 +:javascript-driver-version: 4.1 +:python-driver-version: 4.0 +:dotnet-driver-version: 4.1 :go-driver-version: 1.8 :maven-artifact-info: http://search.maven.org/#artifactdetails%7Corg.neo4j.driver%7Cneo4j-java-driver%7C{java-driver-version}%7Cjar diff --git a/language-guides/python/python.adoc b/language-guides/python/python.adoc index 3f88155a..fea3d81a 100644 --- a/language-guides/python/python.adoc +++ b/language-guides/python/python.adoc @@ -19,8 +19,8 @@ While it is not comprehensive, it aims to introduce the available drivers and li .Prerequisites [abstract] -* You should be familiar with link:/developer/graph-database[graph database concepts] and the property graph model. -* You should have link:/download[installed Neo4j] and made yourself familiar with our link:/developer/cypher-query-language[Cypher query language]. +* You should be familiar with link:/developer/graph-database/[graph database concepts] and the property graph model. +* You should have link:/download/[installed Neo4j] and made yourself familiar with our link:/developer/cypher-query-language/[Cypher query language]. * We also recommend installing and becoming familiar with both https://pip.pypa.io/[pip^] and https://virtualenv.pypa.io/[virtualenv^] before working on a Python project. [role=expertise] @@ -134,3 +134,8 @@ harry_potter = Book(title='Harry potter and the..').save() rowling = Author(name='J. K. Rowling').save() harry_potter.author.connect(rowling) ---- + +== Resources + +* link:{drivermanual}[Docs: Driver Manual^] +* https://medium.com/neo4j/neo4j-python-4-0-driver-the-latest-driver-for-the-next-gen-database-a5be6ecd481f[Blog post: Python 4.0 driver^] \ No newline at end of file From 92ffd20ca2f13771c85eab2d3f4e26a2210f1f54 Mon Sep 17 00:00:00 2001 From: Jennifer Reif Date: Wed, 24 Jun 2020 16:52:11 -0500 Subject: [PATCH 2/3] Fix iframe formatting on neo4j-database --- graph-platform/neo4j-database/neo4j-database.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/graph-platform/neo4j-database/neo4j-database.adoc b/graph-platform/neo4j-database/neo4j-database.adoc index 8197c464..1c79991a 100644 --- a/graph-platform/neo4j-database/neo4j-database.adoc +++ b/graph-platform/neo4j-database/neo4j-database.adoc @@ -97,7 +97,9 @@ The table below shows the latest releases and planned support timelines and exte === Neo4j 4.1 (June 2020) +++++ +++++ link:/blog/introducing-neo4j-4-1/[Blog post: 4.1 Announcement^] + link:/docs/operations-manual/current/[Neo4j 4.1 Docs^] + From 3ac52de9184189b50a4e42c80e98f5100750f3a9 Mon Sep 17 00:00:00 2001 From: Jennifer Reif Date: Fri, 26 Jun 2020 16:20:58 -0500 Subject: [PATCH 3/3] Add 4.1 and modeling resources, prune unused content, add note to sdn page --- contribute/contribute.adoc | 2 +- cypher/cypher.adoc | 2 +- .../guide-cypher-basics.adoc | 239 -- cypher/guide-cypher-basics/index.html | 1439 ------------ .../procedures-functions.adoc | 2 +- cypher/procedures-gallery/index.html | 2018 ----------------- .../procedures-gallery.adoc | 401 ---- .../data_modeling_movies_actors.png | Bin 39198 -> 0 bytes .../movie-database/import-movies.rb | 65 - .../example-data/movie-database/index.html | 1486 ------------ .../movie-database/movie-database-queries.txt | 120 - .../movie-database/movie-database.adoc | 91 - .../guide-data-modeling.adoc | 6 +- .../modeling-designs/modeling-designs.adoc | 2 + get-started/get_started_neo4j.svg | 4 +- .../neo4j-database/neo4j-database.adoc | 4 + .../graphenedb.png | Bin 97168 -> 0 bytes .../graphgrid.jpg | Bin 11998 -> 0 bytes .../graphstory.png | Bin 16908 -> 0 bytes .../neo4j-cloud-hosting-providers/index.html | 1262 ----------- .../neo4j-cloud-hosting-providers.adoc | 68 - .../guide-sizing-and-hardware-calculator.adoc | 93 - .../index.html | 1278 ----------- integration/integration.adoc | 2 +- .../java-procedures/java-procedures.adoc | 4 +- .../spring-data-neo4j-rx.adoc | 2 +- .../spring-data-neo4j/spring-data-neo4j.adoc | 10 +- 27 files changed, 26 insertions(+), 8574 deletions(-) delete mode 100644 cypher/guide-cypher-basics/guide-cypher-basics.adoc delete mode 100644 cypher/guide-cypher-basics/index.html delete mode 100644 cypher/procedures-gallery/index.html delete mode 100644 cypher/procedures-gallery/procedures-gallery.adoc delete mode 100644 data-import/example-data/movie-database/data_modeling_movies_actors.png delete mode 100644 data-import/example-data/movie-database/import-movies.rb delete mode 100644 data-import/example-data/movie-database/index.html delete mode 100644 data-import/example-data/movie-database/movie-database-queries.txt delete mode 100644 data-import/example-data/movie-database/movie-database.adoc delete mode 100644 guide-cloud-deployment/neo4j-cloud-hosting-providers/graphenedb.png delete mode 100644 guide-cloud-deployment/neo4j-cloud-hosting-providers/graphgrid.jpg delete mode 100644 guide-cloud-deployment/neo4j-cloud-hosting-providers/graphstory.png delete mode 100644 guide-cloud-deployment/neo4j-cloud-hosting-providers/index.html delete mode 100644 guide-cloud-deployment/neo4j-cloud-hosting-providers/neo4j-cloud-hosting-providers.adoc delete mode 100644 in-production/guide-sizing-and-hardware-calculator/guide-sizing-and-hardware-calculator.adoc delete mode 100644 in-production/guide-sizing-and-hardware-calculator/index.html diff --git a/contribute/contribute.adoc b/contribute/contribute.adoc index bfbbb6a2..53112547 100644 --- a/contribute/contribute.adoc +++ b/contribute/contribute.adoc @@ -129,4 +129,4 @@ Neo4j is supported by a rich ecosystem of libraries, tools, drivers and guides p We want to give an overview about what is available and link to the original sources. We try to focus on the freely available solutions here and provide links to commercial options where appropriate. -Read more about it in our link:/developer/ecosystem/[Integrations section]. \ No newline at end of file +Read more about it in our link:/developer/integration/[Integrations section]. \ No newline at end of file diff --git a/cypher/cypher.adoc b/cypher/cypher.adoc index d97e6a5c..098cb212 100644 --- a/cypher/cypher.adoc +++ b/cypher/cypher.adoc @@ -150,7 +150,7 @@ Before we get too carried away with creating all of our functionality custom, th Learn where you can look to find out if code already exists for your capability or if you need to write your own custom functionality! link:/developer/procedures-functions/[User-Defined Procedures and Functions] + -link:/developer/procedures-gallery/[Existing Procedure Libraries] +link:/labs/apoc/[APOC: Neo4j's Standard Utility Library^] [#recommendation-engine] == Tutorial: Build a Recommendation Engine diff --git a/cypher/guide-cypher-basics/guide-cypher-basics.adoc b/cypher/guide-cypher-basics/guide-cypher-basics.adoc deleted file mode 100644 index 735a0cc6..00000000 --- a/cypher/guide-cypher-basics/guide-cypher-basics.adoc +++ /dev/null @@ -1,239 +0,0 @@ -= Guide to Cypher Basics -:slug: guide-cypher-basics -:level: Beginner -:section: Cypher Query Language -:section-link: cypher -:sectanchors: -:toc: -:toc-title: Contents -:toclevels: 1 -:author: Neo4j -:category: cypher -:tags: cypher, queries, graph-queries, movie-graph, cypher-example - -.Goals -[abstract] -This guide explains the basic concepts of Cypher, Neo4j's query language, including how to create and query graphs. -You should be able to read and understand Cypher queries after finishing this guide. - -.Prerequisites -[abstract] -You should have familiarized yourself with link:/developer/get-started/graph-database[Graph Databases] and the link:/developer/get-started/graph-database#property-graph[Property Graph Model]. - -[role=expertise] -{level} - -[#cypher-basics] -== Pop-Cultural Connections -_The Movie Graph_ is a mini graph application containing actors and directors that are related through the movies they've collaborated on. -It is available in your Neo4j Browser if you execute `:play movie-graph`. -It is helpful if you run the queries as you go along, but you should understand them even so. - -This guide will show you how to: - -1. Create: insert movie data into the graph -2. Find: retrieve individual movies and actors -3. Query: discover related actors and directors -4. Solve: the Bacon Path - -[#cypher-movie-create] -== Create - -Hidden below this text is a giant code block containing a single Cypher query statement composed of multiple `CREATE` clauses. -This will create the movie graph. - -(You can unfold it with the little [role='icon-plus-sign-alt']plus button) - -<>, <> - -[#cypher-movie-find] -== Find - -Example queries for finding individual nodes. - -1. Look at every query example -2. Run the query with the play button -3. Notice the syntax pattern -4. Try looking for other movies or actors - -<>, <>, <> - -=== Find the Person Named "Tom Hanks"... - -[source, cypher] ----- -MATCH (tom:Person) -WHERE tom.name = "Tom Hanks" -RETURN tom ----- - -//graph_result -//table - -=== Find the Movie Titled "Cloud Atlas"... - -[source, cypher] ----- -MATCH (cloudAtlas:Movie {title: "Cloud Atlas"}) -RETURN cloudAtlas ----- - -//graph_result - -//table - -=== Find 10 People... - -[source, cypher] ----- -MATCH (people:Person) -RETURN people.name LIMIT 10 ----- - -// table - -=== Find Movies Released in the 1990s... - -[source, cypher] ----- -MATCH (nineties:Movie) -WHERE nineties.released > 1990 AND nineties.released < 2000 -RETURN nineties.title ----- - -//table - -[#cypher-movie-query] -== Query - -Finding patterns within the graph. - -1. Actors are people who acted in movies -2. Directors are people who directed a movie -3. What other relationships exist? - -<> - - -=== List All Tom Hanks Movies... - -[source, cypher] ----- -MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) -RETURN tom,tomHanksMovies ----- - -//graph_result - -//table - - -=== Who Directed "Cloud Atlas"? - -[source, cypher] ----- -MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) -RETURN directors.name ----- - -//table - - -=== Tom Hanks' Co-Actors... - -[source, cypher] ----- -MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) -RETURN tom, m, coActors ----- - -//graph_result - -//table - - -=== How People are Related to "Cloud Atlas"... - -[source, cypher] ----- -MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) -RETURN people.name, Type(relatedTo), relatedTo ----- - -//table - -[#cypher-paths] -== Solve the Six Degrees Question - -You've heard of the classic "Six Degrees of Kevin Bacon"? -That is simply a shortest path query called the "Bacon Path". - -1. Variable length patterns -2. Built-in shortestPath() algorithm - -{cyphermanual}/syntax/patterns/#cypher-pattern-varlength[variable length relationships^] -{cyphermanual}/execution-plans/shortestpath-planning/[shortestPath^] - - -==== Movies and Actors up to Three Hops Away from Kevin Bacon - -[source, cypher] ----- -MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..3]-(hollywood) -RETURN DISTINCT hollywood ----- - -//graph_result - -//table - - -=== The Bacon Path to Meg Ryan - -[source, cypher] ----- -MATCH p=shortestPath( - (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"}) -) -RETURN p ----- - -//graph_result - -//table - -[#cypher-movie-cleanup] -== Clean Up - -When you're done experimenting, you can remove the movie data set. - -[NOTE] -1. Nodes can't be deleted if relationships to them exist -2. Delete both nodes and relationships together - -[WARNING] -This will remove all Person and Movie nodes! - -* <> - - -=== Delete All Movie and Person Nodes and their Relationships - -//output - -[source, cypher] ----- -MATCH (a:Person),(m:Movie) -OPTIONAL MATCH (a)-[r1]-(), (m)-[r2]-() -DELETE a,r1,m,r2 ----- - -=== Prove that the Movie Graph is Gone - -[source, cypher] ----- -MATCH (n) -RETURN count(*) ----- - -//table diff --git a/cypher/guide-cypher-basics/index.html b/cypher/guide-cypher-basics/index.html deleted file mode 100644 index acf5e2a0..00000000 --- a/cypher/guide-cypher-basics/index.html +++ /dev/null @@ -1,1439 +0,0 @@ - - - - - - - - - - - - What is a Graph Database? A Property Graph Model Intro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
-
-

Guide to Cypher Basics

-
-
-
-
-

lead text

-
-
- - - - -
-
-
-
-
-
-
Goals
-
-This guide explains the basic concepts of Cypher, Neo4j’s query language, including how to create and query graphs. -You should be able to read and understand Cypher queries after finishing this guide. -
-
-
-
Prerequisites
-
-You should have familiarized yourself with Graph Databases and the Property Graph Model. -
-
- - -
Beginner
-
- - -
-
-
-
-

Pop-Cultural Connections

- - -
-

The Movie Graph is a mini graph application containing actors and directors that are related through the movies they’ve collaborated on. -It is available in your Neo4j Browser if you execute :play movie-graph. -It is helpful if you run the queries as you go along, but you should understand them even so.

-
- - - -
-

This guide will show you how to:

-
- -
-
    -
  1. -Create: insert movie data into the graph -
  2. -
  3. -Find: retrieve individual movies and actors -
  4. -
  5. -Query: discover related actors and directors -
  6. -
  7. -Solve: the Bacon Path -
  8. -
-
-
-
-

Create

- - -
-

Hidden below this text is a giant code block containing a single Cypher query statement composed of multiple CREATE clauses. -This will create the movie graph.

-
- - - -
-

(You can unfold it with the little [role='icon-plus-sign-alt']plus button)

-
- - - - - -
-
-

Find

- - -
-

Example queries for finding individual nodes.

-
- -
-
    -
  1. -Look at every query example -
  2. -
  3. -Run the query with the play button -
  4. -
  5. -Notice the syntax pattern -
  6. -
  7. -Try looking for other movies or actors -
  8. -
-
- - - - -
-

Find the Person Named "Tom Hanks"…​

-
-
-
MATCH (tom:Person)
-WHERE tom.name = "Tom Hanks"
-RETURN tom
-
-
-
-
-

Find the Movie Titled "Cloud Atlas"…​

-
-
-
MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})
-RETURN cloudAtlas
-
-
-
-
-

Find 10 People…​

-
-
-
MATCH (people:Person)
-RETURN people.name LIMIT 10
-
-
-
-
-

Find Movies Released in the 1990s…​

-
-
-
MATCH (nineties:Movie)
-WHERE nineties.released > 1990 AND nineties.released < 2000
-RETURN nineties.title
-
-
-
-
-
-

Query

- - -
-

Finding patterns within the graph.

-
- -
-
    -
  1. -Actors are people who acted in movies -
  2. -
  3. -Directors are people who directed a movie -
  4. -
  5. -What other relationships exist? -
  6. -
-
- - - - -
-

List All Tom Hanks Movies…​

-
-
-
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies)
-RETURN tom,tomHanksMovies
-
-
-
-
-

Who Directed "Cloud Atlas"?

-
-
-
MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})<-[:DIRECTED]-(directors)
-RETURN directors.name
-
-
-
-
-

Tom Hanks' Co-Actors…​

-
-
-
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
-RETURN tom, m, coActors
-
-
-
- -
-
-

Solve the Six Degrees Question

- - -
-

You’ve heard of the classic "Six Degrees of Kevin Bacon"? -That is simply a shortest path query called the "Bacon Path".

-
- -
-
    -
  1. -Variable length patterns -
  2. -
  3. -Built-in shortestPath() algorithm -
  4. -
-
- - - - -
-

Movies and Actors up to Three Hops Away from Kevin Bacon

-
-
-
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..3]-(hollywood)
-RETURN DISTINCT hollywood
-
-
-
-
-

The Bacon Path to Meg Ryan

-
-
-
MATCH p=shortestPath(
-  (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
-)
-RETURN p
-
-
-
-
-
-

Clean Up

- - -
-

When you’re done experimenting, you can remove the movie data set.

-
- -
-
    -
  1. -Nodes can’t be deleted if relationships to them exist -
  2. -
  3. -Delete both nodes and relationships together -
  4. -
-
-
- - - - - -
- - -This will remove all Person and Movie nodes! -
-
-
- -
-
-

Delete All Movie and Person Nodes and their Relationships

-
-
-
MATCH (a:Person),(m:Movie)
-OPTIONAL MATCH (a)-[r1]-(), (m)-[r2]-()
-DELETE a,r1,m,r2
-
-
-
-
-

Prove that the Movie Graph is Gone

-
-
-
MATCH (n)
-RETURN count(*)
-
-
-
-
-
-
- - - -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Stay Connected

-

Sign up to find out more about Neo4j's upcoming events & meetups.

-
-
-
-
-
-
- -
- -
- -
-
-
-

 

-
- - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cypher/procedures-functions/procedures-functions.adoc b/cypher/procedures-functions/procedures-functions.adoc index 80b2cf14..bdcab8e4 100644 --- a/cypher/procedures-functions/procedures-functions.adoc +++ b/cypher/procedures-functions/procedures-functions.adoc @@ -116,7 +116,7 @@ If they are open source, check their source-code and best build them yourself. [#procedure-function-gallery] == Procedure and Function Gallery -In our link:../procedures-gallery[procedure and functions gallery] we describe some of the impressive procedure libraries built by our community. +In our link:/labs/[Neo4j Labs projects], we provide an impressive set of libraries built by our community and staff. Check it out to see what's already there. Many of your needs will already be covered by those, for example: diff --git a/cypher/procedures-gallery/index.html b/cypher/procedures-gallery/index.html deleted file mode 100644 index cd6ebcbc..00000000 --- a/cypher/procedures-gallery/index.html +++ /dev/null @@ -1,2018 +0,0 @@ - - - - - - - - - - - - What is a Graph Database? A Property Graph Model Intro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
-
-

Procedures & Functions Gallery

-
-
-
-
-

lead text

-
-
- - - - -
-
-
-
-
-
-
Goals
-
-Our community created already a lot of useful user defined procedures and functions. This overview highlights which areas each library covers with some examples. This saves you from implementing existing ones yourself. -
-
-
-
Prerequisites
-
-You should know what user defined procedures and functions are and how to use them within Cypher. -
-
- - -
Intermediate
-
- - -
-
-
-
-

Awesome Procedures on Cypher (APOC)

- - -
-

With the advent of user defined procedures, many capabilities could be added to Cypher with ease. -That’s how the APOC library got started, which developed into a "standard-library" for Neo4j built by the Neo4j community.

-
- - - -
-

Due to the use of internal APIs there are dedicated APOC versions for the different Neo4j versions.

-
- - - -
-

By now it contains 200+ procedures and 70+ functions.

-
- - - -
-

APOC covers much ground, here are some examples for the available functionality.

-
- -
-

Procedures

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
package# of procedurespopular proceduredocs link
- -
-

data api access

-
-
- -
-

11

-
-

apoc.load.json(json-url)

- -
-

-
-
- -
-

database integration

-
-
- -
-

23

-
-

apoc.load.jdbc(jdbc-url,table-or-statement)

- -
-

-
-
- -
-

graph algorithms

-
-
- -
-

18

-
-

apoc.algo.dijkstra(from,to,cost-prop)
-apoc.algo.pageRankStats({iterations:10,write:true})

- -
-

-
-
- -
-

(virtual) data creation

-
-
- -
-

16

-
-

CALL apoc.create.relationship(startNode,'TYPE',{key:value,…​}, endNode)

- -
-

-
-
- -
-

transaction control

-
-
- -
-

8

-
-

apoc.periodic.iterate('source-query','work-statement',{batchSize:100, parallel:true})

- -
-

-
-
- -
-

cypher operations

-
-
- -
-

9

-
-

apoc.cypher.runFile(file or url)

- -
-

-
-
- -
-

graph data export

-
-
- -
-

9

-
-

apoc.export.cypher.query(query,file,config)

- -
-

-
-
- -
-

graph generation

-
-
- -
-

5

-
-

apoc.generate.ws(noNodes, degree, beta, 'label', 'TYPE') // Watts-Strogatz

- -
-

-
-
- -
-

meta information

-
-
- -
-

4

-
-

apoc.meta.stats()

- -
-

-
-
- -
-

time to live, node-expiry

-
-
- -
-

1

-
-

CALL apoc.date.expire(node,100,'s');

- -
-

-
-
- -
-

monitoring & operations

-
-
- -
-

6

-
-

apoc.monitor.tx()

- -
-

-
-
- -
-

manual and schema indexes

-
-
- -
-

17

-
-

apoc.index.between(node1,'TYPE',node2,'prop:value*')

- -
-

-
-
- -
-

cypher triggers on transaction end

-
-
- -
-

3

-
-

apoc.trigger.add(name, statement, selector)

- -
-

-
-
- -
-

search and expand

-
-
- -
-

5

-
-

apoc.path.expand(startNode, relationshipFilter, labelFilter, minDepth, maxDepth )

- -
-

-
-
-
-

-apoc.load.json so result -

-
-
-
-

Functions:

- - -
-

As mentioned before, functions can compute values in any kind of expression or predicate.

-
- - ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
package# of functionspopular function
- -
-

date & time conversion

-
-
- -
-

3

-
-

apoc.date.parse("time",["unit"],["format"])

- -
-

number conversion

-
-
- -
-

3

-
-

apoc.number.parse("number",["format"])

- -
-

general type conversion

-
-
- -
-

8

-
-

apoc.convert.toMap(value)

- -
-

type information and checking

-
-
- -
-

4

-
-

apoc.meta.type(value)

- -
-

collection and map functions

-
-
- -
-

25

-
-

apoc.map.fromList(["k1",v1,"k2",v2,"k3",v3])

- -
-

JSON conversion

-
-
- -
-

4

-
-

apoc.convert.toJson(value)

- -
-

string functions

-
-
- -
-

7

-
-

apoc.text.join(["s1","s2","s3"],"delim")

- -
-

hash functions

-
-
- -
-

2

-
-

apoc.util.md5(value)

- - -
-

Learn more about APOC by reading the blog post series on APOC or watch the presentations about it.

-
- - - -
-

APOC itself comes also with a comprehensive and growing documentation site.

-
- - - -
-

Recently added Neo4j Browser guides make parts of that documentation available within your working environment.

-
- - - -
-

Just run: :play http://guides.neo4j.com/apoc within your Neo4j browser to learn interactively.

-
- -
-
-
-

Neo4j Spatial Procedures

- - -
-

The neo4j-spatial library has been with Neo4j for a long time.

-
- - - -
-

In the past you used it with its Java or REST APIs. -Now for Neo4j 3.0 the maintainer, Craig Taverner added procedures for the APIs to integrate the spatial capabilities closely with Cypher.

-
- -
-

Spatial Procedure Overview

- - -
-

Neo4j Spatial is packaged as a ZIP file that can be unzipped into the $NEO4J_HOME/plugins directory. -After restarting the server, you should be able to use the following procedure calls from Cypher.

-
- - - -
-

Below are some of the most commonly used procedures grouped by type. You can find usage examples below in the legis-graph section.

-
- - ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
typeprocedures (spatial.*)
- -
-

general

-
-

procedures()

- -
-

layers

-
-

layer(layer),layers(), layerTypes()

- -
-

add layers

-
-

addLayer(layer, type, config), addLayerWithEncoder(), addPointLayer(layer), addWKTLayer(name, property)

- -
-

remove layers

-
-

removeLayer(layer)

- -
-

add nodes

-
-

addNode(layer,node), addNodes(layer,nodes), updateFromWKT(layer,geometry,geoNodeId)

- -
-

add geometries

-
-

addWKT(layer, geometry), addWKTs(layer,geometries)

- -
-

find / search

-
-

bbox(layer, min, max), closest(layer, coordinate, distance), intersects(layer, geometry), withinDistance(layer, coordinate, distance)

- -
-

utilities

-
-

asGeometry, asExternalGeometry, decodeGeometry, getFeatureAttributes

- -
-

import

-
-

importShapefile(uri), importShapefileToLayer(layer, uri)

-
-
-

Using Neo4j Spatial Procedures in legis-graph-spatial

- - -
-

William Lyon demonstrates how to use them in the Legis-Graph-Spatial Blog post with the code being available on GitHub

-
- -
-

-ca san mateo -

-
-
-
create a WKT layer
-
-
call spatial.addWKTLayer('geom', 'wkt')
-
-
-
-
match on all District nodes and add them to the WKT layer
-
-
MATCH (d:District)
-WITH collect(d) AS districts
-CALL spatial.addNodes('geom', districts) YIELD node
-RETURN count(*)
-
-
-
-
Find Geometry within distance and related
-
-
WITH {latitude: 37.563440, longitude: -122.322265} AS coordinate
-CALL spatial.withinDistance('geom', coordinate, 1) YIELD node AS district
-MATCH (district)<-[:REPRESENTS]-(legislator:Legislator)
-RETURN district.state, legislator.govtrackID, legislator.lastName, l.currentParty AS party
-
-
-
-
-
-

Semantic Web (RDF / Ontology) Procedures

- - -
-

Neo4j Consultant Jesus Barrasa wrote a number of procedures for importing and managing semantic web data.

-
- -
-
import RDF formats and convert them into the property graph model
-
-
CALL semantics.importRDF(rdf-url-or-file,format, shorten-url-flag, batch-commit-size);
-
-
-
-
import ontologies into Neo4j ontologies for graph generation and checking
-
-
CALL semantics.LiteOntoImport(own-url-or-file,'RDF/XML')
-
-
-
-

-screen shot 2016 06 09 at 00 45 38 -

-
- - -
-

You can find them here on GitHub, for more detail see his blog post series.

-
- -
-
-

Developing your own Procedures and Functions

-
-

Writing your first Function

- - -
-

You can find details on writing and testing procedures in the Neo4j Manual.

-
- - - -
-

There is even an example GitHub repository with detailed documentation and comments that you can clone directly and use as a starting point.

-
- - - -
-

User-defined functions are simpler, so let’s look at one here:

-
- -
-
    -
  • -@UserFunction annotated, named Java Methods -
    -
      -
    • -default name is class package + "." + method-name -
    • -
    -
    -
  • -
  • -take `@Name’ed parameters (with optional default values) -
  • -
  • -return a single value -
  • -
  • -are read only -
  • -
  • -can use @Context injected GraphDatabaseService etc -
  • -
  • -run within Transaction of the Cypher Statement -
  • -
-
-
-
simple user defined uuid function
-
-
@UserFunction("create.uuid")
-@Description("creates an UUID (universally unique id)")
-public String uuid() {
-   return UUID.randomUUID().toString();
-}
-
-
-
-
use the function like this
-
-
CREATE (p:Person {id: create.uuid(), name:{name}})
-
-
-
-
-

Testing the Function

- - -
-

The Neo4j testing library neo4j-harness enables you to spin up a Neo4j server, provide fixtures for data setup and register your functions and procedures.

-
- - - -
-

You then call and test test the function via the bolt - neo4j-java-driver.

-
- -
-
-
@Rule
-public Neo4jRule neo4j = new Neo4jRule()
-                         .withFunction( UUIDs.class );
-...
-
-try( Driver driver = GraphDatabase.driver( neo4j.boltURI() , config ) {
-    Session session = driver.session();
-    String uuid = session.run("RETURN create.uuid() AS uuid")
-                         .single().get( 0 ).asString();
-    assertThat( uuid,....);
-}
-
-
-
-
-

Writing a Procedure

- - -
-

User defined procedures are similar:

-
- -
-
    -
  • -@Procedure annotated, Java methods -
  • -
  • -with an additional mode attribute (Read, Write, Dbms) -
  • -
  • -return a Stream of value objects (DTO) with public fields -
  • -
  • -value object fields are turned into result columns to be `YIELD`ed -
  • -
-
-
-
Expose dijkstra algoritm from the Java API to Cypher
-
-
@Procedure(mode = Write)
-@Description("apoc.algo.dijkstra(startNode, endNode, 'KNOWS', 'distance') YIELD path," +
-       " weight - run dijkstra with relationship property name as cost function")
-public Stream<WeightedPathResult> dijkstra(
-       @Name("startNode") Node startNode,
-       @Name("endNode") Node endNode,
-       @Name("type") String type,
-       @Name("costProperty") String costProperty) {
-
-
-   PathFinder<WeightedPath> algo = GraphAlgoFactory.dijkstra(
-           PathExpanders.forType(RelationshipType.withName(type)),
-           costProperty);
-   Iterable<WeightedPath> allPaths = algo.findAllPaths(startNode, endNode);
-   return Iterables.asCollection(allPaths).stream()
-           .map(WeightedPathResult::new);
-}
-
-public static class WeightedPathResult {
-   public final Path path;
-   public final double weight;
-   public WeightedPathResult(WeightedPath wp) { this.path = wp; this.weight = wp.weight(); }
-}
-
-
- - -
-

Use a build tool (like maven, gradle, ant) to package your code into a jar-file and copy that into $NEO4J_HOME/plugins -Make sure required dependencies are added as well, either to your jar or the plugins directory.

-
- -
-
-
-
- - - -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Stay Connected

-

Sign up to find out more about Neo4j's upcoming events & meetups.

-
-
-
-
-
-
- -
- -
- -
-
-
-

 

-
- - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cypher/procedures-gallery/procedures-gallery.adoc b/cypher/procedures-gallery/procedures-gallery.adoc deleted file mode 100644 index 2892b366..00000000 --- a/cypher/procedures-gallery/procedures-gallery.adoc +++ /dev/null @@ -1,401 +0,0 @@ -= Procedures & Functions Gallery -:slug: procedures-gallery -:level: Intermediate -:section: Cypher Query Language -:section-link: cypher -:apoc: https://neo4j-contrib.github.io/neo4j-apoc-procedures/ -:sectanchors: -:toc: -:toc-title: Contents -:toclevels: 1 -:author: Neo4j -:category: cypher -:tags: cypher, queries, apoc, spatial, rdf, custom-development - -.Goals -[abstract] -Our community created already a lot of useful user defined procedures and functions. This overview highlights which areas each library covers with some examples. This saves you from implementing existing ones yourself. - -.Prerequisites -[abstract] -You should know what user defined procedures and functions are and how to use them within Cypher. - -[role=expertise] -{level} - -[#apoc-library] -== Awesome Procedures on Cypher (APOC) - -With the advent of user defined procedures, many capabilities could be added to Cypher with ease. -That's how the APOC library got started, which developed into a "standard-library" for Neo4j built by the Neo4j community. - -Due to the use of internal APIs there are https://github.com/neo4j-contrib/neo4j-apoc-procedures#version-compatibility-matrix[dedicated APOC versions] for the different Neo4j versions. - -By now it contains 200+ procedures and 70+ functions. - -APOC covers much ground, here are some examples for the available functionality. - -=== Procedures - -[options="header",cols="3a,a,3m,a",subs=attributes] -|=== -| package | # of procedures | popular procedure | docs link - -| data api access -| 11 -| apoc.load.json(json-url) -| icon:book[link={apoc}#_load_json] - -| database integration -| 23 -| apoc.load.jdbc(jdbc-url,table-or-statement) -| icon:book[link={apoc}#_load_jdbc] - -| graph algorithms -| 18 -| apoc.algo.dijkstra(from,to,cost-prop) + -apoc.algo.pageRankStats({iterations:10,write:true}) -| icon:book[link={apoc}#graph_algorithms] - - -| (virtual) data creation -| 16 -| CALL apoc.create.relationship(startNode,'TYPE',{key:value,…​}, endNode) -| icon:book[link={apoc}#_creating_data] - -| transaction control -| 8 -| apoc.periodic.iterate('source-query','work-statement',{batchSize:100, parallel:true}) -| icon:book[link={apoc}#_job_management_and_periodic_execution] - -| cypher operations -| 9 -| apoc.cypher.runFile(file or url) -| icon:book[link={apoc}#_cypher_operations] - -| graph data export -| 9 -| apoc.export.cypher.query(query,file,config) -| icon:book[link={apoc}#_export_import] - -| graph generation -| 5 -| apoc.generate.ws(noNodes, degree, beta, 'label', 'TYPE') // Watts-Strogatz -| icon:book[link={apoc}#_generating_graphs] - -| meta information -| 4 -| apoc.meta.stats() -| icon:book[link={apoc}#_meta_graph] - -| time to live, node-expiry -| 1 -| CALL apoc.date.expire(node,100,'s'); -| icon:book[link={apoc}#_timetolive_ttl_expire_nodes] - -| monitoring & operations -| 6 -| apoc.monitor.tx() -| icon:book[link={apoc}#_warmup] - -| manual and schema indexes -| 17 -| apoc.index.between(node1,'TYPE',node2,'prop:value*') -| icon:book[link={apoc}#_monitoring] - - -| cypher triggers on transaction end -| 3 -| apoc.trigger.add(name, statement, selector) -| icon:book[link={apoc}#_triggers] - -| search and expand -| 5 -| apoc.path.expand(startNode, relationshipFilter, labelFilter, minDepth, maxDepth ) -| icon:book[link={apoc}#_path_expander] - -|=== - -image::http://neo4j-contrib.github.io/neo4j-apoc-procedures/img/apoc.load.json-so-result.png[width=700] - -=== Functions: - -As mentioned before, functions can compute values in any kind of expression or predicate. - -[options="header",cols="2a,a,2m"] -|=== -| package | # of functions | popular function -| date & time conversion -| 3 -| apoc.date.parse("time",["unit"],["format"]) - -| number conversion -| 3 -| apoc.number.parse("number",["format"]) - -| general type conversion -| 8 -| apoc.convert.toMap(value) - -| type information and checking -| 4 -| apoc.meta.type(value) - -| collection and map functions -| 25 -| apoc.map.fromList(["k1",v1,"k2",v2,"k3",v3]) - -| JSON conversion -| 4 -| apoc.convert.toJson(value) - -| string functions -| 7 -| apoc.text.join(["s1","s2","s3"],"delim") - -| hash functions -| 2 -| apoc.util.md5(value) - -|=== - -Learn more about APOC by reading the https://neo4j.com/?s=apoc%20blog[blog post series on APOC] or watch the https://www.youtube.com/channel/UCvze3hU6OZBkB1vkhH2lH9Q/search?query=apoc[presentations about it]. - -APOC itself comes also with a comprehensive and growing https://neo4j-contrib.github.io/neo4j-apoc-procedures/[documentation site]. - -Recently added Neo4j Browser guides make parts of that documentation available within your working environment. - -Just run: `:play http://guides.neo4j.com/apoc` within your Neo4j browser to learn interactively. - -[#apoc-spatial] -== Neo4j Spatial Procedures - -The http://github.com/neo4j-contrib/spatial[neo4j-spatial] library has been with Neo4j for a long time. - -In the past you used it with its Java or REST APIs. -Now for Neo4j 3.0 the maintainer, Craig Taverner added procedures for the APIs to integrate the spatial capabilities closely with Cypher. - -=== Spatial Procedure Overview -// TODO include from spatial docs - -Neo4j Spatial is packaged as a ZIP file that can be unzipped into the `$NEO4J_HOME/plugins` directory. -After restarting the server, you should be able to use the following *procedure calls* from Cypher. - -Below are some of the most commonly used procedures grouped by type. You can find usage examples below in the legis-graph section. - -[options="header",cols="a,4m"] -|=== -| type | procedures (spatial.*) -| general | procedures() -| layers | layer(layer),layers(), layerTypes() -| add layers | addLayer(layer, type, config), addLayerWithEncoder(), addPointLayer(layer), addWKTLayer(name, property) -| remove layers | removeLayer(layer) -| add nodes | addNode(layer,node), addNodes(layer,nodes), updateFromWKT(layer,geometry,geoNodeId) -| add geometries | addWKT(layer, geometry), addWKTs(layer,geometries) -| find / search | bbox(layer, min, max), closest(layer, coordinate, distance), intersects(layer, geometry), withinDistance(layer, coordinate, distance) -| utilities | asGeometry, asExternalGeometry, decodeGeometry, getFeatureAttributes -| import | importShapefile(uri), importShapefileToLayer(layer, uri) -|=== - -//// - -// todo auto-generate -.Available Spatial Procedures -[options="headers",cols="2*m"] -|=== -|name |signature -|spatial.addLayer |spatial.addLayer(name :: STRING?, type :: STRING?, encoderConfig :: STRING?) :: (node :: NODE?) -|spatial.addLayerWithEncoder |spatial.addLayerWithEncoder(name :: STRING?, encoder :: STRING?, encoderConfig :: STRING?) :: (node :: NODE?) -|spatial.addNode |spatial.addNode(layerName :: STRING?, node :: NODE?) :: (node :: NODE?) -|spatial.addNodes |spatial.addNodes(layerName :: STRING?, nodes :: LIST? OF NODE?) :: (node :: NODE?) -|spatial.addPointLayer |spatial.addPointLayer(name :: STRING?) :: (node :: NODE?) -|spatial.addPointLayerWithConfig|spatial.addPointLayerWithConfig(name :: STRING?, encoderConfig :: STRING?) :: (node :: NODE?) -|spatial.addPointLayerXY |spatial.addPointLayerXY(name :: STRING?, xProperty :: STRING?, yProperty :: STRING?) :: (node :: NODE?) -|spatial.addWKT |spatial.addWKT(layerName :: STRING?, geometry :: STRING?) :: (node :: NODE?) -|spatial.addWKTLayer |spatial.addWKTLayer(name :: STRING?, nodePropertyName :: STRING?) :: (node :: NODE?) -|spatial.addWKTs |spatial.addWKTs(layerName :: STRING?, geometry :: LIST? OF STRING?) :: (node :: NODE?) -|spatial.asExternalGeometry |spatial.asExternalGeometry(geometry :: ANY?) :: (geometry :: ANY?) -|spatial.asGeometry |spatial.asGeometry(geometry :: ANY?) :: (geometry :: ANY?) -|spatial.bbox |spatial.bbox(layerName :: STRING?, min :: ANY?, max :: ANY?) :: (node :: NODE?) -|spatial.closest |spatial.closest(layerName :: STRING?, coordinate :: ANY?, distanceInKm :: FLOAT?) :: (node :: NODE?) -|spatial.decodeGeometry |spatial.decodeGeometry(layerName :: STRING?, node :: NODE?) :: (geometry :: ANY?) -|spatial.getFeatureAttributes |spatial.getFeatureAttributes(name :: STRING?) :: (name :: STRING?) -|spatial.importShapefile |spatial.importShapefile(uri :: STRING?) :: (node :: NODE?) -|spatial.importShapefileToLayer |spatial.importShapefileToLayer(layerName :: STRING?, uri :: STRING?) :: (node :: NODE?) -|spatial.intersects |spatial.intersects(layerName :: STRING?, geometry :: ANY?) :: (node :: NODE?) -|spatial.layer |spatial.layer(name :: STRING?) :: (node :: NODE?) -|spatial.layerTypes |spatial.layerTypes() :: (name :: STRING?, signature :: STRING?) -|spatial.layers |spatial.layers() :: (name :: STRING?, signature :: STRING?) -|spatial.procedures |spatial.procedures() :: (name :: STRING?, signature :: STRING?) -|spatial.removeLayer |spatial.removeLayer(name :: STRING?) :: VOID -|spatial.setFeatureAttributes |spatial.setFeatureAttributes(name :: STRING?, attributeNames :: LIST? OF STRING?) :: (node :: NODE?) -|spatial.updateFromWKT |spatial.updateFromWKT(layerName :: STRING?, geometry :: STRING?, geometryNodeId :: INTEGER?) :: (node :: NODE?) -|spatial.withinDistance |spatial.withinDistance(layerName :: STRING?, coordinate :: ANY?, distanceInKm :: FLOAT?) :: (node :: NODE?, distance :: FLOAT?) -|=== - -//// - -[[legis-graph]] -=== Using Neo4j Spatial Procedures in legis-graph-spatial - -William Lyon demonstrates how to use them in the http://www.lyonwj.com/2016/08/09/neo4j-spatial-procedures-congressional-boundaries/[Legis-Graph-Spatial Blog post] with the https://github.com/legis-graph/legis-graph-spatial[code being available on GitHub] - -image::http://www.lyonwj.com/public/img/ca_san_mateo.png[width=500] - -.create a WKT layer -[source,cypher] ----- -call spatial.addWKTLayer('geom', 'wkt') ----- - -.match on all District nodes and add them to the WKT layer -[source,cypher] ----- -MATCH (d:District) -WITH collect(d) AS districts -CALL spatial.addNodes('geom', districts) YIELD node -RETURN count(*) ----- - -.Find Geometry within distance and related -[source,cypher] ----- -WITH {latitude: 37.563440, longitude: -122.322265} AS coordinate -CALL spatial.withinDistance('geom', coordinate, 1) YIELD node AS district -MATCH (district)<-[:REPRESENTS]-(legislator:Legislator) -RETURN district.state, legislator.govtrackID, legislator.lastName, l.currentParty AS party ----- - -[#apoc-rdf] -== Semantic Web (RDF / Ontology) Procedures - -Neo4j Consultant Jesus Barrasa wrote a number of procedures for importing and managing semantic web data. - - -.import RDF formats and convert them into the property graph model -[source,cypher] ----- -CALL semantics.importRDF(rdf-url-or-file,format, shorten-url-flag, batch-commit-size); ----- - -.import ontologies into Neo4j ontologies for graph generation and checking -[source,cypher] ----- -CALL semantics.LiteOntoImport(own-url-or-file,'RDF/XML') ----- - -image::https://jesusbarrasa.files.wordpress.com/2016/06/screen-shot-2016-06-09-at-00-45-38.png?w=700[] - -You can find them https://github.com/jbarrasa/neosemantics[here on GitHub], for more detail see his https://jesusbarrasa.wordpress.com/?s=procedure[blog post series]. - -[#apoc-custom] -== Developing your own Procedures and Functions - -=== Writing your first Function - -You can find details on writing and testing procedures in the link:/docs/java-reference/current/extending-neo4j/procedures-and-functions/introduction/[Neo4j Manual^]. - -There is even an https://github.com/neo4j-examples/neo4j-procedure-template[example GitHub repository] with detailed documentation and comments that you can clone directly and use as a starting point. - -User-defined functions are simpler, so let's look at one here: - -* `@UserFunction` annotated, named Java Methods -** default name is `class package + "." + method-name` -* take `@Name`'ed parameters (with optional default values) -* return a single value -* are read only -* can use `@Context` injected `GraphDatabaseService` etc -* run within Transaction of the Cypher Statement - -.simple user defined uuid function -[source,java] ----- -@UserFunction("create.uuid") -@Description("creates an UUID (universally unique id)") -public String uuid() { - return UUID.randomUUID().toString(); -} ----- - -//// -cp $GROOVY_HOME/lib/groovy-2.*.jar $NEO4J_HOME/plugins/ -$GROOVY_HOME/groovyc function.groovy && jar cf $NEO4J_HOME/plugins/uuid.jar UDF.class - - -@Grab(value="org.neo4j:neo4j:3.1.0-BETA1",initClass=false) - - -class UDF { - @UserFunction("create.uuid") - @Description("creates an UUID") - def String uuid() { UUID.randomUUID().toString() } -} -//// - - -.use the function like this -[source,cypher] ----- -CREATE (p:Person {id: create.uuid(), name:{name}}) ----- - -=== Testing the Function - -The Neo4j testing library `neo4j-harness` enables you to spin up a Neo4j server, provide fixtures for data setup and register your functions and procedures. - -You then call and test test the function via the bolt - `neo4j-java-driver`. - -[source,java] ----- -@Rule -public Neo4jRule neo4j = new Neo4jRule() - .withFunction( UUIDs.class ); -... - -try( Driver driver = GraphDatabase.driver( neo4j.boltURI() , config ) { - Session session = driver.session(); - String uuid = session.run("RETURN create.uuid() AS uuid") - .single().get( 0 ).asString(); - assertThat( uuid,....); -} ----- - -=== Writing a Procedure - -User defined procedures are similar: - -* `@Procedure` annotated, Java methods -* with an additional `mode` attribute (`Read, Write, Dbms`) -* return a `Stream` of value objects (DTO) with `public` fields -* value object fields are turned into result columns to be `YIELD`ed - -.Expose dijkstra algoritm from the Java API to Cypher -[source,java] ----- -@Procedure(mode = Write) -@Description("apoc.algo.dijkstra(startNode, endNode, 'KNOWS', 'distance') YIELD path," + - " weight - run dijkstra with relationship property name as cost function") -public Stream dijkstra( - @Name("startNode") Node startNode, - @Name("endNode") Node endNode, - @Name("type") String type, - @Name("costProperty") String costProperty) { - - - PathFinder algo = GraphAlgoFactory.dijkstra( - PathExpanders.forType(RelationshipType.withName(type)), - costProperty); - Iterable allPaths = algo.findAllPaths(startNode, endNode); - return Iterables.asCollection(allPaths).stream() - .map(WeightedPathResult::new); -} - -public static class WeightedPathResult { - public final Path path; - public final double weight; - public WeightedPathResult(WeightedPath wp) { this.path = wp; this.weight = wp.weight(); } -} ----- - -Use a build tool (like maven, gradle, ant) to package your code into a jar-file and copy that into `$NEO4J_HOME/plugins` -Make sure required dependencies are added as well, either to your jar or the plugins directory. diff --git a/data-import/example-data/movie-database/data_modeling_movies_actors.png b/data-import/example-data/movie-database/data_modeling_movies_actors.png deleted file mode 100644 index 37242f1da92871b740cd0728a9db3628e45dfa1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39198 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 j6l#SE{vX^mAmE--`nPPgEW`c}LE$ZM diff --git a/data-import/example-data/movie-database/import-movies.rb b/data-import/example-data/movie-database/import-movies.rb deleted file mode 100644 index c1b10a86..00000000 --- a/data-import/example-data/movie-database/import-movies.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'rubygems' -require 'rest-client' -require 'json' - -URL = "http://api.themoviedb.org/3" -# get the api key at https://www.themoviedb.org/faq/api and set it as environment variable -KEY = ENV['THE_MOVIE_DB_KEY'] - - -puts setup -puts "BEGIN" -[19995 , 194, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 13, 20526, 11, 1893, 1892, - 1894, 168, 193, 200, 157, 152, 201, 154, 12155, 58, 285, 118, 22, 392, 5255, 568, 9800, 497, 101, 120, 121, 122].each do |id| - puts create_movie(movie(id)) -end -puts "COMMIT" - -def get(type,id) - url = "#{URL}/#{type}/#{id}?api_key=#{KEY}&append_to_response=casts" - res = RestClient.get url - File.open("json/#{id}.json", 'w') {|f| f.write(res.to_str) } - JSON.parse(res.to_str) -end - -def person(id) - get("person",id) -end - -def clean(name) - name.to_s.gsub(/['"]/,"") -end -def movie(id) - parse_movie(get("movie",id),id) -end - -def parse_movie(res,id) -# puts res.inspect - movie = [:tagline,:released,:genres].reduce({:movie_id => id}) { |r, prop| r[prop] = res[prop.to_s] if res[prop.to_s] && res[prop.to_s].length>0; r } - movie[:title] = res["title"] - movie[:genres] = movie[:genres].collect { |g| g["name"] } - movie[:actors] = res["casts"]["cast"].collect { |g| { :id => g["id"], :name => clean(g["name"]) , :role => clean(g["character"]) }} - movie[:directors] = res["casts"]["crew"].find_all {|a| a["job"]=="Director" } .collect { |g| { :id => g["id"], :name => clean(g["name"]) }} - movie -end - -def setup - ["CREATE INDEX ON :Movie(title)", - "CREATE INDEX ON :Movie(movie_id)", - "CREATE INDEX ON :Person(id)", - "CREATE INDEX ON :Person(name)", - "CREATE INDEX ON :Genre(genre)",""].join(";\n") -end - -# node auto-index for movie_id, id, name, title, genre, type -def create_movie(movie) - props=[:movie_id, :title,:tagline,:released].find_all{ |p| movie[p] }.collect { |p| "#{p}:'#{clean(movie[p])}'" }.join(', ') - actors = movie[:actors].collect { |a| "CREATE UNIQUE (movie)<-[:ACTS_IN {role:'#{clean(a[:role])}'}]-(:Person:Actor {id:'#{a[:id]}', name: '#{a[:name]}'})-[:PERSON]->(people) "}.join(" \n") + "\n" - directors = movie[:directors].collect { |a| "CREATE UNIQUE (movie)<-[:DIRECTED]-(:Person:Director {id:'#{a[:id]}', name:'#{a[:name]}'})-[:PERSON]->(people) "}.join(" \n") + "\n" - genres = movie[:genres].collect { |g| "CREATE UNIQUE (movie)-[:GENRE]->(:Genre {genre:'#{g}'})-[:GENRE]->(genres) "}.join(" \n") + "\n" - " MERGE (genres:Genres) - MERGE (movies:Movies) - MERGE (people:People) - CREATE (movie:Movie {#{props}}) - " + genres + actors + directors + ";" -end diff --git a/data-import/example-data/movie-database/index.html b/data-import/example-data/movie-database/index.html deleted file mode 100644 index 7cbb5723..00000000 --- a/data-import/example-data/movie-database/index.html +++ /dev/null @@ -1,1486 +0,0 @@ - - - - - - - - - - - - What is a Graph Database? A Property Graph Model Intro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
-
-

Dataset: Movie Database

-
-
-
-
-

lead text

-
-
- - - - -
-
-
-
-
-
-
Goals
-
-There’s lots of example datasets for Neo4j. -This guide outlines some of them. -
-
-
-
Prerequisites
-
-You should be comfortable installing and importing data into Neo4j. -
-
- - -
Intermediate
-
- - -
-
-
-
-

The Dataset

- - -
-

The movie database is a traditional dataset for graph databases, similiar to IMDB it contains movies and actors, directors, producers etc. -It could be extended with Genres, Publishers, Ratings and more.

-
- -
- - - - - -
- - -You find a similar, but smaller dataset in the Neo4j-Browser of your Neo4j installation by entering :play movie graph in the commandline. -
-
- - -
-

This dataset was sourced from link:TheMovieDB.org. -Thanks so much to them for allowing us to use it for educational purposes. -It was originally used for the Spring Data Neo4j tutorial project Cineasts.

-
- - - -
-

The data model is straightforward:

-
- -
-
    -
  • -(:Movie {title, released, …​ }) -
  • -
  • -(:Person {name, born, …​}) -
  • -
  • -(:Person)-[:ACTED_IN|:DIRECTED|:PRODUCED]→(:Movie) -
  • -
-
-
-

-data modeling movies actors -

-
-
-
-

Download

- - -
-

The dataset consists of 12862 movies, and 50179 people (44943 actors, 6037 directors).

-
- -
- - - - - -
- - -Make sure to download the correct version of the dataset for your Neo4j installation. -
-
-
- -
- - -
-

Unzip the dataset after the download and move the graph.db folder to your /path/to/neo4j/data directory and override the graph.db folder that was previously there.

-
- - - -
-

Installation in Detail:

-
- -
-
    -
  • -Stop your Neo4j server with bin/neo4j stop or your control app -
  • -
  • -Unzip the downloaded file -
  • -
  • -Override graph.db in /path/to/neo/data -
  • -
  • -Start the server again with bin/neo4j start -
  • -
  • -Open the Neo4j Web Interface on http://localhost:7474 -
  • -
  • -Read about the Cypher Query Language -
  • -
  • -Follow the source links for some example Cypher queries -
  • -
-
- - -
-

You can also point the neo4j-shell to the extracted directory to run Cypher queries directly:

-
- -
-
-
/path/to/neo/bin/neo4j-shell -path /path/to/graph.db
-
-
-
-
-

Example Queries

-
-
Actors who played in some movie
-
-
MATCH (m:Movie {title: 'Forrest Gump'})<-[:ACTS_IN]-(a:Actor)
-RETURN a.name, a.birthplace
-
-
-
-
Find the most prolific actors
-
-
MATCH (a:Actor)-[:ACTS_IN]->(m:Movie)
-RETURN a, count(*)
-ORDER BY count(*) DESC LIMIT 10;
-
-
-
-
Find actors who have been in less than 3 movies
-
-
MATCH (a:Actor)-[:ACTS_IN]->(m:Movie)
-WITH a, count(m) AS movie_count
-WHERE movie_count < 3
-RETURN a, movie_count
-ORDER BY movie_count DESC LIMIT 5;
-
-
-
-
Find the actors with 20+ movies, and the movies in which they acted
-
-
MATCH (a:Actor)-[:ACTS_IN]->(m:Movie)
-WITH a, collect(m.title) AS movies
-WHERE length(movies) >= 20
-RETURN a, movies
-ORDER BY length(movies) DESC LIMIT 10;
-
-
-
-
Find prolific actors (10+) who have directed at least two films, count films acted in and list films directed
-
-
MATCH (a:Actor)-[:ACTS_IN]->(m:Movie)
-WITH a, count(m) AS acted
-WHERE acted >= 10
-WITH a, acted
-MATCH (a:Director)-[:DIRECTED]->(m:Movie)
-WITH a, acted, collect(m.title) AS directed
-WHERE length(directed) >= 2
-RETURN a.name, acted, directed
-ORDER BY length(directed) DESC, acted DESC;
-
-
-
-
Rewritten to filter both :Actor and :Director labels up front
-
-
MATCH (a:Actor:Director)-[:ACTS_IN]->(m:Movie)
-WITH a, count(1) AS acted
-WHERE acted >= 10
-WITH a, acted
-MATCH (a:Actor:Director)-[:DIRECTED]->(m:Movie)
-WITH a, acted, collect(m.title) AS directed
-WHERE length(directed) >= 2
-RETURN a.name, acted, directed
-ORDER BY length(directed) DESC, acted DESC;
-
-
-
-
Using the lowest cardinality label, :Director
-
-
MATCH (a:Director)-[:ACTS_IN]->(m)
-WITH a, count(m) AS acted
-WHERE acted >= 10
-WITH a, acted
-MATCH (a)-[:DIRECTED]->(m)
-WITH a, acted, collect(m.title) AS directed
-WHERE length(directed) >= 2
-RETURN a.name, acted, directed
-ORDER BY length(directed) DESC, acted DESC;
-
-
-
-
User-Ratings
-
-
MATCH (u:User {login: 'Michael'})-[r:RATED]->(m:Movie)
-WHERE r.stars > 3
-RETURN m.title, r.stars, r.comment
-
-
-
-
Recommendations including counts, grouping and sorting
-
-
MATCH (u:User {login: 'Michael'})-[:FRIEND]-()-[r:RATED]->(m:Movie)
-RETURN m.title, avg(r.stars), count(*)
-ORDER BY AVG(r.stars) DESC, count(*) DESC
-
-
-
-
Ratings by like-minded people
-
-
MATCH (u:User)-[r:RATED]->(m:Movie)<-[r2:RATED]-(likeminded),
-      (u)-[:FRIEND]-(friend)
-WHERE r.stars > 3 AND r2.stars >= 3
-RETURN likeminded, count(*)
-ORDER BY count(*) desc LIMIT 10;
-
-
-
-
Mutual Friend recommendations
-
-
MATCH (u:User {login: 'Michael'})-[:FRIEND]-(f:Person)-[r:RATED]->(m:Movie)
-WHERE r.stars > 3
-RETURN f.name, m.title, r.stars, r.comment
-
-
-
-
-

Import Instructions

- - -
-

TheMovieDB.org offers a JSON API to access, movies, and their cast.

-
- - - -
-

We use that API with a ruby script to turn each movie-json object into a cypher statement. -Make sure to get an API-Key upfront.

-
- -
-
-
require 'rubygems'
-require 'rest-client'
-require 'json'
-
-URL = "http://api.themoviedb.org/3"
-# get the api key at https://www.themoviedb.org/faq/api and set it as environment variable
-KEY = ENV['THE_MOVIE_DB_KEY']
-
-
-puts setup
-puts "BEGIN"
-[19995 , 194, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 13, 20526, 11, 1893, 1892,
- 1894, 168, 193, 200, 157, 152, 201, 154, 12155, 58, 285, 118, 22, 392, 5255, 568, 9800, 497, 101, 120, 121, 122].each do |id|
- puts create_movie(movie(id))
-end
-puts "COMMIT"
-
-def get(type,id)
-  url = "#{URL}/#{type}/#{id}?api_key=#{KEY}&append_to_response=casts"
-  res = RestClient.get url
-  File.open("json/#{id}.json", 'w') {|f| f.write(res.to_str) }
-  JSON.parse(res.to_str)
-end
-
-def person(id)
-  get("person",id)
-end
-
-def clean(name)
-  name.to_s.gsub(/['"]/,"")
-end
-def movie(id)
-  parse_movie(get("movie",id),id)
-end
-
-def parse_movie(res,id)
-#  puts res.inspect
-  movie = [:tagline,:released,:genres].reduce({:movie_id => id}) { |r, prop| r[prop] = res[prop.to_s] if res[prop.to_s] && res[prop.to_s].length>0; r }
-  movie[:title] = res["title"]
-  movie[:genres] = movie[:genres].collect { |g| g["name"] }
-  movie[:actors] = res["casts"]["cast"].collect { |g| { :id => g["id"], :name => clean(g["name"]) , :role => clean(g["character"]) }}
-  movie[:directors] = res["casts"]["crew"].find_all {|a| a["job"]=="Director" } .collect { |g| { :id => g["id"], :name => clean(g["name"]) }}
-  movie
-end
-
-def setup
-  ["CREATE INDEX ON :Movie(title)",
-  "CREATE INDEX ON :Movie(movie_id)",
-  "CREATE INDEX ON :Person(id)",
-  "CREATE INDEX ON :Person(name)",
-  "CREATE INDEX ON :Genre(genre)",""].join(";\n")
-end
-
-# node auto-index for movie_id, id, name, title, genre, type
-def create_movie(movie)
-  props=[:movie_id, :title,:tagline,:released].find_all{ |p| movie[p] }.collect { |p| "#{p}:'#{clean(movie[p])}'" }.join(', ')
-  actors = movie[:actors].collect { |a| "CREATE UNIQUE (movie)<-[:ACTS_IN {role:'#{clean(a[:role])}'}]-(:Person:Actor {id:'#{a[:id]}', name: '#{a[:name]}'})-[:PERSON]->(people) "}.join(" \n") + "\n"
-  directors = movie[:directors].collect { |a| "CREATE UNIQUE (movie)<-[:DIRECTED]-(:Person:Director {id:'#{a[:id]}', name:'#{a[:name]}'})-[:PERSON]->(people) "}.join(" \n") + "\n"
-  genres = movie[:genres].collect { |g| "CREATE UNIQUE (movie)-[:GENRE]->(:Genre {genre:'#{g}'})-[:GENRE]->(genres) "}.join(" \n") + "\n"
-  " MERGE (genres:Genres)
-    MERGE (movies:Movies)
-    MERGE (people:People)
-    CREATE (movie:Movie {#{props}})
-   " + genres + actors + directors + ";"
-end
-
-
- - -
-

It outputs the Cypher statements on stdout and can be piped to the neo4j-shell or a file, which then can be read by the neo4j-shell.

-
- -
-
-
- - - -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Stay Connected

-

Sign up to find out more about Neo4j's upcoming events & meetups.

-
-
-
-
-
-
- -
- -
- -
-
-
-

 

-
- - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/data-import/example-data/movie-database/movie-database-queries.txt b/data-import/example-data/movie-database/movie-database-queries.txt deleted file mode 100644 index c5f575c9..00000000 --- a/data-import/example-data/movie-database/movie-database-queries.txt +++ /dev/null @@ -1,120 +0,0 @@ -.Actors who played in some movie -[source,cypher] ----- -MATCH (m:Movie {title: 'Forrest Gump'})<-[:ACTS_IN]-(a:Actor) -RETURN a.name, a.birthplace ----- -//table - -.Find the most prolific actors -[source,cypher] ----- -MATCH (a:Actor)-[:ACTS_IN]->(m:Movie) -RETURN a, count(*) -ORDER BY count(*) DESC LIMIT 10; ----- -//table - -.Find actors who have been in less than 3 movies -[source,cypher] ----- -MATCH (a:Actor)-[:ACTS_IN]->(m:Movie) -WITH a, count(m) AS movie_count -WHERE movie_count < 3 -RETURN a, movie_count -ORDER BY movie_count DESC LIMIT 5; ----- -//table - -.Find the actors with 20+ movies, and the movies in which they acted -[source,cypher] ----- -MATCH (a:Actor)-[:ACTS_IN]->(m:Movie) -WITH a, collect(m.title) AS movies -WHERE length(movies) >= 20 -RETURN a, movies -ORDER BY length(movies) DESC LIMIT 10; ----- -//table - -.Find prolific actors (10+) who have directed at least two films, count films acted in and list films directed -[source,cypher] ----- -MATCH (a:Actor)-[:ACTS_IN]->(m:Movie) -WITH a, count(m) AS acted -WHERE acted >= 10 -WITH a, acted -MATCH (a:Director)-[:DIRECTED]->(m:Movie) -WITH a, acted, collect(m.title) AS directed -WHERE length(directed) >= 2 -RETURN a.name, acted, directed -ORDER BY length(directed) DESC, acted DESC; ----- -//table - -.Rewritten to filter both :Actor and :Director labels up front -[source,cypher] ----- -MATCH (a:Actor:Director)-[:ACTS_IN]->(m:Movie) -WITH a, count(1) AS acted -WHERE acted >= 10 -WITH a, acted -MATCH (a:Actor:Director)-[:DIRECTED]->(m:Movie) -WITH a, acted, collect(m.title) AS directed -WHERE length(directed) >= 2 -RETURN a.name, acted, directed -ORDER BY length(directed) DESC, acted DESC; ----- -//table - -.Using the lowest cardinality label, :Director -[source,cypher] ----- -MATCH (a:Director)-[:ACTS_IN]->(m) -WITH a, count(m) AS acted -WHERE acted >= 10 -WITH a, acted -MATCH (a)-[:DIRECTED]->(m) -WITH a, acted, collect(m.title) AS directed -WHERE length(directed) >= 2 -RETURN a.name, acted, directed -ORDER BY length(directed) DESC, acted DESC; ----- - -.User-Ratings -[source,cypher] ----- -MATCH (u:User {login: 'Michael'})-[r:RATED]->(m:Movie) -WHERE r.stars > 3 -RETURN m.title, r.stars, r.comment ----- -//table - -.Recommendations including counts, grouping and sorting -[source,cypher] ----- -MATCH (u:User {login: 'Michael'})-[:FRIEND]-()-[r:RATED]->(m:Movie) -RETURN m.title, avg(r.stars), count(*) -ORDER BY AVG(r.stars) DESC, count(*) DESC ----- -//table - -.Ratings by like-minded people -[source,cypher] ----- -MATCH (u:User)-[r:RATED]->(m:Movie)<-[r2:RATED]-(likeminded), - (u)-[:FRIEND]-(friend) -WHERE r.stars > 3 AND r2.stars >= 3 -RETURN likeminded, count(*) -ORDER BY count(*) desc LIMIT 10; ----- -//table - -.Mutual Friend recommendations -[source,cypher] ----- -MATCH (u:User {login: 'Michael'})-[:FRIEND]-(f:Person)-[r:RATED]->(m:Movie) -WHERE r.stars > 3 -RETURN f.name, m.title, r.stars, r.comment ----- -//table diff --git a/data-import/example-data/movie-database/movie-database.adoc b/data-import/example-data/movie-database/movie-database.adoc deleted file mode 100644 index 3efb7f80..00000000 --- a/data-import/example-data/movie-database/movie-database.adoc +++ /dev/null @@ -1,91 +0,0 @@ -= Dataset: Movie Database -//:slug: movie-database -:level: Intermediate -:toc: -:toc-placement!: -:toc-title: Overview -:toclevels: 1 -:section: Data Import -:section-link: example-data -:author: Michael Hunger -:category: import-export -:tags: graph-data, data-sets, import-data, graph-examples, app-development - -.Goals -[abstract] -There's lots of example datasets for Neo4j. -This guide outlines some of them. - -.Prerequisites -[abstract] -You should be comfortable installing and importing data into Neo4j. - -[role=expertise] -{level} - -== The Dataset - -The movie database is a traditional dataset for graph databases, similiar to IMDB it contains movies and actors, directors, producers etc. -It could be extended with Genres, Publishers, Ratings and more. - -[NOTE] -You find a similar, but smaller dataset in the Neo4j-Browser of your Neo4j installation by entering `:play movie graph` in the commandline. - -This dataset was sourced from link:TheMovieDB.org. -Thanks so much to them for allowing us to use it for educational purposes. -It was originally used for the link:/developer/language-guides/spring-data-neo4j[Spring Data Neo4j] tutorial project Cineasts. - -The data model is straightforward: - -* (:Movie {title, released, ... }) -* (:Person {name, born, ...}) -* (:Person)-[:ACTED_IN|:DIRECTED|:PRODUCED]->(:Movie) - -image::{img}/data_modeling_movies_actors.png[] - -=== Download - -The dataset consists of 12862 movies, and 50179 people (44943 actors, 6037 directors). - -[NOTE] -Make sure to download the correct version of the dataset for your Neo4j installation. - -* http://example-data.neo4j.org/files/cineasts_12k_movies_50k_actors_2.1.6.zip[Download for Neo4j 2.1 (12.3 MB)] -* Download for Neo4j 2.2 -* Download for Neo4j 2.3 - -Unzip the dataset after the download and move the `graph.db` folder to your `/path/to/neo4j/data` directory and override the `graph.db` folder that was previously there. - -Installation in Detail: - -* Stop your Neo4j server with `bin/neo4j stop` or your control app -* Unzip the downloaded file -* Override `graph.db` in `/path/to/neo/data` -* Start the server again with `bin/neo4j start` -* Open the Neo4j Web Interface on http://localhost:7474 -* Read about the Cypher Query Language -* Follow the source links for some example Cypher queries - -You can also point the neo4j-shell to the extracted directory to run Cypher queries directly: -[source, shell] ----- -/path/to/neo/bin/neo4j-shell -path /path/to/graph.db ----- - -=== Example Queries - -include::movie-database-queries.txt[] - -=== Import Instructions - -http://themoviedb.org[TheMovieDB.org] offers a JSON API to access, movies, and their cast. - -We use that API with a ruby script to turn each movie-json object into a cypher statement. -Make sure to get an https://www.themoviedb.org/faq/api[API-Key] upfront. - -[source,ruby] ----- -include::import-movies.rb[] ----- - -It outputs the Cypher statements on stdout and can be piped to the neo4j-shell or a file, which then can be read by the neo4j-shell. diff --git a/data-modeling/guide-data-modeling/guide-data-modeling.adoc b/data-modeling/guide-data-modeling/guide-data-modeling.adoc index 44c7c8b5..5dbafbec 100644 --- a/data-modeling/guide-data-modeling/guide-data-modeling.adoc +++ b/data-modeling/guide-data-modeling/guide-data-modeling.adoc @@ -241,6 +241,6 @@ A walkthrough of designs for different use cases is in our link:/developer/model [#modeling-resources] == Resources -* https://neo4j.com/blog/data-modeling-basics/[Blog post: Graph Data Modeling Basics^] -* http://neo4j.com/graphgists/[GraphGists: Graph Model Examples^] -* https://neo4j.com/blog/data-modeling-pitfalls/[Blog post: Data Modeling Pitfalls to Avoid^] +* link:/blog/data-modeling-basics/[Blog post: Graph Data Modeling Basics^] +* link:/graphgists/[GraphGists: Graph Model Examples^] +* link:/blog/data-modeling-pitfalls/[Blog post: Data Modeling Pitfalls to Avoid^] diff --git a/data-modeling/modeling-designs/modeling-designs.adoc b/data-modeling/modeling-designs/modeling-designs.adoc index 6ee49810..1f2011b7 100644 --- a/data-modeling/modeling-designs/modeling-designs.adoc +++ b/data-modeling/modeling-designs/modeling-designs.adoc @@ -203,8 +203,10 @@ If so, being able to use more than one data model is a great solution! [#modeling-resources] == Resources +* https://medium.com/neo4j/graph-data-modeling-all-about-relationships-5060e46820ce[Blog post: Modeling relationships^] * https://maxdemarzi.com/2015/08/26/modeling-airline-flights-in-neo4j/[Max's blog post: Modeling airline flights^] * https://maxdemarzi.com/2017/05/24/flight-search-with-neo4j/[Follow-up blog post: Flight search^] +* https://medium.com/neo4j/graph-data-modeling-categorical-variables-dd8a2845d5e0[Blog post: Modeling data categories^] * https://maxdemarzi.com/2017/11/21/mutual-fund-benchmarks-with-neo4j/[Blog post: Modeling mutual funds^] * https://maxdemarzi.com/2018/07/11/building-a-dating-site-with-neo4j-part-one/[Blog post series: Building a Dating Site^] * https://maxdemarzi.com/2017/03/30/building-a-twitter-clone-with-neo4j-part-one/[Blog series: Building a Twitter Clone^] diff --git a/get-started/get_started_neo4j.svg b/get-started/get_started_neo4j.svg index 0e9dca1b..00073cad 100644 --- a/get-started/get_started_neo4j.svg +++ b/get-started/get_started_neo4j.svg @@ -187,14 +187,14 @@ Dev Tools - + Tools - + diff --git a/graph-platform/neo4j-database/neo4j-database.adoc b/graph-platform/neo4j-database/neo4j-database.adoc index 1c79991a..61b9fe2f 100644 --- a/graph-platform/neo4j-database/neo4j-database.adoc +++ b/graph-platform/neo4j-database/neo4j-database.adoc @@ -108,6 +108,10 @@ https://github.com/neo4j/neo4j/wiki/Neo4j-4.1-changelog[4.1 Changelog^] + https://www.youtube.com/playlist?list=PL9Hl4pk2FsvV__9u8fho4oVpP1DvJAZhm[YouTube playlist: 4.1 Features presented by the engineers who built them^] + https://youtu.be/of53lUFs5hc[Video: 4.1 Whirlwind Tour with Michael Hunger^] +++++ + +++++ + === Neo4j 4.0 (January 2020) Official documentation - diff --git a/guide-cloud-deployment/neo4j-cloud-hosting-providers/graphenedb.png b/guide-cloud-deployment/neo4j-cloud-hosting-providers/graphenedb.png deleted file mode 100644 index eebe60d5969c759e4f63e614e0e68b5b19d3850a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97168 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

%w<| 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

}I@bTc;dltb;UOI7BAuaCW5e}Rl z%pZpWC0eFc=M29bI>qDZ1K`w{u_x}xWGIrdhpL-sl|MX_jXh80u=H~@lrtwD@#IL3 zU}9N9{8k^yHzs1Xit#JG_PkP_ceCU*CwT>PG|-R;fSnoNm#KcAqO^{q)D%faBN`1l zr7@MW55P`UlwXb=^1J$oT_Lk&n`J29vVO zJPGi6l@uulN<5i9_9jspppSPBDP1os*5fFEDDOz%oiCBk@*M4qE(pAUEAv$xZ%ze6 zqTlF*Lh@Q%RwY@@B%uPLIEQB;YT;Lf9P#yyHz% z{P5i!{_*!N?wCHr)|ZX?o+hLDgLM+Tv~G=TcXI#jFA}3u7nHXd~m-xS}G1baRfI? zbm!=aojOU|19H%k^~5>ds3M?vs7;XZ=IvrxX{3H-v7Ithtn_tciPd|tneGB(DoY0D*ew;bDBy6AX(-vEnXE9Sx>=v0&_NM@f|EB(4y`{JYP1 z{PQ2&#e41@;h+8B65jSYkN@?L$M}=KBdqQxnbR#Ok^15&UAt$DlM_x#_y@&Jyd8(% zCFV$hqcD~PG{WWg`f)a9b(JAj+Ty_1-I)V_L`UciWyV3nm~=nI-4pzYZO%eO@r|_7>ot4;96P!M z36h*kQ1X~2r^4}YCtBujI{?9DT`obPQ;tH)q;ST@xin>*=;A$+!<});ACZgaCqy+9 z;F43}$icfHFftB;FAqcDj3i>ei~~7z&S`6)?Xq?dfRamK$`zc|rGMOj{oAF#`d_F1 zjm%$v!;xdJy7A^)-^E{M>rzC-UT?<>Onitb7D>5;bZ~`QXP{C&1S-zo&K^{d`CoEr z-iEz;l_u&shm9S=n{W5{jsM2sHMcta#Um5^&;OUl|NXfUE^j%kECno&qNln%B3!sa z`0GaqUwF!6d3lPvU)|wdZ|bmi+2hO404tqdAXcuH)sbh+E~SBY9r!GA>YPd`=IAlc zCC72g+r>DA7^60)Xq7*2ozlsi=H?acDqYp_z0ZpU3%aXAeB>C@pcaHVGoEUUoQi;n zAdyL6p<#SIrx10&`MBUX*H+G@<^@%pLe%4{Xhm@=DVSCUf7dau=KKCop1dmzZmDZeiVx_s~%*DI6Ss4}?>-j+7!xZK=#cDI4XO$-z4z=>k{h4Psh>)4aUk z6PY(uz~G88OY`0Q5hIo>?-ie^4344|k`5weP@Lf_-iC^Rf>)%iLKmn^Xje{6xT0Sa zSsJYiv@B$Ntt^y!q_cHNO;e@A-gv!I=d2E*f>&7gg+ylpX84RhqL-(gQ@?7e(P^Co zN{78gIxj6P<;-Z}GY6ngwCgy_nCPAY@tDB@p-WMEo_fm}*)&8&TA%rf@A-?Zk(S6? zW!X_t3oQ}S`Xu2Ek3MA@9PwdTD8>ZHyR~|i`4)UBIYe67eL4dwlB6JNShMI{fmFIz0Dsz?YvRtnQD|li(I~zuBn~#I*PBc~PI5 zpG!EAgtJsc|D1lx{jhf~2ut)To^yJiqZ^J~h`~UPA0dMlznK#9XoGTJdJK3hb;d&Q z)nlodK|N=Dq44F%O+`8~=ZuVWjxclGVu6*-xPV~{sb2+%ybl>C@Q`sD(7wy}1cg7* z%(zIZ5+zJAQJr~1NSh+1km_rEOS&^01Q5$Y;$t%Ss(Yd|t;79FHX!p=U?7X}4l>@% zS2E0j$*9LAT@od0+EEVRL!ynwhjCP8i}6nIv228Z@^B?HMv$gdjzLA3ag4bx6~Cn{ z>H9ps1wN#VBIPVf{t@ZH;;c2QPAJXPW%`Dcd8AD9M3SOzK`Y8QQ9(#5bx`Vxvp}Ti z%np*&O*}==bxU0UMR(z=5Hk@(QO`desR z^G}zxR{(OxfD1cyZ!-&|$}g+u`k!AtdhFzpn{IxWoiEdKj|51x#NMT&yjZ7<%GDt+ zNz+QC#U7$CIb>z6{`4jQZ0>mc_y5%6RmXvU{b7gCex<|ee!{+eISb)jj*fx6&Y*KW zmPZbcK0m^rp6zkhs{{Vg>w*90%MlI=p^WH3*d33tvAKn)W*&Zm77bJsa*K_b%3B3r8j|S&^n{{%XO2s1A<&?PI(#nheg74$}s9HHLaD)^s zNu=phW`QI6w1`({KLX^?G3Y2&7B#vO|Fo+lNCcF}jGz`+`4~a5oNg6!}!^P?W$8-WuR&A@lwX>^H;xke>-9mZD<|r=bVSk@JPHyuM*i36>-6G zSjOXMtTilTTi`K*`B%Ud#dZC=@V-roa1y*mVa#OR)4~ct^9Pie|Eb{<_oa6uE&u=^ z07*naR8NeZIsv~YBUlbn1j|8&`K<_Zga-0an6DJ25c(V3Z}Sp~g#nw;NV4YR0~MrA z86pD* zg|nXE^hHb|c=;=((A{QmdMd{M{6~ZT^h&(Ta%G@4E9*tP|)z2RCk(AVeYp`p_cKnY&{R@nr zK7*axx8nBK-h>k;hw+&&-itThc`Ghky9UNul#&F~Gc)+q=f8}#J!80P-7JiC8}pM# z+ws(~HY5?yUN(6Bj!|@1GepYZ=;<=PwXYMY)rhtApmOFos}y@62P=$W2R9Hi_Mu3U zh@=!xT5Pc3(1x0Ul3_7k2}e9IP6}s2U!BjVK^lQ&>y{BIx|LGQKw(ImFf^###smaL z7KCX}Ga8|7sZ9`VNLnCxFpm1RtPewu964HVIZ^;K>U>f%fb5=R)>Yn)VEwvSjd0xO zVPlxiJgmgARd;(E+Nx#D%+@h7HXejsVTG~QBFzlSag5B*k2dN`se~*`y@{9Fr6Uf% zVftthPKHLI!yx6r3I{R8nHfo|4o8|`ComGW6sf-!?AdR~5m71B8VxZIpsiYF9JNZo zSO|$eGVgmZ4NCvA_<1Lv)KyoaD63yq^Vx;KZkMYo-wPjbOb} z{&)B_w4UdZ*`C|-cuLcc{2pTfLEGN4plSc{);p?88?~px;CM>@bA?R0e#}Am2=u~p zfRE~7;j*x|f#@vIzVQNrqen4jqF3d}S9yWS3(|oB`lUfAtptJjtO-<7V(@x8waE{ylv0%lF}}ci)Ab+qdLa;0&N@bN$Y zYi!=I9zXrgx8d=pcH?h8cMsnA);D0&;AH@SW}4#E*f>79dAYNvZZ+6 zul+~#uk6FW`iZyW(2-;Ki@*5{-gMU;xaO)Iu3oc=>6ux4=H72%%gRG|@9V};Z)%hi zgUkS*c%T>m?}IC_sI88lxOx=JyP7y#i?F04#Xmg02*3a3epttK{rU<^5y+pzvgfhH z740`YGA@NMq`~r zl8$sP@d`zINOB1|8G;6HXbzlq)@u`)@K^D4WI_1t1OuI`Ygu^7I1OzGL$%7`7e%0e zwWDB3;E+FV3mpC7QZ`c(CT9)Eyw6E$4OT2&j5pnW6ONo1LRUuz(k#Ol@B1dEXKILJ z2fIe2fi){vU~pg+{^`4qLcs~hsWFHYaNG5}@aXQnI59j1trW_o1dV2jNNY6HCQ79e z(kw%y6q?Nx)k+!lG=&0?rWq=gGMZ@<3JPhOp}oE8{R$`~PHN#H)w_X3M4`0Iz{UDH zW`R3zz8;GgbtBC(?0fzYp4`0;r6fV4*+d*gh@%*(Ns%OptDB}!N~4iB{bmYm8XUms zvlBQqdK!&p6H%m4sZ?N6gJ#-bdfzk@iM$=geONqlDYuEzQXf#kMmr+U*WOR8Q zYtqIi<#Ks#tffsL|qt%H>k9&?rH#2FyoInz1mal(Y6&rhNd$_(W*|2c6aqq?ypH zHQ~3*17dPQrLa&bh4;3KMrq-w!%4w%tSz#LuMG6 zwFb^kSxnU;Z0yshB$S)oG2=MW_h=u z2>|%!cOSwnZ~jRzlT!d3qujhCuT3wLhbIC}&nU`YbWnI!HoGC90cm`lj?7px{NSu^RgPdh8<0#c7C&%E_ z7}0TACh*$|M?K~BbfN{Czw9@qBxONUVFy9aK=MwyL<eiL4I&6Utmgi5)D+poVG@4Wjq3=XUU0Ni%NF1+cE zn{eZ<9Z2FB*Iuy|Z@TR!+;Z)eFxFz{<_&o3owwk+E4M)_h3j`*jhi7VU$Fws zEJa6q8(R&^k za)O!JS@bSnf~$9I>fTASl!eK9qsg?BrkNM`H0q58X6p@*!%s8y^|KUdmZ6zu zPAG_+&@x+VV76An!0JA1T)!4)CZ>?Yv47uSV0Aw>4X(w;%hq7$_RWZ+2#sa~NfM*h zXn3K+;ajcNMC$LY0f4FLS!~%bfJI&Hn4YOaD<>Re#yHCl5NOfIQ;EI0_^i(HyG1yv z;CJS`J+fGe)`V74NO;)-6v7A!0rKWqGXLhZMb3r=uTA+bjfJs}NP{K8dnHqxNF@A~n#;9Wod zR($7skKo_@(tm*BNdtG^c`L5F`YPXtm&Sd=Z@>F4yzTD0@YFMV@GpPi1J1&ufXUei z&z`K}Z@;$`H*K82rWLa|I8w%JBf{mYXYh%C^BnpXHSoxx4xF8dykn0F=4urja&lHC zp*@pEp9@1|3svy;&S@fm^Bv)~f=SZ)4V*p6g(gCNGnUP@UZW>0_ujg>wBmjo6r)Y1 zUW%095UI?D#95YTA$UjA8q#G~Icl_)&7xtIjbZcZD^%=jAY@+ z(#+9S6f6nuN9188)`*S`9O=0BI;s^+PR-)Uy$7(izYonc!=Ym*vAS3_ow;zVd4E7#8f?KZHfo7WG zhFzEA{_i}3YPpQ(FR6aQltd;n30Jn3|r! z+SM!Z&NtqLN1xh*AG`YweD2<_Vf@SlO67#3C;;RljzW?-V)nuJ#d_7eJh6K((##-=BHVcOPIPy5V(-C2n3|r!_RWLHvJ?+L@hp}v>A{NL zrAX5hk3GE?S6#jtr6k4^yZ57a*%B=3?7(cj4r?v0+P)b*i@Gp2eg$FP0VdL(g#L&r|wmO7f@JD4 zCW^GRguImUmo!>Fr*#@0;O`rU(Apx}n3Z>sqYPvg#$?F6HoK%}5tj7y;M%Kp;P#tu zz+Jc9f>M&O#Q!tzd>cOSEB`0rIKrR&@4vyb`wrmtTW-X*%^PvzsM;EL7L*uJ`kMizszAkrE+hfsec;F)!>Iw?*N zBu$D@q;nf8Ct@;Tja=Q}m`BGPtS!?Gh~8Psq`ob`-qs5f;igRz7{jrK3$^s2SSmQZ zu|=a8)}@r+oXBDYo`YKtk&H!zEwZzj7npMR?KgS&wjv$nZ{8#ehPdONEM=?#db;AU zOdB%H=>k1#rTrZqzOJ?6UJ6GG)3bGC)?m%bK8&3{gCvTuw5J=^08`U5n3$Tz#MBHX zr)E$om#}0}HzuZMVJ%RrH?Zg6Aw0f&KWg;`7I$}|TrQ!fyAxA0vlu&b7GM3=L+I~a zhMw+DtXtIw3yaRSHXJ&3632&6;r{PDivHfESh~0eo$YO&$9SPHCi?d0|AZTvfR(UF zlC=i_TV*s9qSzg)F6r*V68@#ovD6Ui{sczJkSzy0NIU17G^u1Nh6&-h*Q&hw#%s_GYwItEkoL zSh~0eE0-_BbBB-NbN~1?96WRc)k+0pr_Z|aN{2b74bt$vp9K_$sFR6YlLM)BINwY& z)ap%SSqck_Yp=QjNgSb8t7CQl3beOZk!1#L)i!+Ndyn9+K6ekE*u4+0*|802nmSln zKxRqFw`?&crlzrd^B`9C zF2#xAQ5+u{M&I(K*!SFFOis;U)8GK^|Mo*DB_(Vf9Ke!AUC69Oni{s2iM<+PpO*W& z+`EhK6yMLKXO@l9-*Z|H3U!qK#BEvG8o-+p;1HI6C#_e_*Shr~U!hg^N!dBlOMZGD z9#)~AT9%%n#B07&m-xg_K@7yD*v(HNiGfH1^)z$gL;m$Rj&WjW1P^}qVQ8)K`@i)c z(b>_CV<(3I08c)>2g9SIDEYI-zy8eU@$9|>0D#W+c9hFy{OnJ?0{}3vW;K5Loo@pG z?AX2qw_JY>W@g#Ao@F#!qH~23f`(ylHzy2FIeda8mUyhBP#;^a@NARVu-VXqL zT`Ohu%d!lOW{URqDk_yK&+YjmNAYw2_kX~F=MTAhev_7F|9Z2DYNd>}YL(U0JGY<3 z``>gF@4IaX2SzG*1R|ve`Qo&C5*4Y*JRRCX9d4*46HL z-H2MffjHJ!+S3iCG?p&z#+BPPVO8&PoIX2+#oe8#R>~-s6TJ4?EAfU~Z@^5ghB%I~ zx~~^!r>3x|s}sFTdT`n5J{&rB5^GoWVQOX;Q`57kHJc#M@bzo@ap>3(R`o8$;vVNu z;O1k+-@tdQ{}7!0+{Q$fB6uxKjE>{rk)t?p z_$Z#)e*o8Ac?HU)1p5vi#%!&IkU-R%+zq?#7R8)?0%e{m;j*A(b0zCQ)77asol6{=jGVCX+3I<`dqw% zl}HLdjeufeJ(DEH#MCst`Ta-m!1o@;@aSn&D;1obn83v36b>CbfhV5XgLmWD8iOa>#%A?FO*VfG@2M#-G^GE$>gqegl3vzWON+X0+Z7-Xr>vA zHSDOY6;Mh_NMiTyvj+~LQc7^y+J1C)wxioCjRMN8cGgzhg+9-b2Pj#Rd`bS736~=A zH!eJf@W}2ZD|?pp-cDLdW+=qbhdD{FZ5z%Gr9+jTqb-SqDJmq>$t8IqX}XYzN9zd9 z4Cr5+;f75SzVwL3*rY|ILee5~0;A+X`NTu{OFx>a#j-AoAHQDXu|p~Dd%`)|L|zlg zvJ8(s`83w8S&i*mHsab{JJGvrDR%GOkN^DN{s^bW#_@(bZ^N4YmH4y2`3&xV@H@Es zj$5&H^G38)D)`YmUWf5BXYjHA^=J6U`yW89R>y|*>rky$Ff@D$H(!4>9(wEveBif# z56|q`kETBdUAwv;cinmm#!jEX=l|g=xP0qo+s z)(@<~9k<+wo36VWfBS{6U}fhRw)EH0-&4otzF9nbvK=4$Y9F2-DWR*H;hOc+=+0 z8y0{m;D!yMl`WIns1WjIr8U5izluzzqqr_#=tX88 z=r=Kjohs0Vum(g0Uyv3FfGmUshmtnQBR+3s3ld%#M;-hd>h%Urj*dYqjZ@=i z@cqZ0!EB?BV?!h8?&!erp;4SVeFi5-#xOiKj-k@4;lI)>R= z1CiGF-V@K@`C}(h_hGpQkDkErsWA+l8pDd^OYro*gLwFfXE8E<2K~Lu@cglp*!$dJ z%+~7YTfP{NKD`gm9XXC9j=-UKIamcBqt-mgdRRrU0McfLo^B^3^snf}zJrJHoyVTQ z>}(BNHmpOXT*i^(LpXD05~U=;(Gx>BHZ+XMscCE(T!(V0jKjxHz*>u;kx`r&9>%U6 z+p&02Hy-@nqgd3{i8cLwShi#_hDXQn5BEQa-ldB%uxcgFOiW;O>@=EbiW9>l7+kjo z1FQQnGCGE*cJD)Q`1WfQN6cfT4@%zWBt#XFgY49@s^v1i`{I6ENQMEO{41l#g;Ga!QO*M zuzF=LRxDqFr=H!9dZUTSsTo9(#`NqgTkwoEIC$tdhDOH`YmM<*jg0va_!`nIMWd0r{wpOM9~#BZts8K5Y8uZUIe~#yeW*8@ zI6ia=OM1F-_VlUyj~+fG6E0CGWQx|IlJp-a=-mkV0TM41kU&76Nf1bcV2~94mkR&0 zzO@^74PL(U!w z%X%~X>HC0x|CbTIy$9&5*qjs#TkIG4&>7$CObyt+7Wnx4G(P<46kmKOLPsSZ(o(C} zp_Ia=!Sz_NYzfBCPGHZz1E_lsEtkG!V$ng{C>g+)8vZa`qoWk&_QPk>nEb8jQ@})~~=;$%@tyqqZ zwsw$zK$>Paa{L4$m7!7!XY^;LV`LU6$IevPRx;4qtxIM#PESWjA}63hwZa8j&;Un< zI~j&r;!3_POV%pC=~`GQx_F5X_#tpb;2`&7=f^944!EMkAY0EVs7|(+=!dH+7L5F> z0Vl=9Q90PbC){EDm6kBW{wGDcV#^-4WyJjRb0FUbi1|8gkv1LDy1lcev0i&uY{`n_ z$UB0iY@tfx7|muAQ4}Hb$0^oYBykKV=alQ76KL&xcnCOgEeG%|@}q-n-VN1Q}R zn;9RwBypUh&)k~jaA6+2D!{$oXh14n)pFT8%{kwwB#zx?F;hcAc}~36Xe>}lVl>kf z5k=~FIMy3Y+;ZJ6jEsz7-=V{ZqX?xWams*Sm)Os>l*FhvnuubJw3#7EVnkjraOeB9 zMz)B8>@d#w>E~;#bC@odOHj%QeVP@djD?Umjxk%SVdu8ZP)gz9CwHTiBq${@r#oic zU>B%>J2a4BB$Id*-lZj~R4OdwQDvHwTaPB9NTbnk&Xupdeiy#|&=WZ0^UAopah&xa zGZ`rSl6XR9G9sCiwUN zTcKJ8Dscch;H&{o0*-QZiJ} zfxDX7nW$oDtub4xBW?xh7-b&HcZUK(MHCWF$(u} ziH3B}azN+V7XDezSFVwVUB+6tg7UXVS_?kImysY=)K!sYtxHi|a#|H|rU(tv{$<$W z+(;)%SxvNIK_S{Xdd}pney!@Z<|7=2Ys7praa*Pe&UTz=iLMzYZQlmkkaIw8D+I5% zyFVZ}o)+<$wDOE$<>`txH4?1mr7Pln@pLY6Wg;%F?8B+j>|*+`wz;*(!V znhf~tafN6yqKmQ!uP9n+uC=FHt-A2RjPRNGwaA0v+e+ft@zk1&44892gbJHF0FKDW zyx#P z;&B7Dp#fwaJxlr*FI#cD_1dnyEs(suNm^HAaqx`I*{8s<+blNvgc8VtXv}p1XV&#o zBBw8>y@AtsW|_soVTE6~+hW`55}rP4aPo{r5_=>i4}2Z`J4rY;nZ@L+MWv+h^FLa` zd+to}+n>#_=V**dl7BbcQ=yQQVkB{bQj#!IS>v<%SPFH!6buC z6RLcdw<80VDRu&XuK0>2mxx4t_$4sGX zCRO*sOtG7&A@M|etox=+jAGnSC8;csi{mkeJKnGoV?ybR(v5O4UwwbNefUxs0u&?CA?QQT4fu#kmqgClWJ z)&Z~iEqz|dEy3qCt21&5yAC-)=>|^TkL~ZIwrF}({w}q{!&L@YMbHad$H6qfx934p zSmE(QJE#3hxUC^XgZ;dYN6u;LJBJk+eIF4DUZ45YLF7|9i+}8U*((D1GuJ`2ZQ5Bb z9}GZBX1KH#*QT3mTF@emhvvDcK=1wum$w;~544RvmSK%3H1}z9*0{eg@$Vo<3hv?6 zq!dxR`8e=$;U~T$VyumW7(Regxn0Xrk^Kiq>~*m!J8rU1G5-|>rb5L@h8D6cjw0Yp%?VcJD>1culiPr z&Jdx@$Q_GcdR&}vb_NaODJPMoY(w2}D>3~Pm)NRRq@XT{6Pz z{8}lHe6m^-5)p%YS+$)3jof91LXz!MtU{*0yh;76y6Zv%7Xgc7Gu-3f|Z5?z; zB&}m%C?1Ch#@>Es`iPmLM4}B|<75CycW0x?Ft3w^75s^s{vD21N@SCU@2Sc2VxUp4MTKYF4sT_O8CZv^9B2Rj5ozE&&X4wR%0i)rhib*Z^^Z{1yA&vVX@(wCzd*FKUSN@}-y?L!s zMMerZfuT+X~11)_xZ|Bc3p#JsLAklN}zW}Ad8S=$I`wr=SXdUwVF6=b-s0e{U((zBk zQM_7;y_@H6E_;D9is{0)aHMVTN$HdxhX5b$W_UrI8vQdy0nxW%vUop}1wGK6%|iagp+>Cs zT0W+)*+Nkh{n&qSgDrH0^-CAb4rKYR<32|$jGLEDDi{L zE!DMvAMH$__2I7Ympqmjy-OjdFc>pL`Ik`QHVK*U$*=3E=xP>B%Mw2^$6!l?qZ1|k zf3Q^fn7(R`%l6A2TgGD5jY%C_k7Vw z36;i;UoeUe`zkgOi$&51VZ{ppvk`y0VafFk(nztPdlLNxi&)~Ie3Mls0go(50XdbQ z@ylGh5g5}MX%GlUhQ`!XjMv<@BkW z<4^L&la_oJPKF397S4Ap`Is7m_N95UTvE}`2!jzP^;)4P>nd_r3jHo+YQw^r@;HhP zS=$5yAKph%k(KRQ6?ajEQD_q4U1k20t`MTq#XHl#?_|dM7b=fC>*~om%cPTb&nz}6 zvK71Iu8xJ$Ps~whEXndpzhCEJRW@t8vyo7z*XuYMWy@fpZ{3%SixrBToH|@TUZ{K- zACI7r7Ggo!A`y*%)PAo(MRPH?oS&usHI2n-b7RO*2d;BP=EOGXYREP2v}4$QMRqK{ z|C3zK{TVL4anOg6HH-LKCIRDd&Zq}$?73R;Vx49hn(R)zE41aGnZI6OR}hb>2Q*b# zm7wf@nMbj!ae9o;M(t@={C466+^^^)Sm6;HTq7)WuR@V+b0kdEUL{EsBTGt((4qW8 zS+r0~NQ%97ULE;+T;9HU@Sm-LteQjg#$|uY9LtO&4MxErTdYTq_u_9l>t*ty{r5M$phQ^J`!4*i^1D~!oYnQfSo z2pZeNQ`?A0|2dWSNKCcl2l<2&k_ip{OiqkxnnFDKS9myd>zG(5 zp9_3`y~tty4kYZ)PALJ$27S8L(I+0;fO+(<{YkB`z@O=1hPq>5T{i^Li(nR<&vlnX z{OT9TSjNcSa9t&B!h(w+i-hyFtJOk5?1yRJWz<8xbo z@c+!(F{-M-(2w9Oor%lIn5uWKf~zNfD1=EDJEsabCbLmu#f(n5LHOZdPPA6}l~!JH zXO-HWbrr6i;eD#GBu4}MN{Wz?Y?sspIo0Yps9_1!aJrCFB578)9aaCRES%VqRdZ5e zfngM@W=Ohqw_&W`M1!K#qIeygre>u={(e&fU+M&w+o*uVwOKw6DNe<(RX3*UF&wg? znYk?JkN4x|r8hNS`}wF$icR|BZYr2iMxudubd${0wsS`4K_$~L^o1}4IlOxBX{{0= zEc{~X;^d7b^MdyYky(v>(^Q%DNNw*dhu{!_MHuLHDg;b}dVkQ8qQsTg`-v>Gjpv9_ zJ8q}ax&4O~D1~{~I6i21*lxx8WRP!wd*nvFZVatYLzQ?dnhCpbE@Mi;Vn}`o&kW#% zNL4)6IC0MrqQ}N766mKRgsI?nK~#jyf(tlplIO$rS}-s?3Zlr0OLsm>ndA{n1vAx> z-RmyC>LnC}I5P;k6qP2SX*A)~NJllw<~^)mO%&=I+4wiYKp1Njns^8}+7u#aH+OOT zSyOmcV1IcI6i45FwPtjUR0WfH)}t!!1*=%eao6JgBmwU6x0y0p1cWdwSW^SdG$++Y z*YSY#6-C<%w-EybSE(Y*%GgcAUu@M%Lg@101&k(6Un%nmdJEL@30%vNK04Ja=x!8ohQNjVm$zu!Bt(9T)g&X=r(KRXR}XMEu6THT|N}n z=9@^pXqGj>DU#?2CLvr%cqRhHQ_xczROTT}Px17Z8-ON#{x_Q4Ur^xwAQ) zd~*J-s^Y3>*yKzsryu`B`quDrgv+=eK~#xe$%%Vmtv6y`QD*K$dIHoZ2BvBX!#;vC z+ovN)RpN+yuuYHRnR6Z@%c{VlaU2kadm-gM#+>yJIR>Rz`ue|D{o0h6mDA33Bt|{n zRUr5qsz#`CE1=-htGfHh@+#SYCt9Y zR&x5|=d68{8#G@}bUV#aaqLRg1}C6?v#1GceEi`&v1{XkvEr(UtkT+SH9eK3h_s^6 zryC813`R~Jn0nTN!=U-x#k_?(9Z7cwKld#zNE?1rT)$pU%E%c^ztiYqL69>7zhJri2tZ4LdtP3}u%iy4rE`!_4!~v(}FyXM@yMYe} zd)0l!0tR96@iMsX3#J&==`pVLBLnrg$GZX$ii?WfPPI9Bs1Kgig{Wc&Wdf~pjY->= z3c)DE;jHwV42s;S&QYlWu2yk=UXl%*W^tFy4EjF=Okm&XZ|6Oje?s6_LnCHFYtS?H z&@M+q!37b4@0|EGv3)FKpHbC3VyR90`SYTL4zkI03h>hk3(Xcq@Tjjsczk5EsqXSD zRfd=lec|g>B$h0@7HWT7ecC=7^%;T6z*JzYFiKkSSSM&=M8!4t;d2xwv-GiD@gblq z87JxPh{~iVZ4}=cL>Cu2KP7b&=j`zqqGyg;ujitJD84Fk0$!j z1W*;`eBll(2MPToS}4E^)gELFA~ic(%T-p;u&&|J#n(;6V+<@F@a4~Si%6$}u+W_A z(3DIZxk9bf_>+!TDhFz4s$i)JR6`>t%j5=|9 zd~PE_^33y^=dApZIIxkcVI8&vf@A87!I0i(QFTn)PrK+Wbs|btX^dBJrUGA1i(bGm z&esh{8|i)XFvnf)ri4xZfc^aL7_*vJ))TWj3z5eN@uiW+)?CDLNb7X`?-TfS7aUTO zkT#0EX;tvQSSk?HY$rFBaqghu3-7nPruvXsh=|H13+r%IOXAOBVG!T*KrbZ?kJ{sR ze1ph-x+SQ!F|h7N<_6J>ut+v%6EGa}6&#>r%y@JqN2TM5qV<2sIc^`4qj1r@&Y6Es z7~dd9G+bwQX;*gaxv<_pmQsSL~=$+OXR@YmIoGhuVrviHcF*XHKlk% z!hSkDbd5wN#5`dW2SaRDJ#|@*xxwMYin$7=%6X%O;#!nh z_ie3yWrio(5Tq+&VM;+;GDZ0zqG6r)R(Lb#U6K^D9ntDl9LD+Qd^<@qHFZ(xOoB*= zR??!F{(q^Cs^EWz{;du*kvy@6o}-rgB;=QnCK6Obn!ucq9jdD8RLpsK>}!>M`glkN z4$84d%q}a8jE%-62(Z=*NXl1~6qM|jNmwotC^^266c>DcyI;f+J87XDhD=Uz*LqX1 zOg7E1v(Gv69zar2Es^8jM8Q)-q0Ao=+}Mhfl4I5@Y@B25S_Lu5iSjR!>Z`v80 zz`<;7WJ6X8jJN1FeMJ<*xN4L91LAngkc=0`8Jl;f0sYN*6g;5hdvNS)i=Ez4)xA{>7oqwa~M3o=Z$mGCrc=*D{p1aqEz9gvoTxWaVsF z#U`-*=^k2I7X3IfrE8P{NR<7yFeb+JYX%Au8*<8wkH9!;FJ>X);z!kx8W21m{Vl=; z$11!1Wa4~y8Jh%*sYPS|WpG|m8S<>)G7S<}pj7FcRQBJn-Tv9gEKTu(yd%>H#w}{% z<#Kn$b@qgH{b+R6KBBSP!RMJfDP8jya1s1(EN&Q-y2g?n@cclXo@q}R`ujzO1fs6( z-@)?cyAPp6xWbT_7`#;$8-Iz|V}G*!t)iEs^M%KS0;xTvp*dUkq6Eo(JmmcLKm^Ex zJfa19gMcna^}XISsk`fIcxmkJ?;6-H-$g&%f_Y*A@bp1CvK*!2p-mWg&1U)}+vnZv z#}L<1WSp`7Y+Sf(VM7EihdCBn$NE0Auw@myD1m2ud?BZw2U>};B6X#=816_U5qRfH zTO73@m(r}E_Y`9Au*YyJAO0YDrjD{y|5(9iNo)5``8lUc@xvrAUugrr-`%(S8|xrH zk&VPurYo(k7L=R8xBEng?3OU3S6asceeagGD$ca0ZiqiLnXnoG2EIC0q1`43WptDK z4}=^3S|y}(s&||i#+zxN$9RbyMR=?Zb)JZHTtVL@o;zJg__AxiodGm9d&AdWY0&q; z0Aik;?$xRszC3Ii{Pb-Y1jbE}Lt!QC)P7}={lF$eT!2qpu#^aEo>z*gFqDBWwVu3M zplp+NC;U%d6HTQl>j1>1gA2WEq-SBJyD^teu2^?X7&O9a#s@Y3o$7#!MjDRL1)dj< zpHAx6eqQW$6 zc;p^E=_ogQ>e!6H#T&Jsgh>b%d+_SO#F{I{+XL-z2U8y{8$Q6$OXD`tUN4Is+o|m{ zg|h$$ojdq7sc9xcJm&T92hpn?h_P{VWU~(+!Mo4?9-rB){#VKf})`?%!l0m z^ftM>Lx{GP9`>oYMibaX>09X4Dgq`W=Y!cMGp$o_ew+fZ2a-tO&J3FXUWNW z`pwJ_ofZG#;jgt4Q_qg3iZRwn_0fK3?lJL!|C^Q(v5!^M_v3d;*-Rf}A8+%aYwGq5 zKX@b>vbC8bfdHwONZx&-7oXkJWnhseljtU-J38O~Qjc?nA!(C?W4>Yr&Ty5Q;j_^< zoi+(Whzc&OvLC!dvtFyrl6UJ;dV92Yl&m(x z(u|6=gRJ2z?&Zdh$|ee)Ih2|e)w5!t2yXyU<;ope9vDqOPt;Ric729gl^UE- zCe->}(Vk*Z#2FpAjmkDG(J#6vI|8{t>Uk>G%TmmZ6v;2+DSbDk4J3;Ch@U}aB&Yos z1!~^5a4h`shIz{K6oGy-lEZGG8eB+eUzlRA3XZu%Y%%7?E(|t zfd2xTA|v*SC9F!ZZmkm%JI--!k1&*0 z0)6cqtxK!RuD_bOGnTeWCVwe7z**XE*gB@HW_+kCwZ~Wzrr~dy0=-|7#wdS#_sIIw6656w1Uz^2%7!y8WqQ_WLeArmHe$<#$vD}5}1@#kD+qqaQa*D>Xl)e{hZ6o<%r;gz{1=LIV?=| zyuy1q7-6dmQyE*o8VztOFTKMoJ>5iCc{FKy7H?m%b$BVx%!q#FHG`H57SwZ`TY*pf zXaGT~H)Vmt#V10ZvN31+&^<5Nwue#ARPrR-ASybEOtM${%fQ4@3$1y#r5Ym!Y!i$z zcbfMELgC$);n-@Ylnf#&M#w^cZMrA!N@K=MuDS#Tgkw&7Y zVEIE8Uyx+eGNkSbnZ5rFT55en(##8P#e*l0==w_%j_?3^&cy{bV$Oe;cp%ZTJM2{Z zJ*TwXdTZbwS&h>BgpONQEJ2fLONpbvI29MD(O{~e-Ba~-heDqz^$!S3wXt8{!RX!W ztZqnNO6ZD#+H^PFL4=)BiCHZ+d%~h#?Frr2roCafu~09f-4P58;WVo1=R0`oKpq=U z*rSN@f8sN&rmFT9orphFCXsS_2_w_5s8mw8->)FvxEy;CdBM)aMt*`|7I52I2Zvi@ z{P-$rPpCb`%w79TkuK98dNeY`_af1n{^_gR26A^_lHvoF^m`k@xXc+3(~D}D1ISI9 z8j|&-9h>3dE^Xd?Xb$dngHzAV6oeC{3W5ro*lv0)d8C&AScZ_U<+Bz32D4g7WcGh+ z0Y0$}Je3U)xX{n>)EK*p!@lLU#2g*he3Uj|sHRNNn^&$e5P~DnQ$^CzbZP{))M5SV zvH8RLJ=N3okHgo3`k}RFeHTNs1eh_q{sg@B;A-O`0lX{OcC=4_e_aW!u0dXhacQ#D z(NW=Xqa8w4-U|?N?I6ozGi`uZ!aw4CbU4xR-G%38{D()q5KQ|@w8G9u|ElrVfZIM= zCQE79B!~8U>&E#@w$|9?MWdZ7G?`idd2&m^TJ}N5ffa`1xCCik_cg#=3uy~U!$evG zTOcMHi@zKO#b9!1J?*e_lA4~%Qj}67t@n7FR=L4QV|f$b{u4@`14DR;dT+n0()pOJ zKzm@fhYB$Vi;z-eeK*!WszH!~2D*N}89lv9v3KiLZMA)#ZCo|TA-%ZkgiijJ&ix?z z`A~4h0^=RSR3%m{-DsY#O4^YKIY%aQ0I>M91)ti+pGhh4%%+{?HQ)xVR@s%SBtlHJXAi^;5Z^(o)2QCpc&s4Z<) zS~90)r&wz!@4tr2#zI2Mv8J>A;NFb&aQ^e1VMMr7mu#A@^3*DE<@G1-q;o#qEpELG zv@E{1K*u6uTFEqX>xS_mUw#4UGq}sR=ky!B49<^ctoW2m$pQFdC8k|1!K(~?`JX=D z!^_j5dJOvXF87^8xvrBBXKC^rTFk$Jdakff25N>R$*(=oc$iJ4 z)J--Q8-~^;JK}`YmPFfXGBV%u=%q_#2^jq1!rr%qHP>`yuYA$}vwp+=qIy|1z-4Xb z;Q5=P9M$kXK~X(R%Qj~N=oMlUno;I#EHS;jHgFQre3}kJYm{MqQ+v_QNpZktx69HJU!ZASH5}NNEv0xtefQa6N7jXP@W>A3dWs_gt9raZa z>04z>A3Aa;zWY8c$_YewmLs{ylwidm{snSx0Cq13!E*@^)fcaa8|NfJUZvV$*!|iB zQDmNh_^pW7rxKNv!r|KSM1gmvW+j5NM}LVvx)Oyj*VybFozLt!no6?%OAvN|y0Gsz z5k`f7jN_c=Le{U4*Fm8~@J_+sWIPdAVVQHNRzb75hojBt>@B_ru+53P|+=%NyW z@hPsfnYg05L^ls;edj7|1AO8e?fmO*V92U{v&TWH*YzLwRiWMNT<7TY*+IobUpA-U zRh@=<7#O_zt$Z|x@vXosZ2ynVrG8*B`zusHD9HkzVHagiuvblBy zp7kGPr{3KS6qE|*=NA_Gn&v;F9g%WfQ-plkHmDy%MJoIvzc;i_mx`pjK-QU?i6ClU zbA1s5ER=o}PTr|Hl@{N7jtnttaNUb2QJYi5Dc&(a2DL#~NUn|FCWGweS0(irP%VpD z(jpqwUIi>YzK2NLd;DlwfQA@9wbgJt5wsb@-@=8)QwwFK)2Qc7 zJ{oGm*fy3l46oC^<;@>Hfkqb<6;rIqQN*`Tf6=o2!=X$DW)^?qziB?SWRoclel7So zGVZv)5K2KxX7PUEL4ucGPCTn}5IBr2`^F8W;eX8mG^xcL>y#%<{+1om1rTgB>;pB* z_NwO|EhGPwZ~GiF%4K_Iwc+j%yCfw|dm3K{fxW{o&OpuyB}dneEb}*0#=6!ABcLk; zBu*)v&S=WjFy4zj+&jj5hR8#F5NC(r3;V=fdKV}*5!>dVvUz5B#L`^m4Z)@+E+!j) zLWbc3`*69wQFVjiguAHmgDKe)Dr?<{fbsYLIiag^Uz|{FrrnIu8Y9zf&9l`k9)`kB zlV@?3K&h704b(TkoPY)8|NIJnVp2agRe||j^18c(HY5S*xI?5-%fH;ATI&E+4)gza znC3It=7jT=KP<|P7)7m5vM)&AkV*m_kCga0UAt@jAeC8hl#Sq?*6yF*o=kt%2rVu~ z%l|jI>`+qHIWAf)!9s%&IFlo#y-gxO8#lU``g1~J9yN%x+#IY|kyj@7&BsozTPg?EIGZArxcnBlAq z#KvCheUh>qb*9vBM(3?+IkEZQh{K=okGKr=u}m)!>i55#s(gM2l@^yAFum^lpHxcU4kYNGPc=)b7#B94pQ!rRi5vLP;zc{)c0@3nph;F#eCUsLsm&__CIk zCR(m4WmN)&o$F`e3Tk56p!6FW6gEV^|TbBu1DoM$%;D+-K>QTFj2Z!WCEzmg|T zyBc+-bTzh2b+*hD8sz4lwm%Fq#k)~@^2yn2N0Sp?j8>Hf3}W%aaEjF5|4Pbe^;O8z z7fSJdM$vO5#K*tgdk>RK`G-(^boXN)?}+J{xwvMiO65HN6ZiM3?dX3Yh0^Xf6sfd2 zW{-1~YDQk~j4TB6~yrO>Rd#UcIZQd*^`OG-@AQE6Io& z0TM?f^)3xOGf)!@QSF!)hO#hq^8ufK+8EqMW&&*#(DZQFm-Zjb^kiojt*X8vZrodz zQHe}ePYsVDNr|GQeqK?@m%qmV zi(6aMBffvn$zX})Ug!SW-g+9fF{WM4BoFrS98TRbLS@5exKyt;D|F3OV`(dkH4m!@1K58lQ}CdSx$_bm{Tw zEK!oU_GYtCr?8i7kgUSc7vR1T%KSYK+#Q5! z-`iW$$qZIt&3opiFu*GU)(wc|1*CtP+yeD@Yl;^>b2%J6qwfD}VI!7=G4Av3OB zjNdK+$wAIE@~0kMS_1XF-qsyV8oz!Z3;3(9YyaOEH$7Jk+iq73=I7^KUuD@+O433( z5i!M{IU=K?)W5aKW7qIxuo^^itGGV?wY8}M!UF@$AMDm1Pb%aE(U4Yw`uuJfbph6~ zXjW-St8>36kLS!PC>UA%D3$>11$953QL-ZgKn@~rn=Ut8u_yGCX-d7Qz53&&Am!d6 zqatIOEs8yB$;m+D8II!{#m~86LE_{KNIdU1^m0%mOBg4jLMp_jlOX3`ofew0s(kR3 zI)fn3l=sve6Xe5PZU?-GjFH3o;bP${ci^3O5J6K@(^{7=m(g9vDl7~JnQ%0w|L(i5 z+Ew?<#xGi32c%+PbpluL!CbKvzwZqV&^HF={UFO^z1yLp!&*HoH8u7B{GETl_0kk+ z!NNXR_AAx>B{Ffz6{nNJ?{unLfE`pD_I1OrFHfAp!tv|t>jDQ#sqkA{Te{tTJcx*h zY}wcBX%RPe>?`_!nMFnYTQXQCIk>o>VVbrrr!6;PW!-O(9Q8?I6paZ6K|V#fXm`)o z?~J_bL%Ira2RZ~MI2Wxul&m}a2OcMeQV=N(btJTIxYKXiex zTh?ZipuSZy3dACez8ZVDAyv1JvZUIjnS5lBAfbo|5o_OD11GHd!N7aKw53siNB)n|F~Ep_=NA{l%9S$r*BZm$8&)nH>Gtnsr&u5pJ@h+T+u`wjk zo0O#8?#lr7?Yo}4z2l(Q1EU$Zh$xC^(z06ZIXq-g&BxU$5Up{}bWjfw0{i6F#m&73nR z6;{81qlkf_Ikqz`|8OLHMPsb0WYc|CB)SC2IS`tAJ)aZ^a`qV{srS0jclg!8q7!QeW6yHE`#WR&qbF+tK7YN_wN2}{WJ80_s@Ca-8&PQWO(`H-5%%EuMryr zO05=3jfV{X+z-kE9aGuZRrL8(3Kp4E7XNyPu&em(b5ANPnp?YX5d2h8HS29N!ZB!M z{n@Ckzap!c*7m7PK9)otW=QlB^Nf!e&01UoRc0P45@n6p`{2k0bG*INz4JLpL_{Qf z&@?tKuHokeRCZ3E1z)ll3m8@d4 zNHDp)j#S_tMYv{N7L?WF)!tVgR#sO3Jyhd9t0u+?1sa@wrytN21Lu@4U!(#8L{jA8 zD;K}Dy<^2kO%i+MkHcr(Hz$804E{i#f`v|jABUYF+pzASsK-sLRc(P0^{#69`_dBy z%WqM6wQ`2J8>Cy&kG8dfOpn21=|#txb4p!BLUlwlZ;^Z2Z}qq_@a#SJR7#m_mbYii z{9p{T20~`-YM9-NA3I0D3(;ga7LPw)_51hlx}9FEz;TD=nMNJORhJ};OBQ;vsWgg; ziqWG7YYx2rqU2E+qyv|C%dFqEK> zkbuus5mg@vF|m!E-N2p;hp6Zba52Y%z(-qP=cT-oQfX7um%%7ZE>Y3MWxGQFm&!{^ z!$Lw}*&uC2SN33x_X!CJV6nhFT^3nCKfzQQ*PCAos(Jh&%XV5U)`NqC+}zv@w@!y| zzo(xQRFst&iq8O+U;VB6_vwYPPOelPE~Jm=HUPKSS|ZrOJeVv-UB`FsGqs%xo*zwg zT9)&`zU(YLew-^XTJ2g$%;4TGwD8S;;r8h0sEm``?}YMDn4UgrvGOBs+;Cdva6(@~ z*QgD*qOY%jqoX4lCgy>M;OWJM<>hv_g|)SL)B4wM-->~`m#2}mwPge-go>5baU*D? z{TKUKWBlNr$-ziM9=~g7Yb!5K416jLBj-33b?LMfH9LC}kNpaZeBglpe!^yaJLF@~ zo=X;BLYL!w@0(}n?Bd48gz?+0@h4r~F#rmaME(&51Oxz~^B?J)ot@o3^}c=XGGaG0 zG~5h&ds$ju1_VV2%VgKh1oMA*sL6u8{hj}MZH6fH`5(rb^i#}lR zNbqn#Cb$)3>|MpnG3^)VJB#Tj3R%j?3AX)_V!+OHb~0wrf;@H#{2`EXWKW&T(N=s;ymvFmkN0IM%7EM#S6 ziDy{KWC`CceS);Pgp860*a3exXSp2$*3+TLJ9rV=eo`ftoCxxD|;UD_zw=lIJ2pmROo zB04vCEHpGY$TIRusnS6~V$;*p7M7Ot%gZthASw_FV=YM*WX#jkbMM+GnI^`Dd*c3{ z|FZjzER)@sj+He5kZegKBeMGX`ePFl1E(IT+1cX}s093<|5Z0;L zI5Ek<5P-C5z0H+c$m_SsYOUe#jh491%bwg8`&A7+J%PG=JUS=RrMFx_)3$9nZTmx2 z088caIUm(_{sCH6Jkz10qd(t|iX8#=l}n}h?Ii?klOF%gDCtD2VD|Ly;@9C}gY6<6 ztD18-wvqYFP65MtMWgm!(tcNHeX^yhoO3URzF;@sd%L)$B^|&x3M>-<`To-@Y3b># zYh9H1aWbwV;gXbq4_R7T{$6Vc@ zlxWEtH^Kbab9$VZsjMw0GgGN*iijuM=^P$uDr~Qd4HcnB|8OSv-gJF`dV1RRcvb}u2MdUdWE$kc*-8e`f7bm`Yt)_7 z-!E}vQ^NBfg5Ox(C=det|he<%# zR;xD<;6n6%C`6cW$kX7oe=DOgmBC_6fu#kz^#sh)DMOfn0C~E*JO*&bbhbbQL_mO> zAp0=>F>nBYC0D`x=XvrMY+!btfs}zB&@TW$llknzdR=Z$1B&?m^kdKjAUvio-(D}7 z)ln-|^Y;Na@4N8&lAo`lu8s{@g8l89{7r%?#bmxjM!Hm86q-GI_4;%P{oOQs^B-pI z?U`=-9H3{g=!FiOnL>}I^Mt$;0Y(HS9?&Sy4~1_6fRFi~8|-M5d;x+3Q}_zzKavF) z1DHbX8vWr)u@~F_FcL_{`T%|h%q9GIQVNKQ*~vHaxZx6{ZF|q*mtV zFvNs6b|AC&`LOqG#`}>)sOtaL0`x5QmE~zOBW{?dRiT8c5e^xH(@Q8ma1mc@6|v!x zNXOXgj|D$VxQa~iWl5UgSRDzPXU)>^gqvswsnXy8=p)ni9XCaBz!Su|>Jk1=4_jI&zXUc;9LM}6arHb8%D?oSW!zw7j1 zvz2H~TiY5r&A&IlhqK!+(RZSsYu0&UvCyK`#9JMlRLMdpzBPZHLn8a!nWsh0N=oKW9$Q$tuZNCTV zC#y?F(g>UJ7NUH9bx{BnYdlH4ABo>)*pd^{R}|9FeJ`~|=#AknfUv74WT z^zXU20EsbB9&qIc13dMgdfsxTTP01;ZMe0YxaxSbOxA~e=6Izpg2lh>^3p>I=TXk z0cca-zw>f2(p3KyY5-jZz_VVL4=2F#zkdC4x!RQg)C5ps!R-ZVhvPFdBNtxofW&bF z=o?7;0G9nPI|3joDS?C!P7MN4R#HL*#*RYyy`sWu1=@xEwl+Y|+^X+nYg=4jpPZP8 z0dU|)4#Hmx?G!#!aLCepaaSk|G9EM?_`2$i%Lw>8A0uReTW|on(I@sDAlh z>r_SzR4bAo9499yCO~4`SLXW}m{_1-%lYAhBrxvh2Pgo4ji!T$|4|PhRE}p0tpV77 zem)kf{Q5N-5PU$oz~22Ar{5$QP zkS-r}1y#7YwYBJ<7j*3GA7k!jW@qUEWeE5>Aa764&p-LsBOoCBIyy3IT6c;iUpf&T zz6Ub(qU!4SfTw@+3kxL-#z3M2_>HP6hK!61kQch2F3vwbNQhxTSt>{DsY%QnP+?v7`*Hqfp9=TCRTfC5()>S~ zzB>@h{`+4cGuebhMnnkNBeF;K-h1y+wv1#Yn~;(0y+>wbk3tHOy|O9W?_AI4`+NR) zo*udH`?{|8`+d%NjdN~T7pRCC#+n-SpD!%0E-&DCVdLN=;uphl0`!)enhM7Wo(xI$ zpS>3=zL#(?s;x$#qAThuzIF3vY;3HU5Osc4RU9NAHp5Rcii$TO&WwNm{%vxyr>hGM z&K!cAJ)0}FSrJBpgX4*Y1_{7+sJCVu{{<;3n{{^i2K^?4(opBVhngO>m92xKhLebd z+E4qspKr>4mCLsGPwYyk*lMJR3y*Fey_KsT{XS-CRdanW^ozNEz2hDD3?V3y06IW% zCF1Jlrc-H(4p_3N=mE9wt{6j4eFY&3t6p6c02x&S14U_RjOOP%Useyk&deyt%3{F< zBM(KRSTi;)&1c|12#P(;67B4eXBJjgZcvcX3~(+kE=Ig1o+_0YM@m+6oxHp}DHC<4 z9~CCgE{@@|;Kj^k*D6b$G&M;%3ejZax`4=s>#{nYm0LS$24sshA(zIq^ea zo_<;s)?w+b-YR>Y*X-ZcJ1ML_9L+K@n6N$43pg)5zPT1%NcPl`o7clY?3KEnq{6cx zct=N6Ya{iI5%1V2?<)NaYZVpj!_IpXeM#d~=q=9JA6rsWzjleY+sCb^aG1c7x04hX zCZ%P4#IpX(Ky+ggJ&q4sH?2uBpVj8sJ2wWd#p@rK2Ys|zN#l*JIzz%Ku|0Ag5!GXG zr@G~1`numE(HK3mpO4t=cwJE7Q1D%(CinsAs}qVN8r4*`nuHe9ks~{uYx&*;GlR)p zzTVe{@*DNpNx!wEG(2kfJ{R(P|8+@Twaxu6k01SeOD`+&+S;OVsz0zu!B1WKskVBi zO1?Acs3%YSVC2E+7QO#&rM7*?BkQBT=5Xa9;hQgItk^uO70|PztYa1^1_ew;6HcZ4 zHklc{b63=H?zMQ14M~^BG#a|EN843uSAZmt7a~uactrEE^^;N##TqlVcbBBY(_dan z!)})kZOnDPIM%cCFJpAw*VPNfbO3VAWMW)Qkhr$uTjZq*3sGSSjxNrVB8B299#iVVslruL`nTOwwadCh$S1x$-FdsS30;P~YCgPn>v);nr?Ju;~&h3MiV{iaK^vJ?4#-xVo6lvPQ$>xGq6Twgm;%2%#~Nv) zG|vhX-mI5g=W0n-UsMWH*L0loAN9B-2^&f8EpGdD+9b=}K^2k&B zQgiUQL8~PY?MOx5lXw{`#gx9HeL^uSp)%DrNZCm3^Shifn!-zv z6F{{sUnihZ{NF8$6_M;JXr6dWNVo9l-pj3nZ;R@*UlGk9jE}hcRu1c{nz5?n7*nt(~)-5**Hf)v!oFBJ->*dU{DtfZY#FfbX$jNx01$o`5lkYuHb-{=_<)(Np&@D4ve|o#{9@F8cYf@Er z@;0vN(${RG(uEgIaF1J54cDe&tL>&CfoA5($V@58akbZd%Gfj2M)DdD%g);}kELsO zl`O8MhU18_)J$x3AEh>tTb|n2un|P7W*huq`SoE$Hl34-qUFgq_3vsFHBmAjhRstl zrw@kfPyTxZTPPC`9EPHASQCw4ga;cRGrUciPpJ zd(w$s9VK+swq4a0`w7nr|MDZpauSvggHCE9mX}RNuz;tjD`#In+*}i*yqTR~*B3SA zEUUge^|E%AGqBqAS$bC7+?~c zpfl{YpAonb5fOW2WRure_Pp$ggUaZE-I@!2O;7F*`GIlrXUHDna7i<3B6(hP>W%%y z{sYQkzpBplyiLK03-V~ET;jqQsck&rfp+^9r^7+Z&gmycb#`Ruy8SN;=r%t(lO{^& z6n&MXzQLepb}x2R_bw8SI=dY3wu)W|n3QYHVOA3)O&!=(atzk|Qqa1X8YxVma_|vO z{!%*|-z1a&F4jU!>7~p9lkQ`Zn&{dL`i3InUV1$u;>qC4Qsk{d!l!R~oA``1;^w(Y z=iWOj95@<|KK(=>^Z1|oKaR0hiRPcf1~E7$U9}BT*3qc40)e?rOb_x+pKiq7JDef> zFWQ)1Gp@Vt%BVuP@UE`)ul_A5%QN-<9);3dV~sMFpYt0?C;QzGG~?y-RlXd)z?cec zJ8gPDNG2D&;H|88<4|C%i6)8|l|OcL`?ke@5z$dA*YuE5j9s9;;LT}u>=UKhBCYaK ztEvdzdo06CLL`Bh~8l;qq{XTKA=BybN}!MrW_9ajt&Bm8x*??UM8SnKVPa z7MY0KQt4~4L`RHSp8Q$-nN`fhMRMLNn8F`v!v|;vs=9GwxRECpdW~*g*g!p)uLylg z;r!IwZ!q^#;Z#G9=5QrFA|_iyHL8Sq(pEBsjqvl@&%(qz8a~3$gLRXNV{Ergz7cna z8;%E;H03coE)tx?v;JQ$V9GOFvLgvor|(W}ps(>iQE&Bf_?0TI^m26Ajqx0-#l?yO zJ+_E7(Ul_@y-_po!)b|Q$zyVBVJzAC*v`Az3}WOu#N&C`AK%|TGDhAJ2Se(*vw%tA zs(hv*ch^zENZzcw@9R`467t$Hy89cA^5Zhg-e2DoE+%nQ-76rw@FqnQ_7=My$MuM@ z5#PN(nh#eO=fBVokuW8i#Y;e}sOMoyw6cQ62or^A-ND2n4f!5{stZFNrIWz^qI)_< z>0=3xGKT`iVB;4iB*&IR^8+9G-JEEuH~yx`B+3w;#aBY!xGFXw@9AQYHAFzY2{*8g-0$a zD!2YSTRw}rXo>I7#9~A_;(O5^em3%PR5voP%$2d;v>7?tmUj}_aB&LpF@H6K`q3Yo zIkq%z;p?R(+REK2pnpMPMAY-CROZ?|BsNupSrsOL$Ga}yRxN%XFN zQNwYft8V=s_b9{n9b3P+lY)bLm%8S+y9OjB7)HF!=gGnn3m=;0-2LR)wN?8F~;V+Lv7!5@X)HA;i7G%*@zk3nh3aO!tjuL3X6MumD;!{X+xk?(i4X3 zgsM<5V-*q;ekiz6y8LvVHJ_fg*cHwYV&}3Xj)y0Y zYoeBFh?Od@8R(6YQ&O6NxB^I!i-+e+_S3K*bqqm4KEu zBt=hXVr+~8_)&$wrgQTzpz&!3ID>EDjh+NUX_*wKI`EkHTIIFf@P~ha|$E>U;Cn}jjUVvDGdlu(`h6ZK_s1Kl0 z096B3;B|HJudlBUzUeIk_+rp#+W~*W%>g!k;0N4qEPzcw{0J2Tx-I}{@G7-~@&q#V zpSiZockd|Py?e*R!eRy@9{eqkGd*wam`xOE0LBDF>2~pq2(21AYd=7|5C&+}sj0_{yZRx|>1ot4!;s zAyfhzfgde}kSbNIMBx&7H3XVCm04A~r2y)_eE9;J2p`oO_~tGp0O#sX-P+}nX0TYD?ek3fK%34}IO&*(T+uMx1 zyvd00ZTJbK58$ad02hOZ44g&Rq6-L$0BQSUx`B4PJof@X3%oY4^I#4jr>3?9trLhU zB1|;caj*>Y|IVD|$2d(E{)T9B6rv{+bjiKQ?tI;Tf99r0<}ID1!oosYQPI2g(~1C1 zfv^BcPA)E&MtzWJRMpg;f~p0^g70dNYc2y|uX0l?XI`CTo*d?j z4q1tw>4^Mm9QmII4`_8zfMHXHeHH_rrtf|x+HWA45ETRd%Kz}gU6-X^fQ7=Bk_BzhiH)Cw>ZkbNSc9ejxTl&*yKg@9bo9YCUPh2>aYI+4}df zq1Q5rWa?M{`^*Vs!f`q889I6&XOpARYjmr3iX{5b+GN?yGp*S~9T31u1Q8Jt9Ajs&)NMDeQo|;|3>8PTibx%H62(0iRh z)hOkJbQ}-Nawdij%l1)j!2b+kBIsC`EhUF+yl|5!n}`gyI~OzNZs}A?L1Jj zfrtW0;_m5a*zOA5$YU&OiI zpSgCw((7R5+u2TAz^d=GBqv35-23Q4ZcgitB&!CB42~EvQC!a= z*av>Q3qTTqlfHbn-?o+$mcP9n@$`Wy2<|A>A{8`R5L`gqg^dpc%@`{xs3 zw^W^Z!P;SrFB`|_u|bSb=ODd9sB?97eQ|lRip0JVkuz2lL|X&V$O^KZP7>tc?3|n+ z5ECyq+b$y`BC!48Y*d58;Jx2p9mG3IFH0rjn}Uer5Gk2H;a%Hm{$*QR^?YZR7r0;F zaM@I1oqwSh7=Yz zm5`JKJaTzWy*4WZOvYL+6H^`}!*Bh~9oc(9l{S>5-ujjxTmm8M{o68$?mv4QAO9Ja z9Ed{1&IZ&w-W`E1h(17-cLLS;{X62w1G*dxRh8ff1#%UR$mi7qI5!Ym>QBF0;tGeh zGhJ`Tl!`iEpDHFHq|0lgmyKx7FD{ORAbe%A+@FXTh=Ih8HE8yPxXUf<=!} zsr`>l{Et81h2#sS0vfP3t-kkp17vXP)y0mQrlypd8d0{gb^igc_jjq71aqCTS}N5-n)H9Dlt>^++)1;z(^7#KzSEvNtwuZ(?_g z`cRjFC=0usMwZaa%L~>t4g_^4r}F(aEe#Dxu>X~omO|M!OS-M`I7(q!*Lp`j~Lq$IpC5Zae!I-Eog7>ghA4fEuI0J zjEaFlsk0tZ@v*X+gNCE7rFB1g_22|?euMQ0Hc@P1V&ZuH*m`=L(vqhbcp0Ex7#|-8 z8EY_-y%kY8AQVH*GYYJ{i%Vsv;||0bPbd~g&oJ)e>#JXxgPoHzwr&oufa?V93?44%1Lyv23*MtrG}fz( z1DvoQfM5PE{7~^BssxB6LdU;@A>YH7q&@~C5#phO--43Td1df6_&>VAxqvv`sAIyK zngr-&O(BFMz9Ts8Fq!=6-BbK*<<~1Kmau8S5{B4EQ*wTTWFN&l=NoU#(fb|7ksb^S zhIgBOf-V5Cd%z(E&54d8x(X5*+$DTFGU7*a6|PLA07u2ZL+q5&BKriO zBmHM9@%hWjmK+H}Ak=MK3=*pBGY7R`kzL%K|J=>X8Pu?$Z&|b{#`1}X zv<%xXo4&vcNBkPTbl8S<+x}|9{wkWO4^$`rNeXrc4v7S~H^7co?@a;9g!`ZA`WT2G zAX0k4HbtHWL>jO&f}67eyj+6Mw{syjfmyZEV^b3`-r3mNs*0crU7a6*0`?$p7Ph1` zZC1<4N}Af~Hk82-QQSQ}zd_kz07mX&>dzix9J`^$J3Bi)i+f-lT8D4e*z!~ZjfR6f zx3u(T@<1r$brzP$q$E;s%)$mjs(ucRz@EkIPoK_7=OzYeHGc+u$O=t*tKgLS|Gfa? zOtOUFcEQEPrIC&6{G$Z={%4bJ4~A2a071?Q{Xvc$3MeHZA>sFtx0U%v!ldvgG$?^! zI*yfrzy|K*V_y--5sw`zPHAyJD-@5$O?ynvHf8_D5f;S|%10K;7okqH7yu@F%?FRRMRvmqy|Bn#w zd|4SDHTqN@h5dAZmUuyu)Yzd3DMwJN0DOaMhKm;v5NL3ozYe9ETr(toKn`)IptJk* z4h^9*Ccc6-ghkyu@s){77=I34Teux$mtUTrOv`cDLb#9Dyt;>K2g)IfR+)M~7bhq2 zo44(7@)8dq+<{Tcao^qvPn8+dd*>KHlcgmilnb(DKP2wG99cDkj1OQR+%zB`V)KG= zv2(s+0b4mH5y+E2p!kHO z{G2eA18j6)2=6vkIVI(%%K2JAI9ouie2m1K4{z4jk?Tx>>EI}`QWLV-ue@`}1 zjC07vq8O8;-j@6#X~A0d;D#+;kh2;+?uO3N^bmnnXV>+o;I1N#1eBLrfd3nS| z1rLdv3=fBjbiiD0rKE(lTQ18(colH+2^x5s5=g4X)^l@m#Ce++6b`i3mrSnUTk1+2TYCqR!1}DI+`T}Q?0d&BlJ4)6`rq0sy*h4qWt$FxdTq1`mGsHGIf#5ZJ&;0LT-;^?f_d9<4#K3|9HXPsS|}s-8dfX(efME`EgG;T z7NOK*bZn)Y^!r9I@Wx+$ zfc~@;(;6#!YDCt+X6k-TqhBpWX!fh@+fP(zSXa`J3y&z(tAD^A4Mhc1j|uo}uxZzCB8s@{59GG(NN9gk6rkS<>h5Cnc1B2xcG>(hgNA86b?jdj(W4$3uhM$Wn^VU zYSNDW&CVY!=$YJ9Dlbp<)r?8)7v>})i=f_la?2Y#Ha3pF>D#&DdfXDG^y9)ueTvyD zOxA++J%V(ON^Qb}RzazXD&j0HAd8LAem_lN)WuN{%rD-p0w zMBNH9ntt}G*he^56-~lwqXJ8f`9IDY9d9c_LrJDEw9SyR6h$3J>BGdOg66Q)$_s~C z^rK^`#XQ}wlt(7H^fs$`8EvtWV&yHfzBPUYtNBHC38G>)U&bX{C08llrl+b5ydGyX zLdk1jsIdUu_R$Fw``-ui&54R z3lp&(KOQqZK{2-khOY|)|0}+GX4uNVta8*FO|%@>T{I3;>BaKMuvxNwu~-c;7;2p< z)#{^IuWxMT=r7#>Yo8o7ddqQuhhS|5(QV3kTQ&?29=)%;3RPzlURY>RXw~>-JZTSY zo^g>JKT#!>^(ey-`#nwvv|BbC(V133c)IBUvrB+fe-MGwQ)0!&a9Qi8jI~w5h5C2E zLs1ZIJ$m|h{Ei;CM|s~rbA&)XAZ!)0esS|zD|*Wo{{B-T5u3*qg7Jxg+T^}ZN4*K@ zG0e@ymQ}T%vzJU`y_psiEcx1OfVl$Akl=;@wDlWmFfcsFCnx8JTy?06v4yk@St3m1 z_O>Hb@(^diQ#v*~I}GR&h$|>r05+l^iGVPiiJxs@??oITt!!M5_UjC0U_9ZN^*>7j zx=uEEJX6xZ11$_P3eb+=B18cjPU0ElV7X34og|XsmCobmJRZpv5rsu5Tj1fu{O00|g@r5MyNp7i;Whf9ESIUm@B|Isc9c3|Cv zM+y%d;w%OS^Ndlzg$FzuoodUQP-7W$0LueCFpJK73BR7p%gOZ)4yuP#(aVBMh5|ZR zAoobWp#t9;7{Cxd2udg@WFV7+$r8?pbgH$;3$jt8w?FSGoa;KOpvyS3=Ve!1g%FDp)t@IfdjkK24lU*lDZ!p-y3o zR=EVndp>sKL*2_dHHYTDTX#7kJE7YGup(gJSFc_{kIX$lOBMr3^H3xQTna(^QTe32 zfx$0_>WLC8qPyC-e>=-tZz@VNlDs^r(pm`183s8_y1OpV-)zgD22w)3gv{XE&z>VwIfWSaXdEl0yBti^;tOH1S z2+7VugRM#g052h4*xuO%WF8>H5oQ1(Bp`Rfo4X$Gn!ro?kbaLwxBH&W1}aHiHKl!2O9YL83o=X|}pq@pQzx5Tpj zfEt`a_y}Z`Kr4U(6FTqdxVVU9n{2xXL{(!86;c+vZlNptpBI*48NF*Nr*u)YZxKlI z>P(e{*48RBEo})i%ZP~+QCXN zx1l^oT1Dnu4GpPLR);fC8RzC;;{zS&3b-1f=A4{XTmH?ev0^AHD)#&6C0PKa*blH6 zdcbJF$_jQ*sIviz1D%1iZLF;^#nHnd7zSAe04XpcP(#7007QD5mR8Ip3D!=4CT`Gh z0f7(Ne7=5Ffe?qBKxmv`1L6)e1z?`5t|BUu;BX=5iFF`H>4=PB28%0pabr`C@`z__ z16%X3K1DOR_<1U^ph7=1r?9nvSN6HTa$RbjZYcuDz^e(35zt)OFR~KEr>3ESuAoZ^ znLvCSc3y<#Lr8p*5q3Ojia+Z#6b<2LGI6>3YWWf*=C@5Kh}iA3Uruj%F2BRS4v}5r zUbek)jwL$IH=s4Nd`&y+nO5$XVRa67Nj&CE3cD z(78Ei;5TwFvE-|;T{)J6;itpH_tMbfX-R3DT zZjAr?=uf@yzV_e87OP6d^3U@!r_r;TSLBtW=?d}UTY4Yvo)*GYgV{_DhuZ%!j6BV)O` zf@~i&?pR+9Ue+1M`YP4>pZ4&3nzAHYu8p9QseKbEH)=D~xoFmB1AYe(MQ&NyGp{Qx zb#-uc0+-tZJqpl>32Y23`v(j?_FuLmz=t zdP4IAQYoZBAVoljLU?B`u6QVK^x4SD+b&Njp%rz*Le;alK7mwFB0|*RFo!2jB|NHv zqfw(qQ%u>3>tS6A>9m|(eQF(7V|NYe>x&7ai-|8tzw?y<84I?-Xgn1zBkZu@HPafD^_A?DGvs*>^vwy7ETuNPrCnFnM=bZVXhAh*# zI=qToNAweY0lz3!=-pa&d0#>ANrIE(X$gzdxp# z;2A6I#18$&eD5|?aGuR~Ac`^#E?hm)*VXU_jxuZnhQrG=@d0~ED=BV`MEC&#BCX{Z9@?PM;0M#fpe~6MQrk3C-+Fs3Pz4* zLi$u%7+|aev!`Y{%S_Z6PT1%EFG{wrlV1b*=7#=9Gur3r?(o5=FYX`D;~!?cTCynG z)u?Q>pPl@%F|Noo9YYy5owieWF$-Ib=KYmf2u#z=T^>^5ZR#>~dC<0p(hzU6wfN#q z3Ei}%Ev{=X>>)OL-8ya(3fB}7D#pGOJSA|S7_-!vY_V{<@N8^0vw`f0bZp8cG$+TA z<$Y$;4oh~jtw@jndyuA7F%fIww6^*r3ZbT=^n(5;znV)_;nwRLO?SE9Tz{L(0OA<* zi^uQJtwJ@KnOSb#dT>*mE7NX`K{7S+(W)*jcBnY-jFnUFk6#gIL@6xI5jRd z%0f(1Yp0Cq;t=#q9Fl{aTLc&H?d!$UsoMUxuJZ->zbigTF#s082Vu~0;?s<`GDT(;}!-9v{Q*vD0 z#DABDc#hHAnDd~Mnmg)f+ha z@Bn=_#a$`q?xVU1TMM94fzYwAcbPM71ukB$H(!}z+)e#}c>Evjm$&rHvMM0r_oqMh zy;-V2Iu&P_@L{SOMUCv7wBenz>=szCa8+$+ZRu0F9S1bJG05xt%Y9k2_v$+@J`CRq zsHQb+s9!jPeu?H47fGh6q1Os>;cukY>@c)=O4ggujE3P%(UJY-fyCYvsDgnLMcUri-GPq%41G0- zfC3d8BE%wX)ljef_(A^i2?~G{S=sO$cZA75nR_GkA)Vh%3ajVO&JNPg000nFC>X~> z51r`WzNx~agh2=0Tb^8x9*Kc|56y>2yTt`Oy!j(mknWEF4Vc#javSZc0k( zOF9cqhw<*ao?6{fH#rWC(OJw6mjXln)Hods04G4(Gt{?H0C0n<0aN-K!8_YpT>u)0 zrAI|Y44S9Lui0undjMs1Jagu1VGc^)IZDe~7?7*b8-&Q-kRr``-oW#MSAm3zlx&c` zke-{>)oNtc1`j2mO(=$-Co++wh5Tu|V?7Ij1kzg!WiSxdpgj+R(lY?nnY<7+^q|i| zwAzc6)Mu0=$_daBT zu@nnH(gP6WDxl#h=flx4>k{@u3txHq7rpn{Hp|LIF#trML26rk}P zDYGt#;p*Y3BIR5g;Gue_d_cI(+f6ti%DOJS&QX9%^?{wD4B8eb8&C)$gcMG&8l$xTb1(S~QORJUjxJ;yO{L)>E$7Ff$50_&MjkMV z$K~=H)ee8;pEa%g?b_%VE;;Z0rNx4Nuq>~SSL-BBb~q4Lv^wC*ADlu@+}yaFT2J!! z4WNth@AfZwxH0gyfGx<#=K0CK1>zR~!xKDpr12CQL=F(S3rrdc8Nv7OMm(S;d{ySg zyJu;2t9DNRLhyT}c%W=(IY|EC2x92p94}NuK$FMjcW4s|8d?3&+)N4168a*@bh6o@ zQ0o9PL4odTSpc+9-GJnY91;uBP+(6qHIq8Mpv(kC3SwFx^oj#Z02&n1tW!_`77~_N z?0cn`aIl$KS)m4d0~-knGQh>~nfflwpeis$RM5);&{0-Z?F7OHPIZbp-oU_sPM!U2 z(Eq^@a9uVIn#43;$H4}ME+oj)N? zL$^?410EibCV~q7%>{@;haGkscz{rmc{!dSpMyk7SUop73YM{M)6^No%GTERV6Q`n z8F{b<^J}xlr`|PFA#Ze7b9!Dk>c*QZelJ#ea0!;55zsgyN`8=z0U6&Anu|d?6x#2l z1Js!cBoe4(K)lFtvd1=TLWe1eoN74^85{jFu6C0;(vfOE3vNh365az)frIKlkRzfoX*1aK+f)dQInb`?l5ir^FD zjC~UmgUZxD06YX}`A9<)94RJZRZeC$aJT@P+dJJXU)+144X7B*co3o!_V!$meyAC2 zWE@Os{p`Zgq)~odou+IKW7*`y1k%p!3T=C^YOtP&sHflLj&-y_g$YHyhUYEO*b@IEw!157E|#2Wk{PuNlYQnD}ss{hR^fDdv>x+d@EVC})_1NKf} zMiimAgm;2853)-Kw5Ssny_ht3j_86fkjAL(rcE}8o&eq9(ICyD430481cD?Cynw@W z4}uwFLr@hGqO(DDAjzRYJb}=j21x(g*RNu5A_3<^6B8ekJ9S3z-^x82^~OiVD1`_}a# zoU-eP(!a3O7ms*=VE@d!Hp09K);Rh~n1b=_y^t)pAAoMkbn(<)9ujOLRqHfo8?H@9 zd)yUah*|dMkA1hOk+yb0Zn2WQyjmw#=2ihv7>8L(yolL-N2fPS8@3$tB5$}OvsFh=OpCw&|C6{eMR@O1)HiMS*t zCI}+C3rb45HjgO0P*uf7Z)6ZX2Z_L6!B8~*(|Yxx)M zK2X(ZMpney&zXuFE7PTFyR@1kBt-*~7kRyq(j$??!$Qkw;>FmVNT&Gm!vDuC?} znLblQ%8)&rs9vNm&_sWX6|X;HD^trD zkU>|7fnV(#gG|rWttqA>Ugj8SZOT76g6UJ9RaL}A`48}){iM#=j(trLKmB%N>fz4gGXnV8r{sN==$DJB|-(WWa z%>VBNz%_Av$lLWS0|(n;?vi`9?qM&qc$*0wi7Icu`{Y*oOV~Anm|#`n8~vka&70WFWOA0$9&w)QY0JHs zg2O=;8qUn2p*fU)643ce#M8)kuj^|LqPX8N47f9#5j;;oekU~9=#@3`8|q-AOV={# zHOx7xU845$&puW^12PqF5(rKtX1S$Y%{R{WgY9k z2z{d&mJ=Pwf{x16J>I94*^It>*Z;v)ml$1)`r zC8lZHUAsS=kQ1Q84BA)q@X^12s}4AGlap4=#QU`yRxYATb={iVmD(l0tF<+_vCsde z^M!=+p}Zl8X8R~k%a~ilUEtx~-e75Pi;j*%2v>xC{Ci42Fx?e?f-}BE+&n9jlO8hk zga77D;=8zcEOi;a*{FTxz^zu8q$N#brL1I@r&quMi>J8`8^+?Ir4Emv4iBfP|C=6K z>if4Nv!y?%4SeYt;^{h;k{T2t#Ht<6s1}ziHS1q z{TJXqo}S!rcmGqw#f`YWAU7V)+i}9lkGixabcEhtQIb;+pWReQb>k6i;olVKn>EDs zGQ_!7T=zusA+G!9lh1Bkui|}Zd2nyaXM0V|M0H&AWO2^-BM2FVv1-Uvsl6AhI4`xo zT2g@a$kr#og zhwKW4Bm^YzWs!!pZyvdVG=yZU|Bd(o4sI7F)x-`gL-7bzvW^OBpLrb6*DQCXI8$@W z%SWovB4%zO_5DY4#PAKiP4e=|0TB9*r`s;{pgMpq0nKUg#M=Q$ zM=GRvX%1%>d68z;z4m6#_(5XTgNu)*$*H&pZrm6={qP~n2CcYg^z| zOplP3j!oUx(Yqjq44%!KxG5H2nHqkroJe%q8x68hgubIVc;98Z(s1L(Ze8uXBIA%} zJF$4^3RTjI5U1(z_#a1{;r>e$))g=+Rf9N1C^Hv7q&UPEve{| zgH(8rQRCe_oA0j*@$vDmDtr;rTuqltoog0YozhkN{U$nfF>duS!QZal-tj7#F8fKx z;f^e?wyt!HTz;Px>umfE^>61~5p(T7Qclu}3Ibnt^vy{>dFSSFG``~{28vejaQ*#(gzQ;J?~KY-I?{hQP%wN)5U64#SS``g4?f~__$ni@D^wd#EryiBFM)l z12qydsSyVAfnW#1<85kcM$*Vi7{r0#W8g)=X9@HRuq{eZoBp&<0_p-BeLx79bKYi= zcog5KZIca&6QB!%3gNQAmnh2^kM#6|zXp1a;`=JVUI#lL9BWHpf&G3wwq8RLXVY_~ zyi>hVrM#)g`aN_;(~SX(uaWAHE8Fjv%-c5_iJD(6kErPrO_pq$*yEm_W_yJ*D{Gd& zs=w7 zbY6uuD*;#1V4HXnN$9ckCp4$kT9Ei1E0LLYV;nQSh3m%jJBnh~jJ~&aw)dEb(P@R` zQ{C(~&2{KG9}S0BtysDXqf1d-y=r!DIl8g6f%LEE|e< z`@(4ls{W`|X*r|+N|I!!3nCwNrM<&ExmXE);yZ$KjrR&W-52NCpOLS_@MH4U?re+nwwB!6YHbw!gv6U*ASdVtItfmf$0RKcskW(dfJ* zD*0$Tfw~lTflGbvc4PLGu<%X(u6kK+&eq(b>zVA|JK1N^<#AEN&rW9)9%$4JCR5Iha^!`sB!kIP30bH@7r~uIDt&EGAs1;y0BCImV^GOoAv9&_FD|0+kZv#h z5K9+P7%qAn46!f`2H<{NUoOeQkJ(vAmj_E{ECFQCuAD*#3z`VV&6=AQ+zbtP(s%mdkH^zkD!ywL6sOfk zh;yc<#}{B!ij65eT8_4l>sS;uUFzf-FFW%Pmv@vJ<34{(xhs{FZNs*!K5ysCUb}g> zlhP4gk?xx->z%F14h^_J z(0q5yyzsxe)N?*{D6k2<+GPqUwrm?Aq(!SNq7U?Yk*mF2S6BD#=TEG5xN<3&83XNg z&=Y}7R)o$==r~ELFapF2ARai{Y9JZEml+Iz01fFDT1Kkj*WlbVm5qJ-20Oh3Mz}#y z4?h8M6&m{>T>sBhQ3>P$sDz+310#quGuqj)fVj(;JfNbdCr^V<0}W2_2ly%A_3y1j zKq3QJhT{PZ4W>XN0OZfv6oAN`W7^qt8!t=;d>g<`0wE3dNNr%k;LL&G{i!avg9f&i z7im1~3}BR@1p=J%D|oAB6@OVJsGU0+^)4u~Gm z6Z>2j_R#S2ggEB5Yba~P@s%rG+R$)#C%@To{!Y8ymGuheag0$=nh2kdpYR#)?%-U? zOl+9{T}L;WEg@lWA>hyJ$bTWr<&R9v6D1$PV;X)ki#$GR?hhI|p?3^5^h>$K8WAn;qp*Y$0r9Zb`T7+*tg z`s*7yzAO9A=^}VR?z-_>W00RM+uftdD=XXbvs<{-XM#802*1p>y0e)aZ`J-_EJr2fVDPwbEHUcClawOX zu?*@zo}VOK6b<78OVKrJ9}xGK(%Un)?bpq?KYt*a|F69si`PE?{LF%EdGNQs=ME-cYjI$96f;am(-83=V5NL+Hga=O0cg z(jv1-CFaQ=sS6hKcJ~t^kMzXN#X9!L^j?Jjm9IP}={K7C?b-cI|Xdg-U+{=~ZvyfX|kmESAI<9?=zmC+VlP9zEnsr{W8>P&L}eR970 zZd!V%+F8~jUrA#J?niwO;qj!maV_CT$T|lKK?k4@7uE9UJpgHubgmY zCcW-5%ls}U!80?vZ$13kH1i@G1O`KuuW^YDxWA5~+iElZvw#zl{3pwDOZrJ#>+hDh z3BQS=Gt6;Ell)u{4`tePG^f$@wga1~gPM{SE=Ev) zG*YE&e&67~AKJP7DZX9ptd^+g8Mb)k+?D$bbN8?y)`@t3hyccYVztpfe7IlCJ3Z8xhh2ZlZzQw%R`K>L6Y{BhM#jjvWqeGu{<0+t&eS+o?9@H#8%pP| z^#!CZR<6XeJTFN8F^hBNQ$E-%H&i?*4e0&dmpNMfFQ!oEAI<#Ax7Tl$Kb5~S0nuw! zLI=E?nOqDO-z!W}&%fVIUC+4HYOjlVqv?0M{7NzY16z}2%O5qUb#v(Qnn@PD)#2hQ zw?a1tm?p-z>7z12d}(Qmu=O=MD%6C`Cj&Elo@OX9cecH?=v>!+pMNKN?Ap71!d3kg z0zA)I)Fba=Sb9DWbLlq~)dCGG5rYk{S$g!Du$13Pn*8}DFEMh?HJ@~cyVM6}`Fe=_ zDxSx&cD#F(<{!B?;B#Bx(u^=zx?uV^&AO~J9fN>J`;Cv#Bx&gLt$=_D(t|{*u)m9= zlh??U#A+s^-k?0;sxNia#x5-$IvgF~O-THprgqVnM^HPmA3?jt}HJ% zJPz+(QX90LKc%Si#SYL&GxOuW(M%hb*}g8t&dtN>O!vYi`iY9baBHj7yY}Kn1*Lek@Dtak4h^|n-+_eH)ijd7=9+6 zvW{jN@fE4C5lHToyywiyBlgqdX7V!L!|60ZKW^t3cCqWz4ZBmv90|2| z`oT_{RYt}CU2x~I?(-!Ey)O-F$LCLZ@bQE^Mrku~apHJS+{l0Q^AM*4|^f zr?jngX`j4dSx3<*x-;F6qtt0ct6%g;9>AkP=VlSnQEnK|R59TkKc5 zb%9BjQX9Oz@}=|w(7MWY>qA4gHIKs;qGo*L=xc3{^(F_~dHZle zihcm^?_aD}(A<`oKyvdcVGFK#x42d`|M%L4=U-c?<~H<(Oei}XX`RGbJ3P2bvC|kYMHY37=5eatSABMzv&xX_SE*XLqSdMj z9DG-~_)ooG@v43FzH6y?ijxp~l~<_C6)jJnq-jCoLZp|R{con_&lC%X=$m{hb*FPn zH+s+Ch&~VFbopB({cor3wzcTdJId`@Nd~u|DfTPA9np)Bqg*;T1_p=jd=731WmF0- z%%=QALrYvI(dR#>t42n~nf2Hh1iVmI@Vtmzv{&JABw3=KeHo=l;kan zmmWRVzJ*iq>fk$;Hpg-e6JbZK+CcxiyMh>0@~g_7xPDEs7`e5K%i*{+k*7v`acQt$M)X?!-X!gTB&`@SFYtEFI(_4%=A~c_RIy!X~u=HFF zR<2uD)sfLMqiubs$2jWct<-Z{?VD>rf(_@d%YhK*@69gba%zR1w$IMuaeOA));dFJ z?w9Vjs1=;6hx9(C&%XL3F|Y}Xjo9Y9)t8RqfJrfC)JCQ6>y?_lq)Is#VyzO47!v9# zYDc~=vehP-MfOj`1kvjp+8z_^n=zP_^)g5G;JDsE*ZeVcPu5Auz@g+@qZpO9`)qv$ zQxqBq1Yf@SJ~~yL0VxDX1))a=m%y-#=nS2G(t7Na)}%}uI?FJu523vkpYYe23l$Dx z`BR97UamUTK@kOJ!C4&@mY*KE2x?41uN%n)wCeSWqRWBg0t^bsv?=^S^A)ecuwQrP zE({aHFrEn6-s|GeJuAKJy2KWr#TkDL2A2N{%r?T%z74f%#$R z>2kQ?CzheYoX-|5tL<>(V+;KGe=SBWHq+N!z;<}OD+R?93cMFJ)7z`o<v)w`zVX zbG2k+@&1z7K1`Mz(Q%=&VT}Jx|Hvia*jAu$5XXMVC*$+du^>%p?R%@m`)ouq^R-9$3657 zTBYYMlSSdT1jXEzx6;yzy%);4oQPZ$^PNtpvNv%K^@HqFYAI!Th6K{oR-|^)DQ=bw z9&Z=i$*iQ;&1S*ij22Up9?P$jP8;r1zkFYSH}QzUIR~m2o_(e|`zP*WZDyK z*RI#&+xu-{pKC}&SFZ8`%NRC#A9N~nO!+}i9=y^xOt&vljX`<-)I&NPJkQZvI>Tv% z!WwOGuMvcVRiv8{9iytd2-%bm5?PLU;q~M{CVoaL-f`QeeZ^^M-{0U5Q|u7;Sbt*d zkQ1JG$4b1&G~)xKQ>OCn=$=HEYneE%Ck`di<*EWszCYG+To^OkcXV=t0!FlgYE*)1 z7;fp%DDJ;}gcD#d&YZlcPIwDLy_&ka&fVI~BRrj^P$u|;x7KT$sq#R`)&PGC^=p{o zn2bAGdGLY>Uks~Dw$-tF*;AI8_+{x-bf9yc-Bfh$QqLK!SvwZbOh}RQgIBkoN6Osi ztberZmh{x22D@q|u!Gg<#ZS`}PxCm_%mSy{JBuE*M=dMESU>eXGS0}RUA;DnN$SwA z@OSxpD>lO6m{oJWNGoV{IA`{cohi=3n1Br4ErY-3&%0V5L>^Rp-Z|IQ`NbLWV@LMmVFJ#J3dw{0yKjW#w8@^BJzW#lV3-@qF#|;Ci zrM@MfNbjFqMw!F!pA0En&PUaX&L02Bx?LuGBc|t3{=p%7e9nsl!WPD>FAKyXq7G-B zHCBK8VpM8Qufz^~&FY`)kG`48MF<+Jb z=^DPE8sn{Y+xr}Zt~!=4d4qg<`PnLMA7u8EjHAh`V=iNkKFNFggV5)@1}&>BM~u}k zA_|iLl77ttG$%2RN6k$`cf#c)bEp4KyL@;{SdhNpFBK>?5ZRXz@Uvp!Urd8@vwEl* zRlJxkGgOZ{sI3j^j}+{?uFbrE*39nQo7aTLYu%y${mWl-fk5NW-KUSLFGkD8l5gw0 zty0o|cYAVA&OGk=n>Ln_`y~Mw!D9KQl$nGFY8YwZ!zrh$iR~Fuq2m$;Jqqgli+YR$6kjc@@!2>%Po;CtAU&gB@Ek zaVu++PFXo5L)#k9sk>LAuJo2BDe5Q|XImeq9UG(3&!69E5~x%zZadw+w$cO9e5^Qc zeBvZe3#P=tCH~3PZFvryT5K9W4A3=tH$0qsgvs7!O%W_PRquEub|9gx^eB% zZCaI_or=35g>Y<{J!>f2OX8z^a!4!|%BNJdM@;haX-p6P-B%o)mBPtI)(1a%Ubi<4 ztQ!@c>b7qEP$Zm;xSr^Ks>p#V@K};GYS{FljTrNI?%PD^ptjYeVs7 zZIYK+p?U9~9+H@Mm#B~1#9L?|2j9Mz%7bsR$6SIEA)8qk)NB4*+h6h0_jsiW%4hMu zakA6twDEnP`%HVNZo(lCo1?GT3jHK@q&q(wj)7UgUHmrVIdUXaagy zmvJ?40CEcplT^$uP7hrjNV?jf!2^62n6oOM5l<#1S;QqN#p!%2XLmd2_4DjTqXZ1b zi5kkEcH|p%;r5)jA;~I?tVpGhGF(is-X=E;hb`Pm?r{zMer1G4qs8cp6y^sN+&A}% zIg^RTIY0cECoL-HX0;jn^MA7duM%~Bo#AtpD8{`xlkJj4{TdkFeKU@^Woa);NUegx z&?4(0xh!gNN;JARbdiv%>ZjWRIr;fZ(11V%ceP09OF+#N803sGJqXkYW(GTrxey&( z)tqNMh$T!+?$;JNKpzV#*4I?+>fBFCM=?dEq&|+0iTT_nZ?dT1=*F#hRYm0#?I~d^szzEFfd?DQh@IN3B3=6Yuf>ji@m1YjDs_2}FR!1zvx91dZGVyqh zrYTGR&R^LOOqf9*p?&vclzkNc)ktL|6x!aYr-pyWQBBKHvwGkAQc0lrwM+ZgkYFb2 zEGy-~GP_d(udt!u0oAG#=OSqtZ>x^9@Sc_K_Q)Zg*ZsbSVj4tE=SiR!gsL|}$N@=P zf0B?KM+|*T4^m%ciB1FkisKW7|B2a|-iSBWmM@3?~C*-A6Bvw6zGhKP}=x-(Uf|}{ZnT-Q&=dtDa z8IRsb2|JZiL@hQ%JZJ4toIxK|HIQR2Ub^!*f_m#o#aVp-hQ9=z^8Q#)*N-JwfC?ya zZ%(*=)GBDsykUr>jh5BjJJkH3!=d?4ctuFSl-l1gT>9RsZ<7FW&v+D;{!PDGLt3ZM zY|R4d1Q=ccG63{J#?UK)hE@c<6jYZHzenA1c2+Tl$cKC)!5#2e!Ib6XV%G0k#V3gj ziHeauD-*SES>g6UNYi&%ep}gm<=YqXC9E6{pM1(-UG3cMFN<+s150vV=XGSdCw(ea z+n8YPeH8T_O@nW~o;hkNpumEJj>mFJOix88osjx5Y0IBUFVlhpb<44Hs)$Tyy|;}t zVcA>CSVkYa?CBB}W7q{%M#{D2Qq=JrMt9{6p`Sc<49x%-?uRA;0v-bun> z&CUuV3QUfeo==SCYo5iC2TroSn2`$+i(Tu>14`fU;_R(;%cMxtC- zlv;Q#`7X)gcpdWh>_4Bc66LDlR88xC!He2&*?du575r5ZU3oatqL%M% z1LE_s)Deb2`U*Fp?X(Y`I;GISvZ-BXK)j1!tPw#rL1z$x$r_qcKkNFB)|R(gmJ*9e zOt|ZgZhCLB8v^ouh+T&io5<+|rvhN>BRT+o2PPJjrB0ZCc#pd4~Zpo*2a9d5W1-*_~2$^C5L zk~oe}O#R|T{Q?vg^BFZC-q4@p@f=Ok-h%oVal{$~7jASbwR|K}SI-}%}r+1bhmMAp@TtxZo= zhKQ?u@G0WVy0x;n8;nd~=il4g`&<|~K+56}S4Qy;`cbE9Jvh2+j&q6a!n2!MFHQN( z_Gp6JvJxEP#vRwT)J!Qb0i;qiAX#6h#1xk@u{a=8%zvo*yG-{&>@EFlnG!W zmNr%%!l~-@taudgTQLPq07`*=V-g&sk4568p;@=TzD!-B?L z)nG0qK{yc&rJQ_r?`5q!HEJYPjW^!3$)f80Ic9}Hk=D-4u1x<s}-g+p$zK zMRHL;9X_1Ohu_g|IL=v5;z!P?_dwF{2rGf&<0a4XFI|6C1Gi>{ga`M|)eLpJA94Gw zvj{ki=ZxoR1c()v8Iw?dOpF%Wc_VhMEd55#)9X&VPCwD`d;fGAz3}(XwW!W?$O~)P zkgvm3eS97D8n_k4IV*m$(WfD5#?*`Pfl>A(!Kmgz)+)#m3XcB5o>_d zm(MhHO)hJ}=8pshKaH7`97mh)u~Mz?NkARS(qSlIae5Wg!xbz4%iZ)< zztgJ$W3FnQLS_^D&Wzdm!VEl+i=B&~40-7@OmmzB|B9FY62$^FP|2xvhp zFMXx>?U=F6h-~@sTePJ&8PMc4lbks4XQ+-JNO(U$C$bnBXRSXbT;OAqTjBg4)1rPe13vwDsPe|fRV`j znCk{Bs;xMB9C=Q&0b{GNp-x`0>OzL-b3Far6Ea-mS zI85wLvhQW7ZB=er*Wg(;XNpC)mB^hW@P%0or4=istbMMYSJz6Aa=%n7_pqF0_#^KG!eOhX)XgmFx9-J3bcg+~uN+sq!=Ij;k4Zn4U-OKy zpwznUo9UVJXCmI2 zXnL$oi-SFBG=?jHAzHAAYsZ1pr=1Yfp`24Nn6Opbn$*c896TsJdU%(9;4tL{vEx2v zq`%7QmnZQ?Sz4{!X;sB;j1p+AT~x&X8MmQJ%v8mGl05W*~>&&$uxEb-iIi z#MJ(luokZRO5m5on-kcFv6kb7VJgvnD$&vFe+Uvz8;Fi%a>w4QU`3Z2saW6GXCAtz zN`4xitfO4PgEe){X<9zGJ*ei^&wjFp1K~8^oBqUl(F%D+*dDygF;9#OBJ1r9ao7tV zFW+a>`LHjw8a0x3cV}J4J$VKUU4cKUviYeS8fJ0~3^gVR1ptZ6xQ` zC_DMwu6PHed7^Rs-E$WA3&xn+MVQpGNv;|MKdDT`bm(kRF_Qa?e3h#qSGdl!o-8lTjzZK$T#n`StqH!3Vdm^5IN^UE6 z|EKH1N>10S;}b$bB?8g|!PLye!7BQtE+z(@MD$$Mn%lA$iKGq>Nj5wBKdbc4&M!|f z@rH>V^2zYpEb@=c5{{$} zqaBS8^jmtpCH!D>Ty>2?I^Hn)Xgqc&=mb++l>c^*Z4d>M1dU_uFAF?N55`7MW>))0 zD(Ol!#9IYy8`awz0-*}eN~A+jgFdp2(CRnz>`JdxihpG)OVY!PtVdsnQ4(PFcRg0+ zd#HL@eiEc(`873CB-Lz}5AvulGk+yF_%5AfWKo-rkB<}Xb#@tZY2bO*g!h?3IAgM1 zHbaP=xtccT7iYd6dh_={oMC9Aia;I5d$K$AjZ@1aj`DxVR#~@t=lApUN%QjVvbJsM zbv}O(_EfJg_@FHc*Y%d7t%?K=Gqs{au>j-T_3X>hn%vh7N12LS6E#%EuO*qNf)^r8BshfHf47lS>|Wk)2r}WZxw_TRO*&#D)p`;`y%OR? z2$_vZl@Zp0Hb;K5jz==&5u=MLIEwdsuTOr9HdSk}ex=)aPoY7`)L*|4SFBHPiIwD~ zUGRZob6(WkhpC15LCzo0>$YxEpL3S{oV4y{+cQ8U=Nz4sP&4_fiJkh-Sb94>K&Gp;|1c)xb#>EnoX z){nG0zk?I3CA;m5uKaC9M$0A{?P9AslG3cm{1$A*FEL^o{wk-;2F%Lj7f#Pm-tO&A z_-noBvbp}1>Tups&@VrQeO3AEBMLYF61fM&n=^hr`ZC-8b9c3>*7K$l^CkElB5ZSK zsCk~A5OegAN*NZOey7q=j3vVe!w4)3%$g!TM>h zuGGEj6oKR9D^(%H=un@C@gw(j-NWc^SKBx9UShI0tX(x=0J?qF<-uL6i8?R-`vob51f9z z7nJk)=x+6)TKbU!376cmgON&6ZOtzlh}XinawNqE0S9Ql?ilwt)MpUpT1cg9^YnxXCI3L z`i|R9!4dcGkB5X0EIz&a=FT^#w0*Kx1zVYM%Dj=E{elaB+4FGP(9#<$ed8Hg3k{^l$7NWZSv z{Gn3kJHp$@$eypmNbUK0 z@+I@tlGix_$jM?-_C^UJZiD?^yG>Plclnfg4l{!%^e*mgUK`0T>P6xqysQpTp9Gi zkRrvx_*wr=p);?}Px=fK?$`0BcYkbShsRG0Yh+N9d5I~E48FY$rHf*=n4T4jF~9EC zLNA&y#v*w^tgS*~lNz1EjLn}PgC8>zGmm=W^li$nu?;^vb8q-?P&>?Z;u)|P7+vWS z)01_eOLmIi>7d9E30MGDAt&a>YuTkL4Q9$;*@*SY*yMlo@EW~**A5W{TjXPKyI2e|DP-4o)L0&w^ozwRHLkHH zI^@okDe*3sp5SG#XwZV*9H}G26Am*E2m}mFSYcKIt~NZR!|UbWuxGKI?iHV)j9Tv) zSCa3DgDtbVdi07Wc~_srl;a+e&Eu1mL$?DmLZ^$KwI=uehNJJhE1-X=-|uDxD@4Uj+G{DWCERr{N!W}&xt7>Swyg1``Kjzdwn;J*ZfcjvpfY^wGj0?5%oyJEo zTEq<%%;t|4Olam0fl$z>7ya{TI4 zAJkt^MujzS-oJZ(12!6h+)RRc7Geit2imj$jL?PN{j;5Ky4G;M@&I9=HJpwX?E}m>20+=JSK6d6 z27A_8>k?uor-X+4mr>eC(d+tGr{8?v8srIu`EtDVY^I5sjq-s zilEKUE+B>gy?Q(DgL=eq8+kHEvJ^(*ycFFw`m?X+Sdxa5>y~nk^MvYfNC5}%Eddm< zt?jTRgaoX7iGK_!(kl1Bm9s0ffK z;`q0eNcRt)>nF>MB4D7tPYewrV9XPE9cp@+%myRUV6bY5fTBBs(g&9CCxM-Lg3EaV z7w}AnE#5osnXc~E^d6zQt~vwPs-#eLRFM5&pU1lyq4G~_H2)mngZ^g)s3+*C?=4PP z$V&nwqX<0l>%Z1}mn2Z;Y2m?m5^zzHVTS%b5+cul*f8w64!oNH zAmnqwJ#@ZbF2LhP59??NB4w=xFbZJG7hzk3K0~Sdi9K8mSlQ>`agzxsPf#)u1-I>= z-W+?($(~dyhX5I8z!e68GD3Y+dnM+9K4PQ-d>3FMu$w$23r4&hfb0%WnP)Rh;`f8S z3jpo1fRzYOyazn$2&4}rnM3A3?aiS5_TnZ%tb99Fa`D7Bm`+1>)bH<(N&)bI`rf-& znQ#|sCFj~gW=s!)d(ACw@P_7exV?89uk^obc(T9ZAml3vs&5RXO}_x@H0|F5q8@?I zP!vX>p~gW?3*J0IcMt+bx}-0=;Oe85tN7XxVn*l;5*TZn-O;&hE{pCAt_hN}&nR5sSu zoWQDXEx$p0vGkp)p5s+ z$I&d}hk*G0TK}r21lk86XG*kssZ_x*0nRT3%7ARNAU0g6jcB>8{=(bZ#x{*CU|_6* zDoX{Q!CA4sj&qi1zr-x9@O)pPzTW#zrw{-L_=Mp-d$FC@9ANCZBtS4$L(@)2RubUq z>qYH7f;~a?o}hO~57!8fPopVu)PWn5^h2@=(@&-4JD`^a5u^4k#J>tOjeyexBxBmp z@2FeX7u_E5lxAikW*nuH)=%$?5n4zlH@8LfnF50yrrkgzg^#~_qZSr7Y^~4_0Kp6y zxsic^_r`{0FhxNvpQCQo4vg8A6;QxGY0QC8v++2%5wTGCFMNXt9H4x`b@Ty?u&qOZ z9L`|2%NOAB0v#XFOa(KsHPidai8Ju`IKU_$BJ3ADS&l^PJrG*|)=W)ge}BKo@o-Fo zBZ{hNwl`0B?BjmvqOI0C;k_iVgWvz`9Husluav;f%o&Df8m!eyN2W}rfjO_!ET1fx z#O=TmMT|!ITQ*+i%T#w2-wPRAdxD9Y8xpNz(5!@I0jeC>M83UVHnGnxMkTQqdAwp2 z{*7|~ur&O6_6VSesHmveem#ZuEm5G>N?I748o_tjj_AY0??%f4Rs-&RZyjip?7)-^ z$cJ#*fCer&?sxYNE?>EP0of~(LiC&L_g0r2i`pImI8c22?Wa2;{cq0O-xNEnDGFbm z3_R~*)M3x~zgYmE`9BgIo+4P67naE>Cxcwyr4 z4A*xZ8O>1ohpJC44xd_`RNi5xbV7f|sA2?29|)6xmI6i{#^0J(+?kulcUs?uE3<7p z#jnxqNPltvr!+~bD2nTllF z?D z=hSub);68k^26NZQHNZ$ZZ~F=(s}37Q}Q6=@|0)1kNuu^CMOo)YFyYe^1o<}UI56G zMEX$ap)-in5lbRH06;^BKVFlUi>oJOs>?z^iTYX4w3} z4}Q4d2pPk0+Wqy~188hVQDBFz(T{Vt;&bSx;K|_zP($01-CJz`-f93(V*y>zp54{e6BFl`W4Lx524V*7*CS zqOKx3_E){XbE{yS0q!Jl0IM0FAQ3Q_a8 z*l3z7yspGvcuile`HJ}T*udwPH z!qf+2vis*<_ca0JWC0-6$LH>g#DbT{OJ7p1AS(C!A4j|h{x@u}FuF7esHL-`UF3|s z8{aoPGZQktX#$;haA&7Jue$m-2jS#77&q|~h@5jG_ZA{;P+%fMNEGDKNi_ofSz}AyeJ!@ACT5V5uiZJBzd3%8QlW7UDJCsIKBtIeuk+OFhWD@ z2a%Nl$n*XLe({$tsbL&yEtK!qU9wy7*>AxN2lAZ&GKE1F)6BWarYuftJT%O$+kWXwW#i*7(`}hd zg&)7k<*ces3L_Mg)oq*lW|?SDk40P$wg(jq6MHujH2OX)4FaQVZg;JXT;F)E!2?Eo z3U%ucmzpq<%f~M(trxs52d-j|&Tiely#l8u49)=K1_8DuL)cSLdA0xG>NAk+_YaG_ z65;pHUB&>YuRq`K0ZpoqJNOx{jB4ut4~g3Zo_np3oxg`4hr~k=5w0Q}D6rpI0wcr> z7}5c{8FJ(t#5bPA!__;O_aU$cp5VS!<3B5mvKX>bs+^FF{8{}mHBF~N4ZS5O6!YiK!FJeLO47(3AT>TkfAMjytw=637gN_sowyf7H&#` zQXbUEAQvIkAPws%$}57*1oCl%RgX7TR%K#Y5}lESn-Kazn955$f;JE1x-b+(7hwQP z6@YU{r47K9Frg=#Sq&_lgVOtY%pmNBV=Ws#3CP1sK~W5@iGWOVZJ3PpKfb_HiTQIq zc(5GS5R7tE&$}==YqV^ntdqIi$9WUdzqP?=^;IKSh<hD_np(FoTo9k!i$Ln|8!@;=fU?ll63i&gHK$}%n03?EE?10yc$Rg_+ z#OTMJQo>>{U&gO|qJV->?Pg(mNy$)YA(j6RpfI}3zrPMW^LB6q*mJ1{JT;OUHNu02 z`~$pk-~n=iyJLsQr5)gnLJKzm25@KIpV|f`1&TFCjaUD{r(Ac4v?l~^@&$Wb=W^85 z)D$XBsN{aojXzOC$MaT|=_Xw+(XA~VeEZnApN2OND00<;z;G!P#{S@P!*+O&1SdkC z0sCVM8MCx6aUThkJfcynArDv2*BBZfM-cWUB@tkxRSbB88Ji<@vvQKypAe~0P*J5p zbZE>a12YbtG7zal!lwbxZnKM_>moa!PGqDdza1^>IQB-HC;7mc1 zn)AN7b9{(2>)|h%@ClJk(fwjme+}`hTBg5KQV=wEzRJh%yps?e1+g1~^2#Sr7(s4g z^HIZ*5D-9Iw=2f07yPLq`9c`~@(fU!9D7?e>qL!Y&7dBK8WtDaw7IK`ImB86p2})4 z+oHU4r;1DXgN2=d!)i!{MSP-q`%c5-=$@k&Z&x};zizlGiO_qDMZFStClti^5#l&q z4-G`Rn$OY=%Vu1ApUDSBplUJu*Uamm*_@7iHBTcHexaTYA*h^7kh(d4R}S!T0E8e{ z-D*^#P0k5cZ3dj?B?)H4fXjj7&jH-pUcRI2<@MFq+Ik~GUH3TX9TRs$&!fgkf19Qx z>?2WGK7Kqa@nU{K55EO_s!#3n)tC=SXFsm~F)9k<^CaWlU*ExIV(-^c19=N4LivQldIgp}z-M11WP*j z(*X#0v@?rvvrYS`tWxbj2WC^ffLS`p_L1O@X^THTEG2tDsNuC3Kp_J_8&I|$02^ln z1Ist-NPL}uCIfCD@C8t^Bo`oA{~}ot-qz0XQKH1n;Dv(c)sfc~LBqxNn>z-d--O>2 z8B&SsGM3X`F@a*tvXrj)RB%AE><8+#-jKzLud#MFgToD~j?U@GFsF!3Kl$yHuk!{} zr%qn)K^^@4i2gq6XLla&44W+99ff$A1h)~w@jhSK9#jU4(vywvie)#nmBTfU4espS zZRw{nVEmIF`Nz9)6RuWS(!dgb+ zVL%Sf*WSdt`mAP}B*uz2Ihct!_-8+^v;Ev6@f+~EJka+%-|LubkD9b#;O6e`5K|`X z;AbF3-yxtz z@m1||{)uK%f59}!CHPV=7b25qBATGONpia7n7Hw#DnGq4f3x=WKJVKQdkJqrOwzW3 z+j%I?izE}0_Bj^<73mCmEI&W$3fwr)R>3G;!Y3!g_!{^8>2?#xs(rTsUdv$j`jQ@` zelTX|kI8lz|A2EAdk8Nh^!$k@zGeLhN1$Jj(Fdxms#Eo%$bsB#(nSWW$18?R8Mcp^ zNflp5p}xht@_IK%L#=6daaD7sCo=AIYdRcV;Q2K6y&K`JigXFrS+JwTWF=Es^wl@S zrOUl#)jd~^q|_@KWuKB>un?)q-e*c1RFM@oAHOCmj~z%Xy>U-*j3DIo-G5Vdi@E~; z8tUKe?uH%e4D|QUyt_?f*Xy1!>e1WFZ?;qD(VyV3s#9jx%uVOAa6RJbD`nnFZ=#|U zB7<9$cW$fAiqK4vEte*#g~p4Wm|mY`U`c4C4TLp zL6O-;X60vMgSK?T`{#zMT?Qw6tFO64{7z9Oi!2SuuM9p>9{slD#(5OLfG$sNY;-_0 zF-sKprQehU`vEO{*^zqd)eIlGto;>Irb`>bnF}b4eMq<1w@K5Igp zFS~-BZiZW>TYJ(-?06~nCTAD-%^V754s^fy65h$pTkvUtk}K`(*&Oz0%p(*R+Uu2J zw9>aR68TE;(URUbpicP& znDGzp?%(+HyV$-I^Gk$X(>}4ES!a1TdE3mWxMrpZl{U4>_yH?-|^P_f2(4G8||E{=z{awDk0SDD_>R z1tpT`z0KskJ^OfWd!jfD$P>;Ir*=NUf#pf$aDy(hPp*kub&KvkYd87)3Og3pWtmIy znrYBjCnpgluJs+g{%c{Me)Ch_=NUf2PvU+v^jvh)V+uRPZVE+yTzUTfLkd?Sp4FTV z5#!%a;T;<7JYBvt(>*oKH%hlf88G;YU9hE-az;tXlcs~2RItn>n?({z+BeYqwdB}+ zVi0W_v)^NkOv$^qJGfx_{oAJjh1~a|{r|gqGe6{KF2O7KLBlZ}GR94=@BT19EcS!7 zjZMEfpUSz$0dYaWlF z@QuaL0fUntJcob*n_5_S1Bz-W-db$_fbAAjj$-2n92xv)XojJ|i$eu@j(( z5L}Od7L9ib8j0F1cp+esYTHBp0yf19mD4uj@7~qfa1y!!wfTvN8^)W~s_)-*lgEL< z1yzniyJb(f)W9Kxt9@7rKLW}MU^@g{S;1FH&*s9gU12wo9Jobrqu|#pv1pV~xZZl*tPN8TYSDOn zX88MZMX1dO_tS$j#cO!Szqhyh!hHtQL#dN)**Kr}0ZLdZSrfE3Hn%8*B0&TWL6Wfx zs8WkK1Qw)zj~v{$hnKhcotl-^uA-82myMRH6_*uDX2he@Doc_Bo8IUdHu8YMBZgAY z{3wrHNmn-%oQ>fkLH>_?GH^@}I{*r_$q<6i2JRRbv}e2{A(4Cv=xOkpEo=q31KjjO zC6v^33o59(T{C7et|h?c8?+A~x^?X?1)k~PlAjKgDFz3X{1?PUvLWV$R1B`Si7yS* z)lnPg2=3l?L-7X6qj4vP?CG)xLBejZZf6<4|1$$VmJAtGTe`$IqV_jBYZ6Z%XPri* z6MF|gsm<<>gg)SJ1@PdyRN#s&XBv<30pq5{#YI+je`H%LkYb4j-jy$ixNrmr1H^8c z*3pH0{_8S7#5WmdY|C3Tohg>wMZ9@Asv(x2@=D1-1qs#Ax`k$B}Bty)ogLnYwY>4 zvcJk~$twGz+(R|v+>GU5#rlM2N|!dJLyma33Z zAKlF~k^&MEugp)`p4Ya2===>k#E4AOgu%QJiQb)1Us9J;jH$Z@wDyKfd3mKC_mLC5 zkgK@vmP^oNQ1*{bQBK)#lF*V#>tf*_?(vi0qo7BzLI|9x~6rwR`Hj^~PsrlF5sb{%M} zI8tAm92K?1Exx;LVq!wM1ltFUi69X?Opp*mc?NO6-4XPHJ%ZDd!YbL#5lB@+IvMY0{mjx6KrnWKoGXJ0v{ z=OP`oP0G`cY-}rxU)#bts)}Iw__nU$rrV!qVm+%m~rqx+04ig|lDEa|0!Lg;0Imaz4G zDSJh5H)`6j&}%c%tGzb+>?0x;Q40!JUCFBjXuP+&L!Ncv7ho8*S#~wc3!)Fl-$i1fm8Rf8;y*LX z@D?z_3zHr{d6GAhvasjEby)>f>x+bMFR;Ax>qGN+{{8(+!JtO;Dzm1B5>kJ+Tyr;A@yU*QDQJk82b4$BSsc;*yae%Mrd)F$7Sh{ z|NNO!T1o^wI+S4>Cl%VE%|iq~e7fOkYpdiH8<}O{RtG;WXINU(E(0o!?*RgTXQI>u z7YbNNiwE9S%RL1Zi<{D#PR6WkMA|Z?j29|QbTDVr2G0lA??DGNZ!paSrs+BjvEKa- z*veB&QZwh~d$aHc^?X8hI{)1>mLw+02*p^$FMd_aMSt=*CyaQpJLCq+27Q>I{YWGf zajmptm60fJ16?;(SzTRj8u!}4w>`+Be}2Camz7#mqut1h*3*$=ME`)zNG+waz&?#B zbtpt6EIBqLC~Y2!h;2aGXP5uO1qY>O>6DkPvXG5t6|Xm{(VP+e&09T~Hc`Irt&pad@Zp+)&WR?|02bRzD*|a?eFsgjEkc!d>vvT7=%mzv|$r0n> zkFr7E*oWLcYc0WKC?mL+c%=yspP)@C8F1fooeV=~dHbMcFr5E?;WGi9pIrZBn0bA4 z!u2o0(>BY)Rbt}H`13=k!*8j*|2oOn5_t3tb1wZ@YUv3zcu2g9FN8NKK&+ka?Sx`X z=%j?7cJKPIBG+9Db9oV1$9pqU|HTZN1R+s0-wM{%51_4bc{X>op^kNSddkJZL{uD2 z3Y#J<+Y}4vdQzdFfK}KV9Z*j~ z2zTmIIc3O6Aprp-crcWJiH&XpxE~-YP~qg~*`p9;YUcDc!~0S%6F!uQ>G{0;h==xIpZIkfukT*~N|P4>pr#%!p5+ zKM&Iw!4Sy)`0=AaHne;(3m>|G$;uvtqVWD8S_TF1HRufP)*pPj?7yxO7*XgZ{d;(y zs76{+I(gtD#57_fG85?bW$PH8BWG?8{H zrG=uYLX@_oqNyQiq415iLR3WGG@j4pd44}He-L%u*L9ueaUSD+9G~IiGDe=)UOh4_ zmk&F!TULUy8kT(hOjM}U-}BLik@A6NX8Ytyp{J*3cR`$y)j_2AU-L^GZ$#Geq=l$s zp~$JDH6h%c6(~3$g}1b0f9m!0Vy5+%pDAqJsQ`MjmRLT3-?L zAcFrzlT5zQ;s@F)&h$r#BMQ`yUmCuJQFU3j-OW5Hz3Gg8j_Xa=GlDTCn+M~T}G{S zvyO6>{?SZ}y-Vrqj$(~r=(I$Ll~;^ZE05Uijmk{DiE9N?Pu)R207ZjN@NrjjNvEwC zO^Px@VoD0x!lH|ji8`5dkdHpeXk2+NjXg(8!BUgOY5h{FOgOixOj(d=zfYdS=8g!1 zvswFghCWq0EZ;vduBxEH8JIh4zGagcUsS2DRn1>BgNE4sb}BxPE@XQ__V6LAf{Z; z<$K|s+#!|xkD2%GMcYn=ytktFUws($v#qU-J4WxXC)R+xHzJ4E|y6A2H}RkdUfp> zfRq?5sv`JC2n0poKsOW(ioom*Of$kPX|@qBLDV8@3hN<%hBFq&bR%X%-~F-rv)>Gz zI0tQPV&EN9y}fw=C1a@lt`+FhbkFLe`?i|RnvJ@YgupJ)H|?m zM+RkV;9$09AP=Y3PcD!86+djH6q}p#-~l^k4wt@l$8%9JUuf zKGFC#awGTyAw(V%!wf+;VTd58B1fW#Z89=qFKb)P1@5a*6E#;91y8O_I+67>qMg!C zdm3d&wd;y)aLXUxeOWU%-$9BM1(At)*;hN8-w zDHnKm8P5(RU<^nV7!34vQ-4f$SwjFUE9jSv=4=BQSX~q5ftR@r$ia%ht`K)!jlKY4 zfVHf3DGBmxh!in|gk0tMk)w8qSc||H$AAVkLZjXb#2BG26fkw`QmIR?IK*|xq8Daq z5H>?!ITpHpLRb_~@5-Kb%VNfQCGI5MqlOt$=ZjN$30yIH!(Kac?r$SR&jU0$EG(cT zc^ z5JFi*CJj2|M42v=7=o`Ul2H5)WbUEXSn$Zq#Dp-D7|B<&#|tn$7Ud`m8i3MPSje)A zE9dZ2mhskF91^smfZf=GcCfAsP(-mDgS#)I);#TVDJqJP@UU+TqbD{GCTZYq!8{SG zk%{hSn7S1i<1>iQ4n4ZYX`d#KM-B*1q1mDfauNR#5}$zXh-EYWRIE6*hZ% zbJL+TOFj+L=Fj&BUvyH(W4Iqz7}iVkGKVIqmGf^qXf|3F>h4B8F|3jt!q5I6vZN@rBt-@dLMTr(ht5hyDX+%IBj zF!FI|YRJpar$csd5D*sL7Xjhl%E=*t+c5-#q`f#yUjFL5yZ>JvwT$MG29N+jgmD68 zv9vnrqHB@T` zb62Ei@Spbq)3;N51_zm7Q=zj=LxO%Xk=R7DP~O9b{6zE$;WvV3bdK2f)M#+VFGK6R zK(7lQB)ou~x3-A}v)%2FLBwiX7hwMJ?hyDEbdX@4`vx3#X}g29;oZY#yv)>KtR1@Y z=8Yv`q>)WPlwD9*g5dfBe9D zhDv1wW^+hvh(Cd}sC8oC2Lne^PZm8zB*gp*jfVWv&FeRuqoZ5PN(H}-L~>g9M1{Io#NTtf zR-D)HbYJpjgQWr!p`c=gy%cqq@f^jJO(GGUl7+6=J1S|Gv6S~751 zba|Mu`qw+3E6o_6iTuvOlSe4;M+|ukSS_?Ah+cX>6NNH`)nLoRuXtofj?mSAOaKit zhK0QN#cnNjOI85k`w(ajA$a#iDYDs~Xc%~Asx}mX+z|RLf*VUNF323GAYBuqhbBNJ z07C?E3Gm|8`F1Ik9^1ki`YrPQZv(V~8qPtps2?v-2XW&N|2<51Mb$k1b7ZV(cJQ|1#H2o95QEM*pfE~7Px>f^(QDAMDR z5YYa{OQIK<{-&R>Ny;GJNt))r2s?q?Nj&_}jf6NW6wL^t9K(blyPJ#h2Bl;jF}VtB zzSL`EFUk)XF+)rzB=u1Wu$rzV3QEv~#0#=$N`z{4dmAdS`EGJ$ z(Jrmu|Ae=RoHvnIUjpcceoI=MrHidGy-aue_H8Wk@c!u* zlza$?39ku1tsh3bc#GW2SjITY`F2_58pFLju)bG=ed(3drhURl-rf zLYyc5L%vvEI7OtlZry_hH@V|A5%~Dx!W@8$a^ZKQuCNoG7y@#((KvRAJ_H~Y%q%ADa&~gQy10f`c62rsQ3WI6sQ;r9(E3I&m+yo)0ywiQp$Ht z>!3Pai2gQbxhlToM4`#r)WB*r%f==$rK&s@(w5+?zy+`0@4MWCS{p4n7Ofr!3;KTM zm=@~6JH^wI`pMN(xmON+HhOvZ|4Ul&Z$9i~tXZX!%>gw}9BU>q_jCPA8p#5j6Y}{*S9PS?b3+Du^79u+$cqDm23I`7tIk%H7 zRr~4!5NiTTC6t2}QZqHJx@Ql~5sPQ2RsbesFzqKKNtc%|TmV&+mXV={ zq;!-vA&+!Sa&~H%XqxzT49uq4Cp#JEYO+w%F!k7cRBaAPe3Sm_T2h%***xA?!`W}0+W>2|&GXr)Jv8F|Xmlah^b+N3GH$psL z3fCAD3~9dCuW7?KC)O_d8ZLSO(hY^_fv0?iRW9%e1=KXcLr~rydw=*qOUOeKt`|fN z$IuZrSamwR)GH-7pH+^ZkMF`{OTP?#@<+#tx78x_AD$nht4JhK>&okewJrZx&+UpH z7nr*lGthGXh4RSn%NPQ-w*1Y%UL&-!IEyZkOL$AtFR?_l+!B3j zcKUAiDB7TC6D_Z+z|}_|6C8g;Q=G_fu&_tsB`z;7tJ_P%?NNSq`l?lfTlPLmC^si1 zyOY^pu-9Q?vZGEIfw?I_{l4A#8HuoS`0z ztJJ=|TpJR>r_{a=4KZq%6i-y$Rdwr&gT8sO_0*ojDP94w=5@=Id>#j*?;#`-`<%5f z@;+}JRQNd_nQdUUv$x$I`>3Yo+{@PHdRalO-SB9!pzAR0t4XgsK=Vpp-=S}d-MX8) z{AMRz_(XEPm$4+LvWktKd0al{SU!4>Yhr8Z0PvnDWxY+j<}OXLElSA#^EjX7)zc84 zs?(!BKX|Z!L1CkHX<2+xUas`JYs(J3m3$eG`MoB#ryZcsgP$F%4jsV5FXD$DksgTMMmdD-|=}BB(<75cMosX6EI-uV{&2$cUd-x=y_n_-c{U(!m?EqE9*ojUlllCVALuM)Y#v5{NXQ(qim}r($CN1Pv7q4z5lVx~vffql+uJ`aLd-`qdY`{{pK!Zs+fEURlnqc| z3AJXoDP4XbxZS`YWGc(NwpTOI`@ried;jgEQAhn>+5;{*9~X4|PiT;D80cJgqrG7e z9?_C|<#A1J%Hjo`t8||HMbfbp-cVce+t}EU?NTNQHwx=@3ysb5t>bx^yEJ)<3fH_X zmn}6}i@w$=gxU-?xfg4$TE@}HXx?cRj1-*G(?9q-n&Xo?hZ2QFpP|RFDSETP@2+y~ zoyU|VC7*gp$L6k+s5zvr#8a^@HWzv>Vj>CT#S_625d*f*OnBIBZo9n>p}KNeD{@)O zhuqlH)VE{)XfzvRo>xe(XZ#MQ7d#sS%dOiVQ?KnFiiv0Gaq#I;XUTc#+8q}Af~Tvf zEb+_(wA9D(*x4X=?R5ah+3E7c3fztKzd1zwlG}MfNwFOdqrH z6^b-^F*TpeJ1y~DBw_b=^||p!JgW*n&WZKwk{rLB_LfYd^G>+n~p9bU#A)-8$g34d$Swvk*9 ziUMV9D+K>coI9iU{Oa{K_l(!$#vgWa%NIuRobNWCifEmfR24hs=`6YBkfC|-F788R zikSg6NwVD6?OV0<&7oR)4VmQX8vDxf$>ZcnmRF~)ghpR6n*O25ths8SIW19AFFn`W z-n=Q-LH~fvxg%U*RIQa6Sxd`B zCmBbHRE_=3?rqHSo*@GsDp~&7sSebu31T-B%sJ@IEPI#NzYSOt;@YCpx0J3mpcBZ) zH`&h9m6*CI&0e;>C!D|q{-F{2zHY{LxY6j}xn%nIR&u|5O&)(O_r@d|st@3Z7v3xZ zDsL0sDi3!VzH++mtVpkF7@Arl);CkBl@mHAotPGp`B~>5?iSxYc0cNvmHyUXPjEE2 z6z1J=U0*UNP~^_;3N}JE`^Iy(lTsd6J%J@sD>wE^CxlN(<+`1`lB;g|Bt87o9HVc( zE_dbX=D=8=wYVPgX~7dgIF7hX~(#>x|$2gt0zQFX}j_UiWjvz z`hE(tv8%X1o26;+JadPhOO0kic>C~Z@5yn=Yy5ASNZs6td#f6C-qSW*H4OC-i%e}` z%fB(7yg||T{~i`yo`tsSnrtPro{U?K>D2(2Np^)=vwmeI*?_uf#oY6`nd`r1#Pb++ zX^OroW=i_hP>`?u#k@U@%S}-5v3S6X4y_f5|33G}wOE*)^8fsPFKWG^1 z+-Ckkj?Qo4Wy)c`Q}%nhU&qp%taJ!9Y>Q*)7DC<1ddTF<7rwIzA0|kXN1b0`2$zswAM2-nIFE?~}_ZXGY z=0K0Hv{|YgA?_>Ny#=O96*ua8Fl*fltuc#er^;&mw^q!U>(yYgB$WAM^vBO6#;nU( z8=b3^KJ})%Qo?T7i{B*6-!hN55#d+hXpnrK%Evw&DICCm{oxvCoK8y6XkD5h3BUH~ LAJ8k_OAY%Eaxvwp diff --git a/guide-cloud-deployment/neo4j-cloud-hosting-providers/graphgrid.jpg b/guide-cloud-deployment/neo4j-cloud-hosting-providers/graphgrid.jpg deleted file mode 100644 index 170df56395663a02ef587671d9019c078a1287df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11998 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 Bo0k9p diff --git a/guide-cloud-deployment/neo4j-cloud-hosting-providers/graphstory.png b/guide-cloud-deployment/neo4j-cloud-hosting-providers/graphstory.png deleted file mode 100644 index 1988bf780d28f5747ff42d04be6fdbddf8dcad27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16908 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 tFz7T0M4?Uoy8! diff --git a/guide-cloud-deployment/neo4j-cloud-hosting-providers/index.html b/guide-cloud-deployment/neo4j-cloud-hosting-providers/index.html deleted file mode 100644 index 6e4f74b3..00000000 --- a/guide-cloud-deployment/neo4j-cloud-hosting-providers/index.html +++ /dev/null @@ -1,1262 +0,0 @@ - - - - - - - - - - - - What is a Graph Database? A Property Graph Model Intro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- -
-
-
-

Neo4j Cloud Hosting Providers

-
-
-
-
-

lead text

-
-
- - - - -
-
-
-
-
-
-
Goals
-
-This guide introduces the different Neo4j cloud-hosting partners. -
-
-
-
Prerequisites
-
-You should know how to run and operate Neo4j locally. -Knowledge of remote drivers to access Neo4j from your application helps you connect to your cloud-hosted database. -
-
-
-

Overview

- - - -
-
- - -
-

There are a number of companies that provide hosting of Neo4j instances in the cloud.

-
- -
- - - - - -
- - -If you provision databases via their offering, you enter a contract with those partners, not with Neo Technology. -
-
-
-
-
-

GraphGrid

-
-

-graphgrid -

-
-
-
    -
  • -GraphGrid Data Platform is the complete Neo4j data platform, architected for the enterprise to unleash the full power of Neo4j into your modern graph data architecture. -
  • -
  • -High Performance Neo4j Clusters The full power of Neo4j at your fingertips with thousands of graph compute cores for big graph data processing and graph data warehouse management. -
  • -
  • -On Graph Analytics in Real Time Don’t drown in your disconnected data lake. Embrace the connectedness of your data and discover meaningful insights today. -
  • -
  • -Setup your Neo4j Cluster in Minutes Enterprise-grade graph data management platform enabling batch, interactive and real-time analytics and data processing applications simultaneously across your connected graph data. -
  • -
-
-
-
-

GrapheneDB

-
-

-graphenedb -

-
- - -
-

GrapheneDB offers Neo4j instances from free plans suitable for evaluation and testing to production-ready plans for demanding graph applications, with following features:

-
- -
-
    -
  • -Pay-as-you-go pricing model -
  • -
  • -On-demand instant provisioning in several regions on AWS, Azure -
  • -
  • -Online, automated and manual backups -
  • -
  • -24x7 monitoring and support -
  • -
  • -Support for community plugins and custom extensions -
  • -
  • -DB management tools: access server logs, update configuration, cloning, upgrading or downgrading a server -
  • -
  • -Advanced deployment options with Neo4j Enterprise Edition -
  • -
-
- - -
-

GrapheneDB is also available as a Heroku Add-On with free and tiered plans.

-
- -
-
-

GraphStory

-
-

-graphstory -

-
- - -
-

Graph Story provides end-to-end Graph Database hosting for Community and Enterprise Neo4j, including:

-
- -
-
    -
  • -On-demand instances with monthly pricing -
  • -
  • -Available on AWS, Azure, Google Compute Engine, Digital Ocean and Heroku -
  • -
  • -World-class support via chat & email -
  • -
  • -Data management tools for Import & Export, Backup & Restore, and Clear & Refresh -
  • -
  • -Scheduled backups & log access -
  • -
  • -Add-ons for New Relic and Logentries -
  • -
-
-
-
-
- - - -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Stay Connected

-

Sign up to find out more about Neo4j's upcoming events & meetups.

-
-
-
-
-
-
- -
- -
- -
-
-
-

 

-
- - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/guide-cloud-deployment/neo4j-cloud-hosting-providers/neo4j-cloud-hosting-providers.adoc b/guide-cloud-deployment/neo4j-cloud-hosting-providers/neo4j-cloud-hosting-providers.adoc deleted file mode 100644 index b66000a7..00000000 --- a/guide-cloud-deployment/neo4j-cloud-hosting-providers/neo4j-cloud-hosting-providers.adoc +++ /dev/null @@ -1,68 +0,0 @@ -= Other Neo4j Cloud Hosting Providers -:slug: neo4j-cloud-hosting-providers -:level: Intermediate -:section: Neo4j in the Cloud -:section-link: guide-cloud-deployment -:sectanchors: -:toc: -:toc-title: Contents -:toclevels: 1 -:author: Neo4j -:category: cloud -:tags: cloud, hosting, deployment, partners - -.Goals -[abstract] -This guide introduces Neo4j's cloud-hosting partners. - -.Prerequisites -[abstract] -You should know how to run and operate Neo4j locally. -Knowledge of link:/developer/language-guides[remote drivers] to access Neo4j from your application helps you connect to your cloud-hosted database. - -[#neo4j-providers] -There are a number of other options that provide hosting of Neo4j instances in the cloud, oustide of those covered in earlier guides in this section. -This page will point to any companies and resources for additional alternatives. - -[NOTE] -If you provision databases via their offering, you enter a contract with those partners, not with Neo4j. - -//// -==== GraphGrid - -image::{img}20160914051238/graphgrid.jpg[width=300,float=right] - -* *GraphGrid Data Platform* is the complete Neo4j data platform, architected for the enterprise to unleash the full power of Neo4j into your modern graph data architecture. -* *High Performance Neo4j Clusters* The full power of Neo4j at your fingertips with thousands of graph compute cores for big graph data processing and graph data warehouse management. -* *On Graph Analytics in Real Time* Don't drown in your disconnected data lake. Embrace the connectedness of your data and discover meaningful insights today. -* *Setup your Neo4j Cluster in Minutes* Enterprise-grade graph data management platform enabling batch, interactive and real-time analytics and data processing applications simultaneously across your connected graph data. - -==== GrapheneDB - -image::{img}graphenedb.png[width=400,float=right] - -http://www.graphenedb.com/[GrapheneDB] offers Neo4j instances from free plans suitable for evaluation and testing to production-ready plans for demanding graph applications, with following features: - -* Pay-as-you-go pricing model -* On-demand instant provisioning in several regions on AWS, Azure -* Online, automated and manual backups -* 24x7 monitoring and support -* Support for community plugins and custom extensions -* DB management tools: access server logs, update configuration, cloning, upgrading or downgrading a server -* Advanced deployment options with Neo4j Enterprise Edition - -GrapheneDB is also available as a link:https://elements.heroku.com/addons/graphenedb[Heroku Add-On] with free and tiered plans. -//// -[#graphstory-host] -== GraphStory - -image::{img}graphstory.png[width=400,float=right] - -link:http://www.graphstory.com[Graph Story] provides end-to-end Graph Database hosting for Community and Enterprise Neo4j, including: - -* On-demand instances with monthly pricing -* Available on AWS, Azure, Google Compute Engine, Digital Ocean and Heroku -* World-class support via chat & email -* Data management tools for Import & Export, Backup & Restore, and Clear & Refresh -* Scheduled backups & log access -* Add-ons for New Relic and Logentries diff --git a/in-production/guide-sizing-and-hardware-calculator/guide-sizing-and-hardware-calculator.adoc b/in-production/guide-sizing-and-hardware-calculator/guide-sizing-and-hardware-calculator.adoc deleted file mode 100644 index 7bf9e920..00000000 --- a/in-production/guide-sizing-and-hardware-calculator/guide-sizing-and-hardware-calculator.adoc +++ /dev/null @@ -1,93 +0,0 @@ -= Neo4j's Hardware Requirements -:slug: guide-sizing-and-hardware-calculator -:level: Advanced -:section: Neo4j in Production -:section-link: in-production -:sectanchors: -:toc: -:toc-title: Contents -:toclevels: 1 -:author: Neo4j -:category: performance -:tags: administration, sizing, hardware, calculator - -.Goals -[abstract] -This guide explains Neo4j sizing and hardware calculation tips and best practices. -It details what you need to make Neo4j fly. - -.Prerequisites -[abstract] -You should know how to link:/download[download] and install Neo4j on your system. -You should be accustomed to the graph data model and have written your Neo4j application. -You should know that Neo4j employs its own persistence and caching implementation, have seen the files on disk (`data/graph.db`), and have glanced at `messages.log`. - -[role=expertise] -{level} - -[#neo4j-architecture] -== Neo4j's Architecture - -Neo4j is a native graph database; it handles the graph data records down to the disk/filesystem level. -On top of the memory mapped filesystem, Neo4j employs additional caches for loaded Node and Relationship-Records. - -[#disk-storage] -== Disk Storage - -Neo4j's storage is organized in record-based files per data structure - nodes, relationships, properties, labels, and so on. -Each node and relationship record block is directly addressable by its id. - -The blocks have different sizes to accommodate the different type of data they contain: - -* Node records: labels, pointer to first relationship, pointer to first property block. -* Relationship records: relationship-type, pointers to: start-node, end-node, first property block, next-relationship and previous relationship for both start and end-nodes -* Property records: up to four property entries, each with a property-key id, and an encoded / compressed property value or pointer to string or array storage list - -Nodes occupy 15B of space, relationships occupy 31B of space and properties occupy 41B of space. - -An example disk space calculation is: - ----- -10,000 Nodes x 14B = 140kB -1,000,000 Rels x 33B = 31.5MB -2,010,000 Props x 41B = 78.6MB - -Total is 110.2MB ----- - -[#cache-config] -== Low Level Cache - -The low level cache requirements are the same as for the disk space. -Its configuration (memory mapped regions per file), is done in `conf/neo4j.properties`. -You should try to memory-map as much data as your RAM allows (allow for 6 to 16GB heap depending on availability and use-cases). - -[#optimize-perf] -== Optimizing - -In optimizing a graph database solution for performance, we should bear the following guidelines in mind: - -* Utilize the filesystem cache as much as possible, and map store files in their entirety into this cache -* Have as much RAM available as possible -* Tune the JVM heap and keep an eye on GC behaviors -* Consider using fast disks—SSDs or enterprise flash hardware to bring up the bottom line when disk access becomes inevitable - -[#performance-opt] -== Performance Optimization -There are three areas in which we can optimize for performance: - -* Keep the object cache to a reasonable size (2 to 16 GB, about 50% of the heap) -* Increase the file cache (from 2 GB all the way up to 200 GB or more in exceptional circumstances) -* Increase the percentage of the store mapped into the filesystem cache -* Invest in faster disks: SSDs or enterprise flash hardware - -[#hardware-sizing] -== Hardware sizing calculator - -++++ - -++++ diff --git a/in-production/guide-sizing-and-hardware-calculator/index.html b/in-production/guide-sizing-and-hardware-calculator/index.html deleted file mode 100644 index 181dd3da..00000000 --- a/in-production/guide-sizing-and-hardware-calculator/index.html +++ /dev/null @@ -1,1278 +0,0 @@ - - - - - - - - - - - - What is a Graph Database? A Property Graph Model Intro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- -
-
-
-

Neo4j’s Hardware Requirements

-
-
-
-
-

lead text

-
-
- - - - -
-
-
-
-
-
-
Goals
-
-This guide explains Neo4j sizing and hardware calculation tips and best practices. -It details what you need to make Neo4j fly. -
-
-
-
Prerequisites
-
-You should know how to download and install Neo4j on your system. -You should be accustomed to the graph data model and have written your Neo4j application. -You should know that Neo4j employs its own persistence and caching implementation, have seen the files on disk (data/graph.db), and have glanced at messages.log. -
-
- - -
Advanced
-
- - -
-
-
-
-

Neo4j’s Architecture

- - -
-

Neo4j is a native graph database; it handles the graph data records down to the disk/filesystem level. -On top of the memory mapped filesystem, Neo4j employs additional caches for loaded Node and Relationship-Records.

-
- -
-
-

Disk Storage

- - -
-

Neo4j’s storage is organized in record-based files per data structure - nodes, relationships, properties, labels, and so on. -Each node and relationship record block is directly addressable by its id.

-
- - - -
-

The blocks have different sizes to accommodate the different type of data they contain:

-
- -
-
    -
  • -Node records: labels, pointer to first relationship, pointer to first property block. -
  • -
  • -Relationship records: relationship-type, pointers to: start-node, end-node, first property block, next-relationship and previous relationship for both start and end-nodes -
  • -
  • -Property records: up to four property entries, each with a property-key id, and an encoded / compressed property value or pointer to string or array storage list -
  • -
-
- - -
-

Nodes occupy 15B of space, relationships occupy 31B of space and properties occupy 41B of space.

-
- - - -
-

An example disk space calculation is:

-
- -
-
-
10,000    Nodes x 14B = 140kB
-1,000,000 Rels  x 33B = 31.5MB
-2,010,000 Props x 41B = 78.6MB
-
-Total  is 110.2MB
-
-
-
-
-

Low Level Cache

- - -
-

The low level cache requirements are the same as for the disk space. -Its configuration (memory mapped regions per file), is done in conf/neo4j.properties. -You should try to memory-map as much data as your RAM allows (allow for 6 to 16GB heap depending on availability and use-cases).

-
- -
-
-

Optimizing

- - -
-

In optimizing a graph database solution for performance, we should bear the following guidelines in mind:

-
- -
-
    -
  • -Utilize the filesystem cache as much as possible, and map store files in their entirety into this cache -
  • -
  • -Have as much RAM available as possible -
  • -
  • -Tune the JVM heap and keep an eye on GC behaviors -
  • -
  • -Consider using fast disks—SSDs or enterprise flash hardware to bring up the bottom line when disk access becomes inevitable -
  • -
-
-
-
-

Performance Optimization

- - -
-

There are three areas in which we can optimize for performance:

-
- -
-
    -
  • -Keep the object cache to a reasonable size (2 to 16 GB, about 50% of the heap) -
  • -
  • -Increase the file cache (from 2 GB all the way up to 200 GB or more in exceptional circumstances) -
  • -
  • -Increase the percentage of the store mapped into the filesystem cache -
  • -
  • -Invest in faster disks: SSDs or enterprise flash hardware -
  • -
-
-
-
-

Hardware sizing calculator

- -
-
-
- - - -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Stay Connected

-

Sign up to find out more about Neo4j's upcoming events & meetups.

-
-
-
-
-
-
- -
- -
- -
-
-
-

 

-
- - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/integration/integration.adoc b/integration/integration.adoc index 80a2264e..3688ca95 100644 --- a/integration/integration.adoc +++ b/integration/integration.adoc @@ -16,7 +16,7 @@ Neo4j is supported by a rich ecosystem of libraries, tools, drivers, and guides We want to give an overview about what's available and link to the original sources. We try to focus on the freely available solutions here, and provide links to commercial options were appropriate. -Check out our link:../integration/ecosystem[ecosystem contributions] to further boost your Neo4j productivity. +Check out our link:/developer/integration/[integrations] to further boost your Neo4j productivity. Neo4j integration projects: diff --git a/language-guides/java-procedures/java-procedures.adoc b/language-guides/java-procedures/java-procedures.adoc index 5d952d96..8d2097be 100644 --- a/language-guides/java-procedures/java-procedures.adoc +++ b/language-guides/java-procedures/java-procedures.adoc @@ -28,7 +28,7 @@ We don't provide code examples for the Java API on this page, because they are c Neo4j uses that functionality itself for built-in procedures for meta-data, cluster-, query- and user-management and more. -Several libraries already provide new capabilities using procedures and functions, here is an example from the link:/developer/cypher/procedures-gallery#apoc[APOC] library. +Several libraries already provide new capabilities using procedures and functions, here is an example from the link:/developer/neo4j-apoc/[APOC] library. [source,cypher] ---- @@ -40,4 +40,4 @@ ORDER BY weight ASC LIMIT 10 To get you started we provided a https://github.com/neo4j-examples/neo4j-procedure-template[template project^] and documentation in the link:/docs/java-reference/current/#procedures[Java developer manual^]. -More useful examples for user defined procedures can be found in our link:/developer/procedures-gallery/[procedure & function gallery]. +More useful examples for user-defined procedures can be found in our link:/developer/procedures-functions/[procedure & function guide]. diff --git a/language-guides/spring-data-neo4j-rx/spring-data-neo4j-rx.adoc b/language-guides/spring-data-neo4j-rx/spring-data-neo4j-rx.adoc index 9b500242..6253df70 100644 --- a/language-guides/spring-data-neo4j-rx/spring-data-neo4j-rx.adoc +++ b/language-guides/spring-data-neo4j-rx/spring-data-neo4j-rx.adoc @@ -92,7 +92,7 @@ For imperative applications, check out the https://github.com/neo4j/sdn-rx/tree/ [#prepare-db] == Prepare the database -For this example, we will use the Neo4j-standard link:/developer/movie-database/[movie graph] data set because it comes for free with every Neo4j instance and is a small size. +For this example, we will use the Neo4j-standard movie graph data set because it comes for free with every Neo4j instance and is a small size. If you haven't already, link:/download/[download Neo4j Desktop^] and link:/developer/neo4j-desktop/#desktop-create-graph[create/start a database]. diff --git a/language-guides/spring-data-neo4j/spring-data-neo4j.adoc b/language-guides/spring-data-neo4j/spring-data-neo4j.adoc index b703bec1..ce4e9f42 100644 --- a/language-guides/spring-data-neo4j/spring-data-neo4j.adoc +++ b/language-guides/spring-data-neo4j/spring-data-neo4j.adoc @@ -7,6 +7,7 @@ :toc: :toc-title: Contents :toclevels: 1 +:icons: font :author: Jennifer Reif :programming-language: java :category: drivers @@ -14,6 +15,12 @@ include::../_includes/versions.txt[] +[NOTE] +==== +The Spring Data Neo4j project is currently for existing support and maintenance only. +All new and future projects should use the link:/developer/spring-data-neo4j-rx/[Spring Data Neo4j RX] project instead. +==== + .Goals [abstract] For Java developers who use the Spring Framework or Spring Boot, this guide introduces Spring integration through the Spring Data Neo4j library. @@ -71,7 +78,6 @@ Then, you can annotate your entities and define your Spring Data repositories as Spring Boot takes on much of the responsibility of application configuration and bootstrap, so we have chosen to take advantage of that assistance in our project for this guide. The example project code for https://github.com/neo4j-examples/spring-data-neo4j-intro-app[Spring Data Neo4j^] is in GitHub. You can clone the repository and run the code along with this guide, or you can build the project from the ground up from the http://start.spring.io[Spring Initializr^] page. -//For this approach, you can follow along with a https://medium.com/neo4j/spring-into-neo4j-with-spring-data-5-spring-boot-2-and-neo4j-3962fb1ea067[blog post^] for step-by-step instructions. We will be using the movie domain that you may already be familiar with - people (actors, directors, etc) and the movies those people are involved in. @@ -304,7 +310,7 @@ As with our `PersonRepository` above, these methods in our `MovieRepository` wil == Resources For a more thorough walkthrough of the code, see the resources linked below. -We also provide reactive development through the link:/developer/spring-data-neo4j-rx/[Spring Data Neo4j RX] project. +We also provide both imperative and reactive development through the link:/developer/spring-data-neo4j-rx/[Spring Data Neo4j RX] project. [cols="1,4"] |===