From 7bc754f06874ad3dfc03f5ee82c3ea2ceda21940 Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 19 Jan 2022 19:57:49 +0100 Subject: [PATCH 1/8] WIP doc about perimeter and projection --- docs/contributors/mxgraph-integration.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/contributors/mxgraph-integration.md b/docs/contributors/mxgraph-integration.md index 7175c68255..cda2c7e9e9 100644 --- a/docs/contributors/mxgraph-integration.md +++ b/docs/contributors/mxgraph-integration.md @@ -137,6 +137,16 @@ Check the [GitHub Pull Request #291](https://github.com/process-analytics/bpmn-v to see various positioning methods in action. +#### Terminal points and perimeter + + +TODO schema of various projection on perimeter + +TODO link to code in mxgraph 4.2.2 and even js code extract + +check if there is technical information about this topic in the txt file in mxgraph src/ + + ## Overlays We are hacking mxCellOverlays which originally only supports image shape. This lets us use custom shapes. From 291dd937b56ff1de63a8434b7cc3131376712c4d Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 6 Apr 2022 10:14:31 +0200 Subject: [PATCH 2/8] start notes --- docs/contributors/mxgraph-integration.md | 34 ++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/contributors/mxgraph-integration.md b/docs/contributors/mxgraph-integration.md index cda2c7e9e9..ae1454cb60 100644 --- a/docs/contributors/mxgraph-integration.md +++ b/docs/contributors/mxgraph-integration.md @@ -142,11 +142,45 @@ to see various positioning methods in action. TODO schema of various projection on perimeter + + + TODO link to code in mxgraph 4.2.2 and even js code extract check if there is technical information about this topic in the txt file in mxgraph src/ +référencer les issues concernées (orthogonal) info dans +https://github.com/process-analytics/bpmn-visualization-js/issues/349 +https://github.com/process-analytics/bpmn-visualization-js/issues/295 +https://github.com/process-analytics/bpmn-visualization-js/issues/295#issuecomment-904336449 + + +style config perimeter: par defaut, toutes les shapes ont un rectangle perimeter +cf création du style par défaut par mxgraph (trouver la classe) + + +next to implement +- "Ensure that the terminal waypoints are on the shape perimeter" https://github.com/process-analytics/bpmn-visualization-js/issues/1870 +- "Restore the experimental pools/subprocess live collapsing" https://github.com/process-analytics/bpmn-visualization-js/issues/1871 + + +calcul des points terminaux +cf https://github.com/process-analytics/bpmn-visualization-js/pull/1863 POC custom qui les change + +mettre des schémas et expliquer comment ca se passe les périmètres, et les projections vers centre (defaut) ou orthogonal +(ce qui est activé avec SEGMENT_CONNECTOR et autre option)et ce qu'on voudrait nous: +par défaut, pas une projection mais une prolongation vers l'intersection. +Si pas d'intersection, faire la projection + + +issues without info +- 349 +- PR 351 +- 1236 + + + ## Overlays We are hacking mxCellOverlays which originally only supports image shape. This lets us use custom shapes. From ffa20d7774651195c520c2967814353bf5724420 Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 6 Apr 2022 10:20:08 +0200 Subject: [PATCH 3/8] start notes --- docs/contributors/mxgraph-integration.md | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/contributors/mxgraph-integration.md b/docs/contributors/mxgraph-integration.md index ae1454cb60..cbb044a93c 100644 --- a/docs/contributors/mxgraph-integration.md +++ b/docs/contributors/mxgraph-integration.md @@ -159,6 +159,15 @@ https://github.com/process-analytics/bpmn-visualization-js/issues/295#issuecomme style config perimeter: par defaut, toutes les shapes ont un rectangle perimeter cf création du style par défaut par mxgraph (trouver la classe) +mxConstant.STYLE_ENTRY_PERIMETER: 'entryPerimeter' +Defines if the perimeter should be used to find the exact entry point along the perimeter of the target +Possible values are 0 (false) and 1 (true). +Default is 1 (true). Value is “entryPerimeter”.--> checker ou dans le code s'est utilisé +voir aussi https://stackoverflow.com/a/62127707/14299521 pour des options +il ya aussi les options pour décaler comme essayer par Céline dnas issue sur end event https://github.com/process-analytics/bpmn-visualization-js/issues/188 +parler aussi de STYLE_PERIMETER_SPACING (et de source/target spacing) dans le calcul du floating point + + next to implement - "Ensure that the terminal waypoints are on the shape perimeter" https://github.com/process-analytics/bpmn-visualization-js/issues/1870 @@ -174,9 +183,27 @@ par défaut, pas une projection mais une prolongation vers l'intersection. Si pas d'intersection, faire la projection +voir aussi https://jgraph.github.io/mxgraph/javascript/examples/orthogonal.html +début d'explications sur le fonctionnement dans PR "[TEST] Add more visual tests for edges #1399" +j'ai maj l'issue des segment Connector: +est-ce qu'avec mxgraph 4.2.2 ce n'est pas mieux --> non c'est pire, voir issue 994 et pr de poc + +orthogonal edges et issues liées : issue 994: voir suivi du 11/06/2021 + + +Alternative + +décrire aussi les positionnements en foreground shape/edge: cf https://github.com/process-analytics/bpmn-visualization-js/pull/1863 +comme bpmn-js + transparency (impact on custom colors that would required to be transperent) +only work for inner terminal waypoints +--> don't want to implement this +cf aussi issue 1870 + + issues without info - 349 - PR 351 +- PR 388 - 1236 From 80608f898fd9eb424760f4f967e76ff2146a4c49 Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 6 Apr 2022 11:14:12 +0200 Subject: [PATCH 4/8] start notes + add screenshots --- ...ments.no.intersection.with.shapes-snap.png | Bin 0 -> 33271 bytes docs/contributors/mxgraph-integration.md | 88 ++++++++++++++---- 2 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 docs/contributors/images/mxgraph-perimeter/flows.sequence.04.waypoints.03.terminal.outside.shapes.02.segments.no.intersection.with.shapes-snap.png diff --git a/docs/contributors/images/mxgraph-perimeter/flows.sequence.04.waypoints.03.terminal.outside.shapes.02.segments.no.intersection.with.shapes-snap.png b/docs/contributors/images/mxgraph-perimeter/flows.sequence.04.waypoints.03.terminal.outside.shapes.02.segments.no.intersection.with.shapes-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..2fffc1f2298436127bf35e9b616ae66f9b96d321 GIT binary patch literal 33271 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 literal 0 HcmV?d00001 diff --git a/docs/contributors/mxgraph-integration.md b/docs/contributors/mxgraph-integration.md index cbb044a93c..912b48feb8 100644 --- a/docs/contributors/mxgraph-integration.md +++ b/docs/contributors/mxgraph-integration.md @@ -139,15 +139,80 @@ to see various positioning methods in action. #### Terminal points and perimeter +QUESTION: dans un fichier dédié car il commence à etre très gros -TODO schema of various projection on perimeter +intro mxgraph support of perimeter +ensure that the terminal waypoints of the edge are on the shape border, never inside or outside the shape. +TODO put screenshots directly here for illustration? +floating point +concept of port: another shape can be used to determine where the terminal point are put. Use case: inner elements, +fine for editor, not always accurate for visualization when the terminal point coordinates are provided +perimeter: function defining how ... Several flavor available out of the box: rectangle, ellipse, diamond. Everything we need for BPMN shapes +use next point: the last point defined in the array + + +way mxgraph manage terminal points recomputation. +If no perimeter set (not what we use): terminal are always at the center of the bounds defined by the perimeter +If perimeter is set, use the latest point and project it to the perimeter when STYLE_ORTHOGONAL set to true (default to false) +or use Segment Connector for instance otherwise, compute the intersection of the segment between the shape center and the +point with the perimeter and add the resulting points to the waypoints list. + +The following screenshots are done without STYLE_EDGE and STYLE_ORTHOGONAL set to false + +Orthogonal projection activation: style[mxgraph.mxConstants.STYLE_ORTHOGONAL] = 1; +TODO store screenshots with projection from https://github.com/process-analytics/bpmn-visualization-js/pull/1765 (2 screenshots at the end) +in the repo for offline browsing + rename visual test screenshot + +Screenshots done using visualization test diagram `flows.sequence.04.waypoints.03.terminal.outside.shapes.02.segments.no.intersection.with.shapes.bpmn` + +| without projection | Default (Projection to center) | orthogonal projection | +|---------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| ![](images/mxgraph-perimeter/flows.sequence.04.waypoints.03.terminal.outside.shapes.02.segments.no.intersection.with.shapes-snap.png) | ![seq_flow_outside_no_segment_connector_01_default_projection_to_center](https://user-images.githubusercontent.com/27200110/150537056-68d7410b-9675-4bcc-9d01-ce2562965ffc.png) | ![seq_flow_outside_no_segment_connector_02_orthogonal_projection](https://user-images.githubusercontent.com/27200110/150537058-65e645c1-fb80-4f54-8da9-b0c819bbbc7a.png) | + +We have a lot of non regression visual tests on associations, message and sequence flows for +- terminal waypoints inside and outside shapes +- outside without intersection of the flow segment with the shape + + + +voir aussi https://jgraph.github.io/mxgraph/javascript/examples/orthogonal.html +début d'explications sur le fonctionnement dans PR "[TEST] Add more visual tests for edges #1399" +j'ai maj l'issue des segment Connector: +est-ce qu'avec mxgraph 4.2.2 ce n'est pas mieux --> non c'est pire, voir issue 994 et pr de poc + +orthogonal edges et issues liées : issue 994: voir suivi du 11/06/2021 + +TODO schema of various projection on perimeter for explanation (principles of the computation) TODO link to code in mxgraph 4.2.2 and even js code extract -check if there is technical information about this topic in the txt file in mxgraph src/ +TODO check if there is technical information about this topic in the txt file in mxgraph src/ + +code explanation about mxgraph terminal waypoints + +points definition from the model copied into the `abspoints` array property of the edge `state` instance +and also add to `null` values at the beginning and the end of the array: they will later be replaced by the computed terminal points. +**TODO ref to mxgraph code** computed by mxGraphView.getFloatingPoint + +special case: no waypoints, then the array contains 2 `null` values. +computation: 1st computation: use the center of the other shape? find what is used as next point in this case +result intersection on the 2 shapes with the segments from the 2 shape centers + + +calcul des points terminaux +cf https://github.com/process-analytics/bpmn-visualization-js/pull/1863 POC custom qui les change + +mettre des schémas et expliquer comment ca se passe les périmètres, et les projections vers centre (defaut) ou orthogonal +(ce qui est activé avec SEGMENT_CONNECTOR et autre option)et ce qu'on voudrait nous: +par défaut, pas une projection mais une prolongation vers l'intersection. +Si pas d'intersection, faire la projection +decrire ce qui a été fait dans en 0.23.0 en attendant + lien vers issue next + + + référencer les issues concernées (orthogonal) info dans @@ -174,21 +239,6 @@ next to implement - "Restore the experimental pools/subprocess live collapsing" https://github.com/process-analytics/bpmn-visualization-js/issues/1871 -calcul des points terminaux -cf https://github.com/process-analytics/bpmn-visualization-js/pull/1863 POC custom qui les change - -mettre des schémas et expliquer comment ca se passe les périmètres, et les projections vers centre (defaut) ou orthogonal -(ce qui est activé avec SEGMENT_CONNECTOR et autre option)et ce qu'on voudrait nous: -par défaut, pas une projection mais une prolongation vers l'intersection. -Si pas d'intersection, faire la projection - - -voir aussi https://jgraph.github.io/mxgraph/javascript/examples/orthogonal.html -début d'explications sur le fonctionnement dans PR "[TEST] Add more visual tests for edges #1399" -j'ai maj l'issue des segment Connector: -est-ce qu'avec mxgraph 4.2.2 ce n'est pas mieux --> non c'est pire, voir issue 994 et pr de poc - -orthogonal edges et issues liées : issue 994: voir suivi du 11/06/2021 Alternative @@ -200,6 +250,10 @@ only work for inner terminal waypoints cf aussi issue 1870 + +already considered +- PR 1765 + issues without info - 349 - PR 351 From 69ab7a4ef64d887d5c35980409000afe2d4baa30 Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 6 Apr 2022 11:59:59 +0200 Subject: [PATCH 5/8] start notes + add screenshots --- docs/contributors/mxgraph-integration.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/contributors/mxgraph-integration.md b/docs/contributors/mxgraph-integration.md index 912b48feb8..385e7b032a 100644 --- a/docs/contributors/mxgraph-integration.md +++ b/docs/contributors/mxgraph-integration.md @@ -171,6 +171,7 @@ Screenshots done using visualization test diagram `flows.sequence.04.waypoints.0 |---------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ![](images/mxgraph-perimeter/flows.sequence.04.waypoints.03.terminal.outside.shapes.02.segments.no.intersection.with.shapes-snap.png) | ![seq_flow_outside_no_segment_connector_01_default_projection_to_center](https://user-images.githubusercontent.com/27200110/150537056-68d7410b-9675-4bcc-9d01-ce2562965ffc.png) | ![seq_flow_outside_no_segment_connector_02_orthogonal_projection](https://user-images.githubusercontent.com/27200110/150537058-65e645c1-fb80-4f54-8da9-b0c819bbbc7a.png) | +TODO au début? We have a lot of non regression visual tests on associations, message and sequence flows for - terminal waypoints inside and outside shapes - outside without intersection of the flow segment with the shape @@ -250,6 +251,19 @@ only work for inner terminal waypoints cf aussi issue 1870 +### Impact on marker + +issue PR sur pb conditional not always filled? +TODO lien 1er PR suppr orthogonal segment + test showing we always fill the marker and the msg flow start marker as well + +arrow when extra terminal segment added +- inside arrow: issue association https://github.com/process-analytics/bpmn-visualization-js/issues/715 +- arrow glitch when original terminal point is outside + +proposal to use intersection instead to extend or reduce the existing the segment and avoid this effect + + +### INFOS a supprimer quand fini already considered - PR 1765 From b3dd33641060421a514ed769043124a7d4f7174a Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:02:34 +0200 Subject: [PATCH 6/8] 1st version of schema (draw.io resource) --- docs/contributors/mxgraph-integration.md | 3 +++ docs/contributors/resources/mxGraph-perimeter.drawio | 1 + 2 files changed, 4 insertions(+) create mode 100644 docs/contributors/resources/mxGraph-perimeter.drawio diff --git a/docs/contributors/mxgraph-integration.md b/docs/contributors/mxgraph-integration.md index 385e7b032a..27a1ae852f 100644 --- a/docs/contributors/mxgraph-integration.md +++ b/docs/contributors/mxgraph-integration.md @@ -139,6 +139,9 @@ to see various positioning methods in action. #### Terminal points and perimeter +**Note**: all SVG files from this paragraph are generated from this [draw.io file](resources/mxGraph-perimeter.drawio) + + QUESTION: dans un fichier dédié car il commence à etre très gros diff --git a/docs/contributors/resources/mxGraph-perimeter.drawio b/docs/contributors/resources/mxGraph-perimeter.drawio new file mode 100644 index 0000000000..a5f9f3b7c8 --- /dev/null +++ b/docs/contributors/resources/mxGraph-perimeter.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file From a932dbe6edd79817be3584b27af2f58c6126b480 Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 6 Apr 2022 12:35:53 +0200 Subject: [PATCH 7/8] start notes --- docs/contributors/mxgraph-integration.md | 73 +++++++++++++++++++----- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/docs/contributors/mxgraph-integration.md b/docs/contributors/mxgraph-integration.md index 27a1ae852f..669ec3f1e4 100644 --- a/docs/contributors/mxgraph-integration.md +++ b/docs/contributors/mxgraph-integration.md @@ -165,6 +165,9 @@ point with the perimeter and add the resulting points to the waypoints list. The following screenshots are done without STYLE_EDGE and STYLE_ORTHOGONAL set to false Orthogonal projection activation: style[mxgraph.mxConstants.STYLE_ORTHOGONAL] = 1; + + + TODO store screenshots with projection from https://github.com/process-analytics/bpmn-visualization-js/pull/1765 (2 screenshots at the end) in the repo for offline browsing + rename visual test screenshot @@ -189,7 +192,7 @@ est-ce qu'avec mxgraph 4.2.2 ce n'est pas mieux --> non c'est pire, voir issue 9 orthogonal edges et issues liées : issue 994: voir suivi du 11/06/2021 TODO schema of various projection on perimeter for explanation (principles of the computation) - +also add schema of the intersection solution TODO link to code in mxgraph 4.2.2 and even js code extract @@ -205,6 +208,9 @@ special case: no waypoints, then the array contains 2 `null` values. computation: 1st computation: use the center of the other shape? find what is used as next point in this case result intersection on the 2 shapes with the segments from the 2 shape centers +si pas de perimeter, point terminal est le centre de la shape +retrouver le code +explique pourquoi on avait issue sur les edges: pas de perimeter --> centre du edge pour les associations des text annotation (mettre l'issue) calcul des points terminaux cf https://github.com/process-analytics/bpmn-visualization-js/pull/1863 POC custom qui les change @@ -216,7 +222,7 @@ Si pas d'intersection, faire la projection decrire ce qui a été fait dans en 0.23.0 en attendant + lien vers issue next - +le style orthogonal est passé à getPerimeterPoint dans mxGraphView et c'est la fonction de perimeter qui l'utilise référencer les issues concernées (orthogonal) info dans @@ -234,17 +240,63 @@ Possible values are 0 (false) and 1 (true). Default is 1 (true). Value is “entryPerimeter”.--> checker ou dans le code s'est utilisé voir aussi https://stackoverflow.com/a/62127707/14299521 pour des options il ya aussi les options pour décaler comme essayer par Céline dnas issue sur end event https://github.com/process-analytics/bpmn-visualization-js/issues/188 + parler aussi de STYLE_PERIMETER_SPACING (et de source/target spacing) dans le calcul du floating point +permet d'avoir un border (possibiltié d'avoir des valeurs source/target qui s'ajoute a la valeur global) +pourrait etre interessant pour le pb des end events: TODO mettre l'info dans l'issue mais dire attention code custom chez nous pour gérer les perimeters + +see also exit and enter style setting +this is used by the perimeter function? if true, replicate the behaviour everywhere + + +### Impact on marker + +issue PR sur pb conditional not always filled? +TODO lien 1er PR suppr orthogonal segment + test showing we always fill the marker and the msg flow start marker as well + +arrow when extra terminal segment added +- inside arrow: issue association https://github.com/process-analytics/bpmn-visualization-js/issues/715 +- arrow glitch when original terminal point is outside + +REASON: marker built by using the latest segment of points (TODO link code to confirm this) +mxConnector.createMarker calcule la norme et son inverse +c'est lui qui calcule le point dans le prolongement de celui avant/après qui correspond à la longueur du marker +se base sur les points calculés avant pour finaliser les points du edge + + + +TODO add schema of current pb (glitch + inner original terminal point) + + +### Current implementation to fix the problem + +explication du fix actuel +dedicated mxGraphView injected in the BpmnGraph (extend mxGraph object) +override the getFloatingPoint implementation + +si pas de waypoint, fallback perimeter qui fonctionne très bien +si waypoints, on ne fait pas de calcul, on prend les derniers points non null du tableau (les originaux) et on les utilise +directement comme points terminaux + + +### Wish + +proposal to use intersection instead to extend or reduce the existing the segment and avoid this effect + +TODO schema of the intersection solution + +management when no intersection: fallback to mxgraph perimeter (see screenshots at the begining of the paragraph) + +### Others (TODO order) + next to implement - "Ensure that the terminal waypoints are on the shape perimeter" https://github.com/process-analytics/bpmn-visualization-js/issues/1870 - "Restore the experimental pools/subprocess live collapsing" https://github.com/process-analytics/bpmn-visualization-js/issues/1871 - - Alternative décrire aussi les positionnements en foreground shape/edge: cf https://github.com/process-analytics/bpmn-visualization-js/pull/1863 @@ -253,17 +305,10 @@ only work for inner terminal waypoints --> don't want to implement this cf aussi issue 1870 +Info about SVG Q (quadratic): see PR 1207 (pb position overlay on edge center) +a priori, created by mxPolyline.paintLine when rounded is true in the edge style, see mxShape.addPoints -### Impact on marker - -issue PR sur pb conditional not always filled? -TODO lien 1er PR suppr orthogonal segment + test showing we always fill the marker and the msg flow start marker as well - -arrow when extra terminal segment added -- inside arrow: issue association https://github.com/process-analytics/bpmn-visualization-js/issues/715 -- arrow glitch when original terminal point is outside - -proposal to use intersection instead to extend or reduce the existing the segment and avoid this effect +mxGraphView peut calculer des relative and absolute coordinate as mxPoint with the edge mxState ### INFOS a supprimer quand fini From 5e4ff8853d13bf6560c718622597bcb06abcb907 Mon Sep 17 00:00:00 2001 From: Thomas Bouffard <27200110+tbouffard@users.noreply.github.com> Date: Wed, 6 Apr 2022 15:06:02 +0200 Subject: [PATCH 8/8] draw.io: behaviour when no intersection + intersection --- docs/contributors/resources/mxGraph-perimeter.drawio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contributors/resources/mxGraph-perimeter.drawio b/docs/contributors/resources/mxGraph-perimeter.drawio index a5f9f3b7c8..ac14e0b95f 100644 --- a/docs/contributors/resources/mxGraph-perimeter.drawio +++ b/docs/contributors/resources/mxGraph-perimeter.drawio @@ -1 +1 @@ -7Vddk5owFP01PjoDBLP6uLq2fWhnumM7nT6mJEJqIDQEhf31DSQBgrpTbe33iybn3tyb3HPywQSs0uqlQHnyhmPCJoGHqwl4mATBIvDVbwPUGoCep4FYUKwhvwc29IkY0LqVFJPCcZScM0lzF4x4lpFIOhgSgh9cty1nbtYcxeQI2ESIHaMfKJaJRufBXY+/IjRObGYfLrTlE4p2seBlZvJlPCPakiIbxqyxSBDmhwEE1hOwEpxL3UqrFWFNVW3F9LgXZ6zdlAXJ5LcMKOtHmOyW6+g9wiFHNXz6/G4KdJQ9YqUphZmsrG1tSIbvmxKrXrs6sExkylTPV8126aTJ4KleIQXfdRUECtHRCD4qfz9rv6uFUhfhKZGiVi6HnoeZqWAyoMBigjAk6d4Nj4wc4i5cl+Etpypx4Bnl+qGJY4TrQ88NUfBSRMSMGlZ3FCgYBQpHcSQSMZFHcVRjsOoearm7gMfwhjwGfwKPbvWvZdEHz8e5MYuzH8ri785ZdzLavXcHr9x7YLyJ4U+lDf5jtPnPV/tq2sb8n6FNFRLVA7e8cSi+l9jpazHdzmc8eJxvNrNoP8UfT96OkKlyLre8XUnPMPxScmuYFu0D5145+GFe9UbVis1/G4VaQL0NctK8bxTFRFizmjMdD1GYzm3hkdAkqaSrLn2YrzjjolffljI2ghCjcaa6Zg5guSdCUvVGujeGlGLcpFkeEirJJkdRk/OgHoRnNNwEINWlKrbqGB3p/sL0ByqHJ1QORkf2UNCOPi4Vw6krVnOC6X5M0430kRNB1WoulEgHOxP9a4UTQkc4wS/WzalL/SYiaa+M/0dHc1Q4AgD+rQSguv33m750+s9jsP4K7ZbbjtMwEIafJpdIid1tt5e0uxSJg4oWCXGFvPFsYtWxI2fSA0+PEzvHwi4tXaRF3FT2n/E/9XxjJwFdZvuVYXn6QXOQAQn5PqA3ASFzEtnfSjg4YRqGTkiM4E6KOuFOfAcvNmGl4FA4zUuotUSRF4PVsVYKYhxozBi9G4Y9aDnMmrMEjoS7mMlj9YvgmDr1msw6/S2IJG0yR9O5e3LP4k1idKl8PqUVuCcZa2z8hoqUcb3rSfQ2oEujNbpRtl+CrKraVGyuGX5dfPykFhQlxqvdyrx75czenLKk3ZwBhZe1Js56y2TpK+n3ioemtKD464qQndXFoYsUM2lnkR3WlYMqQ2hnBRq9aQFQqzg34Ef0nthK1NbXdizoDNAc7Lpdx/bKU0l7WBvNgGQotsOczLdY0tq1GdZa2H9DQn8aoon38YchmoZDi0KXJga/ql/ykREZGU1GPshMAnjkYwe9XXdSDfQEuPQZ4ZKXCneE5Fy0EX3c55nRTi6K9kWCJIQOT+mMnnlK6choSv8qy6v/LO2xfBzB2SzHTfELlra67NALy6uA4g9pfy7zzbfN/XX8IG5U+p6ti63xL+kTaXNWpDXhaIi+0tcMEYyqFRLSn97U/0CLPHXh/n6HjF7us0vd3HbafQy68O5bm97+AA==7ZZbT8MgFMc/TR9NWtjFPeqc12hMlmjiGyvH0kjLpMxdPr200Audc7psJhqfCv/C//ScH1A8PEwWF5JM2a2gwD3k04WHzzyEgm4f6UeuLK3io45RIhlTq9XCOF5BOdCqs5hCZjQrKSG4iqeZMzsUaQqhcjQipZi7w54Fd6NOSQRrwjgkfF19jKliRj1G/Vq/hDhiZeSgNzBvJiR8iaSYpTZeKlIwbxJS2tiEMkaomDckPPLwUAqhTCtZDIHndS0rdvPKr6+6g8ngjjGxelBPw5F/ZMzOvzOlSk5CqvZrbbm/ET6zlbS5qmVZWkjpSU5I94ri4FOmEq57gW4WlYM8gq97mZLipQKAtWLcgK7R25JKUNVXr1kQCSi51PPmNduupcIaWEtNAicqfnNjErvEosquinAvYv01yK/2g/Upd0PPdy0yMZMh2FnNkreMUMuo0/JRREag1nx0o5F1LRVAvwEXHxAu+q1wOy6SXdEG+HOfA6Pt7BXtrwSJEHZ3aR/vuEtxy6iHf5Rl958lKq8bmxDszLK9KDaw1NUly8awaT4gOwTt3i60KclYQThw0ef6PVEKZFooyMcfntR/YIlsO3C/fHAPWj/3YF8nt+7Wl0EzvL5t49E75VbbjpswEP2aPCYCmwTy2Fx6kbpq1Ggv7ZsLE3BjcGScEPr1Ndjcdxsl3VUf+hIxx/aZzJwzhhFexucPghyiOx4AGyErOI/waoSQO8PqtwByDThzVwOhoIGG7AbY0l9gQMugRxpAqjEDSc6ZpIe0c9rnSQK+7GBECJ51t+0462Y9kBAGwNYnbIg+0kBGGvWQ2+AfgYZRldmezfXKD+LvQ8GPicmX8AT0SkwqGlNQGpGAZy0Ir0d4KTiX+ik+L4EVXa069t2Lvc/OfjPdre8/jR+2i80jGmuy99ccqYsTkMjXpUaa+kTY0XTS1CrzqrWQBO8KhVRUNgcvIhkzFdnqsewcFBksFaVS8H0tAFaIZoNgoN6FUuy6v8qxwGOQIlfnskbbqVElaslaYQIYkfTUzUmMxcKars6w4VT9G2SZacCW4THDgB2rS5Hyo/DBnGq3vEfk9IhqK1VEkogQ5IBIPbTKbqBS0efVPe3v1jP//svX+Oj+fBo/ZGuRVsa5Tt2ApFGpqN2VusA3REoQSYkgCw8kRwNLKJlF/mQoyuBbsTKZVuHq3N65yk30V8ZRl0/Z2D+0xvqXBkNO1xf2/EaD4R4R6hO9scGsywaTgpIkLKJFFlEJ2wPxi6VMvYe6BtvxRJo3i+2URpKqybxwGy7ssqOMLTnjovGqSQ9CwvlVLphKIO+FwW35w3vGHzNngmYvu6HT/mt7/ZZXNWpPqjVxvGl3Wh0XX5jXMtqAoKpYEP/FEPcv9+mNQ4zc24ZYSU3y1rZDsSG9bsxV2HzA6O3N9yFe/wY=xVVdb5swFP01PLYCGwh9XNJu06RK2SK126MHt2DV2Mg4AfbrZ2PzlazKsrZaHiLusX0u95x7jYc3ZftJkqq4FxkwD/lZ6+FbD6EYx/rfAJ0FwiC0QC5pZqFgAnb0FzjQd+ieZlBbzEFKCKZoVS9Op4JzSNUCI1KKZrntSbBl1orkcALsUsJO0UeaqcKiCVpN+GegeTFkDuIbu/KTpM+5FHvu8nHBwa6UZKBxBdUFyUQzg/CdhzdSCGWfynYDzKg6KMavaJjff/vy8PC436ItTZKv2ytL9vGSI2NxErh6W2pkqQ+E7Z2SrlbVDdICzz4Yh3TUi4PXhSqZjgL92CsHJoOvo1pJ8TwagDVi2SA7ce9MKcGor+5YECUo2elzzeRt5FwpZrYOmARGFD0scxLXYvlIN2bYCqrfBvluGrDveNww4NBfUtRiL1Nwp+aSHxGFR0RjKw1Eisgc1AmRfpiVPUG9oxe4G553V0lKeG6idVNQBbuKpGap0dfE0uonwZUbfH05GOuVFllw43Rk1iljG8GE7Im1huY3tsABpIL2TZrAsaDkBXFnTZL8oUni8BrFL7fEwoNLBY/ecZy0FGutl+y+m+XrMIkG4IcFVngAblvHYKNuHm1BUl0sSAe+akL1Ld938Lke/F+TjI4HMPrHSUarI6Kbv5tkbTXpZtsqs6G+bNZ1OH1k7PbpG47vfgM= \ No newline at end of file +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 \ No newline at end of file