diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..75ab6f3 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e2c36d49dfbfe6a435adb30b39dee074 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree new file mode 100644 index 0000000..6ddc028 Binary files /dev/null and b/.doctrees/api.doctree differ diff --git a/.doctrees/contributing.doctree b/.doctrees/contributing.doctree new file mode 100644 index 0000000..9d41e84 Binary files /dev/null and b/.doctrees/contributing.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000..a2ee974 Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/generated/probinet.evaluation.community_detection.doctree b/.doctrees/generated/probinet.evaluation.community_detection.doctree new file mode 100644 index 0000000..b5bb8fd Binary files /dev/null and b/.doctrees/generated/probinet.evaluation.community_detection.doctree differ diff --git a/.doctrees/generated/probinet.evaluation.covariate_prediction.doctree b/.doctrees/generated/probinet.evaluation.covariate_prediction.doctree new file mode 100644 index 0000000..419f588 Binary files /dev/null and b/.doctrees/generated/probinet.evaluation.covariate_prediction.doctree differ diff --git a/.doctrees/generated/probinet.evaluation.doctree b/.doctrees/generated/probinet.evaluation.doctree new file mode 100644 index 0000000..130da3c Binary files /dev/null and b/.doctrees/generated/probinet.evaluation.doctree differ diff --git a/.doctrees/generated/probinet.evaluation.expectation_computation.doctree b/.doctrees/generated/probinet.evaluation.expectation_computation.doctree new file mode 100644 index 0000000..45044b3 Binary files /dev/null and b/.doctrees/generated/probinet.evaluation.expectation_computation.doctree differ diff --git a/.doctrees/generated/probinet.evaluation.likelihood.doctree b/.doctrees/generated/probinet.evaluation.likelihood.doctree new file mode 100644 index 0000000..8a5a771 Binary files /dev/null and b/.doctrees/generated/probinet.evaluation.likelihood.doctree differ diff --git a/.doctrees/generated/probinet.evaluation.link_prediction.doctree b/.doctrees/generated/probinet.evaluation.link_prediction.doctree new file mode 100644 index 0000000..2082167 Binary files /dev/null and b/.doctrees/generated/probinet.evaluation.link_prediction.doctree differ diff --git a/.doctrees/generated/probinet.input.doctree b/.doctrees/generated/probinet.input.doctree new file mode 100644 index 0000000..b7567f0 Binary files /dev/null and b/.doctrees/generated/probinet.input.doctree differ diff --git a/.doctrees/generated/probinet.input.loader.doctree b/.doctrees/generated/probinet.input.loader.doctree new file mode 100644 index 0000000..94ffa9e Binary files /dev/null and b/.doctrees/generated/probinet.input.loader.doctree differ diff --git a/.doctrees/generated/probinet.input.preprocessing.doctree b/.doctrees/generated/probinet.input.preprocessing.doctree new file mode 100644 index 0000000..07e22df Binary files /dev/null and b/.doctrees/generated/probinet.input.preprocessing.doctree differ diff --git a/.doctrees/generated/probinet.input.stats.doctree b/.doctrees/generated/probinet.input.stats.doctree new file mode 100644 index 0000000..d67d6bd Binary files /dev/null and b/.doctrees/generated/probinet.input.stats.doctree differ diff --git a/.doctrees/generated/probinet.main.doctree b/.doctrees/generated/probinet.main.doctree new file mode 100644 index 0000000..f2a61ee Binary files /dev/null and b/.doctrees/generated/probinet.main.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.acd_cross_validation.doctree b/.doctrees/generated/probinet.model_selection.acd_cross_validation.doctree new file mode 100644 index 0000000..58f7945 Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.acd_cross_validation.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.crep_cross_validation.doctree b/.doctrees/generated/probinet.model_selection.crep_cross_validation.doctree new file mode 100644 index 0000000..4295662 Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.crep_cross_validation.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.cross_validation.doctree b/.doctrees/generated/probinet.model_selection.cross_validation.doctree new file mode 100644 index 0000000..5dfd568 Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.cross_validation.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.doctree b/.doctrees/generated/probinet.model_selection.doctree new file mode 100644 index 0000000..2fc1c58 Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.dyncrep_cross_validation.doctree b/.doctrees/generated/probinet.model_selection.dyncrep_cross_validation.doctree new file mode 100644 index 0000000..c4ec549 Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.dyncrep_cross_validation.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.jointcrep_cross_validation.doctree b/.doctrees/generated/probinet.model_selection.jointcrep_cross_validation.doctree new file mode 100644 index 0000000..31b128b Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.jointcrep_cross_validation.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.main.doctree b/.doctrees/generated/probinet.model_selection.main.doctree new file mode 100644 index 0000000..fbc79fb Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.main.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.masking.doctree b/.doctrees/generated/probinet.model_selection.masking.doctree new file mode 100644 index 0000000..63b6f4e Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.masking.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.mtcov_cross_validation.doctree b/.doctrees/generated/probinet.model_selection.mtcov_cross_validation.doctree new file mode 100644 index 0000000..272ecb4 Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.mtcov_cross_validation.doctree differ diff --git a/.doctrees/generated/probinet.model_selection.parameter_search.doctree b/.doctrees/generated/probinet.model_selection.parameter_search.doctree new file mode 100644 index 0000000..f683f09 Binary files /dev/null and b/.doctrees/generated/probinet.model_selection.parameter_search.doctree differ diff --git a/.doctrees/generated/probinet.models.acd.doctree b/.doctrees/generated/probinet.models.acd.doctree new file mode 100644 index 0000000..facec6c Binary files /dev/null and b/.doctrees/generated/probinet.models.acd.doctree differ diff --git a/.doctrees/generated/probinet.models.base.doctree b/.doctrees/generated/probinet.models.base.doctree new file mode 100644 index 0000000..d68bc06 Binary files /dev/null and b/.doctrees/generated/probinet.models.base.doctree differ diff --git a/.doctrees/generated/probinet.models.classes.doctree b/.doctrees/generated/probinet.models.classes.doctree new file mode 100644 index 0000000..bd2144f Binary files /dev/null and b/.doctrees/generated/probinet.models.classes.doctree differ diff --git a/.doctrees/generated/probinet.models.constants.doctree b/.doctrees/generated/probinet.models.constants.doctree new file mode 100644 index 0000000..a745f39 Binary files /dev/null and b/.doctrees/generated/probinet.models.constants.doctree differ diff --git a/.doctrees/generated/probinet.models.crep.doctree b/.doctrees/generated/probinet.models.crep.doctree new file mode 100644 index 0000000..cdd5974 Binary files /dev/null and b/.doctrees/generated/probinet.models.crep.doctree differ diff --git a/.doctrees/generated/probinet.models.doctree b/.doctrees/generated/probinet.models.doctree new file mode 100644 index 0000000..9f39a76 Binary files /dev/null and b/.doctrees/generated/probinet.models.doctree differ diff --git a/.doctrees/generated/probinet.models.dyncrep.doctree b/.doctrees/generated/probinet.models.dyncrep.doctree new file mode 100644 index 0000000..16d0ad5 Binary files /dev/null and b/.doctrees/generated/probinet.models.dyncrep.doctree differ diff --git a/.doctrees/generated/probinet.models.jointcrep.doctree b/.doctrees/generated/probinet.models.jointcrep.doctree new file mode 100644 index 0000000..59ae66b Binary files /dev/null and b/.doctrees/generated/probinet.models.jointcrep.doctree differ diff --git a/.doctrees/generated/probinet.models.mtcov.doctree b/.doctrees/generated/probinet.models.mtcov.doctree new file mode 100644 index 0000000..41a92e6 Binary files /dev/null and b/.doctrees/generated/probinet.models.mtcov.doctree differ diff --git a/.doctrees/generated/probinet.synthetic.anomaly.doctree b/.doctrees/generated/probinet.synthetic.anomaly.doctree new file mode 100644 index 0000000..988858c Binary files /dev/null and b/.doctrees/generated/probinet.synthetic.anomaly.doctree differ diff --git a/.doctrees/generated/probinet.synthetic.base.doctree b/.doctrees/generated/probinet.synthetic.base.doctree new file mode 100644 index 0000000..f16bfda Binary files /dev/null and b/.doctrees/generated/probinet.synthetic.base.doctree differ diff --git a/.doctrees/generated/probinet.synthetic.doctree b/.doctrees/generated/probinet.synthetic.doctree new file mode 100644 index 0000000..364ca1e Binary files /dev/null and b/.doctrees/generated/probinet.synthetic.doctree differ diff --git a/.doctrees/generated/probinet.synthetic.dynamic.doctree b/.doctrees/generated/probinet.synthetic.dynamic.doctree new file mode 100644 index 0000000..c7c823f Binary files /dev/null and b/.doctrees/generated/probinet.synthetic.dynamic.doctree differ diff --git a/.doctrees/generated/probinet.synthetic.multilayer.doctree b/.doctrees/generated/probinet.synthetic.multilayer.doctree new file mode 100644 index 0000000..59baa0e Binary files /dev/null and b/.doctrees/generated/probinet.synthetic.multilayer.doctree differ diff --git a/.doctrees/generated/probinet.synthetic.reciprocity.doctree b/.doctrees/generated/probinet.synthetic.reciprocity.doctree new file mode 100644 index 0000000..9b8c899 Binary files /dev/null and b/.doctrees/generated/probinet.synthetic.reciprocity.doctree differ diff --git a/.doctrees/generated/probinet.utils.doctree b/.doctrees/generated/probinet.utils.doctree new file mode 100644 index 0000000..d7f1ece Binary files /dev/null and b/.doctrees/generated/probinet.utils.doctree differ diff --git a/.doctrees/generated/probinet.utils.matrix_operations.doctree b/.doctrees/generated/probinet.utils.matrix_operations.doctree new file mode 100644 index 0000000..6d653b8 Binary files /dev/null and b/.doctrees/generated/probinet.utils.matrix_operations.doctree differ diff --git a/.doctrees/generated/probinet.utils.tools.doctree b/.doctrees/generated/probinet.utils.tools.doctree new file mode 100644 index 0000000..d1a3acd Binary files /dev/null and b/.doctrees/generated/probinet.utils.tools.doctree differ diff --git a/.doctrees/generated/probinet.version.doctree b/.doctrees/generated/probinet.version.doctree new file mode 100644 index 0000000..e657423 Binary files /dev/null and b/.doctrees/generated/probinet.version.doctree differ diff --git a/.doctrees/generated/probinet.visualization.doctree b/.doctrees/generated/probinet.visualization.doctree new file mode 100644 index 0000000..ffec74e Binary files /dev/null and b/.doctrees/generated/probinet.visualization.doctree differ diff --git a/.doctrees/generated/probinet.visualization.plot.doctree b/.doctrees/generated/probinet.visualization.plot.doctree new file mode 100644 index 0000000..e2a3231 Binary files /dev/null and b/.doctrees/generated/probinet.visualization.plot.doctree differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000..79c3ef0 Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.doctrees/references.doctree b/.doctrees/references.doctree new file mode 100644 index 0000000..d1c79e4 Binary files /dev/null and b/.doctrees/references.doctree differ diff --git a/.doctrees/start.doctree b/.doctrees/start.doctree new file mode 100644 index 0000000..42970e9 Binary files /dev/null and b/.doctrees/start.doctree differ diff --git a/.doctrees/tutorials/ACD.doctree b/.doctrees/tutorials/ACD.doctree new file mode 100644 index 0000000..27201e3 Binary files /dev/null and b/.doctrees/tutorials/ACD.doctree differ diff --git a/.doctrees/tutorials/CRep.doctree b/.doctrees/tutorials/CRep.doctree new file mode 100644 index 0000000..5ae1e44 Binary files /dev/null and b/.doctrees/tutorials/CRep.doctree differ diff --git a/.doctrees/tutorials/DynCRep.doctree b/.doctrees/tutorials/DynCRep.doctree new file mode 100644 index 0000000..714ffba Binary files /dev/null and b/.doctrees/tutorials/DynCRep.doctree differ diff --git a/.doctrees/tutorials/JointCRep.doctree b/.doctrees/tutorials/JointCRep.doctree new file mode 100644 index 0000000..6942f9e Binary files /dev/null and b/.doctrees/tutorials/JointCRep.doctree differ diff --git a/.doctrees/tutorials/MTCOV.doctree b/.doctrees/tutorials/MTCOV.doctree new file mode 100644 index 0000000..bbc69fa Binary files /dev/null and b/.doctrees/tutorials/MTCOV.doctree differ diff --git a/.doctrees/tutorials/Unknown_structure.doctree b/.doctrees/tutorials/Unknown_structure.doctree new file mode 100644 index 0000000..546d402 Binary files /dev/null and b/.doctrees/tutorials/Unknown_structure.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_images/0389966730cbaa9e60d90cd639a343486febf370bc3b370b4193828b9ff741ad.png b/_images/0389966730cbaa9e60d90cd639a343486febf370bc3b370b4193828b9ff741ad.png new file mode 100644 index 0000000..fa29abd Binary files /dev/null and b/_images/0389966730cbaa9e60d90cd639a343486febf370bc3b370b4193828b9ff741ad.png differ diff --git a/_images/0d55b7a29fc58c6416a6e2f495a74d15825b2353641cb3e23d0c85d1a722a2e2.png b/_images/0d55b7a29fc58c6416a6e2f495a74d15825b2353641cb3e23d0c85d1a722a2e2.png new file mode 100644 index 0000000..2f9d4d0 Binary files /dev/null and b/_images/0d55b7a29fc58c6416a6e2f495a74d15825b2353641cb3e23d0c85d1a722a2e2.png differ diff --git a/_images/1494e55d920f366f79d0c9341b781905e68a78928ee4d2a67b60c2bed7b8af03.png b/_images/1494e55d920f366f79d0c9341b781905e68a78928ee4d2a67b60c2bed7b8af03.png new file mode 100644 index 0000000..a45d970 Binary files /dev/null and b/_images/1494e55d920f366f79d0c9341b781905e68a78928ee4d2a67b60c2bed7b8af03.png differ diff --git a/_images/1853c6b3b10eba7e2cd43862ea0404c20a0c866d018d5ff721dad6aa9491e797.png b/_images/1853c6b3b10eba7e2cd43862ea0404c20a0c866d018d5ff721dad6aa9491e797.png new file mode 100644 index 0000000..2268124 Binary files /dev/null and b/_images/1853c6b3b10eba7e2cd43862ea0404c20a0c866d018d5ff721dad6aa9491e797.png differ diff --git a/_images/207e57f0143a4b2166ba247c8b0f73d9416c506a3bc7d51f0f97754e2f198abb.png b/_images/207e57f0143a4b2166ba247c8b0f73d9416c506a3bc7d51f0f97754e2f198abb.png new file mode 100644 index 0000000..e2b4bd5 Binary files /dev/null and b/_images/207e57f0143a4b2166ba247c8b0f73d9416c506a3bc7d51f0f97754e2f198abb.png differ diff --git a/_images/21d57cf2b0b5372583629f5a3a11857971d52dd745e31799be254051200ed3dc.png b/_images/21d57cf2b0b5372583629f5a3a11857971d52dd745e31799be254051200ed3dc.png new file mode 100644 index 0000000..1709d5e Binary files /dev/null and b/_images/21d57cf2b0b5372583629f5a3a11857971d52dd745e31799be254051200ed3dc.png differ diff --git a/_images/275bc8ec6af7cae014bbf3f9471d35d6bcc4b88e8ea2870bda3e1413aa7381aa.png b/_images/275bc8ec6af7cae014bbf3f9471d35d6bcc4b88e8ea2870bda3e1413aa7381aa.png new file mode 100644 index 0000000..10e56d1 Binary files /dev/null and b/_images/275bc8ec6af7cae014bbf3f9471d35d6bcc4b88e8ea2870bda3e1413aa7381aa.png differ diff --git a/_images/2c370f8876abbfc3a6cffa8b59912847aefb94d64fd43813d12bd0492d35f1fb.png b/_images/2c370f8876abbfc3a6cffa8b59912847aefb94d64fd43813d12bd0492d35f1fb.png new file mode 100644 index 0000000..1354e4c Binary files /dev/null and b/_images/2c370f8876abbfc3a6cffa8b59912847aefb94d64fd43813d12bd0492d35f1fb.png differ diff --git a/_images/2ce6113bb2816f05daf7ac32b16f3f7911505d594e0b42708a842b6e459ef132.png b/_images/2ce6113bb2816f05daf7ac32b16f3f7911505d594e0b42708a842b6e459ef132.png new file mode 100644 index 0000000..58db8ee Binary files /dev/null and b/_images/2ce6113bb2816f05daf7ac32b16f3f7911505d594e0b42708a842b6e459ef132.png differ diff --git a/_images/2fb8f0784896e1fd513d29bffbde0e4aa5e7bfd2333884cf07f33a4786f9b3d9.png b/_images/2fb8f0784896e1fd513d29bffbde0e4aa5e7bfd2333884cf07f33a4786f9b3d9.png new file mode 100644 index 0000000..9eeb6c5 Binary files /dev/null and b/_images/2fb8f0784896e1fd513d29bffbde0e4aa5e7bfd2333884cf07f33a4786f9b3d9.png differ diff --git a/_images/398e030bb05ce65d69827711403bc34db2b05bdf4a17bc6654346fd81c808d0d.png b/_images/398e030bb05ce65d69827711403bc34db2b05bdf4a17bc6654346fd81c808d0d.png new file mode 100644 index 0000000..11d0622 Binary files /dev/null and b/_images/398e030bb05ce65d69827711403bc34db2b05bdf4a17bc6654346fd81c808d0d.png differ diff --git a/_images/44496834b40c205fb3c8d71e8c72c14881a93db199797ff5d64fa25cf7462c0e.png b/_images/44496834b40c205fb3c8d71e8c72c14881a93db199797ff5d64fa25cf7462c0e.png new file mode 100644 index 0000000..a2ae538 Binary files /dev/null and b/_images/44496834b40c205fb3c8d71e8c72c14881a93db199797ff5d64fa25cf7462c0e.png differ diff --git a/_images/54d8a8c60f081402e61b705942e6440c38cae020059b9d4baaa50dd8c4114f40.png b/_images/54d8a8c60f081402e61b705942e6440c38cae020059b9d4baaa50dd8c4114f40.png new file mode 100644 index 0000000..7e9e0cc Binary files /dev/null and b/_images/54d8a8c60f081402e61b705942e6440c38cae020059b9d4baaa50dd8c4114f40.png differ diff --git a/_images/6447956b05ca0df8a4e86953d9f79e7084121bbe53b6f363c4248d9bdf4a271c.png b/_images/6447956b05ca0df8a4e86953d9f79e7084121bbe53b6f363c4248d9bdf4a271c.png new file mode 100644 index 0000000..53194a6 Binary files /dev/null and b/_images/6447956b05ca0df8a4e86953d9f79e7084121bbe53b6f363c4248d9bdf4a271c.png differ diff --git a/_images/699981914b49fd09a52c50f566310035ce340f964715eb6400fe66732f4ba957.png b/_images/699981914b49fd09a52c50f566310035ce340f964715eb6400fe66732f4ba957.png new file mode 100644 index 0000000..d537cd0 Binary files /dev/null and b/_images/699981914b49fd09a52c50f566310035ce340f964715eb6400fe66732f4ba957.png differ diff --git a/_images/9a138761251095d629e365b58b561e6bd286134bbf59788867aa8ec48722b770.png b/_images/9a138761251095d629e365b58b561e6bd286134bbf59788867aa8ec48722b770.png new file mode 100644 index 0000000..509eb52 Binary files /dev/null and b/_images/9a138761251095d629e365b58b561e6bd286134bbf59788867aa8ec48722b770.png differ diff --git a/_images/9e8c26baa5351455ddd7ed47b141c0e37cffbf85d9453bab09f1c2b04195cb57.png b/_images/9e8c26baa5351455ddd7ed47b141c0e37cffbf85d9453bab09f1c2b04195cb57.png new file mode 100644 index 0000000..29310ec Binary files /dev/null and b/_images/9e8c26baa5351455ddd7ed47b141c0e37cffbf85d9453bab09f1c2b04195cb57.png differ diff --git a/_images/a4cd2a8236371139d8741fe53e2c6dbd4418e4ea87e742054bad7a96082de6b0.png b/_images/a4cd2a8236371139d8741fe53e2c6dbd4418e4ea87e742054bad7a96082de6b0.png new file mode 100644 index 0000000..0974f7b Binary files /dev/null and b/_images/a4cd2a8236371139d8741fe53e2c6dbd4418e4ea87e742054bad7a96082de6b0.png differ diff --git a/_images/a4ef432c47ee67cd2cf371237c5d2e637dd09c4af5b166b37981a08caf204eab.png b/_images/a4ef432c47ee67cd2cf371237c5d2e637dd09c4af5b166b37981a08caf204eab.png new file mode 100644 index 0000000..ba9756a Binary files /dev/null and b/_images/a4ef432c47ee67cd2cf371237c5d2e637dd09c4af5b166b37981a08caf204eab.png differ diff --git a/_images/b6091462934ff6da561f0f75914eeda557dd442354d5a3bc86d020556e442974.png b/_images/b6091462934ff6da561f0f75914eeda557dd442354d5a3bc86d020556e442974.png new file mode 100644 index 0000000..a604c39 Binary files /dev/null and b/_images/b6091462934ff6da561f0f75914eeda557dd442354d5a3bc86d020556e442974.png differ diff --git a/_images/c4707d75c0e71758f7d946d7c2250af1abc794d4bffdb6e7c8322e770c6930e4.png b/_images/c4707d75c0e71758f7d946d7c2250af1abc794d4bffdb6e7c8322e770c6930e4.png new file mode 100644 index 0000000..afe0086 Binary files /dev/null and b/_images/c4707d75c0e71758f7d946d7c2250af1abc794d4bffdb6e7c8322e770c6930e4.png differ diff --git a/_images/c8014cae1b686c26ac26d1dbb41465eba275689890b4f607ca5607cf7903379e.png b/_images/c8014cae1b686c26ac26d1dbb41465eba275689890b4f607ca5607cf7903379e.png new file mode 100644 index 0000000..3da924f Binary files /dev/null and b/_images/c8014cae1b686c26ac26d1dbb41465eba275689890b4f607ca5607cf7903379e.png differ diff --git a/_images/dac08b7c1ef30db61032c8b8de4b26723f6d58b5370c8502f45c73d2abe604de.png b/_images/dac08b7c1ef30db61032c8b8de4b26723f6d58b5370c8502f45c73d2abe604de.png new file mode 100644 index 0000000..73c421e Binary files /dev/null and b/_images/dac08b7c1ef30db61032c8b8de4b26723f6d58b5370c8502f45c73d2abe604de.png differ diff --git a/_images/dcd04a38e7e1b4d654d8a0934cb3d65bef22acfaf24747f4319260356b005d3e.png b/_images/dcd04a38e7e1b4d654d8a0934cb3d65bef22acfaf24747f4319260356b005d3e.png new file mode 100644 index 0000000..8696ee2 Binary files /dev/null and b/_images/dcd04a38e7e1b4d654d8a0934cb3d65bef22acfaf24747f4319260356b005d3e.png differ diff --git a/_images/dcd567661db7fef54a67cbf27b8ee83c65d893c7648459d107443b19b8afae37.png b/_images/dcd567661db7fef54a67cbf27b8ee83c65d893c7648459d107443b19b8afae37.png new file mode 100644 index 0000000..ec0e1e0 Binary files /dev/null and b/_images/dcd567661db7fef54a67cbf27b8ee83c65d893c7648459d107443b19b8afae37.png differ diff --git a/_images/e40a3ae7f23ed93653150d0ec8496defc8e8d9101c3e7c139ce89d9efb4008ae.png b/_images/e40a3ae7f23ed93653150d0ec8496defc8e8d9101c3e7c139ce89d9efb4008ae.png new file mode 100644 index 0000000..82b623c Binary files /dev/null and b/_images/e40a3ae7f23ed93653150d0ec8496defc8e8d9101c3e7c139ce89d9efb4008ae.png differ diff --git a/_images/e8342f64958ff58a0d3cbbff9c976c0836d1fe5e591e1df628bc618a8258957b.png b/_images/e8342f64958ff58a0d3cbbff9c976c0836d1fe5e591e1df628bc618a8258957b.png new file mode 100644 index 0000000..59f0572 Binary files /dev/null and b/_images/e8342f64958ff58a0d3cbbff9c976c0836d1fe5e591e1df628bc618a8258957b.png differ diff --git a/_images/e85a10d4b9745884a91cdfad8c8aeeee35a435ce6fd77cefca5480f92b073c85.png b/_images/e85a10d4b9745884a91cdfad8c8aeeee35a435ce6fd77cefca5480f92b073c85.png new file mode 100644 index 0000000..a7ed572 Binary files /dev/null and b/_images/e85a10d4b9745884a91cdfad8c8aeeee35a435ce6fd77cefca5480f92b073c85.png differ diff --git a/_images/ea8d314b7a39ee3bde54bc52092b372b43697dcde74ef19c24ee977d6e9f76d4.png b/_images/ea8d314b7a39ee3bde54bc52092b372b43697dcde74ef19c24ee977d6e9f76d4.png new file mode 100644 index 0000000..589bae7 Binary files /dev/null and b/_images/ea8d314b7a39ee3bde54bc52092b372b43697dcde74ef19c24ee977d6e9f76d4.png differ diff --git a/_images/edf003221d0ac64cee185ababbb938b6bbffb37334088af190db7a299b787c58.png b/_images/edf003221d0ac64cee185ababbb938b6bbffb37334088af190db7a299b787c58.png new file mode 100644 index 0000000..b6cede2 Binary files /dev/null and b/_images/edf003221d0ac64cee185ababbb938b6bbffb37334088af190db7a299b787c58.png differ diff --git a/_images/f49271f6b04d16fb4a12cc07a42e35b2952654f7a7e5edb9f3ce431eeda9c387.png b/_images/f49271f6b04d16fb4a12cc07a42e35b2952654f7a7e5edb9f3ce431eeda9c387.png new file mode 100644 index 0000000..69f2295 Binary files /dev/null and b/_images/f49271f6b04d16fb4a12cc07a42e35b2952654f7a7e5edb9f3ce431eeda9c387.png differ diff --git a/_images/f58c83f8f858dc9540c653046d302b6f8e292b6332582fbc0c9fcc16932d9005.png b/_images/f58c83f8f858dc9540c653046d302b6f8e292b6332582fbc0c9fcc16932d9005.png new file mode 100644 index 0000000..edbfb07 Binary files /dev/null and b/_images/f58c83f8f858dc9540c653046d302b6f8e292b6332582fbc0c9fcc16932d9005.png differ diff --git a/_images/input_and_output_for_algorithms.png b/_images/input_and_output_for_algorithms.png new file mode 100644 index 0000000..78c0415 Binary files /dev/null and b/_images/input_and_output_for_algorithms.png differ diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 0000000..f05853a --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,417 @@ + + + + + + + + + + Overview: module code — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ + + + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/evaluation/community_detection.html b/_modules/probinet/evaluation/community_detection.html new file mode 100644 index 0000000..9f2a6f7 --- /dev/null +++ b/_modules/probinet/evaluation/community_detection.html @@ -0,0 +1,631 @@ + + + + + + + + + + probinet.evaluation.community_detection — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.evaluation.community_detection

+"""
+Functions for evaluating community detection.
+"""
+
+from contextlib import suppress
+from typing import Set
+
+import numpy as np
+
+
+
+[docs] +def calculate_metric(ground_truth: Set[int], detected: Set[int], metric: str) -> float: + """ + Calculates a performance metric based on the similarity between the ground truth + set and the detected set. Supports "f1" and "jaccard" metrics. It is typically + used for evaluating the quality of prediction sets in relation to the true + reference sets. + + Parameters + ---------- + ground_truth + The set of true (ground truth) items. + detected + The set of predicted (detected) items. + metric : str + The metric to calculate. Must be either "f1" for the F1 score or "jaccard" + for the Jaccard index. + + Returns + ------- + float + The calculated metric value as a float. Returns 0.0 if there is no overlap + between the ground truth and the detected sets. + + Raises + ------ + ValueError + If the provided metric is unsupported or invalid. + + Notes + ----- + - The F1 score is calculated as the harmonic mean of precision and recall. + - The Jaccard index is calculated as the ratio of the size of the intersection + of the sets to the size of their union. + """ + if not len(ground_truth.intersection(detected)): + return 0.0 + precision = len(ground_truth.intersection(detected)) / len(detected) + recall = len(ground_truth.intersection(detected)) / len(ground_truth) + if metric == "f1": + return 2 * (precision * recall) / (precision + recall) + elif metric == "jaccard": + return len(ground_truth.intersection(detected)) / len( + ground_truth.union(detected) + )
+ + + +
+[docs] +def compute_community_detection_metric( + U_infer: np.ndarray, U0: np.ndarray, metric: str = "f1", com: bool = False +) -> float: + """ + Compute a similarity metric to evaluate the quality of inferred community memberships. + + This function compares inferred community memberships (`U_infer`) against the ground truth (`U0`) + using supported performance metrics like F1-score or Jaccard Index. The inferred and true + community memberships are represented as **membership matrices** (`U_infer` and `U0`) where + each row corresponds to a node, and columns represent its membership strength across K communities. + + Parameters + ---------- + U_infer + Inferred community membership matrix (shape: [N, K]), where N is the number + of nodes and K is the number of communities. This matrix is created during + the community detection process. + + U0 + Ground truth membership matrix (shape: [N, K]) that represents the true community + membership strengths of nodes. + + metric + The similarity metric to use for evaluation, either: + - "f1": F1-score (harmonic mean of precision and recall for membership overlap). + - "jaccard": Jaccard index (intersection-over-union for memberships). + + com + If True, interpret each row of `U_infer` directly as community members. + Otherwise, threshold each row to determine community assignment. + + Returns + ------- + float + A similarity score based on the chosen metric. The value is between 0 and 1, + where higher values indicate better alignment between the inferred and true + community structures. + + """ + if metric not in {"f1", "jaccard"}: + raise ValueError('The similarity measure can be either "f1" or "jaccard"!') + + K = U0.shape[1] + threshold = 1 / K + # Create the ground truth dictionary for each community in the original partition. The key is + # the community index and the value is the set of nodes in that community, i.e., the nodes + # with a value greater than the threshold in the corresponding column of the original partition. + gt = {i: set(np.argwhere(U0[:, i] > threshold).flatten()) for i in range(K)} + d = {} + for i in range(K): + if com: + with suppress(IndexError): + d[i] = set(U_infer[i]) + else: + d[i] = set(np.argwhere(U_infer[:, i] > threshold).flatten()) + + R = sum( + max(calculate_metric(gt[i], d[j], metric) for j in d.keys()) for i in range(K) + ) + S = sum( + max(calculate_metric(gt[i], d[j], metric) for i in range(K)) for j in d.keys() + ) + # Return the average of the two measures + return np.round(R / (2 * K) + S / (2 * len(d)), 4)
+ + + +
+[docs] +def compute_permutation_matrix(U_infer: np.ndarray, U0: np.ndarray) -> np.ndarray: + """ + Computes a permutation matrix that aligns the inferred and ground truth community memberships. + + This function calculates a permutation matrix to align two membership matrices, `U_infer` (inferred community + structure) and `U0` (ground truth community structure). The permutation ensures that columns of `U_infer` + are reordered to best match those of `U0`. It helps resolve discrepancies caused by arbitrary ordering + of communities across different runs or datasets. + + Parameters + ---------- + U_infer + Inferred community membership matrix (shape: [N, K]), where N is the number of nodes and K is the number + of communities. Each row represents the membership strengths of a node across K inferred communities. + + U0 + Ground truth community membership matrix (shape: [N, K]), where each row represents the true membership + strengths of a node across K communities. + + Returns + ------- + np.ndarray + A permutation matrix (shape: [K, K]) where each row and column contains a single `1`. The matrix reorders + the columns of `U_infer` to maximize alignment with the columns of `U0`. + + Notes + ----- + - The membership matrices (`U_infer` and `U0`) represent soft clustering of nodes into communities, where + each row indicates the strength of a node's association with each community. + - Permutation is necessary because community detection algorithms often produce outputs where the community + labels have no strict correspondence (e.g., community 1 in `U_infer` may correspond to community 3 in `U0`). + + """ + N, RANK = U0.shape + M = np.dot(np.transpose(U_infer), U0) / float(N) + rows = np.zeros(RANK) + columns = np.zeros(RANK) + P = np.zeros((RANK, RANK)) + for _ in range(RANK): + max_entry = 0.0 + c_index = 1 + r_index = 1 + for i in range(RANK): + if columns[i] == 0: + for j in range(RANK): + if rows[j] == 0: + if M[j, i] > max_entry: + max_entry = M[j, i] + c_index = i + r_index = j + P[r_index, c_index] = 1 + columns[c_index] = 1 + rows[r_index] = 1 + return P
+ + + +
+[docs] +def cosine_similarity(U_infer: np.ndarray, U0: np.ndarray) -> tuple: + """ + Compute the cosine similarity between inferred and ground truth community memberships after alignment. + + This function calculates the average cosine similarity between two community membership matrices, `U_infer` + (inferred communities) and `U0` (ground truth communities). Before computing similarity, the function aligns + the columns of `U_infer` with `U0` using a permutation matrix to ensure consistency in community ordering. + + Cosine similarity measures the angular similarity between vectors, making it a suitable metric for comparing + normalized membership strengths of nodes in a soft clustering context. + + Parameters + ---------- + U_infer + Inferred community membership matrix (shape: [N, K]), where N is the number of nodes and K is the number + of communities. Each row represents the degree to which a node belongs to each community. + + U0 + Ground truth community membership matrix (shape: [N, K]), where each row represents the true membership + strengths of nodes across K communities. + + Returns + ------- + tuple + A tuple containing: + - `np.ndarray`: The aligned inferred membership matrix (`U_infer`) after applying the permutation matrix. + - `float`: The average cosine similarity score, a measure of the alignment between `U_infer` and `U0`, + where higher values indicate stronger similarity. + + Notes + ----- + - Cosine similarity ranges between -1 and 1, but in this context (non-negative memberships), it typically + falls between 0 and 1. + - `U_infer` is first aligned to `U0` using a permutation matrix to resolve potential column order mismatches + in community labels. + - Normalization is applied to each row of `U_infer` and `U0` before computing the similarity, ensuring equal + weight across nodes. + + """ + P = compute_permutation_matrix(U_infer, U0) + U_infer = np.dot(U_infer, P) + N, K = U0.shape + U_infer0 = U_infer.copy() + U0tmp = U0.copy() + cosine_sim = 0.0 + norm_inf = np.linalg.norm(U_infer, axis=1) + norm0 = np.linalg.norm(U0, axis=1) + for i in range(N): + if norm_inf[i] > 0.0: + U_infer[i, :] = U_infer[i, :] / norm_inf[i] + if norm0[i] > 0.0: + U0[i, :] = U0[i, :] / norm0[i] + for k in range(K): + cosine_sim += np.dot(np.transpose(U_infer[:, k]), U0[:, k]) + U0 = U0tmp.copy() + return U_infer0, cosine_sim / float(N)
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/evaluation/covariate_prediction.html b/_modules/probinet/evaluation/covariate_prediction.html new file mode 100644 index 0000000..d824d56 --- /dev/null +++ b/_modules/probinet/evaluation/covariate_prediction.html @@ -0,0 +1,486 @@ + + + + + + + + + + probinet.evaluation.covariate_prediction — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.evaluation.covariate_prediction

+"""
+Module for extracting true labels and predicting labels.
+"""
+
+from typing import List, Optional
+
+import numpy as np
+import pandas as pd
+from sklearn import metrics
+
+
+
+[docs] +def extract_true_label( + X: pd.DataFrame, mask: Optional[np.ndarray] = None +) -> np.ndarray: + """ + Extract true labels from the design matrix X. + + Parameters + ---------- + X + Pandas DataFrame object representing the one-hot encoding version of the design matrix. + mask + Mask for selecting a subset of the design matrix. + + Returns + ------- + np.ndarray + Array of true labels. + """ + if mask is not None: + return X.iloc[mask > 0].idxmax(axis=1).values + return X.idxmax(axis=1).values
+ + + +
+[docs] +def predict_label( + X: pd.DataFrame, + u: np.ndarray, + v: np.ndarray, + beta: np.ndarray, + mask: Optional[np.ndarray] = None, +) -> List[str]: + """ + Compute predicted labels. + + Parameters + ---------- + X + Pandas DataFrame object representing the one-hot encoding version of the design matrix. + u : Membership matrix (out-degree). + Membership matrix (out-degree). + v : Membership matrix (in-degree). + Membership matrix (in-degree). + beta : Beta parameter matrix. + Beta parameter matrix. + mask : Mask for selecting a subset of the design matrix. + Mask for selecting a subset of the design matrix. + + Returns + ------- + List[str] + List of predicted labels. + """ + if mask is None: + # Compute the probability of each label + probs = np.dot((u + v), beta) / 2 + # Check that the sum of the probabilities is equal to the number of examples + assert np.round(np.sum(np.sum(probs, axis=1)), 0) == u.shape[0] + # Return the predicted label for each + return [X.columns[el] for el in np.argmax(probs, axis=1)] + else: + # Compute the probability of each label + probs = np.dot((u[mask > 0] + v[mask > 0]), beta) / 2 + assert np.round(np.sum(np.sum(probs, axis=1)), 0) == u[mask > 0].shape[0] + # TO REMIND: when gamma=1, this assert fails because we don't update the entries of U and V that belong + # to the test set, because all these rows will be not in the subs (all elements are zeros) + return [X.iloc[mask > 0].columns[el] for el in np.argmax(probs, axis=1)]
+ + + +
+[docs] +def compute_covariate_prediction_accuracy( + X: pd.DataFrame, + u: np.ndarray, + v: np.ndarray, + beta: np.ndarray, + mask: Optional[np.ndarray] = None, +) -> float: + """ + Return the accuracy of the attribute prediction, computed as the fraction of correctly classified examples. + """ + true_label = extract_true_label(X, mask=mask) + pred_label = predict_label(X, u, v, beta, mask=mask) + acc = metrics.accuracy_score(true_label, pred_label) + return acc
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/evaluation/expectation_computation.html b/_modules/probinet/evaluation/expectation_computation.html new file mode 100644 index 0000000..4f4747c --- /dev/null +++ b/_modules/probinet/evaluation/expectation_computation.html @@ -0,0 +1,792 @@ + + + + + + + + + + probinet.evaluation.expectation_computation — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.evaluation.expectation_computation

+"""
+Functions for computing expectations and related metrics.
+"""
+
+from typing import Optional, Tuple
+
+import numpy as np
+import pandas as pd
+from scipy.stats import poisson
+from sklearn import metrics
+
+from ..evaluation.covariate_prediction import extract_true_label, predict_label
+from ..types import GraphDataType
+from ..utils.matrix_operations import transpose_matrix, transpose_tensor
+from ..utils.tools import check_symmetric
+
+
+
+[docs] +def calculate_conditional_expectation( + B: np.ndarray, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + eta: float, + mean: Optional[np.ndarray] = None, +) -> np.ndarray: + """ + Calculates the conditional expectation of a given set of parameters. + + This function computes the conditional expectation of a multivariate random + process based on the provided inputs. It incorporates a scaling parameter + (eta) and optionally a mean tensor to compute the result. If the mean tensor + is not provided, it defaults to computing a mean based on the input parameters + u, v, and w. + + Parameters + ---------- + B + A 3-dimensional tensor used in the computation of the weighted mean. The + tensor represents the relationship between variables in the multivariate + process. + u + A 1-dimensional array representing the first set of variables + contributing to the computation of the mean. Typically corresponds to a + principal factor in the model. + v + A 1-dimensional array representing the second set of variables + contributing to the computation of the mean. It complements the u array + in forming the joint distribution. + w + A 1-dimensional array representing the third set of variables + interacting with u and v to establish a comprehensive measure of + centrality in the model. + eta + A scaling parameter applied to the tensor factors to adjust their + weighted contribution to the overall mean measure of expectations. + mean + A precomputed 3-dimensional tensor mean to override the default computed + mean. If None, the mean will be computed using u, v, and w. + + Returns + ------- + np.ndarray + A 3-dimensional tensor that represents the computed conditional + expectation given the provided parameters. The tensor provides a + context-sensitive measure of expectation, calculated as either a default + weighted mean or incorporating a provided precomputed mean. + """ + if mean is None: + return compute_mean_lambda0(u, v, w) + eta * transpose_tensor(B) + return compute_mean_lambda0(u, v, w) + eta * transpose_tensor(mean)
+ + + +
+[docs] +def calculate_conditional_expectation_dyncrep( + B_to_T: GraphDataType, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + eta: float = 0.0, + beta: float = 1.0, +) -> np.ndarray: + """ + Calculate the conditional expectation for given dynamic representation. + + This function computes the conditional expectation based on the dynamic + representation of the input data, including arrays and graph-based data. + It utilizes transformation and normalization techniques such as + matrix transposition and scaling. + + Parameters + ---------- + B_to_T : GraphDataType + Graph-based data structure representing relationships or + transitions between nodes or states. + + u : np.ndarray + Input array representing data points or state variables. + + v : np.ndarray + Input array representing another set of data points or state + variables related to `u`. + + w : np.ndarray + Auxiliary input array used for reference in the calculation. + + eta : float, optional + Scaling factor applied to the graph transformation. Default is 0.0. + + beta : float, optional + Scaling factor applied in the normalization computation. Default + is 1.0. + + Returns + ------- + np.ndarray + Array representing the computed conditional expectation + after applying the dynamic representation transformations. + """ + conditional_expectation = compute_mean_lambda0_dyncrep( + u, v, w + ) + eta * transpose_matrix(B_to_T) + M = (beta * conditional_expectation) / (1.0 + beta * conditional_expectation) + return M
+ + + +
+[docs] +def calculate_expectation( + u: np.ndarray, v: np.ndarray, w: np.ndarray, eta: float +) -> np.ndarray: + """ + Compute the expectations for the marginal distribution. + """ + lambda0 = compute_mean_lambda0(u, v, w) + lambda0T = transpose_tensor(lambda0) + M = (lambda0 + eta * lambda0T) / (1.0 - eta * eta) + return M
+ + + +
+[docs] +def compute_mean_lambda0(u: np.ndarray, v: np.ndarray, w: np.ndarray) -> np.ndarray: + """ + Compute the mean lambda0 for all entries. + """ + if w.ndim == 2: + M = np.einsum("ik,jk->ijk", u, v) + M = np.einsum("ijk,ak->aij", M, w) + else: + M = np.einsum("ik,jq->ijkq", u, v) + M = np.einsum("ijkq,akq->aij", M, w) + return M
+ + + +
+[docs] +def compute_mean_lambda0_dyncrep( + u: np.ndarray, v: np.ndarray, w: np.ndarray +) -> np.ndarray: + """ + Compute the mean lambda0 for all entries for dynamic reciprocity. + """ + if w.ndim == 2: + M = np.einsum("ik,jk->ijk", u, v) + M = np.einsum("ijk,ak->ij", M, w) + else: + M = np.einsum("ik,jq->ijkq", u, v) + M = np.einsum("ijkq,akq->ij", M, w) + return M
+ + + +
+[docs] +def compute_mean_lambda0_nonzero( + subs_nz: Tuple[int, int, int], + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + assortative=True, +) -> np.ndarray: + """ + Compute the mean lambda0_ij for only non-zero entries. + """ + if not assortative: + nz_recon_IQ = np.einsum("Ik,Ikq->Iq", u[subs_nz[1], :], w[subs_nz[0], :, :]) + else: + nz_recon_IQ = np.einsum("Ik,Ik->Ik", u[subs_nz[1], :], w[subs_nz[0], :]) + nz_recon_I = np.einsum("Iq,Iq->I", nz_recon_IQ, v[subs_nz[2], :]) + return nz_recon_I
+ + + +
+[docs] +def calculate_Z(lambda0_aij: np.ndarray, eta: float) -> np.ndarray: + """ + Compute the normalization constant of the Bivariate Bernoulli distribution. + """ + Z = ( + lambda0_aij + + transpose_tensor(lambda0_aij) + + eta * np.einsum("aij,aji->aij", lambda0_aij, lambda0_aij) + + 1 + ) + for _, z in enumerate(Z): + assert check_symmetric(z) + return Z
+ + + +
+[docs] +def compute_expected_adjacency_tensor( + U: np.ndarray, V: np.ndarray, W: np.ndarray +) -> np.ndarray: + """ + Compute the expected value of the adjacency tensor. + """ + if W.ndim == 1: + M = np.einsum("ik,jk->ijk", U, V) + M = np.einsum("ijk,k->ij", M, W) + else: + M = np.einsum("ik,jq->ijkq", U, V) + M = np.einsum("ijkq,kq->ij", M, W) + return M
+ + + +
+[docs] +def compute_expected_adjacency_tensor_multilayer( + u: np.ndarray, v: np.ndarray, w: np.ndarray +) -> np.ndarray: + """ + Compute the expected value of the adjacency tensor for multi-covariate data. + """ + M = np.einsum("ik,jq->ijkq", u, v) + M = np.einsum("ijkq,akq->aij", M, w) + return M
+ + + +
+[docs] +def compute_M_joint(U: np.ndarray, V: np.ndarray, W: np.ndarray, eta: float) -> list: + """ + Return the vectors of joint probabilities of every pair of edges. + """ + # Compute the mean lambda0 for all entries + lambda0_aij = compute_mean_lambda0(U, V, W) + + # Calculate the normalization constant Z + Z = calculate_Z(lambda0_aij, eta) + + # Compute the joint probability p00 (both edges are absent) + p00 = 1 / Z + + # Compute the joint probability p10 (first edge is present, second is absent) + p10 = lambda0_aij / Z + + # Compute the joint probability p01 (first edge is absent, second is present) + p01 = transpose_tensor(p10) + + # Compute the joint probability p11 (both edges are present) + p11 = (eta * lambda0_aij * transpose_tensor(lambda0_aij)) / Z + + # Return the list of joint probabilities + return [p00, p01, p10, p11]
+ + + +
+[docs] +def compute_lagrange_multiplier(lambda_i: float, num: float, den: float) -> float: + """ + Function to calculate the value of the Lagrange multiplier. + """ + f = num / (lambda_i + den) + return np.sum(f) - 1
+ + + +
+[docs] +def u_with_lagrange_multiplier( + u: np.ndarray, x: np.ndarray, y: np.ndarray +) -> np.ndarray: + """ + Function to update the membership matrix 'u' using the Lagrange multiplier. + """ + denominator = x.sum() - (y * u).sum() + f_ui = x / (y + denominator) + if (u < 0).sum() > 0: + return 100.0 * np.ones(u.shape) + return f_ui - u
+ + + +
+[docs] +def compute_marginal_and_conditional_expectation( + B: np.ndarray, U: np.ndarray, V: np.ndarray, W: np.ndarray, eta: float +) -> tuple: + """ + Return the marginal and conditional expected value. + """ + lambda0_aij = compute_mean_lambda0(U, V, W) + L = lambda0_aij.shape[0] + Z = calculate_Z(lambda0_aij, eta) + M_marginal = (lambda0_aij + eta * lambda0_aij * transpose_tensor(lambda0_aij)) / Z + for layer in np.arange(L): + np.fill_diagonal(M_marginal[layer], 0.0) + M_conditional = (eta ** transpose_tensor(B) * lambda0_aij) / ( + eta ** transpose_tensor(B) * lambda0_aij + 1 + ) + for layer in np.arange(L): + np.fill_diagonal(M_conditional[layer], 0.0) + return M_marginal, M_conditional
+ + + +
+[docs] +def calculate_expectation_acd( + U: np.ndarray, V: np.ndarray, W: np.ndarray, Q: np.ndarray, pi: float = 1 +) -> np.ndarray: + """ + Calculate the expectation for the adjacency tensor with an additional covariate. + """ + lambda0 = compute_mean_lambda0(U, V, W) + return (1 - Q) * lambda0 + Q * pi
+ + + +
+[docs] +def calculate_Q_dense( + A: np.ndarray, + M: np.ndarray, + pi: float, + mu: float, + mask: Optional[np.ndarray] = None, + EPS: float = 1e-12, +) -> np.ndarray: + """ + Compute the dense Q matrix for the given adjacency tensor and parameters. + + Parameters + ---------- + A : np.ndarray + Adjacency tensor. + M : np.ndarray + Mean adjacency tensor. + pi : float + Poisson parameter. + mu : float + Mixing parameter. + mask : Optional[np.ndarray] + Mask for selecting a subset of the adjacency tensor. + EPS : float + Small constant to avoid division by zero. + + Returns + ------- + np.ndarray + Dense Q matrix. + """ + AT = transpose_tensor(A) + MT = transpose_tensor(M) + num = (mu + EPS) * poisson.pmf(A, (pi + EPS)) * poisson.pmf(AT, (pi + EPS)) + # num = poisson.pmf(A,pi) * poisson.pmf(AT,pi)* (mu+EPS) + den = num + poisson.pmf(A, M) * poisson.pmf(AT, MT) * (1 - mu + EPS) + if mask is None: + return num / den + else: + return num[mask.nonzero()] / den[mask.nonzero()]
+ + + +
+[docs] +def compute_L1loss(X: np.ndarray, Xtilde: np.ndarray) -> float: + """ + Calculate the L1 loss between two matrices. + + Parameters + ---------- + X : np.ndarray + The first matrix. + Xtilde : np.ndarray + The second matrix to compare against the first matrix. + + Returns + ------- + float + The L1 loss between the two matrices, rounded to three decimal places. + """ + return np.round(np.mean(np.abs(X - Xtilde)), 3)
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/evaluation/likelihood.html b/_modules/probinet/evaluation/likelihood.html new file mode 100644 index 0000000..b4488ee --- /dev/null +++ b/_modules/probinet/evaluation/likelihood.html @@ -0,0 +1,724 @@ + + + + + + + + + + probinet.evaluation.likelihood — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.evaluation.likelihood

+"""
+This module provides functions for computing the log-likelihood and pseudo log-likelihood of the models, as well as other related calculations.
+"""
+
+from typing import Optional
+
+import numpy as np
+import pandas as pd
+
+from probinet.evaluation.expectation_computation import (
+    compute_expected_adjacency_tensor,
+    compute_expected_adjacency_tensor_multilayer,
+    compute_mean_lambda0,
+)
+from probinet.utils.tools import log_and_raise_error
+
+
+
+[docs] +def loglikelihood( + B: np.ndarray, + X: pd.DataFrame, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + beta: np.ndarray, + gamma: float, + maskG: Optional[np.ndarray] = None, + maskX: Optional[np.ndarray] = None, +) -> float: + """ + Return the log-likelihood of the model. + + Parameters + ---------- + B : np.ndarray + Graph adjacency tensor. + X : pd.DataFrame + Pandas DataFrame object representing the one-hot encoding version of the design matrix. + u : np.ndarray + Membership matrix (out-degree). + v : np.ndarray + Membership matrix (in-degree). + w : np.ndarray + Affinity tensor. + beta : np.ndarray + Beta parameter matrix. + gamma : float + Scaling parameter gamma. + maskG : Optional[np.ndarray] + Mask for selecting a subset in the adjacency tensor. + maskX : Optional[np.ndarray] + Mask for selecting a subset in the design matrix. + + Returns + ------- + float + Log-likelihood value. + """ + # Compute the log-likelihood for the attributes + attr = loglikelihood_attributes(X, u, v, beta, mask=maskX) + + # Compute the log-likelihood for the network structure + graph = loglikelihood_network(B, u, v, w, mask=maskG) + + # Combine the two log-likelihoods using the scaling parameter gamma + loglik = (1 - gamma) * graph + gamma * attr + + return loglik
+ + + +
+[docs] +def loglikelihood_network( + B: np.ndarray, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + mask: Optional[np.ndarray] = None, +) -> float: + """ + Compute the log-likelihood for the network structure. + + Parameters + ---------- + B : np.ndarray + Graph adjacency tensor. + u : np.ndarray + Membership matrix (out-degree). + v : np.ndarray + Membership matrix (in-degree). + w : np.ndarray + Affinity tensor. + mask : Optional[np.ndarray] + Mask for selecting a subset in the adjacency tensor. + + Returns + ------- + float + Log-likelihood value for the network structure. + """ + if mask is None: + # Compute the expected adjacency tensor + M = compute_expected_adjacency_tensor(u, v, w) + logM = np.zeros(M.shape) + logM[M > 0] = np.log(M[M > 0]) + return (B * logM).sum() - M.sum() + + # Compute the expected adjacency tensor for the masked elements + M = compute_expected_adjacency_tensor_multilayer(u, v, w)[mask > 0] + logM = np.zeros(M.shape) + logM[M > 0] = np.log(M[M > 0]) + return (B[mask > 0] * logM).sum() - M.sum()
+ + + +
+[docs] +def loglikelihood_attributes( + X: pd.DataFrame, + u: np.ndarray, + v: np.ndarray, + beta: np.ndarray, + mask: Optional[np.ndarray] = None, +) -> float: + """ + Compute the log-likelihood for the attributes. + + Parameters + ---------- + X : pd.DataFrame + Pandas DataFrame object representing the one-hot encoding version of the design matrix. + u : np.ndarray + Membership matrix (out-degree). + v : np.ndarray + Membership matrix (in-degree). + beta : np.ndarray + Beta parameter matrix. + mask : Optional[np.ndarray] + Mask for selecting a subset in the design matrix. + + Returns + ------- + float + Log-likelihood value for the attributes. + """ + if mask is None: + # Compute the expected attribute matrix + p = np.dot(u + v, beta) / 2 + nonzeros = p > 0.0 + p[nonzeros] = np.log(p[nonzeros] / 2.0) + return (X * p).sum().sum() + + # Compute the expected attribute matrix for the masked elements + p = np.dot(u[mask > 0] + v[mask > 0], beta) / 2 + nonzeros = p > 0.0 + p[nonzeros] = np.log(p[nonzeros] / 2.0) + return (X.iloc[mask > 0] * p).sum().sum()
+ + + +
+[docs] +def likelihood_conditional( + M: np.ndarray, + beta: float, + data: np.ndarray, + data_tm1: np.ndarray, + EPS: Optional[float] = 1e-10, +) -> float: + """ + Compute the log-likelihood of the data given the parameters. + + Parameters + ---------- + M : np.ndarray + Matrix of expected values. + beta : float + Rate of edge removal. + data : np.ndarray + Current adjacency tensor. + data_tm1 : np.ndarray + Previous adjacency tensor. + EPS : float, optional + Small constant to prevent division by zero and log of zero. + + Returns + ------- + float + Log-likelihood value. + """ + # Initialize the log-likelihood + l = -M.sum() + + # Compute the log-likelihood for the non-zero elements + sub_nz_and = np.logical_and(data > 0, (1 - data_tm1) > 0) + Alog = data[sub_nz_and] * (1 - data_tm1)[sub_nz_and] * np.log(M[sub_nz_and] + EPS) + l += Alog.sum() + + # Compute the log-likelihood for the elements that are present in both data and data_tm1 + sub_nz_and = np.logical_and(data > 0, data_tm1 > 0) + l += np.log(1 - beta + EPS) * (data[sub_nz_and] * data_tm1[sub_nz_and]).sum() + + # Compute the log-likelihood for the elements that are present in data_tm1 but not in data + sub_nz_and = np.logical_and(data_tm1 > 0, (1 - data) > 0) + l += np.log(beta + EPS) * ((1 - data)[sub_nz_and] * data_tm1[sub_nz_and]).sum() + + # Check for NaN values in the log-likelihood + if np.isnan(l): + log_and_raise_error(ValueError, "Likelihood is NaN!") + return l
+ + + +
+[docs] +def PSloglikelihood( + B: np.ndarray, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + eta: float, + mask: Optional[np.ndarray] = None, +) -> float: + """ + Compute the pseudo log-likelihood of the data. + + Parameters + ---------- + B : np.ndarray + Graph adjacency tensor. + u : np.ndarray + Out-going membership matrix. + v : np.ndarray + In-coming membership matrix. + w : np.ndarray + Affinity tensor. + eta : float + Reciprocity coefficient. + mask : Optional[np.ndarray] + Mask for selecting the held out set in the adjacency tensor in case of cross-validation. + + Returns + ------- + float + Pseudo log-likelihood value. + """ + if mask is None: + # Compute the expected adjacency tensor + M = compute_mean_lambda0(u, v, w) + M += (eta * B[0, :, :].T)[np.newaxis, :, :] + logM = np.zeros(M.shape) + logM[M > 0] = np.log(M[M > 0]) + return (B * logM).sum() - M.sum() + + # Compute the expected adjacency tensor for the masked elements + M = compute_mean_lambda0(u, v, w)[mask > 0] + M += (eta * B[0, :, :].T)[np.newaxis, :, :][mask > 0] + logM = np.zeros(M.shape) + logM[M > 0] = np.log(M[M > 0]) + return (B[mask > 0] * logM).sum() - M.sum()
+ + + +
+[docs] +def calculate_opt_func( + B: np.ndarray, + algo_obj, + mask: Optional[np.ndarray] = None, + assortative: bool = False, +) -> float: + """ + Compute the optimal value for the pseudo log-likelihood with the inferred parameters. + + Parameters + ---------- + B : np.ndarray + Graph adjacency tensor. + algo_obj : object + The CRep object. + mask : Optional[np.ndarray] + Mask for selecting a subset of the adjacency tensor. + assortative : bool + Flag to use an assortative mode. + + Returns + ------- + float + Maximum pseudo log-likelihood value. + """ + # Copy the adjacency tensor + B_test = B.copy() + if mask is not None: + B_test[np.logical_not(mask)] = 0.0 + + if not assortative: + return PSloglikelihood( + B, algo_obj.u_f, algo_obj.v_f, algo_obj.w_f, algo_obj.eta_f, mask=mask + ) + + # Compute the pseudo log-likelihood in assortative mode + L = B.shape[0] + K = algo_obj.w_f.shape[-1] + w = np.zeros((L, K, K)) + for l in range(L): + w1 = np.zeros((K, K)) + np.fill_diagonal(w1, algo_obj.w_f[l]) + w[l, :, :] = w1.copy() + return PSloglikelihood(B, algo_obj.u_f, algo_obj.v_f, w, algo_obj.eta_f, mask=mask)
+ + + +
+[docs] +def log_likelihood_given_model(model: object, adjacency_tensor: np.ndarray) -> float: + """ + Calculate the log-likelihood of the model considering only the structural data. + + Parameters + ---------- + model : object + The model object containing the lambda0_ija and lambda0_nz attributes. + adjacency_tensor : np.ndarray + The adjacency matrix. + + Returns + ------- + float + The log-likelihood value, rounded to three decimal places. + """ + M = model.lambda0_ija + loglikelihood = -M.sum() + logM = np.log(model.lambda0_nz) + XlogM = adjacency_tensor[adjacency_tensor.nonzero()] * logM + loglikelihood += XlogM.sum() + return np.round(loglikelihood, 3)
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/evaluation/link_prediction.html b/_modules/probinet/evaluation/link_prediction.html new file mode 100644 index 0000000..69a9a91 --- /dev/null +++ b/_modules/probinet/evaluation/link_prediction.html @@ -0,0 +1,579 @@ + + + + + + + + + + probinet.evaluation.link_prediction — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.evaluation.link_prediction

+"""
+Functions for evaluating link prediction.
+"""
+
+from functools import singledispatch
+from typing import Optional, Union
+
+import numpy as np
+from sklearn import metrics
+
+from probinet.evaluation.expectation_computation import (
+    compute_expected_adjacency_tensor_multilayer,
+)
+
+
+
+[docs] +@singledispatch +def mask_or_flatten_array( + mask: Union[np.ndarray, None], expected_adjacency: np.ndarray +) -> np.ndarray: + raise NotImplementedError(f"Unsupported type {type(mask)} for mask.")
+ + + +@mask_or_flatten_array.register(type(None)) +def _(mask: None, expected_adjacency: np.ndarray) -> np.ndarray: + return expected_adjacency.flatten() + + +@mask_or_flatten_array.register(np.ndarray) +def _(mask: np.ndarray, expected_adjacency: np.ndarray) -> np.ndarray: + return expected_adjacency[mask > 0] + + + + + + + + + + +
+[docs] +def compute_AUC_from_ranked_predictions( + ranked_predictions: list[tuple[float, int]], + num_positive_samples: int, + num_negative_samples: int, +) -> float: + """ + Calculate the AUC (Area Under the Curve) for the given ranked list of predictions. + + Parameters + ---------- + ranked_predictions : list[tuple[float, int]] + The ranked list of predictions, where each tuple contains a score and the actual value. + num_positive_samples : int + The number of positive samples. + num_negative_samples : int + The number of negative samples. + + Returns + ------- + float + The AUC value for the ranked predictions. + """ + y = 0.0 + bad = 0.0 + for _, actual in ranked_predictions: + if actual > 0: + y += 1 + else: + bad += y + AUC = 1.0 - (bad / (num_positive_samples * num_negative_samples)) + return AUC
+ + + +
+[docs] +def calculate_f1_score( + data0: np.ndarray, + pred: np.ndarray, + mask: Optional[np.ndarray] = None, + threshold: float = 0.1, +) -> float: + """ + Calculate the F1 score for the given predictions and data. + + Parameters + ---------- + data0 : np.ndarray + The original adjacency matrix. + pred : np.ndarray + The predicted adjacency matrix. + mask : Optional[np.ndarray], optional + The mask to apply on the data, by default None. + threshold : float, optional + The threshold to binarize the predictions, by default 0.1. + + Returns + ------- + float + The F1 score for the given predictions and data. + """ + # Binarize the predictions based on the threshold + Z_pred = np.copy(pred[0]) + Z_pred[Z_pred < threshold] = 0 + Z_pred[Z_pred >= threshold] = 1 + + # Binarize the data + data = (data0 > 0).astype("int") + + return metrics.f1_score( + mask_or_flatten_array(mask, data), mask_or_flatten_array(mask, Z_pred) + )
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/input/loader.html b/_modules/probinet/input/loader.html new file mode 100644 index 0000000..528d6a3 --- /dev/null +++ b/_modules/probinet/input/loader.html @@ -0,0 +1,831 @@ + + + + + + + + + + probinet.input.loader — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.input.loader

+"""
+Functions for handling the data.
+"""
+
+import csv
+import logging
+from importlib.resources import files
+from os import PathLike
+from pathlib import Path
+from typing import Any, Optional, Union
+
+import networkx as nx
+import numpy as np
+import pandas as pd
+
+from ..models.classes import GraphData
+from ..utils.tools import log_and_raise_error
+from .preprocessing import (
+    create_adjacency_tensor_from_graph_list,
+    create_sparse_adjacency_tensor_from_graph_list,
+)
+from .stats import print_graph_stats
+
+
+
+[docs] +def build_adjacency_from_networkx( + network: nx.Graph, + weight_list: list[str], + file_name: Optional[PathLike] = None, +) -> GraphData: + """ + Import networkx graph and convert it to the GraphData object + + Parameters + ---------- + networkx + networkx graph that will be converted to GraphData object + weight_list + list of names of weights user would like to use from networkx graph + file_name + name of csv file (and path) created from networkx graph (used to create GraphData object) + e.g. /path/to/file/file_name.csv + Returns + ------- + GraphData + GraphData object created from networkx graph + """ + attribute_names = {key for _, _, data in network.edges(data=True) for key in data} + for w in weight_list: + assert w in attribute_names, f"{w} is not an attribute" + + if not file_name or Path(file_name).suffix != ".csv": + file_name = Path.cwd() / "edge_list.csv" + logging.DEBUG("File will be stored at %s" % file_name) + + # Save edges to a CSV file + with open(file_name, "w", newline="", encoding="utf-8") as edge_file: + writer = csv.writer(edge_file, delimiter=" ") + # Write header + writer.writerow(["source", "target"] + weight_list) # Get edge keys. + # Write edge data + for source, target, attrs in network.edges(data=True): + writer.writerow([source, target] + [attrs[a] for a in weight_list]) + + return build_adjacency_from_file(file_name)
+ + + +
+[docs] +def build_adjacency_from_file( + path_to_file: PathLike, + ego: str = "source", + alter: str = "target", + force_dense: bool = True, + undirected: bool = False, + noselfloop: bool = True, + sep: str = "\\s+", + binary: bool = True, + header: Optional[int] = 0, + **_kwargs: Any, +) -> GraphData: + """ + Import data, i.e., the adjacency matrix, from a given folder. + + Return the NetworkX graph and its numpy adjacency matrix. + + Parameters + ---------- + path_to_file + Path of the input file. + ego + Name of the column to consider as the source of the edge. + alter + Name of the column to consider as the target of the edge. + force_dense + If set to True, the algorithm is forced to consider a dense adjacency tensor. + undirected + If set to True, the algorithm considers an undirected graph. + noselfloop + If set to True, the algorithm removes the self-loops. + sep + Separator to use when reading the dataset. + binary + If set to True, the algorithm reads the graph with binary edges. + header + Row number to use as the column names, and the start of the data. + + Returns + ------- + GraphData + Named tuple containing the graph list, the adjacency tensor, the transposed tensor, + the data values, and the nodes. + """ + + # Read adjacency file + df_adj = pd.read_csv(path_to_file, sep=sep, header=header) + logging.debug( + "Read adjacency file from %s. The shape of the data is %s.", + path_to_file, + df_adj.shape, + ) + # Check that the df has only non negative values; if not, raise an error + if (df_adj.iloc[:, 2:] < 0).any(axis=None): + # We check this for the columns that contain weights (i.e., from the 2nd column onwards) + log_and_raise_error(ValueError, "There are negative weights.") + + # Build a list of MultiDiGraph NetworkX objects representing the layers of the network + A = read_graph( + df_adj=df_adj, + ego=ego, + alter=alter, + undirected=undirected, + noselfloop=noselfloop, + binary=binary, + ) + nodes = list(A[0].nodes()) + + # Save the network in a tensor + if force_dense: + B, rw = create_adjacency_tensor_from_graph_list(A, nodes=nodes) + B_T, data_T_vals = None, None + else: + B, B_T, data_T_vals, rw = create_sparse_adjacency_tensor_from_graph_list( + A, calculate_reciprocity=True + ) + + # Get the current logging level + current_level = logging.getLogger().getEffectiveLevel() + + # Check if the current level is INFO or lower + if current_level <= logging.DEBUG: + print_graph_stats(A, rw) + + return GraphData( + graph_list=A, + adjacency_tensor=B, + transposed_tensor=B_T, + data_values=data_T_vals, + nodes=nodes, + )
+ + + +
+[docs] +def read_and_process_design_matrix( + in_folder_path: PathLike, + cov_name: str, + sep: str, + header: Optional[int], + nodes: list[str], + attr_name: str, + egoX: str, +) -> pd.DataFrame: + """ + Read and process the design matrix with covariates. + + Parameters + ---------- + in_folder_path + Path to the folder containing the input files. + cov_name + Name of the covariate file. + sep : str + Separator to use when reading the covariate file. + header + Row number to use as the column names, and the start of the data. + nodes + List of node IDs. + attr_name + Name of the attribute to consider in the analysis. + egoX : str + Name of the column to consider as node IDs in the design matrix. + + Returns + ------- + X_attr + Pandas DataFrame that represents the one-hot encoding version of the design matrix. + """ + df_X = pd.read_csv(in_folder_path / cov_name, sep=sep, header=header) + logging.debug("Indiv shape: %s", df_X.shape) + + # Read and return the design matrix with covariates + return read_design_matrix(df_X, nodes, attribute=attr_name, ego=egoX)
+ + + +
+[docs] +def build_adjacency_and_design_from_file( + in_folder: str, + adj_name: str = "multilayer_network.csv", + cov_name: str = "X.csv", + ego: str = "source", + egoX: str = "Name", + alter: str = "target", + attr_name: str = "Metadata", + undirected: bool = False, + force_dense: bool = True, + noselfloop: bool = True, + sep: str = ",", + header: Optional[int] = 0, + return_X_as_np: bool = True, + **_kwargs, +) -> GraphData: + """ + Import data, i.e. the adjacency tensor and the design matrix, from a given folder. + + Parameters + ---------- + in_folder : str + Path of the folder containing the input files. + adj_name : str + Input file name of the adjacency tensor. + cov_name : str + Input file name of the design matrix. + ego : str + Name of the column to consider as the source of the edge. + egoX : str + Name of the column to consider as node IDs in the design matrix-attribute dataset. + alter : str + Name of the column to consider as the target of the edge. + attr_name : str + Name of the attribute to consider in the analysis. + undirected : bool + If set to True, the algorithm considers an undirected graph. + force_dense : bool + If set to True, the algorithm is forced to consider a dense adjacency tensor. + noselfloop : bool + If set to True, the algorithm removes the self-loops. + sep : str + Separator to use when reading the dataset. + header : int + Row number to use as the column names, and the start of the data. + return_X_as_np : bool + If set to True, the design matrix is returned as a numpy array. + _kwargs + Additional keyword arguments. + + Returns + ------- + A : list of nx.MultiDiGraph + List of MultiDiGraph NetworkX objects representing the layers of the network. + B : ndarray or sparse.COO + Graph adjacency tensor. If `force_dense` is True, returns a dense ndarray. Otherwise, returns a sparse COO tensor. + X_attr : pd.DataFrame or None + Pandas DataFrame object representing the one-hot encoding version of the design matrix. Returns None if the design matrix is not provided. + nodes : list of str + List of node IDs. + """ + + def get_data_path(in_folder): + """ + Try to treat in_folder as a package data path, if that fails, treat in_folder as a file path. + The case where the input is a file path refers to the case where the user points to data + outside the package. + """ + try: + # Try to treat in_folder as a package data path + return files(in_folder) + except (ModuleNotFoundError, FileNotFoundError, TypeError): + # If that fails, treat in_folder as a file path + return Path(in_folder) + + # Check if in_folder is a package data path or a file path + in_folder_path = get_data_path(in_folder) + + # Build the adjacency tensor and the incidence tensor + A, B, _, _, nodes, _ = build_adjacency_from_file( + path_to_file=in_folder_path / adj_name, + ego=ego, + alter=alter, + force_dense=force_dense, + undirected=undirected, + noselfloop=noselfloop, + sep=sep, + binary=False, + header=header, + ) + + # Read the design matrix with covariates + X_df = read_and_process_design_matrix( + in_folder_path, cov_name, sep, header, nodes, attr_name, egoX + ) + + if return_X_as_np: + # Convert X_df to a numpy array + X_df = np.array(X_df) + + return GraphData(graph_list=A, adjacency_tensor=B, design_matrix=X_df, nodes=nodes)
+ + + +
+[docs] +def read_graph( + df_adj: pd.DataFrame, + ego: str = "source", + alter: str = "target", + undirected: bool = False, + noselfloop: bool = True, + binary: bool = True, + label: str = "weight", +) -> list[nx.MultiDiGraph]: + """ + Create the graph by adding edges and nodes. + + Return the list MultiGraph (or MultiDiGraph if undirected=False) NetworkX objects. The graph + is built by adding edges and nodes from the given DataFrame. The graphs listed in the output + have an edge attribute named `label`. + + Parameters + ---------- + df_adj: DataFrame + Pandas DataFrame object containing the edges of the graph. + ego: str + Name of the column to consider as the source of the edge. + alter: str + Name of the column to consider as the target of the edge. + undirected: bool + If set to True, the algorithm considers an undirected graph. + noselfloop: bool + If set to True, the algorithm removes the self-loops. + binary: bool + If set to True, read the graph with binary edges. + label: str + Name to be assigned to the edge attribute, across all layers. + + Returns + ------- + A: list + List of MultiGraph (or MultiDiGraph if undirected=False) NetworkX objects. + """ + # Build nodes + egoID = df_adj[ego].unique() + alterID = df_adj[alter].unique() + nodes = sorted(set(egoID).union(set(alterID))) + + L = df_adj.shape[1] - 2 # number of layers + # Build the multilayer NetworkX graph: create a list of graphs, as many + # graphs as there are layers + if undirected: + A = [nx.MultiGraph() for _ in range(L)] + else: + A = [nx.MultiDiGraph() for _ in range(L)] + + logging.debug("Creating the networks ...") + # Set the same set of nodes and order over all layers + for layer in range(L): + A[layer].add_nodes_from(nodes) + + for _, row in df_adj.iterrows(): + v1 = row[ego] + v2 = row[alter] + for layer in range(L): + if row[layer + 2] > 0: + if binary: + if A[layer].has_edge(v1, v2): + A[layer][v1][v2][0][label] = 1 + else: + edge_attributes = {label: 1} + A[layer].add_edge(v1, v2, **edge_attributes) + else: + if A[layer].has_edge(v1, v2): + A[layer][v1][v2][0][label] += int( + row[layer + 2] + ) # the edge already exists, no parallel edge created + else: + edge_attributes = {label: int(row[layer + 2])} + A[layer].add_edge(v1, v2, **edge_attributes) + + # Remove self-loops + if noselfloop: + logging.debug("Removing self loops") + for layer in range(L): + A[layer].remove_edges_from(list(nx.selfloop_edges(A[layer]))) + + return A
+ + + +
+[docs] +def read_design_matrix( + df_X: pd.DataFrame, + nodes: list, + attribute: Union[str, None] = None, + ego: str = "Name", +): + """ + Create the design matrix with the one-hot encoding of the given attribute. + + Parameters + ---------- + df_X : DataFrame + Pandas DataFrame object containing the covariates of the nodes. + nodes : list + List of nodes IDs. + attribute : str + Name of the attribute to consider in the analysis. + ego : str + Name of the column to consider as node IDs in the design matrix. + + Returns + ------- + X_attr : DataFrame + Pandas DataFrame that represents the one-hot encoding version of the design matrix. + """ + logging.debug("Reading the design matrix...") + + X = df_X[df_X[ego].isin(nodes)] # filter nodes + X = X.set_index(ego).loc[nodes].reset_index() # sort by nodes + + if attribute is None: + X_attr = pd.get_dummies(X.iloc[:, 1]) # gets the first columns after the ego + else: # use one attribute as it is + X_attr = pd.get_dummies(X[attribute]) + + logging.debug("Design matrix shape: %s", X_attr.shape) + logging.debug("Distribution of attribute %s:", attribute) + logging.debug("%s", np.sum(X_attr, axis=0)) + + return X_attr
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/input/preprocessing.html b/_modules/probinet/input/preprocessing.html new file mode 100644 index 0000000..da0d3fa --- /dev/null +++ b/_modules/probinet/input/preprocessing.html @@ -0,0 +1,608 @@ + + + + + + + + + + probinet.input.preprocessing — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.input.preprocessing

+"""
+It provides functions for preprocessing and constructing adjacency tensors from NetworkX graphs.
+The script facilitates the creation of both dense and sparse adjacency tensors, considering edge
+weights, and ensures proper formatting of input data tensors.
+"""
+
+from typing import Any, List, Optional, Tuple, Union
+
+import networkx as nx
+import numpy as np
+import scipy
+from numpy import ndarray
+from sparse import COO
+
+from ..types import GraphDataType
+from ..utils import tools
+
+
+
+[docs] +def create_adjacency_tensor_from_graph_list( + A: List[nx.MultiDiGraph], + nodes: Optional[List] = None, + calculate_reciprocity: bool = True, + label: str = "weight", +) -> Union[ndarray, Tuple[ndarray, List[Any]]]: + """ + Create the numpy adjacency tensor of a networkX graph. + + Parameters + ---------- + A : list + List of MultiDiGraph NetworkX objects. + nodes : list, optional + List of nodes IDs. If not provided, use all nodes in the first graph as the default. + calculate_reciprocity : bool, optional + Whether to calculate reciprocity or not. + label : str, optional + The edge attribute key used to determine the weight of the edges. + + Returns + ------- + B : ndarray or Tuple[ndarray, List[Any]] + Graph adjacency tensor. If calculate_reciprocity is True, returns a tuple with B and a list of reciprocity values. + + Raises + ------ + AssertionError + If any graph in A has a different set of vertices than the first graph. + If any weight in B is not an integer. + """ + + # Get the number of nodes in the first graph of the list A + N = A[0].number_of_nodes() + + # If nodes is not provided, use all nodes in the first graph as the default + if nodes is None: + nodes = list(A[0].nodes()) + + # Initialize an empty numpy array B to store the adjacency tensors for each layer in A + # The shape of B is [number of layers in A, N, N] + B = np.empty(shape=[len(A), N, N]) + + # Initialize an empty list to store reciprocity values for each layer in A + rw = [] + + # Loop over each layer in A using enumeration to get both the layer index (l) and the graph + # (A[l]) + for layer, A_layer in enumerate(A): + # Check if the current graph has the same set of nodes as the first graph + assert set(A_layer.nodes()) == set( + nodes + ), "All graphs in A must have the same set of vertices." + + # Check if all weights in B[l] are integers + assert all( + isinstance(a[2], int) for a in A_layer.edges(data=label) + ), "All weights in A must be integers." + + # Convert the graph A[l] to a numpy array with specified options + # - weight='weight': consider edge weights + # - dtype=int: ensure the resulting array has integer data type + # - nodelist=nodes: use the specified nodes + B[layer, :, :] = nx.to_numpy_array( + A_layer, weight=label, dtype=int, nodelist=nodes + ) + + # Calculate reciprocity for the current layer and append it to the rw list + if calculate_reciprocity: + rw_layer = np.multiply(B[layer], B[layer].T).sum() / B[layer].sum() + rw.append(rw_layer) + + if not calculate_reciprocity: + rw = [] + + return B, rw
+ + + +
+[docs] +def create_sparse_adjacency_tensor_from_graph_list( + A: List[nx.MultiDiGraph], calculate_reciprocity: bool = False +) -> Union[COO, Tuple[COO, COO, ndarray, List[Any]]]: + """ + Create the sparse tensor adjacency tensor of a networkX graph using TensorLy. + + Parameters + ---------- + A : list + List of MultiDiGraph NetworkX objects. + calculate_reciprocity : bool, optional + Whether to calculate and return the reciprocity values.. + + Returns + ------- + data : SparseTensor or Tuple[SparseTensor, SparseTensor, ndarray, List[Any]] + Graph adjacency tensor. If calculate_reciprocity is True, returns a tuple with the adjacency tensor, its transpose, an array with values of entries A[j, i] given non-zero entry (i, j), and a list of reciprocity values. + """ + + # Get the number of nodes in the first graph of the list A + N = A[0].number_of_nodes() + + # Get the number of layers (graphs) in A + L = len(A) + + # Initialize an empty list to store reciprocity values for each layer in A + rw = [] + + # Initialize arrays to store indices and values for building sparse tensors + d1 = [] + d2, d2_T = [], [] + d3, d3_T = [], [] + v, vT, v_T = [], [], [] + + # Loop over each layer in A + for layer in range(L): + # Convert the graph A[layer] to a scipy sparse array and its transpose + b = nx.to_scipy_sparse_array(A[layer]) + b_T = b.transpose() + + # Calculate reciprocity for the current layer and append it to the rw list + if calculate_reciprocity: + rw.append(np.sum(b.multiply(b_T)) / np.sum(b)) + + # Get the non-zero indices for the original and transposed arrays + nz = b.nonzero() + nz_T = b_T.nonzero() + + # Append indices and values to the arrays for building sparse tensors + d1.extend([layer] * len(nz[0])) + d2.extend(nz[0]) + d2_T.extend(nz_T[0]) + d3.extend(nz[1]) + d3_T.extend(nz_T[1]) + v.extend(b[nz]) + vT.extend(b_T[nz_T]) + v_T.extend(b[nz[::-1]]) + + # Create sparse tensors for the original and transposed graphs + subs_ = (np.array(d1), np.array(d2), np.array(d3)) + subs_T_ = (np.array(d1), np.array(d2_T), np.array(d3_T)) + data = COO(subs_, np.array(v, dtype=np.float64), shape=(L, N, N)) + data_T = COO(subs_T_, np.array(vT, dtype=np.float64), shape=(L, N, N)) + + if calculate_reciprocity: + return data, data_T, np.array(v_T), rw + return data
+ + + +
+[docs] +def preprocess_adjacency_tensor(A: np.ndarray) -> GraphDataType: + """ + Pre-process input data tensor. + + If the input is sparse, returns an integer sparse tensor (COO). Otherwise, returns an integer dense tensor (ndarray). + + Parameters + ---------- + A : ndarray + Input data tensor. + + Returns + ------- + A : COO or ndarray + Pre-processed data. If the input is sparse, returns an integer sparse tensor (COO). Otherwise, returns an integer dense tensor (ndarray). + """ + if not A.dtype == np.dtype(int).type: + A = A.astype(int) + if np.logical_and(isinstance(A, np.ndarray), tools.is_sparse(A)): + A = tools.sptensor_from_dense_array(A) + + return A
+ + + +
+[docs] +def preprocess_data_matrix(X): + """ + Pre-process input data matrix. + If the input is sparse, returns a scipy sparse matrix. Otherwise, returns a numpy array. + + Parameters + ---------- + X : ndarray + Input data (matrix). + + Returns + ------- + X : scipy sparse matrix/ndarray + Pre-processed data. If the input is sparse, returns a scipy sparse matrix. Otherwise, returns a numpy array. + """ + + if not X.dtype == np.dtype(int).type: + X = X.astype(int) + if np.logical_and(isinstance(X, np.ndarray), scipy.sparse.issparse(X)): + X = scipy.sparse.csr_matrix(X) + + return X
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/input/stats.html b/_modules/probinet/input/stats.html new file mode 100644 index 0000000..d9aef99 --- /dev/null +++ b/_modules/probinet/input/stats.html @@ -0,0 +1,531 @@ + + + + + + + + + + probinet.input.stats — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.input.stats

+"""
+It is designed to compute and print statistical information about NetworkX graphs. The script
+calculates metrics such as the number of nodes, layers, edges, average degree, weighted degree,
+reciprocity, and more. It aims to provide a comprehensive overview of the structural properties of
+the input graphs, considering both directed and weighted edges.
+"""
+
+import logging
+from typing import List, Optional
+
+import networkx as nx
+import numpy as np
+
+from ..utils.tools import log_and_raise_error
+
+
+
+
+
+
+
+
+
+
+
+[docs] +def reciprocal_edges(G: nx.MultiDiGraph) -> float: + """ + Compute the proportion of bi-directional edges, by considering the unordered pairs. + + Parameters + ---------- + G: MultiDigraph + MultiDiGraph NetworkX object. + + Returns + ------- + reciprocity: float + Reciprocity value, intended as the proportion of bi-directional edges over the + unordered pairs. + """ + + n_all_edge = G.number_of_edges() + # unique pairs of edges, i.e. edges in the undirected graph + n_undirected = G.to_undirected().number_of_edges() + # number of undirected edges reciprocated in the directed network + n_overlap_edge = n_all_edge - n_undirected + + if n_all_edge == 0: + log_and_raise_error(nx.NetworkXError, "Not defined for empty graphs.") + + reciprocity = float(n_overlap_edge) / float(n_undirected) + + return reciprocity
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/main.html b/_modules/probinet/main.html new file mode 100644 index 0000000..9361fe1 --- /dev/null +++ b/_modules/probinet/main.html @@ -0,0 +1,853 @@ + + + + + + + + + + probinet.main — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.main

+"""
+Main script to run the algorithms.
+"""
+
+import argparse
+import dataclasses
+import logging
+import time
+from pathlib import Path
+
+import numpy as np
+
+from .models.acd import AnomalyDetection
+from .models.base import ModelBaseParameters
+from .models.crep import CRep
+from .models.dyncrep import DynCRep
+from .models.jointcrep import JointCRep
+from .models.mtcov import MTCOV
+from .utils.tools import log_and_raise_error
+
+PATH_TO_DATA = str(Path(__file__).parent / "data" / "input")
+
+# Map algorithm names to their classes
+ALGORITHM_CLASSES = {
+    "CRep": CRep,
+    "JointCRep": JointCRep,
+    "MTCOV": MTCOV,
+    "DynCRep": DynCRep,
+    "ACD": AnomalyDetection,
+}
+
+
+
+[docs] +def parse_args(): + """ + Parse the command-line arguments. + + Returns + ------- + args : argparse.Namespace + Parsed arguments. + """ + parser = argparse.ArgumentParser( + description="Script to run the CRep, JointCRep, DynCRep, MTCOV, and ACD algorithms.", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + # Shared parser for common arguments + shared_parser = argparse.ArgumentParser( + add_help=False, + ) + + # Define the subparsers + subparsers = parser.add_subparsers( + dest="algorithm", help="Choose the algorithm to run" + ) + + # Common arguments + shared_parser.add_argument( + "-f", + "--files", + type=str, + default=PATH_TO_DATA, + help="Path to the input files", + ) + shared_parser.add_argument( + "-e", "--ego", type=str, default="source", help="Name of the source of the edge" + ) + shared_parser.add_argument( + "-t", + "--alter", + type=str, + default="target", + help="Name of the target of the edge", + ) + shared_parser.add_argument( + "--noselfloop", type=bool, default=True, help="Flag to remove self-loops" + ) + shared_parser.add_argument( + "--binary", type=bool, default=True, help="Flag to make the network binary" + ) + shared_parser.add_argument( + "--force_dense", + action="store_true", + default=False, + help="Flag to force a dense transformation in input", + ) + shared_parser.add_argument( + "--assortative", + action="store_true", + default=False, + help="Flag for assortative mixing", + ) + shared_parser.add_argument( + "-u", + "--undirected", + action="store_true", + default=False, + help="Flag to treat the network as undirected", + ) + shared_parser.add_argument( + "-tol", + "--convergence_tol", + type=float, + default=None, + help=("Tolerance used to determine convergence"), + ) + shared_parser.add_argument( + "-maxi", + "--max_iter", + type=int, + default=None, + help="Maximum number of iterations", + ) + shared_parser.add_argument( + "--flag_conv", + type=str, + choices=["log", "deltas"], + default="log", + help="Flag for convergence", + ) + shared_parser.add_argument( + "--plot_loglik", + action="store_true", + default=False, + help="Flag to plot the log-likelihood", + ) + shared_parser.add_argument( + "--rseed", type=int, default=int(time.time() * 1000), help="Random seed" + ) + shared_parser.add_argument( + "--initialization", type=int, default=0, help="Initialization method" + ) + shared_parser.add_argument( + "--out_inference", + action="store_true", + help="Flag to save the inference results", + ) + shared_parser.add_argument( + "--out_folder", + "-o", + type=str, + default="evaluation", + help="Path of the evaluation folder", + ) + shared_parser.add_argument( + "--end_file", type=str, default="", help="Suffix for the evaluation file" + ) + shared_parser.add_argument( + "--debug", + "-d", + dest="debug", + action="store_true", + default=False, + help="Enable debug mode", + ) + + # CRep parser + crep_parser = subparsers.add_parser( + "CRep", + help="Run the CRep algorithm", + parents=[shared_parser], + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + crep_parser.add_argument( + "-K", "--K", type=int, default=3, help="Number of communities" + ) + crep_parser.add_argument( + "-nr", "--num_realizations", type=int, default=5, help="Number of realizations" + ) + crep_parser.add_argument( + "--constrained", + action="store_true", + default=False, + help="Flag for constrained optimization", + ) + crep_parser.add_argument( + "--fix_eta", action="store_true", default=False, help="Flag to fix eta" + ) + crep_parser.add_argument( + "--eta0", type=float, default=None, help="Initial eta value" + ) + crep_parser.add_argument( + "-A", "--adj_name", type=str, default="syn111.dat", help="Name of the network" + ) + + # JointCRep parser + jointcrep_parser = subparsers.add_parser( + "JointCRep", + help="Run the JointCRep algorithm", + parents=[shared_parser], + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + jointcrep_parser.add_argument( + "-K", + "--K", + type=int, + default=2, + help="Number of communities", + ) + jointcrep_parser.add_argument( + "-nr", "--num_realizations", type=int, default=3, help="Number of realizations" + ) + jointcrep_parser.add_argument( + "--use_approximation", + type=bool, + default=False, + help="Flag to use approximation", + ) + jointcrep_parser.add_argument( + "--fix_eta", action="store_true", default=False, help="Flag to fix eta" + ) + jointcrep_parser.add_argument( + "--fix_w", action="store_true", default=False, help="Flag to fix w" + ) + jointcrep_parser.add_argument( + "--fix_communities", + action="store_true", + default=False, + help="Flag to fix communities", + ) + jointcrep_parser.add_argument( + "--eta0", type=float, default=None, help="Initial eta value" + ) + jointcrep_parser.add_argument( + "-A", + "--adj_name", + type=str, + default="synthetic_data.dat", + help="Name of the network", + ) + + # MTCOV parser + mtcov_parser = subparsers.add_parser( + "MTCOV", + help="Run the MTCOV algorithm", + parents=[shared_parser], + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + mtcov_parser.add_argument( + "-K", "--K", type=int, default=2, help="Number of communities" + ) + mtcov_parser.add_argument( + "-nr", "--num_realizations", type=int, default=5, help="Number of realizations" + ) + mtcov_parser.add_argument( + "-x", + "--egoX", + type=str, + default="Name", + help="Name of the column with node labels", + ) + mtcov_parser.add_argument( + "-an", + "--attr_name", + type=str, + default="Metadata", + help="Name of the attribute to consider in MTCOV", + ) + mtcov_parser.add_argument( + "--gamma", type=float, default=0.5, help="Scaling hyper parameter in MTCOV" + ) + mtcov_parser.add_argument( + "--batch_size", + type=int, + default=None, + help="Size of the batch to use to compute the likelihood", + ) + mtcov_parser.add_argument( + "-A", + "--adj_name", + type=str, + default="multilayer_network.csv", + help="Name of the network", + ) + mtcov_parser.add_argument( + "-C", + "--cov_name", + type=str, + default="X.csv", + help="Name of the design matrix used in MTCOV", + ) + + # DynCRep parser + dyncrep_parser = subparsers.add_parser( + "DynCRep", + help="Run the DynCRep algorithm", + parents=[shared_parser], + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + dyncrep_parser.add_argument( + "-K", "--K", type=int, default=2, help="Number of communities" + ) + dyncrep_parser.add_argument( + "-nr", "--num_realizations", type=int, default=5, help="Number of realizations" + ) + dyncrep_parser.add_argument( + "-T", "--T", type=int, default=None, help="Number of time snapshots" + ) + dyncrep_parser.add_argument( + "--fix_eta", action="store_true", default=False, help="Flag to fix eta" + ) + dyncrep_parser.add_argument( + "--fix_beta", action="store_true", default=False, help="Flag to fix beta" + ) + dyncrep_parser.add_argument( + "--eta0", type=float, default=None, help="Initial eta value" + ) + dyncrep_parser.add_argument( + "--beta0", type=float, default=0.25, help="Initial beta value" + ) + dyncrep_parser.add_argument("--ag", type=float, default=1.1, help="Parameter ag") + dyncrep_parser.add_argument("--bg", type=float, default=0.5, help="Parameter bg") + dyncrep_parser.add_argument( + "--temporal", + type=bool, + default=True, + help="Flag to use non-temporal version of DynCRep", + ) + dyncrep_parser.add_argument( + "--fix_communities", + action="store_true", + default=False, + help="Flag to fix communities", + ) + dyncrep_parser.add_argument( + "--fix_w", action="store_true", default=False, help="Flag to fix w" + ) + dyncrep_parser.add_argument( + "-fdT", + "--flag_data_T", + type=str, + default=0, + help="Flag to use data_T. " + "It is recommended to use 0, but in case it does not work, try 1.", + ) + dyncrep_parser.add_argument( + "--constrained", + type=bool, + default=False, + help="Flag for constrained optimization", + ) + dyncrep_parser.add_argument( + "--constraintU", + action="store_true", + default=False, + help="Flag for " "constraint U", + ) + dyncrep_parser.add_argument( + "-A", + "--adj_name", + type=str, + default="dynamic_network.dat", + help="Name of the network", + ) + + # ACD parser + acd_parser = subparsers.add_parser( + "ACD", + help="Run the ACD algorithm", + parents=[shared_parser], + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + acd_parser.add_argument( + "-K", "--K", type=int, default=3, help="Number of communities" + ) + acd_parser.add_argument( + "-nr", "--num_realizations", type=int, default=1, help="Number of realizations" + ) + acd_parser.add_argument("--ag", type=float, default=1.1, help="Parameter ag") + acd_parser.add_argument("--bg", type=float, default=0.5, help="Parameter bg") + acd_parser.add_argument("--pibr0", default=None, help="Anomaly parameter pi") + acd_parser.add_argument("--mupr0", default=None, help="Prior mu") + acd_parser.add_argument( + "--flag_anomaly", + action="store_false", + default=True, + help="Flag to detect anomalies", + ) + acd_parser.add_argument( + "--constrained", + action="store_true", + default=False, + help="Flag for constrained optimization", + ) + acd_parser.add_argument( + "--fix_communities", + action="store_true", + default=False, + help="Flag to fix communities", + ) + acd_parser.add_argument( + "--fix_pibr", action="store_true", default=False, help="Flag to fix pibr" + ) + acd_parser.add_argument( + "--fix_mupr", action="store_true", default=False, help="Flag to fix mupr" + ) + acd_parser.add_argument( + "-A", + "--adj_name", + type=str, + default="synthetic_data_for_ACD.dat", + help="Name of the network", + ) + + args = parser.parse_args() + return args
+ + + +
+[docs] +def main(): + """ + Main function for CRep/JointCRep/MTCOV/DynCRep/ACD algorithms. + """ + # Parse the command-line arguments + args = parse_args() + + # Configure the logging + logging.basicConfig( + level=logging.DEBUG if args.debug else logging.INFO, + format="*** [%(levelname)s][%(asctime)s][%(module)s] %(message)s", + ) + + # Set the logging level for third-party packages to WARNING + logging.getLogger("numba").setLevel(logging.WARNING) + + # Print all the args used in alphabetical order + logging.debug("Arguments used:") + for arg in sorted(vars(args)): + logging.debug("%s: %s", arg, getattr(args, arg)) + + # Define the args that set numerical parameters. These will be used to instantiate the models. + numerical_args = [f.name for f in dataclasses.fields(ModelBaseParameters)] + + # Filter the numerical args + numerical_args_dict = { + k: v for k, v in vars(args).items() if k in numerical_args and v is not None + } + + # Check if the algorithm is implemented + if args.algorithm not in ALGORITHM_CLASSES: + log_and_raise_error(ValueError, "Algorithm not implemented.") + + # Instantiate the models + model = ALGORITHM_CLASSES[args.algorithm](**numerical_args_dict) + + # Get dictionary that contains the parameters needed to load the gdata + data_kwargs = model.get_params_to_load_data(args) + + # Import graph data + gdata = model.load_data(**data_kwargs) + + # Time the execution + time_start = time.time() + + # Create the rng object and add it to the args + args.rng = np.random.default_rng(seed=args.rseed) + + # Fit the models to the graph data using the fit args + logging.info("### Running %s ###", model.__class__.__name__) + logging.info("K = %s", args.K) + model.fit(gdata, **vars(args)) + + # Print the time elapsed + logging.info("Time elapsed: %.2f seconds.", time.time() - time_start)
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/acd_cross_validation.html b/_modules/probinet/model_selection/acd_cross_validation.html new file mode 100644 index 0000000..bf92818 --- /dev/null +++ b/_modules/probinet/model_selection/acd_cross_validation.html @@ -0,0 +1,522 @@ + + + + + + + + + + probinet.model_selection.acd_cross_validation — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.acd_cross_validation

+"""
+This module contains the ACDCrossValidation class, which is used to perform cross-validation of the ACD algorithm.
+"""
+
+import logging
+import pickle
+
+import numpy as np
+
+from probinet.evaluation.expectation_computation import (
+    calculate_expectation_acd,
+    calculate_Q_dense,
+)
+
+from ..evaluation.expectation_computation import compute_mean_lambda0
+from ..evaluation.link_prediction import compute_link_prediction_AUC
+from ..model_selection.cross_validation import CrossValidation
+from ..model_selection.masking import extract_mask_kfold
+from ..models.acd import AnomalyDetection
+
+
+
+[docs] +class ACDCrossValidation(CrossValidation): + """ + Class for cross-validation of the ACD algorithm. + """ + + def __init__( + self, algorithm, parameters, input_cv_params, numerical_parameters=None + ): + """ + Constructor for the ACDCrossValidation class. + Parameters + ---------- + algorithm + parameters + input_cv_params + numerical_parameters + """ + super().__init__(algorithm, parameters, input_cv_params, numerical_parameters) + # These are the parameters for the ACD algorithm + self.parameters = parameters + self.numerical_parameters = numerical_parameters + +
+[docs] + def extract_mask(self, fold): + # Extract the mask for the current fold using k-fold cross-validation + mask = extract_mask_kfold(self.indices, self.N, fold=fold, NFold=self.NFold) + + # If the out_mask attribute is set, save the mask to a file + if self.out_mask: + # Construct the evaluation file path for the mask + outmask = self.out_folder + "mask_f" + str(fold) + "_" + self.adj + ".pkl" + logging.debug("Mask saved in: %s", outmask) + + # Save the mask to a pickle file + with open(outmask, "wb") as f: + pickle.dump(np.where(mask > 0), f) + + # Return the mask + return mask
+ + +
+[docs] + def prepare_and_run(self, mask): + # Create a copy of the adjacency matrix B to use for training + B_train = self.gdata.adjacency_tensor.copy() + + # Apply the mask to the training data by setting masked elements to 0 + B_train[mask > 0] = 0 + + # Create a copy of gdata to use for training + self.gdata_for_training = self.gdata._replace(adjacency_tensor=B_train) + + # Create an instance of the ACD algorithm + algorithm_object = AnomalyDetection(**self.numerical_parameters) + + # Define rng from the seed and add it to the parameters + self.parameters["rng"] = np.random.default_rng(seed=self.parameters["rseed"]) + + # Fit the ACD models to the training data and get the outputs + outputs = algorithm_object.fit(self.gdata_for_training, **self.parameters) + + # Return the outputs and the algorithm object + + return outputs, algorithm_object
+ + +
+[docs] + def calculate_performance_and_prepare_comparison( + self, outputs, mask, fold, algorithm_object + ): + # Unpack the outputs from the algorithm + u, v, w, mu, pi, maxELBO = outputs + + # Initialize the comparison dictionary with keys as headers + comparison = { + "K": self.parameters["K"], + "fold": fold, + "rseed": self.rseed, + "flag_anomaly": self.parameters["flag_anomaly"], + "mu": mu, + "pi": pi, + "ELBO": maxELBO, + "final_it": algorithm_object.final_it, + } + + # Calculate the expected matrix M0 using the parameters u, v, and w + M0 = compute_mean_lambda0(u, v, w) + + # Calculate the Q matrix if flag_anomaly is set + if self.parameters["flag_anomaly"]: + Q = calculate_Q_dense(self.gdata.adjacency_tensor, M0, pi, mu) + else: + Q = np.zeros_like(M0) + + # Calculate the expected matrix M using the parameters u, v, w, Q, and pi + M = calculate_expectation_acd(u, v, w, Q, pi) + + # Calculate the AUC for the training set (where mask is not applied) + comparison["aucA_train"] = compute_link_prediction_AUC( + self.gdata.adjacency_tensor[0], M[0], mask=np.logical_not(mask[0]) + ) + + # Calculate the AUC for the test set (where mask is applied) + comparison["aucA_test"] = compute_link_prediction_AUC( + self.gdata.adjacency_tensor[0], M[0], mask=mask[0] + ) + + # Return the comparison dictionary + return comparison
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/crep_cross_validation.html b/_modules/probinet/model_selection/crep_cross_validation.html new file mode 100644 index 0000000..3505d86 --- /dev/null +++ b/_modules/probinet/model_selection/crep_cross_validation.html @@ -0,0 +1,437 @@ + + + + + + + + + + probinet.model_selection.crep_cross_validation — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.crep_cross_validation

+"""
+This module contains the CRepCrossValidation class, which is used for cross-validation of the CRep algorithm.
+"""
+
+from ..models.crep import CRep
+from .cross_validation import CrossValidation
+
+
+
+[docs] +class CRepCrossValidation(CrossValidation): + """ + Class for cross-validation of the CRep algorithm. + """ + + def __init__( + self, algorithm, parameters, input_cv_params, numerical_parameters=None + ): + """ + Constructor for the CRepCrossValidation class. + Parameters + ---------- + algorithm + parameters + input_cv_params + numerical_parameters + """ + super().__init__(algorithm, parameters, input_cv_params, numerical_parameters) + # These are the parameters for the CRep algorithm + if numerical_parameters is None: + numerical_parameters = {} + self.parameters = parameters + self.num_parameters = numerical_parameters + self.model = CRep + +
+[docs] + def extract_mask(self, fold): + # Use the auxiliary method from the base class + return super()._extract_mask(fold)
+ + +
+[docs] + def calculate_performance_and_prepare_comparison( + self, outputs, mask, fold, algorithm_object + ): + return super()._calculate_performance_and_prepare_comparison( + outputs, mask, fold, algorithm_object + )
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/cross_validation.html b/_modules/probinet/model_selection/cross_validation.html new file mode 100644 index 0000000..49bfcaa --- /dev/null +++ b/_modules/probinet/model_selection/cross_validation.html @@ -0,0 +1,704 @@ + + + + + + + + + + probinet.model_selection.cross_validation — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.cross_validation

+"""
+Main function to implement cross-validation given a number of communities.
+
+- Hold-out part of the dataset (pairs of edges labeled by unordered pairs (i,j));
+- Infer parameters on the training set;
+- Calculate performance measures in the test set (AUC).
+"""
+
+import csv
+import logging
+import pickle
+import time
+from abc import ABC, abstractmethod
+from itertools import product
+from pathlib import Path
+
+import numpy as np
+
+from probinet.evaluation.expectation_computation import (
+    calculate_conditional_expectation,
+    calculate_expectation,
+)
+
+from ..evaluation.likelihood import calculate_opt_func
+from ..evaluation.link_prediction import compute_link_prediction_AUC
+from ..input.loader import build_adjacency_from_file
+from ..models.classes import GraphData
+from .masking import extract_mask_kfold, shuffle_indices_all_matrix
+
+
+
+[docs] +class CrossValidation(ABC): + """ + Abstract class to implement cross-validation for a given algorithm. + """ + + def __init__( + self, algorithm, model_parameters, cv_parameters, numerical_parameters=None + ): + self.algorithm = algorithm + for key, value in model_parameters.items(): + setattr(self, key, value) + for key, value in cv_parameters.items(): + setattr(self, key, value) + for key, value in numerical_parameters.items(): + setattr(self, key, value) + +
+[docs] + def prepare_output_directory(self): + """ + Prepare the output directory to save the results. + """ + output_path = Path(self.out_folder) + output_path.mkdir(parents=True, exist_ok=True)
+ + +
+[docs] + @abstractmethod + def extract_mask(self, fold): + """ + Extract the mask for the current fold. + """
+ + + def _extract_mask(self, fold): + """ + Auxiliary method to extract the mask for the current fold using k-fold cross-validation. + """ + mask = extract_mask_kfold(self.indices, self.N, fold=fold, NFold=self.NFold) + + if self.out_mask: + outmask = self.out_folder + "mask_f" + str(fold) + "_" + self.adj + ".pkl" + logging.debug("Mask saved in: %s", outmask) + + with open(outmask, "wb") as f: + pickle.dump(np.where(mask > 0), f) + + return mask + +
+[docs] + @staticmethod + def define_grid(**kwargs): + """ + Define the grid of parameters to be tested. + """ + # Get the parameter names and their corresponding values + param_names = kwargs.keys() + param_values = kwargs.values() + + # Create the Cartesian product of the parameter values + param_combinations = product(*param_values) + + # Convert the Cartesian product into a list of dictionaries + grid = [ + dict(zip(param_names, combination)) for combination in param_combinations + ] + + return grid
+ + +
+[docs] + def load_data(self): + """ + Auxiliary method to load data from the input folder. + """ + # Load data + self.gdata: GraphData = build_adjacency_from_file( + self.in_folder + self.adj, + ego=self.ego, + alter=self.alter, + force_dense=True, + header=0, + sep=self.sep, + )
+ + +
+[docs] + def prepare_and_run(self, mask: np.ndarray): + """ + Prepare the data for training and run the algorithm. + + Parameters + ---------- + mask: np.ndarray + The mask to apply on the data. + + Returns + ------- + tuple + The outputs of the algorithm. + object + The algorithm object. + + """ + # Create a copy of the adjacency matrix B to use for training + B_train = self.gdata.adjacency_tensor.copy() + + # Apply the mask to the training data by setting masked elements to 0 + B_train[mask > 0] = 0 + + # Create a copy of gdata to use for training + self.gdata_for_training = self.gdata._replace(adjacency_tensor=B_train) + + # Initialize the algorithm object + algorithm_object = self.model(**self.num_parameters) + + # Define rng parameter from the previously defined rng + self.parameters["rng"] = self.rng + + # Fit the CRep models to the training data and get the outputs + outputs = algorithm_object.fit(self.gdata_for_training, **self.parameters) + + # Return the outputs and the algorithm object + return outputs, algorithm_object
+ + + def _calculate_performance_and_prepare_comparison( + self, outputs, mask, fold, algorithm_object + ): + # Unpack the outputs from the algorithm + u, v, w, eta, maxL = outputs + + # Initialize the comparison dictionary with keys as headers + comparison = { + "K": self.parameters["K"], + "fold": fold, + "rseed": self.parameters["rseed"], + "eta": eta, + "maxL": maxL, + "final_it": algorithm_object.final_it, + } + + # Calculate the expected matrix M using the parameters u, v, w, and eta + M = calculate_expectation(u, v, w, eta=eta) + + # Calculate the AUC for the training set (where mask is not applied) + comparison["auc_train"] = compute_link_prediction_AUC( + self.gdata.adjacency_tensor, M, mask=np.logical_not(mask) + ) + + # Calculate the AUC for the test set (where mask is applied) + comparison["auc_test"] = compute_link_prediction_AUC( + self.gdata.adjacency_tensor, M, mask=mask + ) + + # Calculate the conditional expectation matrix M_cond + M_cond = calculate_conditional_expectation( + self.gdata.adjacency_tensor, u, v, w, eta=eta + ) + + # Calculate the conditional AUC for the training set + comparison["auc_cond_train"] = compute_link_prediction_AUC( + M_cond, self.gdata.adjacency_tensor, mask=np.logical_not(mask) + ) + + # Calculate the conditional AUC for the test set + comparison["auc_cond_test"] = compute_link_prediction_AUC( + M_cond, self.gdata.adjacency_tensor, mask=mask + ) + + # Calculate the optimization function value for the training set + comparison["opt_func_train"] = calculate_opt_func( + self.gdata.adjacency_tensor, + algorithm_object, + mask=mask, + assortative=self.parameters["assortative"], + ) + + # Store the comparison list in the instance variable + return comparison + +
+[docs] + def save_results(self): + # Check if the evaluation file exists; if not, write the header + output_path = Path(self.out_file) + if not output_path.is_file(): # write header + with output_path.open("w", encoding="utf-8") as outfile: + # Create a CSV writer object + wrtr = csv.writer(outfile, delimiter=",", quotechar='"') + # Write the header row to the CSV file + wrtr.writerow(list(self.comparison.keys())) + + # Open the evaluation file in append mode + with output_path.open("a", encoding="utf-8") as outfile: + # Create a CSV writer object + wrtr = csv.writer(outfile, delimiter=",", quotechar='"') + # Write the comparison data to the CSV file + wrtr.writerow(list(self.comparison.values())) + # Flush the evaluation buffer to ensure all data is written to the file + outfile.flush()
+ + +
+[docs] + def run_single_iteration(self): + """ + Run the cross-validation procedure. + """ + # Set up logging + logging.basicConfig(level=logging.DEBUG) + + # Prepare cv parameters + self.rng = np.random.default_rng(seed=self.parameters["rseed"]) + + # Set up evaluation directory + self.prepare_output_directory() + + # Prepare list to store results + self.comparison = [] + + # Prepare parameters to load data + adjacency = self.prepare_file_name() + + # Prepare evaluation file + if self.out_results: + self.out_file = self.out_folder + adjacency + "_cv.csv" + logging.info("Results will be saved in: %s" % self.out_file) + + # Import data + self.load_data() + + logging.info("Starting the cross-validation procedure.") + time_start = time.time() + + # Prepare indices for cross-validation + self.L = self.gdata.adjacency_tensor.shape[0] + self.N = self.gdata.adjacency_tensor.shape[-1] + self.indices = shuffle_indices_all_matrix(self.N, self.L, rng=self.rng) + + # Cross-validation loop + for fold in range(self.NFold): + logging.info("\nFOLD %s" % fold) + + self.parameters["end_file"] = ( + self.end_file + "_" + str(fold) + "K" + str(self.parameters["K"]) + ) + # Extract mask for the current fold + mask = self.extract_mask(fold) + + # Prepare and run the algorithm + tic = time.time() + outputs, algorithm_object = self.prepare_and_run(mask) + + # Output performance results + self.comparison.append( + self.calculate_performance_and_prepare_comparison( + outputs, mask, fold, algorithm_object + ) + ) + + logging.info("Time elapsed: %s seconds." % np.round(time.time() - tic, 2)) + logging.info( + "\nTime elapsed: %s seconds." % np.round(time.time() - time_start, 2) + ) + + return self.comparison
+ + +
+[docs] + def prepare_file_name(self): + if ".dat" in self.adj: + adjacency = self.adj.split(".dat")[0] + elif ".csv" in self.adj: + adjacency = self.adj.split(".csv")[0] + else: + adjacency = self.adj + # Warning: adjacency is not csv nor dat + logging.warning("Adjacency name not recognized.") + return adjacency
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/dyncrep_cross_validation.html b/_modules/probinet/model_selection/dyncrep_cross_validation.html new file mode 100644 index 0000000..f632b5b --- /dev/null +++ b/_modules/probinet/model_selection/dyncrep_cross_validation.html @@ -0,0 +1,584 @@ + + + + + + + + + + probinet.model_selection.dyncrep_cross_validation — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.dyncrep_cross_validation

+"""
+This module contains the DynCRepCrossValidation class, which is used for cross-validation of the
+DynCRep algorithm.
+"""
+
+import logging
+import time
+
+import numpy as np
+
+from ..evaluation.expectation_computation import (
+    calculate_conditional_expectation_dyncrep,
+)
+from ..evaluation.likelihood import likelihood_conditional
+from ..evaluation.link_prediction import compute_link_prediction_AUC
+from ..models.dyncrep import DynCRep
+from .cross_validation import CrossValidation
+
+
+
+[docs] +class DynCRepCrossValidation(CrossValidation): + """ + Class for cross-validation of the DynCRep algorithm. + + - Hold-out the data at the latest time snapshot (at time T); + - Infer parameters on the observed data (data up to time T-1); + - Calculate performance measures in the hidden set (AUC). + """ + + def __init__( + self, algorithm, parameters, input_cv_params, numerical_parameters=None + ): + """ + Constructor for the DynCRepCrossValidation class. + Parameters + ---------- + algorithm + parameters + input_cv_params + numerical_parameters + """ + super().__init__(algorithm, parameters, input_cv_params, numerical_parameters) + # These are the parameters for the DynCRep algorithm + self.parameters = parameters + self.num_parameters = numerical_parameters + self.model = DynCRep + +
+[docs] + def extract_mask(self, fold): + pass
+ + +
+[docs] + def prepare_and_run(self, t): + # Create the training data + B_train = self.gdata.adjacency_tensor[ + :t + ] # use data up to time t-1 for training + + # Create a copy of gdata to use for training + self.gdata_for_training = self.gdata._replace(adjacency_tensor=B_train) + + self.parameters["T"] = t + # Initialize the algorithm object + algorithm_object = self.model(**self.num_parameters) + + # Define rng from the seed and add it to the parameters + self.parameters["rng"] = np.random.default_rng(seed=self.parameters["rseed"]) + + # Fit the model to the training data + outputs = algorithm_object.fit(self.gdata_for_training, **self.parameters) + + # Return the outputs and the algorithm object + return outputs, algorithm_object
+ + +
+[docs] + def calculate_performance_and_prepare_comparison( + self, + outputs, + _mask, + fold, + algorithm_object, + ): + """ + Calculate performance results and prepare comparison. + """ + # Unpack the outputs from the algorithm + u, v, w, eta, beta, maxL = outputs + + # Initialize the comparison dictionary with keys as headers + comparison = { + "algo": "DynCRep_temporal" if self.parameters["temporal"] else "DynCRep", + "constrained": self.parameters["constrained"], + "flag_data_T": self.parameters["flag_data_T"], + "rseed": self.parameters["rseed"], + "K": self.parameters["K"], + "eta0": self.parameters["eta0"], + "beta0": self.parameters["beta0"], + "T": fold, + "eta": eta, + "beta": beta, + "final_it": algorithm_object.final_it, + "maxL": maxL, + } + + if self.flag_data_T == 1: # if 0: previous time step, 1: same time step + M = calculate_conditional_expectation_dyncrep( + self.B[fold], u, v, w, eta=eta, beta=beta + ) # use data_T at time t to predict t + elif self.flag_data_T == 0: + M = calculate_conditional_expectation_dyncrep( + self.gdata.adjacency_tensor[fold - 1], u, v, w, eta=eta, beta=beta + ) # use data_T at time t-1 to predict t + + loglik_test = likelihood_conditional( + M, + beta, + self.gdata.adjacency_tensor[fold], + self.gdata.adjacency_tensor[fold - 1], + ) + + if fold > 1: + M[self.gdata.adjacency_tensor[fold - 1].nonzero()] = ( + 1 - beta + ) # to calculate AUC + + comparison["auc"] = compute_link_prediction_AUC( + self.gdata.adjacency_tensor[fold], M + ) + comparison["loglik"] = loglik_test + + # Return the comparison dictionary + return comparison
+ + +
+[docs] + def run_single_iteration(self): + """ + Run the cross-validation procedure. + """ + # Set up logging + logging.basicConfig(level=logging.DEBUG) + + # Set up evaluation directory + self.prepare_output_directory() + + # Prepare list to store results + self.comparison = [] + + # Import data + self.load_data() + + # Make sure T is not too large + self.T = max(0, min(self.T, self.gdata.adjacency_tensor.shape[0] - 1)) + + logging.info("Starting the cross-validation procedure.") + time_start = time.time() + + # Cross-validation loop + for t in range(1, self.T + 1): # skip first and last time step (last is hidden) + if t == 1: + self.parameters[ + "fix_beta" + ] = True # for the first time step beta cannot be inferred + else: + self.parameters["fix_beta"] = False + self.parameters["end_file"] = ( + self.end_file + "_" + str(t) + "_" + str(self.K) + ) + + # Prepare and run the algorithm + tic = time.time() + outputs, algorithm_object = self.prepare_and_run(t) + + # Output performance results + self.comparison.append( + self.calculate_performance_and_prepare_comparison( + outputs=outputs, + fold=t, + _mask=None, + algorithm_object=algorithm_object, + ) + ) + + logging.info("Time elapsed: %s seconds.", np.round(time.time() - tic, 2)) + + logging.info( + "\nTime elapsed: %s seconds.", np.round(time.time() - time_start, 2) + ) + + return self.comparison
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/jointcrep_cross_validation.html b/_modules/probinet/model_selection/jointcrep_cross_validation.html new file mode 100644 index 0000000..02ff1ab --- /dev/null +++ b/_modules/probinet/model_selection/jointcrep_cross_validation.html @@ -0,0 +1,435 @@ + + + + + + + + + + probinet.model_selection.jointcrep_cross_validation — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.jointcrep_cross_validation

+"""
+This module contains the JointCRepCrossValidation class, which is used for cross-validation of the
+JointCRep algorithm.
+"""
+
+from ..models.jointcrep import JointCRep
+from .cross_validation import CrossValidation
+
+
+
+[docs] +class JointCRepCrossValidation(CrossValidation): + """ + Class for cross-validation of the JointCRep algorithm. + """ + + def __init__( + self, algorithm, parameters, input_cv_params, numerical_parameters=None + ): + """ + Constructor for the JointCRepCrossValidation class. + Parameters + ---------- + algorithm + parameters + input_cv_params + """ + super().__init__(algorithm, parameters, input_cv_params, numerical_parameters) + # These are the parameters for the JointCRep algorithm + self.parameters = parameters + self.num_parameters = numerical_parameters + self.model = JointCRep + +
+[docs] + def extract_mask(self, fold): + # Use the auxiliary method from the base class + return super()._extract_mask(fold)
+ + +
+[docs] + def calculate_performance_and_prepare_comparison( + self, outputs, mask, fold, algorithm_object + ): + return super()._calculate_performance_and_prepare_comparison( + outputs, mask, fold, algorithm_object + )
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/main.html b/_modules/probinet/model_selection/main.html new file mode 100644 index 0000000..6acfb8c --- /dev/null +++ b/_modules/probinet/model_selection/main.html @@ -0,0 +1,487 @@ + + + + + + + + + + probinet.model_selection.main — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.main

+"""
+Main module for running cross-validation for different algorithms.
+"""
+
+import logging
+from typing import Any, Optional
+
+import pandas as pd
+
+from .acd_cross_validation import ACDCrossValidation
+from .crep_cross_validation import CRepCrossValidation
+from .dyncrep_cross_validation import DynCRepCrossValidation
+from .jointcrep_cross_validation import JointCRepCrossValidation
+from .mtcov_cross_validation import MTCOVCrossValidation
+from .parameter_search import define_grid
+
+
+
+[docs] +def cross_validation( + algorithm: str, + model_parameters: dict[str, Any], + cv_parameters: dict[str, Any], + numerical_parameters: Optional[dict[str, Any]] = None, +) -> pd.DataFrame: + """ + Run cross-validation for a given algorithm. + Parameters + ---------- + algorithm + String with the name of the algorithm to run. + model_parameters + Dictionary with the parameters for the algorithm. + cv_parameters + Dictionary with the parameters for the cross-validation. + numerical_parameters + Dictionary with the numerical parameters for the algorithm, like the number of iterations, etc. + + Returns + ------- + results_df + DataFrame with the results of the cross-validation. + """ + if numerical_parameters is None: + numerical_parameters = {} + cv_classes = { + "CRep": CRepCrossValidation, + "JointCRep": JointCRepCrossValidation, + "MTCOV": MTCOVCrossValidation, + "ACD": ACDCrossValidation, + "DynCRep": DynCRepCrossValidation, + } + + if algorithm not in cv_classes: + raise ValueError(f"Unknown algorithm: {algorithm}") + + logging.info("Starting cross-validation for algorithm: %s", algorithm) + + # If one of the parameters is an element, convert it to a list + for key, value in model_parameters.items(): + if not isinstance(value, list): + logging.debug( + "Converting parameter %s to list. The value used is %s", key, value + ) + model_parameters[key] = [value] + + # Define the grid of parameters + param_grid = define_grid(**model_parameters) + logging.info("Parameter grid created with %d combinations", len(param_grid)) + + # Define list to store results + results = [] + + # Loop over the grid of parameters + for params in param_grid: + logging.info("Running cross-validation for parameters: %s", params) + # Instantiate the cross-validation class with the current parameters + cv = cv_classes[algorithm]( + algorithm, params, cv_parameters, numerical_parameters + ) + # Run the cross-validation and store the results + # The evaluation of run_single_iteration is a list of dictionaries with the results for the + # different folds. Here, we add those lists to a results list. + results += cv.run_single_iteration() + logging.info("Completed cross-validation for parameters: %s", params) + + # Transform the list of results into a DataFrame + results_df = pd.DataFrame(results) + + logging.info("Completed cross-validation for algorithm: %s", algorithm) + + # If the evaluation file is set, save the results to a CSV file + if cv.out_folder: + # Prepare the evaluation directory + adjacency = cv.prepare_file_name() + out_file = cv.out_folder + adjacency + "_cv.csv" + # Save the results to a CSV file + results_df.to_csv(out_file, index=False) + logging.info("Results saved in: %s", out_file) + + return results_df
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/masking.html b/_modules/probinet/model_selection/masking.html new file mode 100644 index 0000000..1fdd4cf --- /dev/null +++ b/_modules/probinet/model_selection/masking.html @@ -0,0 +1,656 @@ + + + + + + + + + + probinet.model_selection.masking — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.masking

+"""
+This module provides functions for shuffling indices and extracting masks for selecting the held-out set in the adjacency tensor and design matrix.
+"""
+
+from typing import List, Optional, Sequence, Tuple
+
+import numpy as np
+
+from ..utils.tools import get_or_create_rng
+
+
+
+[docs] +def shuffle_indices( + N: int, L: int, rng: Optional[np.random.Generator] = None +) -> (List)[np.ndarray]: + """ + Shuffle the indices of the adjacency tensor. + + Parameters + ---------- + N + Number of nodes. + L + Number of layers. + rng + Random number generator. + Returns + ------- + Indices in a shuffled order. + Indices in a shuffled order. + """ + # Calculate the total number of samples in the adjacency tensor + n_samples = int(N * N) + + # Create a list of arrays, where each array contains the range of indices for a layer + indices = [np.arange(n_samples) for _ in range(L)] + + # Create a random number generator with the specified random seed + rng = get_or_create_rng(rng) + + # Loop over each layer and shuffle the corresponding indices + for l in range(L): + rng.shuffle(indices[l]) + + # Return the shuffled indices + return indices
+ + + +
+[docs] +def shuffle_indicesG( + N: int, L: int, rng: Optional[np.random.Generator] = None +) -> List[List[Tuple[int, int]]]: + """ + Parameters + ---------- + N + Number of nodes. + L + Number of layers. + rng + Random number generator. + Returns + ------- + Shuffled indices for each layer. + """ + + # Create a random number generator with the specified random seed + rng = get_or_create_rng(rng) + + # Generate indices for each layer using list comprehension + idxG = [[(i, j) for i in range(N) for j in range(N)] for _ in range(L)] + + # Shuffle indices for each layer + for layer in range(L): + rng.shuffle(idxG[layer]) + + return idxG
+ + + +
+[docs] +def shuffle_indicesX(N: int, rng: Optional[np.random.Generator] = None) -> np.ndarray: + """ + Extract a maskX using KFold. + + Parameters + ---------- + N + Number of nodes. + rng + Random number generator. + Returns + ------- + Shuffled indices. + """ + # Create a random number generator with the specified random seed + rng = get_or_create_rng(rng) + idxX = np.arange(N) + + # Shuffle the indices + rng.shuffle(idxX) + + return idxX
+ + + +
+[docs] +def extract_masks( + N: int, + L: int, + idxG: list[list[Tuple[int, int]]], + idxX: Sequence[int], + cv_type: str = "kfold", + NFold: int = 5, + fold: int = 0, + rng: Optional[np.random.Generator] = None, +) -> Tuple[np.ndarray, np.ndarray]: + """ + Return the masks for selecting the held out set in the adjacency tensor and design matrix. + + Parameters + ---------- + N + Number of nodes. + L + Number of layers. + idxG + Each list has the indexes of the entries of the adjacency matrix of layer L, when cv is set to kfold. + idxX + List with the indexes of the entries of design matrix, when cv is set to kfold. + cv_type + Type of cross-validation: kfold or random, by default 'kfold'. + NFold + Number of C-fold, by default 5. + fold + Current fold, by default 0. + rng + Random number generator. + Returns + ------- + Mask for selecting the held out set in the adjacency tensor and design matrix. + Mask for selecting the held out set in the adjacency tensor and design matrix. + """ + # Initialize masks + maskG = np.zeros((L, N, N), dtype=bool) + maskX = np.zeros(N, dtype=bool) + + if cv_type == "kfold": # sequential order of folds + # adjacency tensor + assert L == len(idxG) + for l in range(L): + n_samples = len(idxG[l]) + test = idxG[l][ + fold * (n_samples // NFold) : (fold + 1) * (n_samples // NFold) + ] + for idx in test: + maskG[l][idx] = 1 + + # design matrix + testcov = idxX[fold * (N // NFold) : (fold + 1) * (N // NFold)] + maskX[testcov] = 1 + + else: # random split for choosing the test set + rng = get_or_create_rng(rng) + maskG = rng.binomial(1, 1.0 / float(NFold), size=(L, N, N)) + maskX = rng.binomial(1, 1.0 / float(NFold), size=N) + + return maskG, maskX
+ + + +
+[docs] +def extract_mask_kfold( + indices: List[np.ndarray], N: int, fold: int = 0, NFold: int = 5 +) -> np.ndarray: + """ + Extract a non-symmetric mask using KFold cross-validation. It contains pairs (i,j) but + possibly not (j,i). + KFold means no train/test sets intersect across the K folds. + + Parameters + ---------- + indices + Indices of the adjacency tensor in a shuffled order. + N + Number of nodes. + fold + Current fold. + NFold + Number of total folds. + Returns + ------- + mask + Mask for selecting the held out set in the adjacency tensor. It is made of 0s and 1s, + where 1s represent that the element (i,j) should be used. + where 1s represent that the element (i,j) should be used. + """ + + # Get the number of layers + L = len(indices) + + # Initialize an empty boolean mask with dimensions (L, N, N) + mask = np.zeros((L, N, N), dtype=bool) + + # Loop over each layer + for l in range(L): + # Get the number of samples in the current layer + n_samples = len(indices[l]) + + # Determine the test set indices for the current fold + test = indices[l][ + fold * (n_samples // NFold) : (fold + 1) * (n_samples // NFold) + ] + + # Create a boolean mask for the test set + mask0 = np.zeros(n_samples, dtype=bool) + mask0[test] = 1 + + # Reshape the mask to match the dimensions (N, N) and store it in the result mask array + mask[l] = mask0.reshape((N, N)) + + # Return the final mask + return mask
+ + + +
+[docs] +def shuffle_indices_all_matrix( + N: int, L: int, rng: Optional[np.random.Generator] = None +) -> List[np.ndarray]: + """ + Shuffle the indices of the adjacency tensor. + + Parameters + ---------- + N + Number of nodes. + L + Number of layers. + rng + Random number generator. + Returns + ------- + indices + Indices in a shuffled order. + Indices in a shuffled order. + """ + + # Create a random number generator with the specified random seed + rng = get_or_create_rng(rng) + + # Calculate the total number of samples in the adjacency tensor + n_samples = int(N * N) + + # Create a list of arrays, where each array contains the range of indices for a layer + indices = [np.arange(n_samples) for _ in range(L)] + + # Loop over each layer and shuffle the corresponding indices + for layer in range(L): + rng.shuffle(indices[layer]) + + # Return the shuffled indices + return indices
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/mtcov_cross_validation.html b/_modules/probinet/model_selection/mtcov_cross_validation.html new file mode 100644 index 0000000..1565d50 --- /dev/null +++ b/_modules/probinet/model_selection/mtcov_cross_validation.html @@ -0,0 +1,572 @@ + + + + + + + + + + probinet.model_selection.mtcov_cross_validation — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.mtcov_cross_validation

+"""
+This module contains the MTCOVCrossValidation class, which is used for cross-validation of the MTCOV
+algorithm.
+"""
+
+import logging
+import pickle
+
+import numpy as np
+
+from ..evaluation.covariate_prediction import compute_covariate_prediction_accuracy
+from ..evaluation.likelihood import loglikelihood
+from ..evaluation.link_prediction import compute_multilayer_link_prediction_AUC
+from ..models.classes import GraphData
+from ..models.mtcov import MTCOV
+from .cross_validation import CrossValidation
+from .masking import extract_masks, shuffle_indicesG, shuffle_indicesX
+
+
+
+[docs] +class MTCOVCrossValidation(CrossValidation, MTCOV): + """ + Class for cross-validation of the MTCOV algorithm. + """ + + def __init__( + self, algorithm, parameters, input_cv_params, numerical_parameters=None + ): + """ + Constructor for the MTCOVCrossValidation class. + Parameters + ---------- + algorithm + parameters + input_cv_params + """ + super().__init__(algorithm, parameters, input_cv_params, numerical_parameters) + # These are the parameters for the MTCOV algorithm + if numerical_parameters is None: + numerical_parameters = {} + self.parameters = parameters + self.num_parameters = numerical_parameters + +
+[docs] + def extract_mask(self, fold): + # Prepare indices for cross-validation + idxG = shuffle_indicesG(self.N, self.L, rng=self.rng) + idxX = shuffle_indicesX(self.N, rng=self.rng) + + # Extract the masks for the current fold using k-fold cross-validation + maskG, maskX = extract_masks( + self.N, + self.L, + idxG=idxG, + idxX=idxX, + cv_type="kfold", + NFold=self.NFold, + fold=fold, + rng=self.rng, + ) + + # If the out_mask attribute is set, save the masks to files + if self.out_mask: + outmaskG = f"{self.out_folder}maskG_f{fold}_{self.adj}.pkl" + outmaskX = f"{self.out_folder}maskX_f{fold}_{self.adj}.pkl" + logging.debug("Masks saved in: %s, %s", outmaskG, outmaskX) + + # Save the masks to pickle files + with open(outmaskG, "wb") as f: + pickle.dump(np.where(maskG > 0), f) + with open(outmaskX, "wb") as f: + pickle.dump(np.where(maskX > 0), f) + + # Return the masks + return maskG, maskX
+ + +
+[docs] + def load_data(self): + self.gdata: GraphData = MTCOV.load_data( + self, + self.in_folder, + adj_name=self.adj, + cov_name=self.cov, + ego=self.ego, + alter=self.alter, + egoX=self.egoX, + attr_name=self.attr_name, + undirected=self.parameters["undirected"], + force_dense=True, + return_X_as_np=False, + ) + # We need to create the attribute design matrix as a df + self.Xs = self.gdata.design_matrix + # But the algorithm expects it as a numpy array + self.gdata = self.gdata._replace(design_matrix=np.array(self.Xs))
+ + +
+[docs] + def prepare_and_run(self, masks): + maskG, maskX = masks + # Create copies of the adjacency matrix B and covariate matrix X to use for training + B_train = self.gdata.adjacency_tensor.copy() + X_train = self.gdata.design_matrix.copy() + + # Apply the masks to the training data by setting masked elements to 0 + B_train[maskG > 0] = 0 + X_train[maskX > 0] = 0 + + # Create a copy of gdata to use for training + self.gdata_for_training = self.gdata._replace(adjacency_tensor=B_train) + self.gdata_for_training = self.gdata_for_training._replace( + design_matrix=X_train + ) + + # Initialize the MTCOV algorithm object + algorithm_object = MTCOV(**self.num_parameters) + + # Fit the MTCOV models to the training data and get the outputs + outputs = algorithm_object.fit( + self.gdata_for_training, + **{k: v for k, v in self.parameters.items() if k != "rseed"}, + rng=self.rng, + ) + + # Return the outputs and the algorithm object + return outputs, algorithm_object
+ + +
+[docs] + def calculate_performance_and_prepare_comparison( + self, outputs, masks, fold, _algorithm_object + ): + maskG, maskX = masks + + # Unpack the outputs from the algorithm + U, V, W, BETA, logL = outputs + + # Initialize the comparison dictionary with keys as headers + comparison = { + "K": self.parameters["K"], + "gamma": self.parameters["gamma"], + "fold": fold, + "rseed": self.rseed, + "logL": logL, + } + + # Calculate and assign the covariates accuracy values + if self.parameters["gamma"] != 0: + comparison["acc_train"] = compute_covariate_prediction_accuracy( + self.Xs, U, V, BETA, mask=np.logical_not(maskX) + ) + comparison["acc_test"] = compute_covariate_prediction_accuracy( + self.Xs, U, V, BETA, mask=maskX + ) + + # Calculate and assign the AUC values + if self.parameters["gamma"] != 1: + comparison["auc_train"] = compute_multilayer_link_prediction_AUC( + self.gdata.adjacency_tensor, U, V, W, mask=np.logical_not(maskG) + ) + comparison["auc_test"] = compute_multilayer_link_prediction_AUC( + self.gdata.adjacency_tensor, U, V, W, mask=maskG + ) + + # Calculate and assign the log-likelihood value + comparison["logL_test"] = loglikelihood( + self.gdata.adjacency_tensor, + self.Xs, + U, + V, + W, + BETA, + self.parameters["gamma"], + maskG=maskG, + maskX=maskX, + ) + + # Return the comparison dictionary + return comparison
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/model_selection/parameter_search.html b/_modules/probinet/model_selection/parameter_search.html new file mode 100644 index 0000000..e09a49d --- /dev/null +++ b/_modules/probinet/model_selection/parameter_search.html @@ -0,0 +1,429 @@ + + + + + + + + + + probinet.model_selection.parameter_search — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.model_selection.parameter_search

+"""
+This module defines the grid of parameters to be tested for models selection.
+It provides a function to generate all possible combinations of parameter values.
+"""
+
+from itertools import product
+from typing import Any, Dict, List
+
+
+
+[docs] +def define_grid(**kwargs: Any) -> List[Dict[str, Any]]: + """ + Define the grid of parameters to be tested. + + Parameters + ---------- + **kwargs : Any + Keyword arguments where the key is the parameter name and the value is a list of possible values for that parameter. + + Returns + ------- + List[Dict[str, Any]] + A list of dictionaries, each representing a unique combination of parameter values. + """ + # Check that each value is a list + if not all(isinstance(v, list) for v in kwargs.values()): + raise ValueError( + "Some values are not lists:\n\t" + + "\n\t".join( + f"{k} : {v}" for k, v in kwargs.items() if not isinstance(v, list) + ) + ) + + # Extract parameter names + param_names = kwargs.keys() + # Extract parameter values + param_values = kwargs.values() + # Generate all combinations of parameter values + param_combinations = product(*param_values) + # Create a list of dictionaries for each combination + grid = [dict(zip(param_names, combination)) for combination in param_combinations] + return grid
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/models/acd.html b/_modules/probinet/models/acd.html new file mode 100644 index 0000000..c86577c --- /dev/null +++ b/_modules/probinet/models/acd.html @@ -0,0 +1,1469 @@ + + + + + + + + + + probinet.models.acd — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.models.acd

+"""
+Class definition of ACD, the algorithm to perform inference in networks with anomaly.
+The latent variables are related to community memberships and anomaly parameters
+:cite:`safdari2022anomaly` .
+"""
+
+import logging
+import time
+from os import PathLike
+from pathlib import Path
+from typing import Any, List, Optional, Tuple
+
+import numpy as np
+import pandas as pd
+from scipy.stats import poisson
+from sparse import COO
+
+from probinet.evaluation.expectation_computation import (
+    compute_mean_lambda0,
+    compute_mean_lambda0_nonzero,
+)
+
+from ..input.preprocessing import preprocess_adjacency_tensor
+from ..types import (
+    ArraySequence,
+    EndFileType,
+    FilesType,
+    GraphDataType,
+    MaskType,
+    SubsNzType,
+)
+from ..utils.matrix_operations import sp_uttkrp, sp_uttkrp_assortative, transpose_tensor
+from ..utils.tools import (
+    get_item_array_from_subs,
+    get_or_create_rng,
+    log_and_raise_error,
+)
+from .base import ModelBase, ModelUpdateMixin
+from .classes import GraphData
+from .constants import AG_DEFAULT, BG_DEFAULT, EPS_, K_DEFAULT, OUTPUT_FOLDER
+
+
+
+[docs] +class AnomalyDetection(ModelBase, ModelUpdateMixin): + """ + Class definition of AnomalyDetection, the algorithm to perform inference and anomaly + detection on networks with reciprocity. + """ + + def __init__( + self, + convergence_tol: float = 1e-1, # Overriding the base class default + decision: int = 2, # Overriding the base class default + err: float = 1e-2, # Overriding the base class default + err_max: float = 1e-8, # Overriding the base class default + num_realizations: int = 1, # Overriding the base class default + max_iter: int = 500, # Overriding the base class default + **kwargs, # Capture all other arguments for ModelBase + ) -> None: + # Pass the overridden arguments along with any others to the parent class + super().__init__( + convergence_tol=convergence_tol, + decision=decision, + err=err, + err_max=err_max, + num_realizations=num_realizations, + max_iter=max_iter, + **kwargs, # Forward any other arguments to the base class + ) + + self.__doc__ = ModelBase.__init__.__doc__ + + def _check_fit_params(self, **kwargs) -> None: + # Call the check_fit_params method from the parent class + super()._check_fit_params(**kwargs) + + self.constrained = kwargs.get( + "constrained", False + ) # if True, use the configuration with constraints on the updates + self.ag = kwargs.get("ag", 1.5) # shape of gamma prior + self.bg = kwargs.get("bg", 10.0) # rate of gamma prior + self.flag_anomaly = kwargs.get("flag_anomaly", True) + self.fix_pibr = kwargs.get("fix_pibr", False) + self.fix_mupr = kwargs.get("fix_mupr", False) + self.pibr = kwargs.get("pibr0", None) # pi: anomaly parameter + self.mupr = kwargs.get("mupr0", None) # mu: prior + + if self.pibr is not None: + if (self.pibr < 0) or (self.pibr > 1): + raise ValueError("The anomaly parameter pibr0 has to be in [0, 1]!") + + if self.mupr is not None: + if (self.mupr < 0) or (self.mupr > 1): + raise ValueError("The prior mupr0 has to be in [0, 1]!") + + if self.fix_pibr == True: + self.pibr_old = self.pibr_f = self.pibr + if self.fix_mupr == True: + self.mupr_old = self.mupr_f = self.mupr + + if not self.flag_anomaly: + self.pibr = self.pibr_old = self.pibr_f = 1.0 + self.mupr = self.mupr_old = self.mupr_f = 0.0 + self.fix_pibr = self.fix_mupr = True + + if self.initialization == 1: + theta = np.load(self.files, allow_pickle=True) + self.N, self.K = theta["u"].shape + + # Parameters for the initialization of the models + self.use_unit_uniform = True + self.normalize_rows = True + +
+[docs] + def fit( + self, + gdata: GraphData, + ag: float = AG_DEFAULT, + bg: float = BG_DEFAULT, + pibr0: Optional[float] = None, + mupr0: Optional[float] = None, + flag_anomaly: bool = True, + fix_pibr: bool = False, + fix_mupr: bool = False, + K: int = K_DEFAULT, + undirected: bool = False, + initialization: int = 0, + assortative: bool = True, + constrained: bool = False, + fix_w: bool = False, + fix_communities: bool = False, + mask: Optional[MaskType] = None, + out_inference: bool = True, + out_folder: Path = OUTPUT_FOLDER, + end_file: Optional[EndFileType] = None, + files: Optional[FilesType] = None, + rng: Optional[np.random.Generator] = None, + **__kwargs: Any, + ) -> Tuple[np.ndarray, np.ndarray, np.ndarray, float, float, float]: + """ + Fit the AnomalyDetection models to the provided data. + + Parameters + ---------- + gdata + Graph adjacency tensor. + ag + Shape of gamma prior, by default 1.5. + bg + Rate of gamma prior, by default 10.0. + pibr0 + Initial value for the anomaly parameter pi, by default None. + mupr0 + Initial value for the prior mu parameter, by default None. + flag_anomaly + If True, the anomaly detection is enabled, by default True. + fix_pibr + If True, the anomaly parameter pi is fixed, by default False. + fix_mupr + If True, the prior mu parameter is fixed, by default False. + K + Number of communities, by default 3. + undirected + If True, the graph is considered undirected, by default False. + initialization + Indicator for choosing how to initialize u, v, and w, by default 0. + assortative + If True, the network is considered assortative, by default True. + constrained + If True, constraints are applied on the updates, by default False. + fix_w + If True, the affinity tensor w is fixed, by default False. + fix_communities + If True, the community memberships are fixed, by default False. + mask + Mask for selecting the held-out set in the adjacency tensor in case of cross-validation, by default None. + out_inference + If True, evaluation inference results, by default True. + out_folder + Output folder for inference results, by default "outputs/". + end_file + Suffix for the evaluation file, by default None. + files + Path to the file for initialization, by default None. + rng + Random number generator, by default None. + **kwargs + Additional parameters for the model. + + Returns + ------- + u_f + Final out-going membership matrix. + v_f + Final in-coming membership matrix. + w_f + Final affinity tensor. + pibr_f + Final anomaly parameter pi. + mupr_f + Final prior mu parameter. + maxL + Maximum log-likelihood. + """ + + # Check the input parameters + self._check_fit_params( + K=K, + data=gdata.adjacency_tensor, + undirected=undirected, + initialization=initialization, + assortative=assortative, + constrained=constrained, + ag=ag, + bg=bg, + pibr0=pibr0, + mupr0=mupr0, + flag_anomaly=flag_anomaly, + fix_pibr=fix_pibr, + fix_mupr=fix_mupr, + fix_communities=fix_communities, + fix_w=fix_w, + out_inference=out_inference, + out_folder=out_folder, + end_file=end_file, + files=files, + ) + # Set the random seed + self.rng = get_or_create_rng(rng) + + # Initialize the fit parameters + maxL = -self.inf # initialization of the maximum log-likelihood + self.nodes = gdata.nodes + conv = False # initialization of the convergence flag + best_loglik_values = [] # initialization of the log-likelihood values + + # Preprocess the data for fitting the models + ( + data, + data_T, + data_T_vals, + subs_nz, + subs_nz_mask, + ) = self._preprocess_data_for_fit(gdata.adjacency_tensor, mask) + + self.data = data + self.data_T = data_T + self.data_T_vals = data_T_vals + self.mask = mask + self.subs_nz = subs_nz + self.subs_nz_mask = subs_nz_mask + + # Run the Expectation-Maximization (EM) algorithm for a specified number of realizations + for r in range(self.num_realizations): + # Initialize the parameters for the current realization + ( + coincide, + convergence, + it, + loglik, + loglik_values, + ) = self._initialize_realization() + # Update the parameters for the current realization + it, loglik, coincide, convergence, loglik_values = self._update_realization( + r, it, loglik, coincide, convergence, loglik_values + ) + + # If the current log-likelihood is greater than the maximum log-likelihood so far, + # update the optimal parameters and the maximum log-likelihood + if maxL < loglik: + self._update_optimal_parameters() + maxL = loglik + self.final_it = it + conv = convergence + self.best_r = r + best_loglik_values = list(loglik_values) + + # Log the current realization number, log-likelihood, number of iterations, and elapsed time + self._log_realization_info( + r, loglik, maxL, self.final_it, self.time_start, convergence + ) + + # end cycle over realizations + + # Store the maximum pseudo log-likelihood + self.maxL = maxL + + # Evaluate the results of the fitting process + self._evaluate_fit_results(self.maxL, conv, best_loglik_values) + + return self.u_f, self.v_f, self.w_f, self.pibr_f, self.mupr_f, maxL
+ + + def _initialize_realization(self) -> Tuple[int, bool, int, float, List[float]]: + """ + This method initializes the parameters for each realization of the EM algorithm. + It also sets up local variables for convergence checking. + """ + + # Log the current state of the random number generator + logging.debug( + "Random number generator state: %s", + self.rng.bit_generator.state["state"]["state"], + ) + + # Initialize the parameters for the current realization + self._initialize() # Remark: this version of this method uses the initialize from this + # class and not from the super, since it has a different logic. + + # Update the old variables for the current realization + super()._update_old_variables() + + # Update the cache used in the EM update + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + + # Set up local variables for convergence checking + # coincide and it are counters, convergence is a boolean flag + # loglik is the initial pseudo log-likelihood + coincide, it = 0, 0 + convergence = False + loglik = self.inf + loglik_values: List[float] = [] + + # Record the start time of the realization + self.time_start = time.time() + + # Return the initial state of the realization + return coincide, convergence, it, loglik, loglik_values + + def _preprocess_data_for_fit( + self, data: GraphDataType, mask: MaskType + ) -> Tuple[ + GraphDataType, + np.ndarray, + np.ndarray, + tuple[int, int, int], + tuple[int, int, int], + ]: + logging.debug("Preprocessing the data for fitting the models.") + logging.debug("Data looks like: %s", data) + + data_T = np.einsum("aij->aji", data) + data_T_vals = get_item_array_from_subs(data_T, data.nonzero()) + + # pre-processing of the data to handle the sparsity + data = preprocess_adjacency_tensor(data) + data_T = preprocess_adjacency_tensor(data_T) + + # save the indexes of the nonzero entries + subs_nz = tuple(self.get_data_nonzero(data)) + + subs_nz_mask = mask.nonzero() if mask is not None else None + + return data, data_T, data_T_vals, subs_nz, subs_nz_mask + + def _initialize(self): + """ + Random initialization of the parameters u, v, w, beta. + """ + if not self.fix_pibr: + self._randomize_pibr() + + if not self.fix_mupr: + self._randomize_mupr() + + if self.initialization == 0: + # Log a message indicating that u, v and w are being initialized randomly + logging.debug("%s", "u, v and w are initialized randomly.") + + super()._randomize_w() + super()._randomize_u_v() + + elif self.initialization == 1: + # Log a message indicating that u, v and w are being initialized using the input file + logging.debug( + "u and v are initialized using the input file: %s", self.files + ) + + self.theta = np.load(self.files, allow_pickle=True) + super()._initialize_u() + super()._initialize_v() + self._randomize_w() + + def _randomize_pibr(self): + """ + Generate a random number in (0, 1.). + """ + self.pibr = self.rng.random() + + def _randomize_mupr(self): + """ + Generate a random number in (0, 1.). + """ + self.mupr = self.rng.random() + + def _initialize_w(self, infile_name: str) -> None: # type: ignore + """ + Initialize affinity tensor w from file. + + Parameters + ---------- + infile_name : str + Path of the input file. + """ + + with open(infile_name, "rb") as f: + dfW = pd.read_csv(f, sep="\\s+", header=None) + if self.assortative: + self.w = np.diag(dfW)[np.newaxis, :].copy() + else: + self.w = dfW.values[np.newaxis, :, :] + if not self.fix_w: + max_entry = np.max(self.w) + self.w += max_entry * self.err * np.random.random_sample(self.w.shape) + + def _copy_variables(self, source_suffix: str, target_suffix: str) -> None: + """ + Copy variables from source to target. + + Parameters + ---------- + source_suffix : str + The suffix of the source variable names. + target_suffix : str + The suffix of the target variable names. + """ + # Call the base method + super()._copy_variables(source_suffix, target_suffix) + + # Copy the specific variables + for var_name in ["pibr", "mupr"]: + source_var = getattr(self, f"{var_name}{source_suffix}") + setattr(self, f"{var_name}{target_suffix}", float(source_var)) + + def _update_cache( + self, + data: GraphDataType, + data_T_vals: np.ndarray, + subs_nz: Tuple[int, int, int], + ) -> None: + """ + Update the cache used in the em_update. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_T_vals : ndarray + Array with values of entries A[j, i] given non-zero entry (i, j). + subs_nz : tuple + Indices of elements of data that are non-zero. + """ + + self.lambda0_nz = super()._lambda_nz(subs_nz) + if not self.assortative: + self.lambda0_nzT = compute_mean_lambda0_nonzero( + subs_nz, self.v, self.u, np.einsum("akq->aqk", self.w), self.assortative + ) + else: + self.lambda0_nzT = compute_mean_lambda0_nonzero( + subs_nz, self.v, self.u, self.w, self.assortative + ) + if self.flag_anomaly == True: + self.Qij_dense, self.Qij_nz = self._QIJ(data, data_T_vals, subs_nz) + self.M_nz = self.lambda0_nz + self.M_nz[self.M_nz == 0] = 1 + + if isinstance(data, np.ndarray): + self.data_M_nz = data[subs_nz] / self.M_nz + elif isinstance(data, COO): + self.data_M_nz = data.data / self.M_nz + if self.flag_anomaly == True: + self.data_M_nz_Q = data.data * (1 - self.Qij_nz) / self.M_nz + else: + self.data_M_nz_Q = data.data / self.M_nz + + def _QIJ( + self, + data: GraphDataType, + data_T_vals: np.ndarray, + subs_nz: SubsNzType, + ) -> Tuple[np.ndarray, np.ndarray]: + """ + Compute the mean lambda0_ij for only non-zero entries. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + w : ndarray + Affinity tensor. + data_T_vals : ndarray + Array with values of entries A[j, i] given non-zero entry (i, j). + + Returns + ------- + nz_recon_I : ndarray + Mean lambda0_ij for only non-zero entries. + """ + if isinstance(data, np.ndarray): + nz_recon_I = np.power(1 - self.pibr, data[subs_nz]) + elif isinstance(data, COO): + nz_recon_I = ( + self.mupr + * poisson.pmf(data.data, self.pibr) + * poisson.pmf(data_T_vals, self.pibr) + ) + nz_recon_Id = nz_recon_I + (1 - self.mupr) * poisson.pmf( + data.data, self.lambda0_nz + ) * poisson.pmf(data_T_vals, self.lambda0_nzT) + + non_zeros = nz_recon_Id > 0 + nz_recon_I[non_zeros] /= nz_recon_Id[non_zeros] + + lambda0_ija = compute_mean_lambda0(self.u, self.v, self.w) + Q_ij_dense = np.ones(lambda0_ija.shape) + Q_ij_dense *= self.mupr * np.exp(-self.pibr * 2) + Q_ij_dense_d = Q_ij_dense + (1 - self.mupr) * np.exp( + -(lambda0_ija + transpose_tensor(lambda0_ija)) + ) + non_zeros = Q_ij_dense_d > 0 + Q_ij_dense[non_zeros] /= Q_ij_dense_d[non_zeros] + assert np.allclose(Q_ij_dense[0], Q_ij_dense[0].T, rtol=1e-05, atol=1e-08) + Q_ij_dense[subs_nz] = nz_recon_I + + Q_ij_dense = np.maximum( + Q_ij_dense, transpose_tensor(Q_ij_dense) + ) # make it symmetric + np.fill_diagonal(Q_ij_dense[0], 0.0) + + assert (Q_ij_dense > 1).sum() == 0 + return Q_ij_dense, Q_ij_dense[subs_nz] + + def _update_em( + self, + ): + """ + Update parameters via EM procedure. + + Returns + ------- + d_u : float + Maximum distance between the old and the new membership matrix u. + d_v : float + Maximum distance between the old and the new membership matrix v. + d_w : float + Maximum distance between the old and the new affinity tensor w. + d_pibr : float + Maximum distance between the old and the new anoamly parameter pi. + d_mupr : float + Maximum distance between the old and the new prior mu. + """ + + if not self.fix_communities: + d_u = self._update_U() + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + if self.undirected: + self.v = self.u + self.v_old = self.v + d_v = d_u + else: + d_v = self._update_V() + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + + else: + d_u = d_v = 0.0 + + if not self.fix_w: + if not self.assortative: + d_w = self._update_W(self.subs_nz) + else: + d_w = self._update_W_assortative() + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + else: + d_w = 0 + + if not self.fix_pibr: + d_pibr = self._update_pibr( + self.data, + self.subs_nz, + mask=self.mask, + subs_nz_mask=self.subs_nz_mask, + ) + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + + else: + d_pibr = 0.0 + + if not self.fix_mupr: + d_mupr = self._update_mupr( + mask=self.mask, + subs_nz_mask=self.subs_nz_mask, + ) + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + else: + d_mupr = 0.0 + + return d_u, d_v, d_w, d_pibr, d_mupr + + def _update_pibr( + self, + data: GraphDataType, + subs_nz: SubsNzType, + mask: Optional[MaskType] = None, + subs_nz_mask: Optional[SubsNzType] = None, + ) -> float: + """ + Update the anomaly parameter pi. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + subs_nz : tuple + Indices of elements of data that are non-zero. + mask : ndarray + Mask for selecting the held out set in the adjacency tensor in case of cross-validation. + subs_nz_mask : tuple + Indices of elements of data that are non-zero in the mask. + + Returns + ------- + dist_pibr : float + Maximum distance between the old and the new anomaly parameter pi. + """ + Adata = None + if isinstance(data, np.ndarray): + Adata = (data[subs_nz] * self.Qij_nz).sum() + elif isinstance(data, COO): + Adata = (data.data * self.Qij_nz).sum() + else: + log_and_raise_error(TypeError, "Data type not supported!") + if mask is None: + self.pibr = Adata / self.Qij_dense.sum() + else: + self.pibr = Adata / self.Qij_dense[subs_nz_mask].sum() + + dist_pibr = abs(self.pibr - self.pibr_old) + self.pibr_old = np.copy(self.pibr) + + return dist_pibr + + def _update_mupr( + self, + mask: Optional[MaskType] = None, + subs_nz_mask: Optional[SubsNzType] = None, + ) -> float: + """ + Update the prior mu parameter. + + Parameters + ---------- + mask : ndarray + Mask for selecting the held out set in the adjacency tensor in case of cross-validation. + subs_nz_mask : tuple + Indices of elements of data that are non-zero in the mask. + + Returns + ------- + dist_mupr : float + Maximum distance between the old and the new rprior mu. + """ + if mask is None: + self.mupr = self.Qij_dense.sum() / (self.N * (self.N - 1)) + else: + self.mupr = self.Qij_dense[subs_nz_mask].sum() / (self.N * (self.N - 1)) + + dist_mupr = abs(self.pibr - self.mupr_old) + self.mupr_old = np.copy(self.mupr) # type: ignore + + return dist_mupr + + def _specific_update_U(self): + """ + Specific logic for updating U in the AnomalyDetection class. + """ + + self.u = ( + self.ag + - 1 + + self.u_old + * self._update_membership(self.subs_nz, self.u, self.v, self.w, 1) + ) + + if not self.constrained: + if self.flag_anomaly == True: + if self.mask is None: + Du = np.einsum("aij,jq->iq", 1 - self.Qij_dense, self.v) + else: + Du = np.einsum( + "aij,jq->iq", self.mask * (1 - self.Qij_dense), self.v + ) + if not self.assortative: + w_k = np.einsum("akq->kq", self.w) + Z_uk = np.einsum("iq,kq->ik", Du, w_k) + else: + w_k = np.einsum("ak->k", self.w) + Z_uk = np.einsum("ik,k->ik", Du, w_k) + + else: # flag_anomaly == False + Du = np.einsum("jq->q", self.v) + if not self.assortative: + w_k = np.einsum("akq->kq", self.w) + Z_uk = np.einsum("q,kq->k", Du, w_k) + else: + w_k = np.einsum("ak->k", self.w) + Z_uk = np.einsum("k,k->k", Du, w_k) + Z_uk += self.bg + non_zeros = Z_uk > 0.0 + + if self.flag_anomaly == True: + self.u[Z_uk == 0] = 0.0 + self.u[non_zeros] /= Z_uk[non_zeros] + else: + self.u[:, Z_uk == 0] = 0.0 + self.u[:, non_zeros] /= Z_uk[non_zeros] + + else: + row_sums = self.u.sum(axis=1) + self.u[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + def _specific_update_V(self): + """ + Specific logic for updating V in the DynCRep class. + """ + + self.v = ( + self.ag + - 1 + + self.v_old + * self._update_membership(self.subs_nz, self.u, self.v, self.w, 2) + ) + + if not self.constrained: + if self.flag_anomaly == True: + if self.mask is None: + Dv = np.einsum("aij,ik->jk", 1 - self.Qij_dense, self.u) + else: + Dv = np.einsum( + "aij,ik->jk", self.mask * (1 - self.Qij_dense), self.u + ) + if not self.assortative: + w_k = np.einsum("aqk->qk", self.w) + Z_vk = np.einsum("iq,qk->ik", Dv, w_k) + else: + w_k = np.einsum("ak->k", self.w) + Z_vk = np.einsum("ik,k->ik", Dv, w_k) + + else: # flag_anomaly == False + Dv = np.einsum("ik->k", self.u) + if not self.assortative: + w_k = np.einsum("aqk->qk", self.w) + Z_vk = np.einsum("q,qk->k", Dv, w_k) + else: + w_k = np.einsum("ak->k", self.w) + Z_vk = np.einsum("k,k->k", Dv, w_k) + + Z_vk += self.bg + non_zeros = Z_vk > 0 + + if self.flag_anomaly == True: + self.v[Z_vk == 0] = 0.0 + self.v[non_zeros] /= Z_vk[non_zeros] + else: + self.v[:, Z_vk == 0] = 0.0 + self.v[:, non_zeros] /= Z_vk[non_zeros] + else: + row_sums = self.v.sum(axis=1) + self.v[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + def _specific_update_W(self, subs_nz: SubsNzType, mask: MaskType = None): + """ + Update affinity tensor. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + """ + sub_w_nz = self.w.nonzero() + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum("Ik,Iq->Ikq", self.u[subs_nz[1], :], self.v[subs_nz[2], :]) + uttkrp_I = self.data_M_nz_Q[:, np.newaxis, np.newaxis] * UV + for _, k, q in zip(*sub_w_nz): + uttkrp_DKQ[:, k, q] += np.bincount( + subs_nz[0], weights=uttkrp_I[:, k, q], minlength=self.L + ) + + self.w = self.ag - 1 + self.w * uttkrp_DKQ + + if self.flag_anomaly == True: + mask = mask if mask is not None else 1 + UQk = np.einsum("aij,ik->ajk", mask * (1 - self.Qij_dense), self.u) + Z = np.einsum("ajk,jq->akq", UQk, self.v) + else: # flag_anomaly == False + Z = np.einsum("k,q->kq", self.u.sum(axis=0), self.v.sum(axis=0))[ + np.newaxis, :, : + ] + Z += self.bg + + non_zeros = Z > 0 + self.w[Z == 0] = 0.0 + self.w[non_zeros] /= Z[non_zeros] + + def _update_W(self, subs_nz: SubsNzType) -> float: + # a generic function here that will do what each class needs + self._specific_update_W(subs_nz) + + dist, self.w, self.w_old = self._finalize_update(self.w, self.w_old) + + return dist + + def _specific_update_W_assortative(self): + """ + Update affinity tensor (assuming assortativity). + + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + + Returns + ------- + dist_w : float + Maximum distance between the old and the new affinity tensor w. + """ + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Ik->Ik", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz_Q[:, np.newaxis] * UV + for k in range(self.K): + uttkrp_DKQ[:, k] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k], minlength=self.L + ) + + self.w = self.ag - 1 + self.w * uttkrp_DKQ + + if self.flag_anomaly == True: + if self.mask is None: + UQk = np.einsum("aij,ik->jk", (1 - self.Qij_dense), self.u) + Zk = np.einsum("jk,jk->k", UQk, self.v) + Zk = Zk[np.newaxis, :] + else: + Zk = np.einsum( + "aij,ijk->ak", + self.mask * (1 - self.Qij_dense), + np.einsum("ik,jk->ijk", self.u, self.v), + ) + else: # flag_anomaly == False + Zk = np.einsum("ik,jk->k", self.u, self.v) + Zk = Zk[np.newaxis, :] + Zk += self.bg + + non_zeros = Zk > 0 + self.w[Zk == 0] = 0 + self.w[non_zeros] /= Zk[non_zeros] + + def _update_membership( + self, + subs_nz: ArraySequence, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + m: int, + ) -> np.ndarray: + """ + (Formerly called 'update_membership_Q') + + Return the Khatri-Rao product (sparse version) used in the update of the membership matrices. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + w : ndarray + Affinity tensor. + m : int + Mode in which the Khatri-Rao product of the membership matrix is multiplied with the tensor: if 1 it + works with the matrix u; if 2 it works with v. + + Returns + ------- + uttkrp_DK : ndarray + Matrix which is the result of the matrix product of the unfolding of the tensor and the + Khatri-Rao product of the membership matrix. + """ + + if not self.assortative: + uttkrp_DK = sp_uttkrp(self.data_M_nz_Q, subs_nz, m, u, v, w) + else: + uttkrp_DK = sp_uttkrp_assortative(self.data_M_nz_Q, subs_nz, m, u, v, w) + + return uttkrp_DK + +
+[docs] + def compute_likelihood(self): + return self._ELBO(self.data, self.mask, self.subs_nz_mask)
+ + + def _ELBO( + self, + data: GraphDataType, + mask: Optional[MaskType] = None, + subs_nz_mask: Optional[SubsNzType] = None, + ) -> float: + """ + Compute the Evidence Lower BOund (ELBO) of the data. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + mask : ndarray + Mask for selecting the held out set in the adjacency tensor in case of cross-validation. + subs_nz_mask : tuple + Indices of elements of data that are non-zero in the mask. + + Returns + ------- + l : float + The computed ELBO value. + """ + + self.lambda0_ija = compute_mean_lambda0(self.u, self.v, self.w) + + if mask is not None: + if isinstance(data, COO): + Adense = data.todense() + else: + raise ValueError("Mask is not None but data is not a COO tensor.") + + if not self.flag_anomaly: + l = (data.data * np.log(self.lambda0_ija[data.coords] + EPS_)).sum() + l -= ( + self.lambda0_ija.sum() + if mask is None + else self.lambda0_ija[subs_nz_mask].sum() + ) + return l + else: + l = 0.0 + + # Term containing Q, pi and A + l -= self.pibr * self.Qij_dense.sum() + + if self.pibr >= 0: + if mask is None: + coords_tuple = tuple(data.coords[i] for i in range(3)) + l += ( + np.log(self.pibr + EPS_) + * (self.Qij_dense[coords_tuple] * data.data).sum() + ) + else: + subs_nz = np.logical_and(mask > 0, Adense > 0) + l += ( + np.log(self.pibr + EPS_) + * (self.Qij_dense[subs_nz] * (Adense[subs_nz])).sum() + ) + + # Entropy of Bernoulli in Q + if mask is None: + non_zeros = self.Qij_dense > 0 + non_zeros1 = (1 - self.Qij_dense) > 0 + else: + non_zeros = np.logical_and(mask > 0, self.Qij_dense > 0) + non_zeros1 = np.logical_and(mask > 0, (1 - self.Qij_dense) > 0) + + l -= ( + self.Qij_dense[non_zeros] * np.log(self.Qij_dense[non_zeros] + EPS_) + ).sum() + l -= ( + (1 - self.Qij_dense)[non_zeros1] + * np.log((1 - self.Qij_dense)[non_zeros1] + EPS_) + ).sum() + + # Term containing Q, M and A + if mask is None: + l -= ((1 - self.Qij_dense) * self.lambda0_ija).sum() + coords_tuple = tuple(data.coords[i] for i in range(3)) + l += ( + ((1 - self.Qij_dense)[coords_tuple]) + * data.data + * np.log(self.lambda0_ija[coords_tuple] + EPS_) + ).sum() + + # Term containing Q and mu + if 1 - self.mupr >= 0: + l += np.log(1 - self.mupr + EPS_) * (1 - self.Qij_dense).sum() + if self.mupr >= 0: + l += np.log(self.mupr + EPS_) * (self.Qij_dense).sum() + else: + l -= ( + (1 - self.Qij_dense[subs_nz_mask]) * self.lambda0_ija[subs_nz_mask] + ).sum() + subs_nz = np.logical_and(mask > 0, Adense > 0) + l += ( + ((1 - self.Qij_dense)[subs_nz]) + * data.data + * np.log(self.lambda0_ija[subs_nz] + EPS_) + ).sum() + + if 1 - self.mupr > 0: + l += ( + np.log(1 - self.mupr + EPS_) + * (1 - self.Qij_dense)[subs_nz_mask].sum() + ) + if self.mupr > 0: + l += np.log(self.mupr + EPS_) * (self.Qij_dense[subs_nz_mask]).sum() + + if self.ag > 1.0: + l += (self.ag - 1) * np.log(self.u + EPS_).sum() + l += (self.ag - 1) * np.log(self.v + EPS_).sum() + if self.bg > 0.0: + l -= self.bg * self.u.sum() + l -= self.bg * self.v.sum() + + if np.isnan(l): + log_and_raise_error(ValueError, "ELBO is NaN!") + return l + + def _log_realization_info( + self, + r: int, + loglik: float, + maxL: float, + final_it: int, + time_start: float, + convergence: bool, + ) -> None: + """ + Log the current realization number, log-likelihood, number of iterations, and elapsed time. + + Parameters + ---------- + r : int + Current realization number. + loglik : float + Current log-likelihood. + final_it : int + Current number of iterations. + time_start : float + Start time of the realization. + """ + logging.debug( + "num. realizations = %s - ELBO = %s - ELBOmax = %s - iterations = %s - time = %s " + "seconds - " + "convergence = %s", + r, + loglik, + maxL, + final_it, + np.round(time.time() - time_start, 2), + convergence, + ) + + def _update_optimal_parameters(self): + """ + Update values of the parameters after convergence. + """ + + self._copy_variables(source_suffix="", target_suffix="_f") + + self.pibr_f = np.copy(self.pibr) + self.mupr_f = np.copy(self.mupr) + if self.flag_anomaly == True: + self.Q_ij_dense_f = np.copy(self.Qij_dense) + else: + self.Q_ij_dense_f = np.zeros((1, self.N, self.N))
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/models/base.html b/_modules/probinet/models/base.html new file mode 100644 index 0000000..9ff294f --- /dev/null +++ b/_modules/probinet/models/base.html @@ -0,0 +1,1724 @@ + + + + + + + + + + probinet.models.base — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.models.base

+"""
+Base classes for the models classes.
+"""
+
+import dataclasses
+import logging
+import os
+import time
+from abc import ABC, abstractmethod
+from argparse import Namespace
+from functools import singledispatchmethod
+from pathlib import Path
+from typing import Any, Dict, Optional, Tuple
+
+import numpy as np
+from sparse import COO
+
+from probinet.input.loader import build_adjacency_from_file
+from probinet.models.classes import GraphData
+from probinet.models.constants import CONVERGENCE_TOL_, DECISION_, ERR_, ERR_MAX_, INF_
+from probinet.types import GraphDataType
+from probinet.utils.tools import log_and_raise_error
+from probinet.visualization.plot import plot_L
+
+
+
+[docs] +@dataclasses.dataclass +class ModelBaseParameters: + """ + Attributes + ---------- + inf : float + Initial value of the log-likelihood. + err_max : float + Minimum value for the parameters. + err : float + Noise for the initialization. + num_realizations : int + Number of iterations with different random initialization. + convergence_tol : float + Tolerance for convergence. + decision : int + Convergence parameter. + max_iter : int + Maximum number of EM steps before aborting. + plot_loglik : bool + Flag to plot the log-likelihood. + flag_conv : str + Flag to choose the convergence criterion. + """ + + inf: float = INF_ # initial value of the log-likelihood + err_max: float = ERR_MAX_ # minimum value for the parameters + err: float = ERR_ # noise for the initialization + num_realizations: int = ( + 3 # number of iterations with different random initialization + ) + convergence_tol: float = CONVERGENCE_TOL_ # tolerance for convergence + decision: int = DECISION_ # convergence parameter + max_iter: int = 500 # maximum number of EM steps before aborting + plot_loglik: bool = False # flag to plot the log-likelihood + flag_conv: str = "log" # flag to choose the convergence criterion
+ + + +
+[docs] +class ModelBase(ModelBaseParameters): + """ + Base class for the models classes that inherit from the ModelBaseParameters class. It contains the + methods to check the parameters of the fit method, initialize the parameters, and check for + convergence. All the models classes should inherit from this class. + """ + + def __init__(self, *args, **kwargs): + # Call the __init__ method of the parent class + super().__init__(*args, **kwargs) + self.__doc__ = ModelBaseParameters.__doc__ + # Define additional attributes + self.attributes_to_save_names = [ + "u_f", + "v_f", + "w_f", + "eta_f", + "final_it", + "maxL", + "maxPSL", + "beta_f", + "nodes", + "pibr", + "mupr", + ] + + # Initialize the attributes + self.u_f: np.ndarray = np.array([]) + self.v_f: np.ndarray = np.array([]) + self.w_f: np.ndarray = np.array([]) + self.use_unit_uniform = False + self.theta: Dict[str, Any] = {} + self.normalize_rows = False + self.nodes: list[Any] = [] + self.rng = np.random.default_rng() + self.beta_hat: np.ndarray = np.array([]) + self.best_r: int = 0 + self.final_it: int = 0 + + self.message_for_invalid_initialization = ( + "The initialization parameter can be either 0 " + "or 1. If 0, the model will be initialized " + "randomly. If 1, the model will be initialized with the parameters " + "stored in the file specified in the `files` parameter." + ) + +
+[docs] + def check_params_to_load_data(self, binary, noselfloop, undirected, **kwargs): + """ + Check that the parameters to load the data are correct. + """ + pass
+ + + def _validate_eta0(self, eta0: float) -> None: + if eta0 is not None and eta0 <= 0.0: + message = "If not None, the eta0 parameter has to be greater than 0.!" + log_and_raise_error(ValueError, message) + + def _validate_undirected_eta(self) -> None: + if self.undirected and not (self.fix_eta and self.eta0 == 1): + message = ( + "If undirected=True, the parameter eta has to be fixed equal to 1 " + "(s.t. log(eta)=0)." + ) + log_and_raise_error(ValueError, message) + + def _check_fit_params(self, *args, **kwargs) -> None: + """ + Check the parameters of the fit method. + """ + # Extract parameters from args and kwargs + initialization = kwargs.get( + "initialization", args[0] if len(args) > 0 else None + ) + undirected = kwargs.get("undirected", args[1] if len(args) > 1 else None) + assortative = kwargs.get("assortative", args[2] if len(args) > 2 else None) + data = kwargs.get("data", args[3] if len(args) > 3 else None) + K = kwargs.get("K", args[4] if len(args) > 4 else None) + data_X = kwargs.get("data_X", args[5] if len(args) > 5 else None) + eta0 = kwargs.get("eta0", args[6] if len(args) > 6 else None) + beta0 = kwargs.get("beta0", args[7] if len(args) > 7 else None) + gamma = kwargs.get("gamma", args[8] if len(args) > 8 else None) + use_approximation = kwargs.get("use_approximation", False) + temporal = kwargs.get("temporal", True) + fix_eta = kwargs.get("fix_eta", False) + fix_w = kwargs.get("fix_w", False) + fix_communities = kwargs.get("fix_communities", False) + fix_beta = kwargs.get("fix_beta", None) + files = kwargs.get("files", None) + fix_pibr = kwargs.get("fix_pibr", None) + fix_mupr = kwargs.get("fix_mupr", None) + out_inference = kwargs.get("out_inference", False) + out_folder = kwargs.get("out_folder", Path("outputs")) + end_file = kwargs.get("end_file", " ") + verbose = kwargs.get("verbose", 0) + + # Check the initialization parameter + logging.debug("Initialization parameter: %s", initialization) + if initialization not in {0, 1}: + log_and_raise_error(ValueError, self.message_for_invalid_initialization) + self.initialization = initialization + + if initialization == 1: + if files is None: + log_and_raise_error( + ValueError, "If initialization is 1, provide a file." + ) + self.files = files + + self.undirected = undirected + self.assortative = assortative + self.use_approximation = use_approximation + self.temporal = temporal + + self.fix_eta = fix_eta + self.fix_beta = fix_beta + self.fix_w = fix_w + self.fix_communities = fix_communities + self.fix_pibr = fix_pibr + self.fix_mupr = fix_mupr + + self.out_inference = out_inference + self.out_folder = out_folder + self.end_file = end_file + self.verbose = verbose + + self.N = data.shape[1] + self.L = data.shape[0] + self.K = K + + # Validate the data_X parameter + if data_X is not None: + logging.debug("Data_X parameter: %s", data_X.shape) + if data_X.shape[0] != self.N: + message = "The number of rows of the data_X matrix is different from the number of nodes." + log_and_raise_error(ValueError, message) + + # Validate the eta0 parameter + logging.debug("Eta0 parameter: %s", eta0) + if self.fix_eta and self.eta0 is None: + log_and_raise_error( + ValueError, "If fix_eta=True, provide a value for eta0." + ) + + if self.fix_beta: + if beta0 is None: + log_and_raise_error( + ValueError, "If fix_beta=True, provide a value for beta0." + ) + else: + self.beta0 = beta0 + + if self.fix_w: + logging.debug("Fixing w.") + if self.initialization != 1: + message = "If fix_w=True, the initialization has to be 1." + log_and_raise_error(ValueError, message) + + if self.fix_communities: + if self.initialization != 1: + message = "If fix_communities=True, the initialization has to be 1." + log_and_raise_error(ValueError, message) + + def _initialize(self) -> None: + """ + Initialization of the parameters u, v, w, eta. + """ + # Call the method to initialize eta + self._initialize_eta() + + # Call the method to initialize beta + self._initialize_beta() + + # Check the initialization type and call the corresponding method + if self.initialization == 0: + # If initialization type is 0, call the method for random initialization + self._random_initialization() + elif self.initialization == 1: + # If initialization type is 1, call the method for file-based initialization + self._file_initialization() + else: + # If initialization type is neither 0 nor 1, log a message and raise a ValueError + message = "Invalid initialization parameter." + log_and_raise_error(ValueError, message) + + def _initialize_eta(self) -> None: + # If eta0 is not None, assign its value to eta + if self.eta0 is not None: + self.eta = self.eta0 + else: + # If eta0 is None, log a message and call the method to randomize eta + logging.debug("eta is initialized randomly.") + self._randomize_eta(use_unit_uniform=self.use_unit_uniform) + + @abstractmethod + def _initialize_beta(self) -> None: + """ + Placeholder function for initializing beta. + Intentionally left empty for subclasses to override if necessary. + """ + + def _initialize_beta_from_file(self) -> None: + # Assign the beta matrix from the input file to the beta attribute + self.beta = self.theta["beta"] + + # Add random noise to the beta matrix + self.beta = self._add_random_noise(self.beta) + + def _random_initialization(self) -> None: + # Log a message indicating that u, v and w are being initialized randomly + logging.debug("%s", "u, v and w are initialized randomly.") + + # Randomize w and u, v + self._randomize_w() + self._randomize_u_v(normalize_rows=self.normalize_rows) + + def _file_initialization(self) -> None: + # Log a message indicating that u, v and w are being initialized using the input file + logging.debug("u, v and w are initialized using the input file: %s", self.files) + # Initialize u and v + self._initialize_u() + self._initialize_v() + self._initialize_w() + + def _initialize_membership_matrix( + self, matrix_name: str, matrix_value: np.ndarray + ) -> None: + # Assign the input matrix value to the local variable 'matrix' + matrix = matrix_value + + # Assert that the nodes in the current object and the nodes in the theta dictionary are the same + # If they are not the same, raise an AssertionError with the message 'Nodes do not match.' + assert np.array_equal(self.nodes, self.theta["nodes"]), "Nodes do not match." + + # Find the maximum value in the 'matrix' + max_entry = np.max(matrix) + + # Add random noise to the 'matrix'. The noise is a random number between 0 and 1, + # multiplied by the maximum entry in the 'matrix' and the error rate 'self.err' + matrix += max_entry * self.err * self.rng.random(matrix.shape) + + # Set the attribute of the current object with the name 'matrix_name' to + # the value of 'matrix' + setattr(self, matrix_name, matrix) + + def _initialize_u(self) -> None: + """ + Initialize out-going membership matrix u from file. + """ + self._initialize_membership_matrix("u", self.theta["u"]) + + def _initialize_v(self) -> None: + """ + Initialize in-coming membership matrix v from file. + """ + if self.undirected: + self.v = self.u + else: + self._initialize_membership_matrix("v", self.theta["v"]) + + def _add_random_noise(self, matrix: np.ndarray) -> np.ndarray: + """ + Add random noise to a matrix. + + Parameters + ---------- + matrix : np.ndarray + The matrix to which random noise will be added. + + Returns + ------- + matrix : np.ndarray + The matrix after random noise has been added. + """ + max_entry = np.max(matrix) + matrix += max_entry * self.err * self.rng.random(matrix.shape) + return matrix + + def _initialize_w(self) -> None: + """ + Initialize affinity tensor w from file. + """ + self.w = self.theta["w"] + if self.assortative: + assert self.w.shape == ( + self.L, + self.K, + ), "The shape of the affinity tensor w is incorrect." + + self.w = self._add_random_noise(self.w) + + def _initialize_w_dyn(self): + # Initialize the affinity tensor w from the input file + w0 = self.theta["w"] + # Initialize the affinity tensor w with zeros + self.w = np.zeros((self.L, self.K, self.K), dtype=float) + if self.assortative: + if w0.ndim == 2: + self.w = w0[np.newaxis, :].copy() + else: + self.w = np.diag(w0)[np.newaxis, :].copy() + else: + self.w[:] = w0.copy() + # Add random noise to the affinity tensor w if fix_w is False + if not self.fix_w: + self.w = self._add_random_noise(self.w) + + def _initialize_w_stat(self): + # Initialize the affinity tensor w from the input file + w0 = self.theta["w"] + # Initialize the affinity tensor w with zeros + if self.assortative: + self.w = np.zeros((1, self.K), dtype=float) + self.w[:] = (np.diag(w0)).copy() + else: + self.w = np.zeros((1, self.K, self.K), dtype=float) + self.w[:] = w0.copy() + # Add random noise to the affinity tensor w if fix_w is False + if not self.fix_w: + self.w = self._add_random_noise(self.w) + + @singledispatchmethod + def _randomize_beta(self, shape: int) -> None: + """ + Initialize community-parameter matrix beta from file. + + Parameters + ---------- + shape : int + The shape of the beta matrix. + """ + self.beta = self.rng.random(shape) + + @_randomize_beta.register + def _(self, shape: tuple): + """ + Assign a random number in (0, 1.) to each entry of the beta matrix, and normalize each row. + Parameters + ---------- + shape : tuple + The shape of the beta matrix. + """ + self.beta = self.rng.random(shape) + self.beta = (self.beta.T / np.sum(self.beta, axis=1)).T + + def _randomize_u_v(self, normalize_rows: bool = True) -> None: + """ + Assign a random number in (0, 1.) to each entry of the membership matrices u and v, + and normalize each row if normalize_rows is True. + + Parameters + ---------- + normalize_rows : bool + If True, normalize each row of the membership matrices u and v. + """ + + self.u = self.rng.random((self.N, self.K)) + # Normalize each row of the membership matrix u + if normalize_rows: + # Compute the sum of each row of the membership matrix u + row_sums = self.u.sum(axis=1) + # Normalize each row of the membership matrix u if the sum of the row is greater than 0 + self.u[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + if not self.undirected: + # Set the membership matrix v to be a random sample of shape (self.N, self.K) + self.v = self.rng.random((self.N, self.K)) + # Normalize each row of the membership matrix v + if normalize_rows: + row_sums = self.v.sum(axis=1) + self.v[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + else: + # If the graph is undirected, set the membership matrix v to be equal to the + # membership matrix u + self.v = self.u + + def _randomize_w(self) -> None: + """ + Assign a random number in (0, 1.) to each entry of the affinity tensor w. + """ + + if self.assortative: + self.w = self.rng.random((self.L, self.K)) + else: + self.w = self.rng.random((self.L, self.K, self.K)) + + def _randomize_eta(self, use_unit_uniform: bool = False) -> None: + """ + Generate a random number in (0, 1.) or (1., 50.) based on the flag. + For CRep the default is (0, 1.) and for JointCRep the default is (1., 50.). + + Parameters + ---------- + use_unit_uniform : bool + If True, generate a random number in (1., 50.). + If False, generate a random number in (0, 1.). + """ + + if use_unit_uniform: + self.eta = float((self.rng.random(1)[0])) + else: + self.eta = self.rng.uniform(1.01, 49.99) + + def _update_old_variables(self) -> None: + """ + Update values of the parameters in the previous iteration. + """ + self._copy_variables(source_suffix="", target_suffix="_old") # type: ignore + + def _update_optimal_parameters(self) -> None: + """ + Update values of the parameters after convergence. + """ + self._copy_variables(source_suffix="", target_suffix="_f") # type: ignore + + def _lambda_nz(self, subs_nz: tuple, temporal: bool = True) -> np.ndarray: + """ + Compute the mean lambda_ij for only non-zero entries. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + + Returns + ------- + nz_recon_I : ndarray + Mean lambda_ij for only non-zero entries. + """ + if temporal: + if not self.assortative: + nz_recon_IQ = np.einsum( + "Ik,Ikq->Iq", self.u[subs_nz[1], :], self.w[subs_nz[0], :, :] + ) + else: + nz_recon_IQ = np.einsum( + "Ik,Ik->Ik", self.u[subs_nz[1], :], self.w[subs_nz[0], :] + ) + + else: + if not self.assortative: + nz_recon_IQ = np.einsum( + "Ik,kq->Iq", self.u[subs_nz[1], :], self.w[0, :, :] + ) + else: + nz_recon_IQ = np.einsum("Ik,k->Ik", self.u[subs_nz[1], :], self.w[0, :]) + + nz_recon_I = np.einsum("Iq,Iq->I", nz_recon_IQ, self.v[subs_nz[2], :]) + + return nz_recon_I + + def _ps_likelihood( + self, + data: GraphDataType, + data_T: COO, + mask: Optional[np.ndarray] = None, + ): + """ + Compute the pseudo-log-likelihood. + """ + + def _likelihood(self): + """ + Compute the log-likelihood. + """ + + def _check_for_convergence( + self, it: int, loglik: float, coincide: int, convergence: bool + ) -> Tuple[int, float, int, bool]: + """ + Check for convergence of the models. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + it : int + Current iteration number. + loglik : float + Current log-likelihood value. + coincide : int + Number of times the update of the log-likelihood respects the convergence_tol. + convergence : bool + Flag for convergence. + use_pseudo_likelihood : bool, default False + Flag to indicate whether to use pseudo likelihood. + data_T_vals : Optional[np.ndarray] + Array with values of entries A[j, i] given non-zero entry (i, j). + subs_nz : Optional[Tuple[np.ndarray]] + Indices of elements of data that are non-zero. + T : Optional[int] + Number of time steps. + data_T : Optional[GraphDataType] + Graph adjacency tensor (transpose). + mask : Optional[np.ndarray] + Mask for selecting the held out set in the adjacency tensor in case of cross-validation. + kwargs : Union[np.ndarray, int, List[int], Tuple[np.ndarray]] + Additional parameters that might be needed for the computation. + + Returns + ------- + it : int + Updated iteration number. + loglik : float + Updated log-likelihood value. + coincide : int + Updated number of times the update of the log-likelihood respects the convergence_tol. + convergence : bool + Updated flag for convergence. + """ + + # Check for convergence + if it % 10 == 0: + old_L = loglik + loglik = self.compute_likelihood() + if abs(loglik - old_L) < self.convergence_tol: + coincide += 1 + else: + coincide = 0 + # Define the convergence criterion + convergence = coincide > self.decision or convergence + # Update the number of iterations + it += 1 + + return it, loglik, coincide, convergence + + def _check_for_convergence_delta( + self, + it: int, + coincide: int, + du: float, + dv: float, + dw: float, + de: float, + convergence: bool, + ) -> Tuple[int, int, bool]: + """ + Check for convergence by using the maximum distances between the old and the new + parameters values. + + Parameters + ---------- + it : int + Number of iteration. + coincide : int + Number of time the update of the log-likelihood respects the convergence_tol. + du : float + Maximum distance between the old and the new membership matrix U. + dv : float + Maximum distance between the old and the new membership matrix V. + dw : float + Maximum distance between the old and the new affinity tensor W. + de : float + Maximum distance between the old and the new eta parameter. + convergence : bool + Flag for convergence. + + Returns + ------- + it : int + Number of iteration. + coincide : int + Number of time the update of the log-likelihood respects the convergence_tol. + convergence : bool + Flag for convergence. + """ + + if ( + du < self.convergence_tol + and dv < self.convergence_tol + and dw < self.convergence_tol + and de < self.convergence_tol + ): + coincide += 1 + else: + coincide = 0 + if coincide > self.decision: + convergence = True + it += 1 + + return it, coincide, convergence + + def _output_results(self) -> None: + """ + Output results. + + Parameters + ---------- + maxL : float + Maximum log-likelihood. + nodes : list + List of nodes IDs. + """ + # Check if the evaluation folder exists, otherwise create it + output_path = Path(self.out_folder) + output_path.mkdir(parents=True, exist_ok=True) + # Define the evaluation file + end_file = self.end_file if self.end_file is not None else "" + outfile = (Path(self.out_folder) / f"theta{end_file}").with_suffix(".npz") + + # Create a dictionary to hold the attributes to be saved + attributes_to_save = {} + + # Iterate over the instance's attributes + for attr_name, attr_value in self.__dict__.items(): + # Check if the attribute is a numpy array and its name is in the list + if attr_name in self.attributes_to_save_names: + # Remove the '_f' suffix from the attribute name if it exists + attr_name_clean = attr_name.removesuffix("_f") + # Remove the 'pr' or 'br' suffix if it exists + attr_name_clean = attr_name_clean.removesuffix("pr") + attr_name_clean = attr_name_clean.removesuffix("br") + # Add the attribute to the dictionary with the cleaned name + attributes_to_save[attr_name_clean] = attr_value + + # Save the attributes + np.savez_compressed(outfile, **attributes_to_save) + + logging.info("Inferred parameters saved in: %s", outfile.resolve()) + logging.info('To load: theta=np.load(filename), then e.g. theta["u"]') + + def _evaluate_fit_results( + self, maxL: float, conv: bool, best_loglik_values: list[float] + ) -> None: + """ + Evaluate the results of the fitting process and log the results. + + Parameters + ---------- + maxL : float + The maximum log-likelihood obtained from the fitting process. + conv : bool + A flag indicating whether the fitting process has converged. + best_loglik_values : list of float, optional + A list of the best log-likelihood values obtained at each iteration of the fitting + process. + If not provided, it defaults to None. + """ + if not best_loglik_values: + if self.flag_conv == "log": + message = "Algorithm did not converge. Please increase the number of realizations, or the maximum number of iterations." + log_and_raise_error(RuntimeError, message) + else: + logging.debug( + "The conv_flag is 'deltas'; there is no best log-likelihood." + ) + return + + # Log the best realization, maximum log-likelihood, and the best iterations + logging.debug( + "Best realization = %s - maxL = %s - best iterations = %s", + self.best_r, + maxL, + self.final_it, + ) + + # Log that the algorithm did converge + if conv: + logging.info( + "Algorithm successfully converged after %d iterations with a maximum log-likelihood of %.4f.", + self.final_it, + maxL, + ) + else: + logging.info("Algorithm did not converge.") + + # Check if the fitting process has converged + if np.logical_and(self.final_it == self.max_iter, not conv): + logging.warning( + "Solution failed to converge in %s EM steps!", self.max_iter + ) + logging.warning( + "Parameters won't be saved for this realization! If you have " + "provided a number of realizations equal to one, please increase it." + ) + return + + # If the fitting process has converged and out_inference is True, evaluate the results + if self.out_inference: + self._output_results() + else: + logging.debug( + "Parameters won't be saved! If you want to save them, set out_inference=True." + ) + + # If plot_loglik and flag_conv are both True, plot the best log-likelihood values + if np.logical_and(self.plot_loglik, self.flag_conv == "log"): + plot_L(best_loglik_values, int_ticks=True) + + def _log_realization_info( + self, + r, + loglik, + final_it, + time_start, + convergence, + ) -> None: # type: ignore + """ + Log the current realization number, log-likelihood, number of iterations, and elapsed time. + + Parameters + ---------- + r : int + Current realization number. + loglik : float + Current log-likelihood. + final_it : int + Current number of iterations. + time_start : float + Start time of the realization. + """ + logging.debug( + "num. realizations = %s - Log-likelihood = %s - iterations = %s - time = %s seconds - " + "convergence = %s", + r, + loglik, + final_it, + np.round(time.time() - time_start, 2), + convergence, + ) + +
+[docs] + @abstractmethod + def compute_likelihood(self) -> float: + """ + Compute the log-likelihood of the data. + + This is an abstract method that must be implemented in each derived class. + """
+ + +
+[docs] + def load_data(self, files: str, adj_name: str, **kwargs: Any) -> GraphData: + """ + Load the data from the input files. + + Parameters + ---------- + files + The directory containing the input files. + adj_name + The name of the adjacency file. + **kwargs + Additional keyword arguments to pass to the data loading function. + + Returns + ------- + GraphData + The loaded graph data. + """ + file_path = os.path.join(files, adj_name) + gdata: GraphData = build_adjacency_from_file(file_path, **kwargs) + return gdata
+ + +
+[docs] + def get_params_to_load_data(self, args: Namespace) -> Dict[str, Any]: + """ + Get the parameters from the arguments. + + Parameters + ---------- + args : Namespace + The arguments. + + Returns + ------- + params : Dict[str, Any] + The parameters. + """ + fields = [ + "files", + "adj_name", + "ego", + "alter", + "undirected", + "force_dense", + "noselfloop", + "binary", + ] + return {f: getattr(args, f) for f in fields}
+ + +
+[docs] + @singledispatchmethod + def get_data_sum(self, data: GraphDataType) -> float: + """ + Compute the sum of the data. + + Parameters + ---------- + data : GraphDataType + The data to sum. + + Raises + ------ + TypeError + If the data type is unsupported. + """ + raise TypeError("Unsupported data type")
+ + + @get_data_sum.register + def _(self, data: np.ndarray) -> float: + """ + Compute the sum of a numpy array. + + Parameters + ---------- + data : np.ndarray + The numpy array to sum. + + Returns + ------- + float + The sum of the numpy array. + """ + return data.sum() + + @get_data_sum.register + def _(self, data: COO) -> float: + """ + Compute the sum of a COO sparse array. + + Parameters + ---------- + data : COO + The COO sparse array to sum. + + Returns + ------- + float + The sum of the COO sparse array. + """ + return data.data.sum() + +
+[docs] + @singledispatchmethod + def get_data_toarray(self, data: GraphDataType) -> np.ndarray: + """ + Convert the data to a numpy array. + + Parameters + ---------- + data : GraphDataType + The data to convert. + + Returns + ------- + np.ndarray + The converted numpy array. + + Raises + ------ + TypeError + If the data type is unsupported. + """ + raise TypeError("Unsupported data type")
+ + + @get_data_toarray.register + def _(self, data: np.ndarray) -> np.ndarray: + """ + Return the numpy array as is. + + Parameters + ---------- + data : np.ndarray + The numpy array. + + Returns + ------- + np.ndarray + The same numpy array. + """ + return data + + @get_data_toarray.register + def _(self, data: COO) -> np.ndarray: + """ + Convert a COO sparse array to a numpy array. + + Parameters + ---------- + data : COO + The COO sparse array to convert. + + Returns + ------- + np.ndarray + The converted numpy array. + """ + return data.toarray() + +
+[docs] + @singledispatchmethod + def get_data_nonzero(self, data: GraphDataType) -> tuple: + """ + Get the indices of non-zero elements in the data. + + Parameters + ---------- + data : GraphDataType + The data to get non-zero indices from. + + Returns + ------- + tuple + The indices of non-zero elements. + + Raises + ------ + TypeError + If the data type is unsupported. + """ + raise TypeError("Unsupported data type")
+ + + @get_data_nonzero.register + def _(self, data: np.ndarray) -> tuple: + """ + Get the indices of non-zero elements in a numpy array. + + Parameters + ---------- + data : np.ndarray + The numpy array to get non-zero indices from. + + Returns + ------- + tuple + The indices of non-zero elements. + """ + return data.nonzero() + + @get_data_nonzero.register + def _(self, data: COO) -> tuple: + """ + Get the indices of non-zero elements in a COO sparse array. + + Parameters + ---------- + data : COO + The COO sparse array to get non-zero indices from. + + Returns + ------- + tuple + The indices of non-zero elements. + """ + return data.coords + +
+[docs] + @singledispatchmethod + def get_data_values(self, data) -> np.ndarray: + """ + Get the values of non-zero elements in the data. + + Parameters + ---------- + data : Union[np.ndarray, COO] + The data to get non-zero values from. + + Returns + ------- + np.ndarray + The values of non-zero elements. + + Raises + ------ + TypeError + If the data type is unsupported. + """ + raise TypeError("Unsupported data type")
+ + + @get_data_values.register + def _(self, data: np.ndarray) -> np.ndarray: + """ + Get the values of non-zero elements in a numpy array. + + Parameters + ---------- + data : np.ndarray + The numpy array to get non-zero values from. + + Returns + ------- + np.ndarray + The values of non-zero elements. + """ + return data[data.nonzero()] + + @get_data_values.register + def _(self, data: COO) -> np.ndarray: + """ + Get the values of non-zero elements in a COO sparse array. + + Parameters + ---------- + data : COO + The COO sparse array to get non-zero values from. + + Returns + ------- + np.ndarray + The values of non-zero elements. + """ + return data.data
+ + + +
+[docs] +class ModelUpdateMixin(ABC): + """ + Mixin class for the update methods of the models classes. It is not a requirement to inherit + from this class. + """ + + def __init__(self): + self.max_iter = None + self.err_max = None + self.flag_conv = None + self._check_for_convergence = None + self._check_for_convergence_delta = None + self.time_start = None + self.u = None + self.v = None + self.w = None + self.u_old = None + self.v_old = None + self.w_old = None + self.delta_u = None + self.delta_v = None + self.delta_w = None + self.delta_eta = None + self.compute_likelihood = None + + def _finalize_update( + self, matrix: np.ndarray, matrix_old: np.ndarray + ) -> Tuple[float, np.ndarray, np.ndarray]: + low_values_indices = matrix < self.err_max # values are too low + matrix[low_values_indices] = 0.0 # and set to 0. + + dist = np.amax(abs(matrix - matrix_old)) + matrix_old = np.copy(matrix) + + return dist, matrix, matrix_old + + def _update_U(self) -> float: + # A generic function here that will do what each class needs + self._specific_update_U() + + # Finalize the update of the membership matrix U + dist, self.u, self.u_old = self._finalize_update(self.u, self.u_old) + + return dist + + @abstractmethod + def _specific_update_U(self): + """ + Update the membership matrix U. + """ + + def _update_V(self) -> float: + # a generic function here that will do what each class needs + self._specific_update_V() # subs_nz, subs_X_nz, mask, subs_nz_mask) + + dist, self.v, self.v_old = self._finalize_update(self.v, self.v_old) + + return dist + + @abstractmethod + def _specific_update_V(self): + """ + Update the membership matrix V. + + This is an abstract method that must be implemented in each derived class. + """ + + def _update_W(self) -> float: + # a generic function here that will do what each class needs + self._specific_update_W() + + dist, self.w, self.w_old = self._finalize_update(self.w, self.w_old) + + return dist + + def _specific_update_W(self, *args, **kwargs): + """ + Update the affinity tensor W. + + This is an abstract method that must be implemented in each derived class. + """ + + def _update_W_assortative(self) -> float: + # a generic function here that will do what each class needs + + self._specific_update_W_assortative() + + dist, self.w, self.w_old = self._finalize_update(self.w, self.w_old) + + return dist + + @abstractmethod + def _specific_update_W_assortative(self): + """ + Update the membership matrix. + + This is an abstract method that must be implemented in each derived class. + """ + + @abstractmethod + def _update_membership(self, *args, **kwargs): + """ + Update the membership matrix. + + This is an abstract method that must be implemented in each derived class. + """ + + @abstractmethod + def _update_cache(self, *args, **kwargs): + """ + Update the cache. + + This is an abstract method that must be implemented in each derived class. + """ + + def _update_old_variables(self) -> None: + """ + Update values of the parameters in the previous iteration. + """ + self._copy_variables(source_suffix="", target_suffix="_old") + + def _update_optimal_parameters(self) -> None: + """ + Update values of the parameters after convergence. + """ + self._copy_variables(source_suffix="", target_suffix="_f") + + def _update_realization( + self, + r, + it, + loglik, + coincide, + convergence, + loglik_values, + ) -> Tuple[int, float, int, bool, list]: + """ + Perform the EM update and check for convergence. + + Parameters + ---------- + r : int + Number of realizations. + it : int + Number of iterations. + loglik : float + Log-likelihood value. + coincide : int + Number of times the update of the log-likelihood respects the convergence tolerance. + convergence : bool + Flag for convergence. + loglik_values : list + List of log-likelihood values. + + Returns + ------- + it : int + Updated number of iterations. + loglik : float + Updated log-likelihood value. + coincide : int + Updated number of times the update of the log-likelihood respects the convergence tolerance. + convergence : bool + Updated flag for convergence. + loglik_values : list + Updated list of log-likelihood values. + """ + logging.debug("Updating realization %s ...", r) + + # It enters a while loop that continues until either convergence is achieved or the + # maximum number of iterations (self.max_iter) is reached. + while not convergence and it < self.max_iter: + # It performs the main EM update (self._update_em() + # which updates the memberships and calculates the maximum difference + # between new and old parameters. + self._update_em() + # Depending on the convergence flag (self.flag_conv), it checks for convergence using + # either the log-likelihood values (self._check_for_convergence(data, it, + # loglik, coincide, convergence, data_T=data_T, mask=mask)) or the maximum distances + # between the old and the new parameters (self._check_for_convergence_delta(it, + # coincide, delta_u, delta_v, delta_w, delta_eta, convergence)). + + if self.flag_conv == "log": + it, loglik, coincide, convergence = self._check_for_convergence( + it, loglik, coincide, convergence + ) + loglik_values.append(loglik) + if not it % 100: + logging.debug( + "num. realization = %s - iterations = %s - time = %.2f seconds", + r, + it, + time.time() - self.time_start, + ) + elif self.flag_conv == "deltas": + it, coincide, convergence = self._check_for_convergence_delta( + it, + coincide, + self.delta_u, + self.delta_v, + self.delta_w, + self.delta_eta, + convergence, + ) + + if not it % 100: + logging.debug( + "Nreal = %s - iterations = %s - time = %.2f seconds", + r, + it, + time.time() - self.time_start, + ) + else: + log_and_raise_error( + ValueError, "flag_conv can be either log or deltas!" + ) + # After the while loop, it checks if the current log-likelihood is the maximum + # so far. If it is, it updates the optimal parameters ( + # self._update_optimal_parameters()) and sets maxL to the current log-likelihood. + if self.flag_conv == "deltas": + loglik = self.compute_likelihood() # data, data_T, mask + + return it, loglik, coincide, convergence, loglik_values + + @abstractmethod + def _update_em(self, *args, **kwargs): + """ + Update parameters via EM procedure. + + This is an abstract method that must be implemented in each derived class. + """ + + def _copy_variables(self, source_suffix: str, target_suffix: str) -> None: + # of derived classes + """ + Copy variables from source to target. + + Parameters + ---------- + source_suffix : str + The suffix of the source variable names. + target_suffix : str + The suffix of the target variable names. + """ + for var in ["u", "v", "w"]: + source_var = getattr(self, f"{var}{source_suffix}") + setattr(self, f"{var}{target_suffix}", np.copy(source_var))
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/models/crep.html b/_modules/probinet/models/crep.html new file mode 100644 index 0000000..0d62373 --- /dev/null +++ b/_modules/probinet/models/crep.html @@ -0,0 +1,1031 @@ + + + + + + + + + + probinet.models.crep — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.models.crep

+"""
+Class definition of CRep, the algorithm to perform inference in networks with reciprocity.
+The latent variables are related to community memberships and reciprocity value
+:cite:`safdari2021generative`.
+"""
+
+import logging
+import time
+from pathlib import Path
+from typing import Any, List, Optional, Tuple, Union
+
+import numpy as np
+from numpy import dtype, ndarray
+from sparse import COO
+
+from ..evaluation.expectation_computation import compute_mean_lambda0
+from ..input.preprocessing import preprocess_adjacency_tensor
+from ..types import ArraySequence, EndFileType, FilesType, GraphDataType, MaskType
+from ..utils.matrix_operations import sp_uttkrp, sp_uttkrp_assortative
+from ..utils.tools import (
+    get_item_array_from_subs,
+    get_or_create_rng,
+    log_and_raise_error,
+)
+from .base import ModelBase, ModelUpdateMixin
+from .classes import GraphData
+from .constants import OUTPUT_FOLDER
+
+
+
+[docs] +class CRep(ModelBase, ModelUpdateMixin): + """ + Class to perform inference in networks with reciprocity. + """ + + def __init__( + self, + max_iter: int = 1000, + num_realizations: int = 5, + **kwargs: Any, + ) -> None: + super().__init__(max_iter=max_iter, num_realizations=num_realizations, **kwargs) + self.__doc__ = ModelBase.__doc__ + + # Initialize other attributes + self.eta_f = 0.0 + +
+[docs] + def load_data(self, **kwargs: Any): + # Check that the parameters are correct + self.check_params_to_load_data(**kwargs) + # Load and return the data + return super().load_data(**kwargs)
+ + +
+[docs] + def check_params_to_load_data(self, **kwargs): + if not kwargs["binary"]: + log_and_raise_error( + ValueError, "CRep requires the parameter `binary` to be True." + ) + if not kwargs["noselfloop"]: + log_and_raise_error( + ValueError, "CRep requires the parameter `noselfloop` to be True." + ) + if kwargs["undirected"]: + log_and_raise_error( + ValueError, "CRep requires the parameter `undirected` to be False." + )
+ + + def _check_fit_params( + self, + **kwargs: Any, + ) -> None: + # Call the check_fit_params method from the parent class + super()._check_fit_params(**kwargs) + + self._validate_eta0(kwargs["eta0"]) + self.eta0 = kwargs["eta0"] + + self.constrained = kwargs.get("constrained", True) + + # Parameters for the initialization of the models + self.use_unit_uniform = True + self.normalize_rows = True + + self._validate_undirected_eta() + + if self.initialization == 1: + self.theta = np.load(Path(self.files).resolve(), allow_pickle=True) + +
+[docs] + def fit( + self, + gdata: GraphData, + K: int = 3, + mask: Optional[MaskType] = None, + initialization: int = 0, + eta0: Optional[float] = None, + undirected: bool = False, + assortative: bool = True, + constrained: bool = True, + out_inference: bool = True, + fix_eta: bool = False, + fix_w: bool = False, + out_folder: Path = OUTPUT_FOLDER, + end_file: Optional[EndFileType] = None, + files: Optional[FilesType] = None, + rng: Optional[np.random.Generator] = None, + **_kwargs: Any, + ) -> tuple[ + ndarray[Any, dtype[np.float64]], + ndarray[Any, dtype[np.float64]], + ndarray[Any, dtype[np.float64]], + float, + float, + ]: + """ + Fit the CRep models to the given data using the EM algorithm. + + Parameters + ---------- + data + Graph adjacency tensor. + data_T + Transposed graph adjacency tensor. + data_T_vals + Array with values of entries A[j, i] given non-zero entry (i, j). + nodes + List of node IDs. + K + Number of communities, by default 3. + mask + Mask for selecting the held-out set in the adjacency tensor in case of cross-validation, by default None. + initialization + Initialization method for the models parameters, by default 0. + eta0 + Initial value of the reciprocity coefficient, by default None. + undirected + Flag to specify if the graph is undirected, by default False. + assortative + Flag to specify if the graph is assortative, by default True. + constrained + Flag to specify if the models is constrained, by default True. + out_inference + Flag to specify if inference results should be evaluation, by default True. + out_folder + Output folder for inference results, by default "outputs/". + end_file + Suffix for the evaluation file, by default "_CRep". + fix_eta + Flag to specify if the eta parameter should be fixed, by default False. + files + Path to the file for initialization, by default "". + rng + Random number generator. + + Returns + ------- + u_f + Out-going membership matrix. + v_f + In-coming membership matrix. + w_f + Affinity tensor. + eta_f + Reciprocity coefficient. + maxL + Maximum pseudo log-likelihood. + """ + + self._check_fit_params( + data=gdata.adjacency_tensor, + K=K, + initialization=initialization, + eta0=eta0, + undirected=undirected, + assortative=assortative, + constrained=constrained, + out_inference=out_inference, + out_folder=out_folder, + end_file=end_file, + fix_eta=fix_eta, + fix_w=fix_w, + files=files, + ) + # Set the random seed + self.rng = get_or_create_rng(rng) + + # Initialize the fit parameters + self.initialization = initialization + maxL = -self.inf # initialization of the maximum pseudo log-likelihood + self.nodes = gdata.nodes + conv = False # initialization of the convergence flag + best_loglik_values = [] # initialization of the log-likelihood values + + # Preprocess the data for fitting the models + E, data, data_T, data_T_vals, subs_nz = self._preprocess_data_for_fit( + gdata.adjacency_tensor, gdata.transposed_tensor, gdata.data_values + ) + # Set the preprocessed data and other related variables as attributes of the class instance + self.data = data + self.data_T = data_T + self.data_T_vals = data_T_vals + self.subs_nz = subs_nz + self.denominator = E + self.mask = mask + + # Run the Expectation-Maximization (EM) algorithm for a specified number of realizations + for r in range(self.num_realizations): + # Initialize the parameters for the current realization + ( + coincide, + convergence, + it, + loglik, + loglik_values, + ) = self._initialize_realization() + + # Update the parameters for the current realization + it, loglik, coincide, convergence, loglik_values = self._update_realization( + r, it, loglik, coincide, convergence, loglik_values + ) + + # If the current log-likelihood is greater than the maximum log-likelihood so far, + # update the optimal parameters and the maximum log-likelihood + if maxL < loglik: + super()._update_optimal_parameters() + maxL = loglik + self.final_it = it + conv = convergence + self.best_r = r + if self.flag_conv == "log": + best_loglik_values = list(loglik_values) + + # Log the current realization number, log-likelihood, number of iterations, and elapsed time + self._log_realization_info( + r, loglik, self.final_it, self.time_start, convergence + ) + + # end cycle over realizations + + # Store the maximum pseudo log-likelihood + self.maxPSL = maxL + + # Evaluate the results of the fitting process + self._evaluate_fit_results(self.maxPSL, conv, best_loglik_values) + + # Return the final parameters and the maximum log-likelihood + return self.u_f, self.v_f, self.w_f, self.eta_f, maxL
+ + + def _initialize_realization(self) -> Tuple[int, bool, int, float, List[float]]: + """ + This method initializes the parameters for each realization of the EM algorithm. + It also sets up local variables for convergence checking. + """ + + # Log the current state of the random number generator + logging.debug( + "Random number generator seed: %s", + self.rng.bit_generator.state["state"]["state"], + ) + + # Initialize the parameters for the current realization + super()._initialize() + + # Update the old variables for the current realization + super()._update_old_variables() + + # Update the cache used in the EM update + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + + # Set up local variables for convergence checking + # coincide and it are counters, convergence is a boolean flag + # loglik is the initial pseudo log-likelihood + coincide, it = 0, 0 + convergence = False + loglik = self.inf + loglik_values: List[float] = [] + + # Record the start time of the realization + self.time_start = time.time() + + # Return the initial state of the realization + return coincide, convergence, it, loglik, loglik_values + + def _preprocess_data_for_fit( + self, + data: GraphDataType, + data_T: Union[GraphDataType, None], + data_T_vals: Union[np.ndarray, None], + ) -> tuple[float, COO | ndarray, COO | ndarray, ndarray | None, tuple]: + """ + Preprocess the data for fitting the models. + + Parameters + ---------- + data : COO, np.ndarray + The input data tensor. + data_T : COO, np.ndarray or None + The transposed input data tensor. If None, it will be calculated from the input data tensor. + data_T_vals : np.ndarray or None + The values of the non-zero entries in the transposed input data tensor. If None, it will be calculated from data_T. + + Returns + ------- + tuple + A tuple containing the preprocessed data tensor, the values of the non-zero entries in the transposed data tensor, + and the indices of the non-zero entries in the data tensor. + """ + + # If data_T is not provided, calculate it from the input data tensor + if data_T is None: + E = self.get_data_sum( + data + ) # weighted sum of edges (needed in the denominator of eta) + data_T = np.einsum("aij->aji", data) + data_T_vals = get_item_array_from_subs(data_T, self.get_data_nonzero(data)) + # Pre-process the data to handle the sparsity + data = preprocess_adjacency_tensor(data) + data_T = preprocess_adjacency_tensor(data_T) + else: + E = self.get_data_sum(data) + + # Save the indices of the non-zero entries + subs_nz = self.get_data_nonzero(data) + + return E, data, data_T, data_T_vals, subs_nz + +
+[docs] + def compute_likelihood(self) -> float: + """ + Compute the pseudo log-likelihood of the data. + + Returns + ------- + loglik : float + Pseudo log-likelihood value. + """ + return self._ps_likelihood(self.data, self.data_T, self.mask)
+ + + def _update_cache( + self, + data: GraphDataType, + data_T_vals: np.ndarray, + subs_nz: ArraySequence, + ) -> None: + """ + Update the cache used in the em_update. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_T_vals : ndarray + Array with values of entries A[j, i] given non-zero entry (i, j). + subs_nz : tuple + Indices of elements of data that are non-zero. + """ + + self.lambda0_nz = super()._lambda_nz(subs_nz) + self.M_nz = self.lambda0_nz + self.eta * data_T_vals + self.M_nz[self.M_nz == 0] = 1 + self.data_M_nz = self.get_data_values(data) / self.M_nz + self.data_M_nz[self.M_nz == 0] = 0 + + def _update_em(self): + """ + Update parameters via EM procedure. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_T_vals : ndarray + Array with values of entries A[j, i] given non-zero entry (i, j). + subs_nz : tuple + Indices of elements of data that are non-zero. + denominator : float + Denominator used in the update of the eta parameter. + + """ + + if not self.fix_eta: + d_eta = self._update_eta( + self.data, self.data_T_vals, denominator=self.denominator + ) + else: + d_eta = 0.0 + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + + if not self.fix_communities: + d_u = self._update_U() + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + else: + d_u = 0.0 + + if self.undirected: + self.v = self.u + self.v_old = self.v + d_v = d_u + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + else: + if not self.fix_communities: + d_v = self._update_V() + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + else: + d_v = 0.0 + + if not self.fix_w: + if not self.assortative: + d_w = self._update_W() + else: + d_w = self._update_W_assortative() + self._update_cache(self.data, self.data_T_vals, self.subs_nz) + else: + d_w = 0 + + self.delta_u = d_u + self.delta_v = d_v + self.delta_w = d_w + self.delta_eta = d_eta + + def _update_eta( + self, + data: GraphDataType, + data_T_vals: np.ndarray, + denominator: Optional[float] = None, + ) -> float: + """ + Update reciprocity coefficient eta. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_T_vals : ndarray + Array with values of entries A[j, i] given non-zero entry (i, j). + denominator : float + Denominator used in the update of the eta parameter. + + Returns + ------- + dist_eta : float + Maximum distance between the old and the new reciprocity coefficient eta. + """ + + if denominator is None: + Deta = data.sum() + else: + Deta = denominator + + self.eta *= (self.data_M_nz * data_T_vals).sum() / Deta + + dist_eta = abs(self.eta - self.eta_old) # type: ignore + self.eta_old = float(self.eta) + + return dist_eta + + def _specific_update_U(self): + self.u = self.u_old * self._update_membership(self.subs_nz, 1) # type: ignore + + if not self.constrained: + Du = np.einsum("iq->q", self.v) + if not self.assortative: + w_k = np.einsum("akq->kq", self.w) + Z_uk = np.einsum("q,kq->k", Du, w_k) + else: + w_k = np.einsum("ak->k", self.w) + Z_uk = np.einsum("k,k->k", Du, w_k) + non_zeros = Z_uk > 0.0 + self.u[:, Z_uk == 0] = 0.0 + self.u[:, non_zeros] /= Z_uk[np.newaxis, non_zeros] + else: + row_sums = self.u.sum(axis=1) + self.u[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + low_values_indices = self.u < self.err_max # values are too low + self.u[low_values_indices] = 0.0 # and set to 0. + + dist_u = np.amax(abs(self.u - self.u_old)) # type: ignore + self.u_old = np.copy(self.u) + + return dist_u + + def _specific_update_V(self): + self.v *= self._update_membership(self.subs_nz, 2) + + if not self.constrained: + Dv = np.einsum("iq->q", self.u) + if not self.assortative: + w_k = np.einsum("aqk->qk", self.w) + Z_vk = np.einsum("q,qk->k", Dv, w_k) + else: + w_k = np.einsum("ak->k", self.w) + Z_vk = np.einsum("k,k->k", Dv, w_k) + non_zeros = Z_vk > 0 + self.v[:, Z_vk == 0] = 0.0 + self.v[:, non_zeros] /= Z_vk[np.newaxis, non_zeros] + else: + row_sums = self.v.sum(axis=1) + self.v[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + def _specific_update_W(self): + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Iq->Ikq", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis, np.newaxis] * UV + for k in range(self.K): + for q in range(self.K): + uttkrp_DKQ[:, k, q] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k, q], minlength=self.L + ) + + self.w *= uttkrp_DKQ + + Z = np.einsum("k,q->kq", self.u.sum(axis=0), self.v.sum(axis=0))[ + np.newaxis, :, : + ] + non_zeros = Z > 0 + self.w[non_zeros] /= Z[non_zeros] + + def _specific_update_W_assortative(self): + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Ik->Ik", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis] * UV + for k in range(self.K): + uttkrp_DKQ[:, k] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k], minlength=self.L + ) + + self.w *= uttkrp_DKQ + + Z = ((self.u_old.sum(axis=0)) * (self.v_old.sum(axis=0)))[np.newaxis, :] + non_zeros = Z > 0 + self.w[non_zeros] /= Z[non_zeros] + + def _update_membership(self, subs_nz: ArraySequence, m: int) -> np.ndarray: + """ + Return the Khatri-Rao product (sparse version) used in the update of the membership + matrices. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + m : int + Mode in which the Khatri-Rao product of the membership matrix is multiplied with the + tensor: if 1 it + works with the matrix u; if 2 it works with v. + + Returns + ------- + uttkrp_DK : ndarray + Matrix which is the result of the matrix product of the unfolding of the + tensor and the + Khatri-Rao product of the membership matrix. + """ + + if not self.assortative: + uttkrp_DK = sp_uttkrp(self.data_M_nz, subs_nz, m, self.u, self.v, self.w) + else: + uttkrp_DK = sp_uttkrp_assortative( + self.data_M_nz, subs_nz, m, self.u, self.v, self.w + ) + + return uttkrp_DK + + def _ps_likelihood( + self, + data: GraphDataType, + data_T: COO, + mask: Optional[MaskType] = None, + ) -> float: + """ + Compute the pseudo log-likelihood of the data. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_T : GraphDataType + Graph adjacency tensor (transpose). + mask : ndarray + Mask for selecting the held out set in the adjacency tensor in case of + cross-validation. + + Returns + ------- + loglik : float + Pseudo log-likelihood value. + """ + # Compute the mean lambda0 for all entries + self.lambda0_ija = compute_mean_lambda0(self.u, self.v, self.w) + + # Get the non-zero entries of the mask + sub_mask_nz = mask.nonzero() if mask is not None else None + + if sub_mask_nz is not None: + loglik = ( + -self.lambda0_ija[sub_mask_nz].sum() + - self.eta * self.get_data_toarray(data_T)[sub_mask_nz].sum() + ) + else: + loglik = -self.lambda0_ija.sum() - self.eta * self.get_data_sum(data_T) + + logM = np.log(self.M_nz) + Alog = self.get_data_values(data) * logM + + loglik += Alog.sum() + + if np.isnan(loglik): + log_and_raise_error(ValueError, "PSLikelihood is NaN!!!!") + return loglik + + def _copy_variables(self, source_suffix: str, target_suffix: str) -> None: + """ + Copy variables from source to target. + + Parameters + ---------- + source_suffix : str + The suffix of the source variable names. + target_suffix : str + The suffix of the target variable names. + """ + # Call the base method + super()._copy_variables(source_suffix, target_suffix) + + # Copy the specific variables + source_var = getattr(self, f"eta{source_suffix}") + setattr(self, f"eta{target_suffix}", float(source_var))
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/models/dyncrep.html b/_modules/probinet/models/dyncrep.html new file mode 100644 index 0000000..e44960a --- /dev/null +++ b/_modules/probinet/models/dyncrep.html @@ -0,0 +1,1547 @@ + + + + + + + + + + probinet.models.dyncrep — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.models.dyncrep

+"""
+Class definition of DynCRep, the algorithm to perform inference in temporal networks :cite:`safdari2022reciprocity`.
+"""
+
+import logging
+import time
+from argparse import Namespace
+from pathlib import Path
+from typing import Any, Dict, Optional, Tuple
+
+import numpy as np
+from scipy.optimize import brentq, root
+from sparse import COO
+
+from ..evaluation.expectation_computation import (
+    compute_lagrange_multiplier,
+    compute_mean_lambda0,
+    u_with_lagrange_multiplier,
+)
+from ..input.preprocessing import preprocess_adjacency_tensor
+from ..types import ArraySequence, EndFileType, FilesType, GraphDataType, MaskType
+from ..utils.matrix_operations import sp_uttkrp, sp_uttkrp_assortative
+from ..utils.tools import (
+    get_item_array_from_subs,
+    get_or_create_rng,
+    log_and_raise_error,
+)
+from .base import ModelBase, ModelUpdateMixin
+from .classes import GraphData
+from .constants import EPS_, OUTPUT_FOLDER
+
+
+
+[docs] +class DynCRep(ModelBase, ModelUpdateMixin): + """ + Class definition of DynCRep, the algorithm to perform inference in temporal networks + with reciprocity. + """ + + def __init__( + self, + err: float = 0.01, # Overriding the base class default + num_realizations: int = 1, # Overriding the base class default + max_iter: int = 1000, # Overriding the base class default + **kwargs, # Capture all other arguments for ModelBase + ) -> None: + # Pass the overridden arguments along with any others to the parent class + super().__init__( + err=err, + num_realizations=num_realizations, + max_iter=max_iter, + **kwargs, # Forward any other arguments to the base class + ) + + self.__doc__ = ModelBase.__init__.__doc__ + +
+[docs] + def check_params_to_load_data(self, **kwargs): + if not kwargs["binary"]: + log_and_raise_error( + ValueError, "DynCRep requires the parameter `binary` to be True." + ) + if not kwargs["force_dense"]: + log_and_raise_error( + ValueError, "DynCRep requires the parameter `force_dense` to be True." + )
+ + +
+[docs] + def get_params_to_load_data(self, args: Namespace) -> Dict[str, Any]: + # Get the parameters for loading the data + data_kwargs = super().get_params_to_load_data(args) + + # Additional fields + data_kwargs["T"] = getattr(args, "T") + + return data_kwargs
+ + + def _check_fit_params( + self, + **kwargs: Any, + ) -> None: + # Call the check_fit_params method from the parent class + super()._check_fit_params( + data_X=None, + gamma=None, + **kwargs, + ) + + self._validate_eta0(kwargs["eta0"]) + self.eta0 = kwargs["eta0"] + + # Define other parameters for fitting the models + self.constrained = kwargs.get("constrained", False) + self.constraintU = kwargs.get( + "constraintU", False + ) # if True, use constraint on U + self.ag = kwargs.get("ag", 1.0) # shape of gamma prior + self.bg = kwargs.get("bg", 0.5) # rate of gamma prior + self.beta0 = kwargs.get("beta0", 0.25) # initial value of beta + self.temporal = kwargs.get("temporal", True) # if True, temporal models + self.flag_data_T = kwargs.get( + "flag_data_T", 0 + ) # if 0: previous time step, 1: same time step + + if self.flag_data_T not in [0, 1]: + log_and_raise_error(ValueError, "flag_data_T has to be either 0 or 1!") + + if self.eta0 is not None: + if (self.eta0 < 0) or (self.eta0 > 1): + raise ValueError( + "The reciprocity coefficient eta0 has to be in [0, 1]!" + ) + if self.fix_eta: + if self.eta0 is None: + self.eta0 = 0.0 + + if self.fix_eta: + self.eta = self.eta_old = self.eta_f = self.eta0 # type: ignore + + if self.fix_beta: + self.beta = self.beta_old = self.beta_f = self.beta0 # type: ignore + + # Parameters for the initialization of the models + self.use_unit_uniform = True + self.normalize_rows = True + + self._validate_undirected_eta() + + if self.initialization > 0: + self.theta = np.load(Path(self.files).resolve(), allow_pickle=True) + +
+[docs] + def fit( + self, + gdata: GraphData, + T: Optional[int] = None, + mask: Optional[MaskType] = None, + K: int = 2, + ag: float = 1.0, + bg: float = 0.5, + eta0: float = None, + beta0: float = 0.25, + flag_data_T: int = 0, + temporal: bool = True, + initialization: int = 0, + assortative: bool = False, + constrained: bool = False, + constraintU: bool = False, + fix_eta: bool = False, + fix_beta: bool = False, + fix_communities: bool = False, + fix_w: bool = False, + undirected: bool = False, + out_inference: bool = True, + out_folder: Path = OUTPUT_FOLDER, + end_file: Optional[EndFileType] = None, + files: Optional[FilesType] = None, + rng: Optional[np.random.Generator] = None, + **_kwargs: Any, + ) -> Tuple[np.ndarray, np.ndarray, np.ndarray, float, np.ndarray, float,]: + """ + Model directed networks by using a probabilistic generative models that assumes community parameters and + reciprocity coefficient. The inference is performed via the EM algorithm. + + Parameters + ---------- + gdata + Graph adjacency tensor. + T + Number of time steps. + mask + Mask for selecting the held-out set in the adjacency tensor in case of cross-validation, by default None. + K + Number of communities, by default 2. + ag + Shape of gamma prior, by default 1.0. + bg + Rate of gamma prior, by default 0.5. + eta0 + Initial value of the reciprocity coefficient, by default None. + beta0 + Initial value of the beta parameter, by default 0.25. + flag_data_T + Flag to determine which log-likelihood function to use, by default 0. + temporal + Flag to determine if the function should behave in a temporal manner, by default True. + initialization + Initialization method for the models parameters, by default 0. + assortative + Flag to indicate if the graph is assortative, by default False. + constrained + Flag to indicate if the models is constrained, by default False. + constraintU + Flag to indicate if there is a constraint on U, by default False. + fix_eta + Flag to indicate if the eta parameter should be fixed, by default False. + fix_beta + Flag to indicate if the beta parameter should be fixed, by default False. + fix_communities + Flag to indicate if the communities should be fixed, by default False. + fix_w + Flag to indicate if the w parameter should be fixed, by default False. + undirected + Flag to indicate if the graph is undirected, by default False. + out_inference + Flag to indicate if inference results should be evaluation, by default True. + out_folder + Output folder for inference results, by default "outputs/". + end_file + Suffix for the evaluation file, by default "_DynCRep". + files + Path to the file for initialization, by default "". + rng + Random number generator, by default None. + **kwargs + Additional parameters for the model. + + Returns + ------- + u_f + Out-going membership matrix. + v_f + In-coming membership matrix. + w_f + Affinity tensor. + eta_f + Reciprocity coefficient. + beta_f + Beta parameter. + maxL + Maximum pseudo log-likelihood. + """ + + # Check the parameters for fitting the models + self._check_fit_params( + K=K, + data=gdata.adjacency_tensor, + ag=ag, + bg=bg, + flag_data_T=flag_data_T, + eta0=eta0, + beta0=beta0, + temporal=temporal, + initialization=initialization, + assortative=assortative, + constrained=constrained, + constraintU=constraintU, + fix_eta=fix_eta, + fix_beta=fix_beta, + fix_communities=fix_communities, + fix_w=fix_w, + undirected=undirected, + out_inference=out_inference, + out_folder=out_folder, + end_file=end_file, + files=files, + ) + logging.info("### Version: %s ###", "w-DYN" if temporal else "w-STATIC") + # Set the random seed + self.rng = get_or_create_rng(rng) + + # Initialize the fit parameters + self.nodes = gdata.nodes + maxL = -self.inf + # If T is None, extract it from the data tensor + if T is None: + logging.debug("T is None. Extracting it from the data tensor.") + T = gdata.adjacency_tensor.shape[0] - 1 + # Make sure that T is not 0 or negative + T = max(0, min(T, gdata.adjacency_tensor.shape[0] - 1)) + self.T = T + self.temporal = temporal + conv = False # initialization of the convergence flag + best_loglik_values = [] # initialization of the log-likelihood values + + # Preprocess the data for fitting the models + ( + T, + data, + data_AtAtm1, + data_T, + data_T_vals, + data_Tm1, + subs_nzp, + ) = self._preprocess_data_for_fit(T, gdata.adjacency_tensor) + + # Set the preprocessed data and other related variables as attributes of the class instance + self.data_AtAtm1 = data_AtAtm1 + self.data_Tm1 = data_Tm1 + self.data_T_vals = data_T_vals + self.subs_nzp = subs_nzp + self.data = data + self.data_T = data_T + self.T = T + self.mask = mask + + # Run the Expectation-Maximization (EM) algorithm for a specified number of realizations + for r in range(self.num_realizations): + # Initialize the parameters for the current realization + ( + coincide, + convergence, + it, + loglik, + loglik_values, + ) = self._initialize_realization() + + # Update the parameters for the current realization + it, loglik, coincide, convergence, loglik_values = self._update_realization( + r, it, loglik, coincide, convergence, loglik_values + ) + + # If the current log-likelihood is greater than the maximum log-likelihood so far, + # update the optimal parameters and the maximum log-likelihood + if maxL < loglik: + super()._update_optimal_parameters() + best_loglik_values = list(loglik_values) + self.maxL = loglik + self.final_it = it + conv = convergence + self.best_r = r + + # Log the current realization number, log-likelihood, number of iterations, and elapsed time + self._log_realization_info( + r, loglik, self.final_it, self.time_start, convergence + ) + + # end cycle over realizations + + # Evaluate the results of the fitting process + self._evaluate_fit_results(self.maxL, conv, best_loglik_values) + + # Return the final parameters and the maximum log-likelihood + return self.u_f, self.v_f, self.w_f, self.eta_f, self.beta_f, self.maxL # type: ignore
+ + + def _initialize_realization(self): + """ + This method initializes the parameters for each realization of the EM algorithm. + It also sets up local variables for convergence checking. + """ + # Log the current state of the random number generator + logging.debug( + "Random number generator seed: %s", + self.rng.bit_generator.state["state"]["state"], + ) + + # Call the _initialize method from the parent class to initialize the parameters for the current realization + super()._initialize() + + # Call the _update_old_variables method from the parent class to update the old variables for the current realization + super()._update_old_variables() + + # Set up local variables for convergence checking + # coincide and it are counters, convergence is a boolean flag + # loglik is the initial pseudo log-likelihood + coincide, it = 0, 0 + convergence = False + loglik = self.inf + loglik_values = [] + + # Record the start time of the realization + self.time_start = time.time() + + # Return the initial state of the realization + return coincide, convergence, it, loglik, loglik_values + + def _preprocess_data_for_fit( + self, T: int, data: GraphDataType + ) -> Tuple[ + int, + GraphDataType, + np.ndarray, + np.ndarray, + np.ndarray, + np.ndarray, + tuple, + ]: + """ + Preprocess the data for fitting the models. + + Parameters + ---------- + T : int + Number of time steps. + data : GraphDataType + The input data tensor. + temporal : bool + Flag to determine if the function should behave in a temporal manner. + + Returns + ------- + tuple + A tuple containing the number of time steps, the preprocessed data tensor, the preprocessed data tensor for + numerator containing Aij(t)*(1-Aij(t-1)), the transposed data tensor, the values of the non-zero entries in + the transposed data tensor, the transposed data tensor at time t-1, and the indices of the non-zero entries + in the data tensor. + """ + + # Set the number of time steps based on whether the models is temporal or static + self.L = T + 1 if self.temporal else 1 + logging.debug("Number of time steps L: %s", self.L) + + # Limit the data to the number of time steps + data = data[: T + 1, :, :] + + # Initialize the data for calculating the numerator containing Aij(t)*(1-Aij(t-1)) + data_AtAtm1 = np.zeros(data.shape) + data_AtAtm1[0, :, :] = data[0, :, :] + + if self.flag_data_T == 1: # same time step + self.E0 = np.sum(data[0]) # to calculate denominator eta + self.Etg0 = np.sum(data[1:]) # to calculate denominator eta + else: # previous time step + self.E0 = 0.0 # to calculate denominator eta + self.Etg0 = np.sum(data[:-1]) # to calculate denominator eta + self.bAtAtm1 = 0 + self.Atm11At = 0 + data_T = np.einsum( + "aij->aji", data + ) # to calculate denominator containing Aji(t) + if self.flag_data_T == 1: + # Copy the data at time t to the array data_Tm1 + data_Tm1 = data_T.copy() + if self.flag_data_T == 0: + # Create data at time t-1 as an array of zeros + data_Tm1 = np.zeros_like(data) + # Copy the data at time t-1 to the array + for i in range(T): + data_Tm1[i + 1, :, :] = data_T[i, :, :] + self.sum_datatm1 = data_Tm1[1:].sum() + + # Calculate Aij(t)*Aij(t-1) and (1-Aij(t))*Aij(t-1) + if T > 0: + logging.debug( + "T is greater than 0. Proceeding with calculations that require " + "multiple time steps." + ) + # Calculate Aij(t)*Aij(t-1) and (1-Aij(t))*Aij(t-1) + bAtAtm1_l = 0 + Atm11At_l = 0 + for i in range(T): + data_AtAtm1[i + 1, :, :] = data[i + 1, :, :] * (1 - data[i, :, :]) + # Calculate the expression Aij(t)*Aij(t-1) + sub_nz_and = np.logical_and(data[i + 1, :, :] > 0, data[i, :, :] > 0) + bAtAtm1_l += ( + (data[i + 1, :, :][sub_nz_and] * data[i, :, :][sub_nz_and]) + ).sum() + # Calculate the expression (1-Aij(t))*Aij(t-1) + sub_nz_and = np.logical_and( + data[i, :, :] > 0, (1 - data[i + 1, :, :]) > 0 + ) + Atm11At_l += ( + ((1 - data[i + 1, :, :])[sub_nz_and] * data[i, :, :][sub_nz_and]) + ).sum() + self.bAtAtm1 = bAtAtm1_l + self.Atm11At = Atm11At_l + + # Calculate the sum of the data hat from 1 to T + self.sum_data_hat = data_AtAtm1[1:].sum() + + # Calculate the denominator containing Aji(t) + data_T_vals = get_item_array_from_subs( + data_Tm1, self.get_data_nonzero(data_AtAtm1) + ) + + # Preprocess the data to handle the sparsity + data_AtAtm1 = preprocess_adjacency_tensor(data_AtAtm1) + data = preprocess_adjacency_tensor(data) + + # Save the indices of the non-zero entries + subs_nzp = self.get_data_nonzero(data_AtAtm1) + + # Initialize the beta hat + self.beta_hat = np.ones(T + 1) + if T > 0: + self.beta_hat[1:] = self.beta0 + + return T, data, data_AtAtm1, data_T, data_T_vals, data_Tm1, subs_nzp + +
+[docs] + def compute_likelihood(self) -> float: + """ + Compute the likelihood of the models. + + Returns + ------- + loglik : float + Log-likelihood of the models. + + """ + return self._likelihood( + self.data_AtAtm1, + self.data_Tm1, + self.data_T_vals, + self.subs_nzp, + self.mask, + )
+ + + def _initialize_beta(self) -> None: + # If beta0 is not None, assign its value to beta + if self.beta0 is not None: + self.beta = self.beta0 + + def _file_initialization(self) -> None: + """ + Initialize u, v, w_dyn or w_stat using the input file. + """ + # Call the base class methods to initialize u and v + self._initialize_u() + self._initialize_v() + # If temporal is True, initialize w dynamically + if self.temporal: + self._initialize_w_dyn() + else: + # If temporal is False, initialize w statically + self._initialize_w_stat() + + def _random_initialization(self) -> None: + # Call the random initialization method from the parent class + super()._random_initialization() + # Randomize beta + self._randomize_beta(1) # Generates a single random number + + def _update_cache( + self, + data: GraphDataType, + data_T_vals: np.ndarray, + subs_nz: ArraySequence, + ) -> None: + """ + Update the cache used in the em_update. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_T_vals : ndarray + Array with values of entries A[j, i] given non-zero entry (i, j). + subs_nz : tuple + Indices of elements of data that are non-zero. + """ + self.lambda0_nz = super()._lambda_nz(subs_nz, temporal=self.temporal) + self.M_nz = self.lambda0_nz + self.eta * data_T_vals # [np.newaxis,:] + self.M_nz[self.M_nz == 0] = 1 + + self.data_M_nz = self.get_data_values(data) / self.M_nz + self.data_rho2 = ( + self.get_data_values(data) * self.eta * data_T_vals / self.M_nz + ).sum() + + def _update_em(self) -> Tuple[float, float, float, float, float]: + """ + Update parameters via EM procedure. + + Returns + ------- + d_u : float + Maximum distance between the old and the new membership matrix u. + d_v : float + Maximum distance between the old and the new membership matrix v. + d_w : float + Maximum distance between the old and the new affinity tensor w. + d_eta : float + Maximum distance between the old and the new reciprocity coefficient eta. + """ + self._update_cache(self.data_AtAtm1, self.data_T_vals, self.subs_nzp) + + if not self.fix_communities: + d_u = self._update_U(self.subs_nzp) + self._update_cache(self.data_AtAtm1, self.data_T_vals, self.subs_nzp) + if self.undirected: + self.v = self.u + self.v_old = self.v + d_v = d_u + else: + d_v = self._update_V(self.subs_nzp) + self._update_cache(self.data_AtAtm1, self.data_T_vals, self.subs_nzp) + else: + d_u = 0 + d_v = 0 + + if not self.fix_w: + if not self.assortative: + if self.temporal: + d_w = self._update_W_dyn(self.subs_nzp) + else: + d_w = self._update_W_stat(self.subs_nzp) + else: + if self.temporal: + d_w = self._update_W_assortative_dyn(self.subs_nzp) + else: + d_w = self._update_W_assortative_stat(self.subs_nzp) + self._update_cache(self.data_AtAtm1, self.data_T_vals, self.subs_nzp) + else: + d_w = 0 + + if not self.fix_beta: + if self.T > 0: + d_beta = self._update_beta() + self._update_cache(self.data_AtAtm1, self.data_T_vals, self.subs_nzp) + else: + d_beta = 0.0 + else: + d_beta = 0.0 + + if not self.fix_eta: + denominator = self.E0 + self.Etg0 * self.beta_hat[-1] + d_eta = self._update_eta(denominator=denominator) + else: + d_eta = 0.0 + self._update_cache(self.data_AtAtm1, self.data_T_vals, self.subs_nzp) + + return d_u, d_v, d_w, d_eta, d_beta + + def _update_eta(self, denominator: float) -> float: + """ + Update reciprocity coefficient eta. + + Parameters + ---------- + denominator : float + Denominator used in the update of the eta parameter. + Returns + ------- + dist_eta : float + Maximum distance between the old and the new reciprocity coefficient eta. + """ + if denominator > 0: + self.eta = self.data_rho2 / denominator + else: + self.eta = 0.0 + + if self.eta < 0 or self.eta > 1: + message = f"Eta has to be a positive number! Current value is {self.eta}" + log_and_raise_error(ValueError, message) + + dist_eta = abs(self.eta - self.eta_old) # type: ignore + self.eta_old = float(self.eta) + + return dist_eta + + def _update_beta(self): + """ + Update beta. + Returns + ------- + dist_beta : float + Maximum distance between the old and the new beta. + """ + self.beta = brentq(self.func_beta_static, a=0.001, b=0.999) + self.beta_hat[1:] = self.beta + + dist_beta = abs(self.beta - self.beta_old) + self.beta_old = np.copy(self.beta) + + return dist_beta + + def _update_U(self, subs_nz): + """ + Update out-going membership matrix. + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + Returns + ------- + dist_u : float + Maximum distance between the old and the new membership matrix u. + """ + + # Call the specific update U method + self._specific_update_U(subs_nz) + + dist_u = np.amax(abs(self.u - self.u_old)) + self.u_old = np.copy(self.u) + + return dist_u + + def _specific_update_U(self, subs_nz): + """ + Specific logic for updating U in the DynCRep class. + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + """ + + if self.constraintU: + u_tmp = self.u_old * ( + self._update_membership(subs_nz, self.u, self.v, self.w, 1) + ) + + Du = np.einsum("iq->q", self.v) + if not self.assortative: + w_k = np.einsum("a,akq->kq", self.beta_hat, self.w) + Z_uk = np.einsum("q,kq->k", Du, w_k) + else: + w_k = np.einsum("a,ak->k", self.beta_hat, self.w) + Z_uk = np.einsum("k,k->k", Du, w_k) + + for i in range(self.u.shape[0]): + lambda_i = self.enforce_constraintU(u_tmp[i], Z_uk) + self.u[i] = abs(u_tmp[i] / (lambda_i + Z_uk)) + + else: + self.u = (self.ag - 1) + self.u_old * ( + self._update_membership(subs_nz, self.u, self.v, self.w, 1) + ) + + if not self.constrained: + Du = np.einsum("iq->q", self.v) + if not self.assortative: + w_k = np.einsum("a,akq->kq", self.beta_hat, self.w) + Z_uk = np.einsum("q,kq->k", Du, w_k) + else: + w_k = np.einsum("a,ak->k", self.beta_hat, self.w) + Z_uk = np.einsum("k,k->k", Du, w_k) + non_zeros = Z_uk > 0.0 + self.u[:, Z_uk == 0] = 0.0 + self.u[:, non_zeros] /= self.bg + Z_uk[np.newaxis, non_zeros] + else: + Du = np.einsum("iq->q", self.v) + if not self.assortative: + w_k = np.einsum("a,akq->kq", self.beta_hat, self.w) + Z_uk = np.einsum("q,kq->k", Du, w_k) + else: + w_k = np.einsum("a,ak->k", self.beta_hat, self.w) + Z_uk = np.einsum("k,k->k", Du, w_k) + for i in range(self.u.shape[0]): + if self.u[i].sum() > self.err_max: + u_root = root( + u_with_lagrange_multiplier, + self.u_old[i], + args=(self.u[i], Z_uk), + ) + self.u[i] = u_root.x + + def _update_V(self, subs_nz): + """ + Update in-coming membership matrix. + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + Returns + ------- + dist_v : float + Maximum distance between the old and the new membership matrix v. + """ + + # Call the specific update V method + self._specific_update_V(subs_nz) + + dist_v = np.amax(abs(self.v - self.v_old)) + self.v_old = np.copy(self.v) + + return dist_v + + def _specific_update_V(self, subs_nz): + """ + Specific logic for updating V in the DynCRep class. + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + """ + + self.v = (self.ag - 1) + self.v_old * self._update_membership( + subs_nz, self.u, self.v, self.w, 2 + ) + + if not self.constrained: + Dv = np.einsum("iq->q", self.u) + + if not self.assortative: + w_k = np.einsum("a,aqk->qk", self.beta_hat, self.w) + Z_vk = np.einsum("q,qk->k", Dv, w_k) + else: + w_k = np.einsum("a,ak->k", self.beta_hat, self.w) + Z_vk = np.einsum("k,k->k", Dv, w_k) + non_zeros = Z_vk > 0 + self.v[:, Z_vk == 0] = 0.0 + self.v[:, non_zeros] /= self.bg + Z_vk[np.newaxis, non_zeros] + else: + Dv = np.einsum("iq->q", self.u) + if not self.assortative: + w_k = np.einsum("a,aqk->qk", self.beta_hat, self.w) + Z_vk = np.einsum("q,qk->k", Dv, w_k) + else: + w_k = np.einsum("a,ak->k", self.beta_hat, self.w) + Z_vk = np.einsum("k,k->k", Dv, w_k) + + for i in range(self.v.shape[0]): + if self.v[i].sum() > self.err_max: + v_root = root( + u_with_lagrange_multiplier, + self.v_old[i], + args=(self.v[i], Z_vk), + ) + self.v[i] = v_root.x + + def _specific_update_W_dyn(self, subs_nz: tuple): + uttkrp_DKQ = np.zeros_like(self.w) + + for idx, (a, i, j) in enumerate(zip(*subs_nz)): + uttkrp_DKQ[a, :, :] += self.data_M_nz[idx] * np.einsum( + "k,q->kq", self.u[i], self.v[j] + ) + + self.w = self.w * uttkrp_DKQ + + Z = np.einsum("k,q->kq", self.u.sum(axis=0), self.v.sum(axis=0)) + Z = np.einsum("a,kq->akq", self.beta_hat, Z) + + non_zeros = Z > 0 + self.w[non_zeros] /= Z[non_zeros] + + def _update_W_dyn(self, subs_nz): + """ + Update affinity tensor. + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + Returns + ------- + dist_w : float + Maximum distance between the old and the new affinity tensor w. + """ + + self._specific_update_W_dyn(subs_nz) + + low_values_indices = self.w < self.err_max # values are too low + self.w[low_values_indices] = 0.0 # and set to 0. + + dist_w = np.amax(abs(self.w - self.w_old)) + self.w_old = np.copy(self.w_old) + + return dist_w + + def _specific_update_W_stat(self, subs_nz: tuple): + sub_w_nz = self.w.nonzero() + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum("Ik,Iq->Ikq", self.u[subs_nz[1], :], self.v[subs_nz[2], :]) + uttkrp_I = self.data_M_nz[:, np.newaxis, np.newaxis] * UV + + for _a, k, q in zip(*sub_w_nz): + uttkrp_DKQ[:, k, q] += np.bincount( + subs_nz[0], weights=uttkrp_I[:, k, q], minlength=1 + )[0] + + self.w = (self.ag - 1) + self.w * uttkrp_DKQ + + Z = np.einsum("k,q->kq", self.u.sum(axis=0), self.v.sum(axis=0))[ + np.newaxis, :, : + ] + Z *= 1.0 + self.beta_hat[self.T] * self.T + Z += self.bg + + non_zeros = Z > 0 + self.w[non_zeros] /= Z[non_zeros] + + def _update_W_stat(self, subs_nz): + """ + Update affinity tensor. + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + Returns + ------- + dist_w : float + Maximum distance between the old and the new affinity tensor w. + """ + + self._specific_update_W_stat(subs_nz) + + dist_w, self.w, self.w_old = self._finalize_update(self.w, self.w_old) + + return dist_w + + def _specific_update_W_assortative(self, subs_nz: tuple, temporal: bool): + uttkrp_DKQ = np.zeros_like(self.w) + + for idx, (a, i, j) in enumerate(zip(*subs_nz)): + uttkrp_DKQ[a, :] += self.data_M_nz[idx] * self.u[i] * self.v[j] + + self.w = (self.ag - 1) + self.w * uttkrp_DKQ + + if temporal: + Z = (self.u_old.sum(axis=0)) * (self.v_old.sum(axis=0)) + Z = np.einsum("a,k->ak", self.beta_hat, Z) + else: + Z = ((self.u_old.sum(axis=0)) * (self.v_old.sum(axis=0)))[np.newaxis, :] + Z *= 1.0 + self.beta_hat[self.T] * self.T + Z += self.bg + + non_zeros = Z > 0 + self.w[non_zeros] /= Z[non_zeros] + + def _update_W_assortative_dyn(self, subs_nz): + """ + Update affinity tensor (assuming assortativity). + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + Returns + ------- + dist_w : float + Maximum distance between the old and the new affinity tensor w. + """ + + self._specific_update_W_assortative(subs_nz, self.temporal) + + dist_w, self.w, self.w_old = self._finalize_update(self.w, self.w_old) + + return dist_w + + def _update_W_assortative_stat(self, subs_nz): + """ + Update affinity tensor (assuming assortativity). + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + Returns + ------- + dist_w : float + Maximum distance between the old and the new affinity tensor w. + """ + + self._specific_update_W_assortative_stat(subs_nz, self.temporal) + + dist_w, self.w, self.w_old = self._finalize_update(self.w, self.w_old) + + return dist_w + + def _update_membership(self, subs_nz, u, v, w, m): + """ + Return the Khatri-Rao product (sparse version) used in the update of the membership matrices. + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + w : ndarray + Affinity tensor. + m : int + Mode in which the Khatri-Rao product of the membership matrix is multiplied with the tensor: if 1 it + works with the matrix u; if 2 it works with v. + Returns + ------- + uttkrp_DK : ndarray + Matrix which is the result of the matrix product of the unfolding of the tensor and the + Khatri-Rao product of the membership matrix. + """ + if not self.assortative: + uttkrp_DK = sp_uttkrp( + self.data_M_nz, subs_nz, m, u, v, w, temporal=self.temporal + ) + else: + uttkrp_DK = sp_uttkrp_assortative( + self.data_M_nz, subs_nz, m, u, v, w, temporal=self.temporal + ) + return uttkrp_DK + + def _update_optimal_parameters(self) -> None: + """ + Update values of the parameters after convergence. + """ + super()._update_optimal_parameters() + self.beta_f = np.copy(self.beta_hat[-1]) + + def _likelihood( # type: ignore + self, + data: GraphDataType, + data_T: GraphDataType, + data_T_vals: np.ndarray, + subs_nz: ArraySequence, + mask: Optional[MaskType] = None, + ) -> float: # The inputs do change sometimes, so keeping it like this to avoid + # conflicts during the execution. + """ + Compute the pseudo log-likelihood of the data. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_T : GraphDataType + Graph adjacency tensor (transpose). + data_T_vals : np.ndarray + Array with values of entries A[j, i] given non-zero entry (i, j). + subs_nz : TupleArrays + Indices of elements of data that are non-zero. + T : int + Number of time steps. + mask : MaskType + Mask for selecting the held out set in the adjacency tensor in case of cross-validation. + EPS : float, default 1e-12 + Small constant to prevent division by zero. + + Returns + ------- + l : float + Pseudo log-likelihood value. + """ + + self._update_cache(data, data_T_vals, subs_nz) + + if not self.assortative: + w_k = np.einsum("a,akq->akq", self.beta_hat, self.w) + else: + w_k = np.einsum("a,ak->ak", self.beta_hat, self.w) + + lambda0_ija_loc = compute_mean_lambda0(self.u, self.v, w_k) + + if mask is not None: + sub_mask_nz = mask.nonzero() + if isinstance(data, np.ndarray): + loglik = ( + -(1 + self.beta0) * self.lambda0_ija[sub_mask_nz].sum() # type: ignore + - self.eta + * (data_T[sub_mask_nz] * self.beta_hat[sub_mask_nz[0]]).sum() + ) + elif isinstance(data, COO): + loglik = ( + -(1 + self.beta0) * self.lambda0_ija[sub_mask_nz].sum() + - self.eta + * ( + data_T.todense()[sub_mask_nz] * self.beta_hat[sub_mask_nz[0]] + ).sum() + ) + else: + if isinstance(data, np.ndarray): + loglik = -(1 + self.beta0) * self.lambda0_ija.sum() - self.eta * ( # type: ignore + data_T[0].sum() + self.beta0 * data_T[1:].sum() + ) + elif isinstance(data, COO): + loglik = ( + -lambda0_ija_loc.sum() + - self.eta * (data_T.sum(axis=(1, 2)) * self.beta_hat).sum() + ) + + logM = np.log(self.M_nz) + Alog = self.get_data_values(data) * logM + loglik += Alog.sum() + + loglik += (np.log(self.beta_hat[subs_nz[0]] + EPS_) * data.data).sum() + if self.T > 0: + loglik += (np.log(1 - self.beta_hat[-1] + EPS_) * self.bAtAtm1).sum() + loglik += (np.log(self.beta_hat[-1] + EPS_) * self.Atm11At).sum() + + if not self.constraintU: + if self.ag >= 1.0: + loglik += (self.ag - 1) * np.log(self.u + EPS_).sum() + loglik += (self.ag - 1) * np.log(self.v + EPS_).sum() + if self.bg >= 0.0: + loglik -= self.bg * self.u.sum() + loglik -= self.bg * self.v.sum() + + if np.isnan(loglik): + message = "Likelihood is NaN!" + log_and_raise_error(ValueError, message) + + return loglik + +
+[docs] + def enforce_constraintU(self, num: float, den: float) -> float: + """ + Enforce a constraint on the U matrix during the models fitting process. + It uses the root finding algorithm to find the value of lambda that satisfies the constraint. + + Parameters + ---------- + num : float + The numerator part of the constraint equation. + den : float + The denominator part of the constraint equation. + + Returns + ------- + lambda_i : float + The value of lambda that satisfies the constraint. + """ + lambda_i_test = root(compute_lagrange_multiplier, 0.1, args=(num, den)) + lambda_i = lambda_i_test.x + + return lambda_i
+ + +
+[docs] + def func_beta_static(self, beta_t: float) -> float: + """ + Calculate the value of beta at time t for the static models. + + Parameters + ---------- + beta_t : float + The value of beta at time t. + + Returns + ------- + bt : float + The calculated value of beta at time t for the static models. + """ + + if self.assortative: + lambda0_ija = np.einsum( + "k,k->k", self.u.sum(axis=0), self.w[1:].sum(axis=0) + ) + else: + lambda0_ija = np.einsum( + "k,kq->q", self.u.sum(axis=0), self.w[1:].sum(axis=0) + ) + lambda0_ija = np.einsum("k,k->", self.v.sum(axis=0), lambda0_ija) + + bt = -(lambda0_ija + self.eta * self.sum_datatm1) + bt -= self.bAtAtm1 / (1 - beta_t) # adding Aij(t-1)*Aij(t) + + bt += self.sum_data_hat / beta_t # adding sum A_hat from 1 to T + bt += self.Atm11At / beta_t # adding Aij(t-1)*(1-Aij(t)) + return bt
+ + + def _copy_variables(self, source_suffix: str, target_suffix: str) -> None: + """ + Copy variables from source to target. + + Parameters + ---------- + source_suffix : str + The suffix of the source variable names. + target_suffix : str + The suffix of the target variable names. + """ + # Call the base method + super()._copy_variables(source_suffix, target_suffix) + + # Copy the specific variables + source_var = getattr(self, f"eta{source_suffix}") + setattr(self, f"eta{target_suffix}", float(source_var)) + + source_var = getattr(self, f"beta{source_suffix}") + setattr(self, f"beta{target_suffix}", np.copy(source_var))
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/models/jointcrep.html b/_modules/probinet/models/jointcrep.html new file mode 100644 index 0000000..a498b4c --- /dev/null +++ b/_modules/probinet/models/jointcrep.html @@ -0,0 +1,1190 @@ + + + + + + + + + + probinet.models.jointcrep — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.models.jointcrep

+"""
+Class definition of JointCRep, the algorithm to perform inference in networks with reciprocity.
+The latent variables are related to community memberships and a pair interaction value
+:cite:`contisciani2022community`.
+"""
+
+import logging
+import time
+from pathlib import Path
+from typing import Any, Optional, Tuple, Union
+
+import numpy as np
+
+from ..evaluation.expectation_computation import compute_mean_lambda0
+from ..input.preprocessing import preprocess_adjacency_tensor
+from ..types import EndFileType, FilesType, GraphDataType
+from ..utils.matrix_operations import sp_uttkrp, sp_uttkrp_assortative, transpose_tensor
+from ..utils.tools import (
+    check_symmetric,
+    get_item_array_from_subs,
+    get_or_create_rng,
+    log_and_raise_error,
+)
+from .base import ModelBase, ModelUpdateMixin
+from .classes import GraphData
+from .constants import K_DEFAULT, OUTPUT_FOLDER
+
+
+
+[docs] +class JointCRep(ModelBase, ModelUpdateMixin): + """ + Class definition of JointCRep, the algorithm to perform inference in networks with reciprocity. + """ + + def __init__( + self, + **kwargs: Any, + ) -> None: + super().__init__(**kwargs) + self.__doc__ = ModelBase.__init__.__doc__ + + def _check_fit_params( + self, + **kwargs: Any, + ) -> None: + # Call the check_fit_params method from the parent class + super()._check_fit_params(**kwargs) + + self._validate_eta0(kwargs["eta0"]) + self.eta0 = kwargs["eta0"] + + # Parameters for the initialization of the models + self.normalize_rows = False + self.use_unit_uniform = False + + self._validate_undirected_eta() + + if self.initialization == 1: + self.theta = np.load(Path(self.files).resolve(), allow_pickle=True) + dfW = self.theta["w"] + self.L = dfW.shape[0] + self.K = dfW.shape[1] + + if self.fix_eta: + self.eta = self.eta_old = self.eta_f = self.eta0 # type: ignore + +
+[docs] + def fit( + self, + gdata: GraphData, + K: int = K_DEFAULT, + initialization: int = 0, + eta0: Optional[float] = None, + undirected: bool = False, + assortative: bool = True, + fix_eta: bool = False, + fix_communities: bool = False, + fix_w: bool = False, + use_approximation: bool = False, + out_inference: bool = True, + out_folder: Path = OUTPUT_FOLDER, + end_file: Optional[EndFileType] = None, + files: Optional[FilesType] = None, + rng: Optional[np.random.Generator] = None, + **_kwargs: Any, + ) -> tuple[ + np.ndarray[Any, np.dtype[np.float64]], + np.ndarray[Any, np.dtype[np.float64]], + np.ndarray[Any, np.dtype[np.float64]], + float, + float, + ]: + """ + Model directed networks by using a probabilistic generative model based on a Bivariate + Bernoulli distribution that assumes community parameters and a pair interaction + coefficient as latent variables. The inference is performed via the EM algorithm. + + Parameters + ---------- + gdata + Graph adjacency tensor. + K + Number of communities, by default 3. + initialization + Indicator for choosing how to initialize u, v, and w. If 0, they will be generated randomly; + 1 means only the affinity matrix w will be uploaded from file; 2 implies the membership + matrices u and v will be uploaded from file, and 3 all u, v, and w will be initialized + through an input file, by default 0. + eta0 + Initial value for the reciprocity coefficient, by default None. + undirected + Flag to call the undirected network, by default False. + assortative + Flag to call the assortative network, by default True. + fix_eta + Flag to fix the eta parameter, by default False. + fix_communities + Flag to fix the community memberships, by default False. + fix_w + Flag to fix the affinity tensor, by default False. + use_approximation + Flag to use approximation in updates, by default False. + out_inference + Flag to evaluate inference results, by default True. + out_folder + Output folder for inference results, by default OUTPUT_FOLDER. + end_file + Suffix for the evaluation file, by default None. + files + Path to the file for initialization, by default None. + rng + Random number generator, by default None. + + Returns + ------- + + u_f + Out-going membership matrix. + v_f + In-coming membership matrix. + w_f + Affinity tensor. + eta_f + Pair interaction coefficient. + maxL + Maximum log-likelihood. + """ + + # Check the parameters for fitting the models + self._check_fit_params( + data=gdata.adjacency_tensor, + K=K, + initialization=initialization, + eta0=eta0, + undirected=undirected, + assortative=assortative, + use_approximation=use_approximation, + fix_eta=fix_eta, + fix_communities=fix_communities, + fix_w=fix_w, + files=files, + out_inference=out_inference, + out_folder=out_folder, + end_file=end_file, + ) + + # Set the random seed + self.rng = get_or_create_rng(rng) + + # Initialize the fit parameters + self.initialization = initialization + maxL = -self.inf # initialization of the maximum log-likelihood + self.nodes = gdata.nodes + conv = False # initialization of the convergence flag + best_loglik_values = [] # initialization of the log-likelihood values + + # Preprocess the data for fitting the models + data, data_T_vals, subs_nz = self._preprocess_data_for_fit( + gdata.adjacency_tensor, gdata.transposed_tensor, gdata.data_values + ) + + # Calculate the sum of the product of non-zero values in data and data_T + self.AAtSum = (self.get_data_values(data) * data_T_vals).sum() + + # Store the preprocessed data and the indices of its non-zero elements + self.data = data + self.subs_nz = subs_nz + + # Run the Expectation-Maximization (EM) algorithm for a specified number of realizations + for r in range(self.num_realizations): + # Initialize the parameters for the current realization + ( + coincide, + convergence, + it, + loglik, + loglik_values, + ) = self._initialize_realization(data, subs_nz) + + # Update the parameters for the current realization + it, loglik, coincide, convergence, loglik_values = self._update_realization( + r, it, loglik, coincide, convergence, loglik_values + ) + + # If the current log-likelihood is greater than the maximum log-likelihood so far, + # update the optimal parameters and the maximum log-likelihood + if maxL < loglik and convergence: + logging.debug("Better log-likelihood found in realization %s.", r) + logging.debug("Updating optimal parameters.") + super()._update_optimal_parameters() + maxL = loglik + self.final_it = it + conv = convergence + self.best_r = r + + # If the convergence criterion is 'log', store the log-likelihood values + if self.flag_conv == "log": + best_loglik_values = list(loglik_values) + + # Log the current realization number, log-likelihood, number of iterations, and elapsed time + self._log_realization_info( + r, loglik, self.final_it, self.time_start, convergence + ) + + # End cycle over realizations + + # Store the maximum log-likelihood + self.maxL = maxL + + # Evaluate the results of the fitting process + self._evaluate_fit_results(self.maxL, conv, best_loglik_values) + + # Return the final parameters and the maximum log-likelihood + return self.u_f, self.v_f, self.w_f, self.eta_f, maxL # type: ignore
+ + + def _initialize_realization(self, data, subs_nz): + """ + This method initializes the parameters for each realization of the EM algorithm. + It also sets up local variables for convergence checking. + """ + # Log the current state of the random number generator + logging.debug( + "Random number generator seed: %s", + self.rng.bit_generator.state["state"]["state"], + ) + + # Call the _initialize method from the parent class to initialize the parameters for the current realization + super()._initialize() + + # Call the _update_old_variables method from the parent class to update the old variables for the current realization + super()._update_old_variables() + + # Update the cache used in the EM update + self._update_cache(data, subs_nz) + + # Set up local variables for convergence checking + # coincide and it are counters, convergence is a boolean flag + # loglik is the initial pseudo log-likelihood + coincide, it = 0, 0 + convergence = False + loglik = self.inf + loglik_values = [] + + # Record the start time of the realization + self.time_start = time.time() + + # Return the initial state of the realization + return coincide, convergence, it, loglik, loglik_values + + def _preprocess_data_for_fit( + self, + data: GraphDataType, + data_T: Union[GraphDataType, None], + data_T_vals: Union[np.ndarray, None], + ) -> Tuple[GraphDataType, np.ndarray, tuple]: + """ + Preprocess the data for fitting the models. + + Parameters + ---------- + data : COO, np.ndarray + The input data tensor. + data_T : COO, np.ndarray, None + The transposed input data tensor. If None, it will be calculated from the input data tensor. + data_T_vals : np.ndarray, None + The values of the non-zero entries in the transposed input data tensor. If None, it will be calculated from data_T. + + Returns + ------- + tuple + A tuple containing the preprocessed data tensor, the values of the non-zero entries in the transposed data tensor, + and the indices of the non-zero entries in the data tensor. + """ + + # If data_T is not provided, calculate it from the input data tensor + if data_T is None: + data_T = np.einsum("aij->aji", data) + data_T_vals = get_item_array_from_subs(data_T, self.get_data_nonzero(data)) + # Pre-process the data to handle the sparsity + data = preprocess_adjacency_tensor(data) + + # Save the indices of the non-zero entries + subs_nz = self.get_data_nonzero(data) + + return data, data_T_vals, subs_nz # type: ignore + +
+[docs] + def compute_likelihood(self) -> float: + """ + Compute the log-likelihood of the data. + + Returns + ------- + loglik : float + Log-likelihood value. + """ + return self._likelihood()
+ + + def _update_cache(self, data: GraphDataType, subs_nz: tuple) -> None: + """ + Update the cache used in the em_update. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + subs_nz : tuple + Indices of elements of data that are non-zero. + """ + + self.lambda_aij = compute_mean_lambda0( + self.u, self.v, self.w + ) # full matrix lambda + + self.lambda_nz = super()._lambda_nz( + subs_nz + ) # matrix lambda for non-zero entries + lambda_zeros = self.lambda_nz == 0 + self.lambda_nz[lambda_zeros] = 1 # still good because with np.log(1)=0 + self.data_M_nz = self.get_data_values(data) / self.lambda_nz + self.data_M_nz[lambda_zeros] = 0 # to use in the updates + + self.den_updates = 1 + self.eta * self.lambda_aij # to use in the updates + if not self.use_approximation: + self.lambdalambdaT = np.einsum( + "aij,aji->aij", self.lambda_aij, self.lambda_aij + ) # to use in Z and eta + self.Z = self._calculate_Z() + + def _calculate_Z(self) -> np.ndarray: + """ + Compute the normalization constant of the Bivariate Bernoulli distribution. + + Returns + ------- + Z : ndarray + Normalization constant Z of the Bivariate Bernoulli distribution. + """ + + Z = ( + self.lambda_aij + + transpose_tensor(self.lambda_aij) + + self.eta * self.lambdalambdaT + + 1 + ) + for _, z in enumerate(Z): + assert check_symmetric(z) + + return Z + + def _update_em(self) -> tuple: + """ + Update parameters via EM procedure. + + Returns + ------- + d_u : float + Maximum distance between the old and the new membership matrix u. + d_v : float + Maximum distance between the old and the new membership matrix v. + d_w : float + Maximum distance between the old and the new affinity tensor w. + d_eta : float + Maximum distance between the old and the new pair interaction coefficient eta. + """ + + if not self.fix_communities: + if self.use_approximation: + d_u = self._update_U_approx() + else: + d_u = self._update_U() + self._update_cache(self.data, self.subs_nz) + else: + d_u = 0.0 + + if self.undirected: + self.v = self.u + self.v_old = self.v + d_v = d_u + self._update_cache(self.data, self.subs_nz) + else: + if not self.fix_communities: + if self.use_approximation: + d_v = self._update_V_approx() + else: + d_v = self._update_V() + self._update_cache(self.data, self.subs_nz) + else: + d_v = 0.0 + + if not self.fix_w: + if not self.assortative: + if self.use_approximation: + d_w = self._update_W_approx() + else: + d_w = self._update_W() + else: + if self.use_approximation: + d_w = self._update_W_assortative_approx() + else: + d_w = self._update_W_assortative() + self._update_cache(self.data, self.subs_nz) + else: + d_w = 0.0 + + if not self.fix_eta: + self.lambdalambdaT = np.einsum( + "aij,aji->aij", self.lambda_aij, self.lambda_aij + ) # to use in Z and eta + if self.use_approximation: + d_eta = self._update_eta_approx() + else: + d_eta = self._update_eta() + self._update_cache(self.data, self.subs_nz) + else: + d_eta = 0.0 + + return d_u, d_v, d_w, d_eta + + def _update_U_approx(self) -> float: + """ + Update out-going membership matrix by using an approximation. + + Returns + ------- + dist_u : float + Maximum distance between the old and the new membership matrix u. + """ + + self.u *= self._update_membership(self.subs_nz, 1) + + if not self.assortative: + VW = np.einsum("jq,akq->ajk", self.v, self.w) + else: + VW = np.einsum("jk,ak->ajk", self.v, self.w) + den = np.einsum("aji,ajk->ik", self.den_updates, VW) + + non_zeros = den > 0.0 + self.u[den == 0] = 0.0 + self.u[non_zeros] /= den[non_zeros] + + low_values_indices = self.u < self.err_max # values are too low + self.u[low_values_indices] = 0.0 # and set to 0. + + dist_u = np.amax(abs(self.u - self.u_old)) + self.u_old = np.copy(self.u) + + return dist_u + + def _specific_update_U(self): + self.u *= self._update_membership(self.subs_nz, 1) + + if not self.assortative: + VW = np.einsum("jq,akq->ajk", self.v, self.w) + else: + VW = np.einsum("jk,ak->ajk", self.v, self.w) + VWL = np.einsum("aji,ajk->aijk", self.den_updates, VW) + den = np.einsum("aijk,aij->ik", VWL, 1.0 / self.Z) + + non_zeros = den > 0.0 + self.u[den == 0] = 0.0 + self.u[non_zeros] /= den[non_zeros] + + def _update_V_approx(self) -> float: + """ + Update in-coming membership matrix by using an approximation. + Same as _update_U but with: + data <-> data_T + w <-> w_T + u <-> v + + Returns + ------- + dist_v : float + Maximum distance between the old and the new membership matrix v. + """ + + self.v *= self._update_membership(self.subs_nz, 2) + + if not self.assortative: + UW = np.einsum("jq,aqk->ajk", self.u, self.w) + else: + UW = np.einsum("jk,ak->ajk", self.u, self.w) + den = np.einsum("aij,ajk->ik", self.den_updates, UW) + + non_zeros = den > 0.0 + self.v[den == 0] = 0.0 + self.v[non_zeros] /= den[non_zeros] + + low_values_indices = self.v < self.err_max # values are too low + self.v[low_values_indices] = 0.0 # and set to 0. + + dist_v = np.amax(abs(self.v - self.v_old)) + self.v_old = np.copy(self.v) + + return dist_v + + def _specific_update_V(self): + self.v *= self._update_membership(self.subs_nz, 2) + + if not self.assortative: + UW = np.einsum("jq,aqk->ajk", self.u, self.w) + else: + UW = np.einsum("jk,ak->ajk", self.u, self.w) + UWL = np.einsum("aij,ajk->aijk", self.den_updates, UW) + den = np.einsum("aijk,aij->ik", UWL, 1.0 / self.Z) + + non_zeros = den > 0.0 + self.v[den == 0] = 0.0 + self.v[non_zeros] /= den[non_zeros] + + def _specific_update_W(self): + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Iq->Ikq", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis, np.newaxis] * UV + for k in range(self.K): + for q in range(self.K): + uttkrp_DKQ[:, k, q] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k, q], minlength=self.L + ) + + self.w = self.w_old * uttkrp_DKQ + + UL = np.einsum("ik,aji->aijk", self.u, self.den_updates) + num = np.einsum("jq,aijk->aijkq", self.v, UL) + den = np.einsum("aijkq,aij->akq", num, 1.0 / self.Z) + + non_zeros = den > 0.0 + self.w[den == 0] = 0.0 + self.w[non_zeros] /= den[non_zeros] + + def _specific_update_W_assortative(self): + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Ik->Ik", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis] * UV + for k in range(self.K): + uttkrp_DKQ[:, k] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k], minlength=self.L + ) + + self.w = self.w_old * uttkrp_DKQ + + UL = np.einsum("ik,aji->aijk", self.u, self.den_updates) + num = np.einsum("jk,aijk->aijk", self.v, UL) + den = np.einsum("aijk,aij->ak", num, 1.0 / self.Z) + + non_zeros = den > 0.0 + self.w[den == 0] = 0.0 + self.w[non_zeros] /= den[non_zeros] + + def _update_W_approx(self) -> float: + """ + Update affinity tensor. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + + Returns + ------- + dist_w : float + Maximum distance between the old and the new affinity tensor w. + """ + + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Iq->Ikq", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis, np.newaxis] * UV + for k in range(self.K): + for q in range(self.K): + uttkrp_DKQ[:, k, q] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k, q], minlength=self.L + ) + + self.w = self.w_old * uttkrp_DKQ + + UL = np.einsum("ik,aji->aijk", self.u, self.den_updates) + den = np.einsum("jq,aijk->akq", self.v, UL) + + non_zeros = den > 0.0 + self.w[den == 0] = 0.0 + self.w[non_zeros] /= den[non_zeros] + + low_values_indices = self.w < self.err_max # values are too low + self.w[low_values_indices] = 0.0 # and set to 0. + + dist_w = np.amax(abs(self.w - self.w_old)) + self.w_old = np.copy(self.w) + + return dist_w + + def _update_W_assortative_approx(self) -> float: + """ + Update affinity tensor (assuming assortativity). + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + + Returns + ------- + dist_w : float + Maximum distance between the old and the new affinity tensor w. + """ + + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Ik->Ik", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis] * UV + for k in range(self.K): + uttkrp_DKQ[:, k] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k], minlength=self.L + ) + + self.w = self.w_old * uttkrp_DKQ + + UL = np.einsum("ik,aji->aijk", self.u, self.den_updates) + den = np.einsum("jk,aijk->ak", self.v, UL) + + non_zeros = den > 0.0 + self.w[den == 0] = 0.0 + self.w[non_zeros] /= den[non_zeros] + + low_values_indices = self.w < self.err_max # values are too low + self.w[low_values_indices] = 0.0 # and set to 0. + + dist_w = np.amax(abs(self.w - self.w_old)) + self.w_old = np.copy(self.w) + + return dist_w + + def _update_eta_approx(self) -> float: + """ + Update pair interaction coefficient eta by using an approximation. + + Returns + ------- + dist_eta : float + Maximum distance between the old and the new pair interaction coefficient eta. + """ + + den = self.lambdalambdaT.sum() + if not den > 0.0: + log_and_raise_error(ValueError, "eta update_approx has zero denominator!") + + self.eta = self.AAtSum / den + + if self.eta < self.err_max: # value is too low + self.eta = 0.0 # and set to 0. + + dist_eta = abs(self.eta - self.eta_old) # type: ignore + self.eta_old = np.copy(self.eta) # type: ignore + + return dist_eta + +
+[docs] + def eta_fix_point(self) -> float: + """ + Compute the fix point of the pair interaction coefficient eta. + Returns + ------- + eta : float + Fix point of the pair interaction coefficient eta. + """ + + st = (self.lambdalambdaT / self.Z).sum() + if st <= 0: + log_and_raise_error(ValueError, "eta fix point has zero denominator!") + return self.AAtSum / st
+ + + def _update_eta(self) -> float: + """ + Update pair interaction coefficient eta. + + Returns + ------- + dist_eta : float + Maximum distance between the old and the new pair interaction coefficient eta. + """ + + self.eta = self.eta_fix_point() + + if self.eta < self.err_max: # value is too low + self.eta = 0.0 # and set to 0. + + dist_eta = abs(self.eta - self.eta_old) # type: ignore + self.eta_old = np.copy(self.eta) # type: ignore + + return dist_eta + + def _update_membership(self, subs_nz: tuple, m: int) -> np.ndarray: + """ + Return the Khatri-Rao product (sparse version) used in the update of the membership + matrices. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + m : int + Mode in which the Khatri-Rao product of the membership matrix is multiplied with the + tensor: if 1 itworks with the matrix u; if 2 it works with v. + + Returns + ------- + uttkrp_DK : ndarray + Matrix which is the result of the matrix product of the unfolding of the tensor + and the Khatri-Rao product of the membership matrix. + """ + + if not self.assortative: + uttkrp_DK = sp_uttkrp(self.data_M_nz, subs_nz, m, self.u, self.v, self.w) + else: + uttkrp_DK = sp_uttkrp_assortative( + self.data_M_nz, subs_nz, m, self.u, self.v, self.w + ) + + return uttkrp_DK + + def _likelihood(self) -> float: + """ + Compute the log-likelihood of the data. + + + Returns + ------- + loglik : float + Log-likelihood value. + """ + + self.lambdalambdaT = np.einsum( + "aij,aji->aij", self.lambda_aij, self.lambda_aij + ) # to use in Z and eta + self.Z = self._calculate_Z() + + ft = (self.data.data * np.log(self.lambda_nz)).sum() + + st = 0.5 * np.log(self.eta) * self.AAtSum + + tt = 0.5 * np.log(self.Z).sum() + + loglik = ft + st - tt + + if np.isnan(loglik): + log_and_raise_error(ValueError, "log-likelihood is NaN!") + + return loglik + + def _copy_variables(self, source_suffix: str, target_suffix: str) -> None: + """ + Copy variables from source to target. + + Parameters + ---------- + source_suffix : str + The suffix of the source variable names. + target_suffix : str + The suffix of the target variable names. + """ + # Call the base method + super()._copy_variables(source_suffix, target_suffix) + + # Copy the specific variables + source_var = getattr(self, f"eta{source_suffix}") + setattr(self, f"eta{target_suffix}", float(source_var))
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/models/mtcov.html b/_modules/probinet/models/mtcov.html new file mode 100644 index 0000000..27a9d48 --- /dev/null +++ b/_modules/probinet/models/mtcov.html @@ -0,0 +1,1244 @@ + + + + + + + + + + probinet.models.mtcov — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.models.mtcov

+"""
+Class definition of MTCOV, the generative algorithm that incorporates both the topology of
+interactions and node
+attributes to extract overlapping communities in directed and undirected multilayer networks
+:cite:`contisciani2020community`.
+"""
+
+import logging
+import sys
+import time
+from argparse import Namespace
+from pathlib import Path
+from typing import Any, Dict, List, Optional, Tuple
+
+import numpy as np
+import scipy.sparse
+from sparse import COO
+
+from ..evaluation.expectation_computation import compute_mean_lambda0
+from ..input.loader import build_adjacency_and_design_from_file
+from ..input.preprocessing import preprocess_adjacency_tensor, preprocess_data_matrix
+from ..types import ArraySequence, EndFileType, FilesType, GraphDataType
+from ..utils.matrix_operations import sp_uttkrp, sp_uttkrp_assortative
+from ..utils.tools import get_or_create_rng
+from .base import ModelBase, ModelUpdateMixin
+from .classes import GraphData
+from .constants import OUTPUT_FOLDER
+
+MAX_BATCH_SIZE = 5000
+
+
+
+[docs] +class MTCOV(ModelBase, ModelUpdateMixin): + """ + Class definition of MTCOV, the generative algorithm that incorporates both the topology of interactions and + node attributes to extract overlapping communities in directed and undirected multilayer networks. + """ + + additional_fields = ["egoX", "cov_name", "attr_name"] + + def __init__( + self, + err_max: float = 1e-7, # minimum value for the parameters + num_realizations: int = 1, # number of iterations with different random initialization + **kwargs: Any, + ) -> None: + super().__init__( + err_max=err_max, + num_realizations=num_realizations, + **kwargs, + ) + + self.__doc__ = ModelBase.__init__.__doc__ + +
+[docs] + def load_data(self, files: str, adj_name: str, **kwargs): + """ + Load data from the input folder. + """ + return build_adjacency_and_design_from_file(files, adj_name=adj_name, **kwargs)
+ + +
+[docs] + def get_params_to_load_data(self, args: Namespace) -> Dict[str, Any]: + """ + Get the parameters for the models. + """ + # Get the parameters for loading the data + data_kwargs = super().get_params_to_load_data(args) + + # Additional fields + for f in self.additional_fields: + data_kwargs[f] = getattr(args, f) + + return data_kwargs
+ + + def _check_fit_params( + self, + **kwargs: Any, + ) -> None: + super()._check_fit_params( + **kwargs, + ) + + # Parameters for the initialization of the models + self.normalize_rows = False + + self.gamma = kwargs.get("gamma", 0.5) + self.Z = kwargs.get("data_X").shape[ + 1 + ] # number of categories of the categorical attribute + + if self.initialization == 1: + self.theta = np.load(self.files, allow_pickle=True) + dfW = self.theta["w"] + self.L = dfW.shape[0] + self.K = dfW.shape[1] + dfU = self.theta["u"] + self.N = dfU.shape[0] + dfB = self.theta["beta"] + self.Z = dfB.shape[1] + assert self.K == dfU.shape[1] == dfB.shape[0] + +
+[docs] + def fit( + self, + gdata: GraphData, + batch_size: Optional[int] = None, + gamma: float = 0.5, + K: int = 2, + initialization: int = 0, + undirected: bool = False, + assortative: bool = False, + out_inference: bool = True, + out_folder: Path = OUTPUT_FOLDER, + end_file: Optional[EndFileType] = None, + files: Optional[FilesType] = None, + rng: Optional[np.random.Generator] = None, + **__kwargs: Any, + ) -> tuple[ + np.ndarray[Any, np.dtype[np.float64]], + np.ndarray[Any, np.dtype[np.float64]], + np.ndarray[Any, np.dtype[np.float64]], + np.ndarray[Any, np.dtype[np.float64]], + float, + ]: + """ + Perform community detection in multilayer networks considering both the topology of interactions and node + attributes via EM updates. Save the membership matrices U and V, the affinity tensor W, and the beta matrix. + + Parameters + ---------- + gdata + Graph adjacency tensor. + K + Number of communities, by default 3. + initialization + Indicator for choosing how to initialize u, v, and w. If 0, they will be generated randomly; + 1 means only the affinity matrix w will be uploaded from file; 2 implies the membership + matrices u and v will be uploaded from file, and 3 all u, v, and w will be initialized + through an input file, by default 0. + eta0 + Initial value for the reciprocity coefficient, by default None. + undirected + Flag to call the undirected network, by default False. + assortative + Flag to call the assortative network, by default True. + fix_eta + Flag to fix the eta parameter, by default False. + fix_communities + Flag to fix the community memberships, by default False. + fix_w + Flag to fix the affinity tensor, by default False. + use_approximation + Flag to use approximation in updates, by default False. + out_inference + Flag to evaluate inference results, by default True. + out_folder + Output folder for inference results, by default OUTPUT_FOLDER. + end_file + Suffix for the evaluation file, by default None. + files + Path to the file for initialization, by default None. + rng + Random number generator, by default None. + + Returns + ------- + u_f + Out-going membership matrix. + v_f + In-coming membership matrix. + w_f + Affinity tensor. + eta_f + Pair interaction coefficient. + maxL + Maximum log-likelihood. + """ + # Check the parameters for fitting the models + self._check_fit_params( + data=gdata.adjacency_tensor, + data_X=gdata.design_matrix, + K=K, + initialization=initialization, + gamma=gamma, + undirected=undirected, + assortative=assortative, + out_inference=out_inference, + out_folder=out_folder, + end_file=end_file, + files=files, + ) + logging.info("gamma = %s", gamma) + # Set the random seed + self.rng = get_or_create_rng(rng) + + # Initialize the fit parameters + self.initialization = initialization + maxL = -self.inf # initialization of the maximum log-likelihood + self.nodes = gdata.nodes + conv = False # initialization of the convergence flag + best_loglik_values = [] # initialization of the log-likelihood values + + # Preprocess the data for fitting the models + ( + data, + data_X, + subs_nz, + subs_X_nz, + subset_N, + Subs, + SubsX, + ) = self.preprocess_data_for_fit( + gdata.adjacency_tensor, gdata.design_matrix, batch_size + ) + + # Set the preprocessed data and other related variables as attributes of the class instance + self.data = data + self.data_X = data_X + self.subs_nz = subs_nz + self.subs_X_nz = subs_X_nz + self.batch_size = batch_size + self.subset_N = subset_N + self.Subs = Subs + self.SubsX = SubsX + + # The following part of the code is responsible for running the Expectation-Maximization + # (EM) algorithm for a specified number of realizations (self.num_realizations): + for r in range(self.num_realizations): + # Initialize the parameters for the current realization + ( + coincide, + convergence, + it, + loglik, + loglik_values, + ) = self._initialize_realization() + + # Update the parameters for the current realization + it, loglik, coincide, convergence, loglik_values = self._update_realization( + r, it, loglik, coincide, convergence, loglik_values + ) + + # If the current log-likelihood is greater than the maximum log-likelihood so far, + # update the optimal parameters and the maximum log-likelihood + if maxL < loglik: + super()._update_optimal_parameters() + self.maxL = loglik + self.final_it = it + conv = convergence + self.best_r = r + if self.flag_conv == "log": + best_loglik_values = list(loglik_values) + # Log the current realization number, log-likelihood, number of iterations, and elapsed time + self._log_realization_info( + r, loglik, self.final_it, self.time_start, convergence + ) + + # End cycle over realizations + + # Evaluate the results of the fitting process + self._evaluate_fit_results(self.maxL, conv, best_loglik_values) + + # Return the final parameters and the maximum log-likelihood + return self.u_f, self.v_f, self.w_f, self.beta_f, self.maxL
+ + + def _get_subset_and_indices(self, subs_nz, subs_X_nz, batch_size): + if batch_size: + batch_size = ( + min(MAX_BATCH_SIZE, self.N) if batch_size > self.N else batch_size + ) + subset_N = np.random.choice( + np.arange(self.N), size=batch_size, replace=False + ) + Subs = list(zip(*subs_nz)) + SubsX = list(zip(*subs_X_nz)) + else: + if self.N > MAX_BATCH_SIZE: + batch_size = MAX_BATCH_SIZE + subset_N = np.random.choice( + np.arange(self.N), size=batch_size, replace=False + ) + Subs = list(zip(*subs_nz)) + SubsX = list(zip(*subs_X_nz)) + else: + subset_N, Subs, SubsX = None, None, None + return subset_N, Subs, SubsX + +
+[docs] + def preprocess_data_for_fit( + self, + data: GraphDataType, + data_X: np.ndarray, + batch_size: Optional[int] = None, + ) -> Tuple[ + GraphDataType, + np.ndarray, + ArraySequence, + ArraySequence, + Optional[np.ndarray], + Optional[ArraySequence], + Optional[ArraySequence], + ]: + """ + Preprocesses the input data for fitting the models. + + This method handles the sparsity of the data, saves the indices of the non-zero entries, + and optionally selects a subset of nodes for batch processing. + + Parameters + ---------- + data : GraphDataType + The graph adjacency tensor to be preprocessed. + data_X : np.ndarray + The one-hot encoding version of the design matrix to be preprocessed. + batch_size : Optional[int], default=None + The size of the subset of nodes to compute the likelihood with. If None, the method + will automatically determine the batch size based on the number of nodes. + + Returns + ------- + preprocessed_data : GraphDataType + The preprocessed graph adjacency tensor. + preprocessed_data_X : np.ndarray + The preprocessed one-hot encoding version of the design matrix. + subs_nz : TupleArrays + The indices of the non-zero entries in the data. + subs_X_nz : TupleArrays + The indices of the non-zero entries in the design matrix. + subset_N : Optional[np.ndarray] + The subset of nodes selected for batch processing. None if no subset is selected. + Subs : Optional[TupleArrays] + The list of tuples representing the non-zero entries in the data. None if no subset is selected. + SubsX : Optional[TupleArrays] + The list of tuples representing the non-zero entries in the design matrix. None if no subset is selected. + """ + + # Pre-process data and save the indices of the non-zero entries + data = preprocess_adjacency_tensor(data) if not isinstance(data, COO) else data + data_X = preprocess_data_matrix(data_X) + + # save the indexes of the nonzero entries + subs_nz = self.get_data_nonzero(data) + subs_X_nz = data_X.nonzero() + subset_N, Subs, SubsX = self._get_subset_and_indices( + subs_nz, subs_X_nz, batch_size + ) + + logging.debug("batch_size: %s", batch_size) + + return data, data_X, subs_nz, subs_X_nz, subset_N, Subs, SubsX
+ + + def _initialize_realization(self): + """ + This method initializes the parameters, updates the old variables + and updates the cache. It sets up local variables for convergence checking. + coincide and it are counters, convergence is a boolean flag, and loglik is the + initial log-likelihood. + """ + # Log the current state of the random number generator + logging.debug( + "Random number generator seed: %s", + self.rng.bit_generator.state["state"]["state"], + ) + + # Call the _initialize method from the parent class to initialize the parameters for the current realization + super()._initialize() + + # Call the _update_old_variables method from the parent class to update the old variables for the current realization + super()._update_old_variables() + + # Update the cache used in the EM update + self._update_cache(self.data, self.subs_nz, self.data_X, self.subs_X_nz) # type: ignore + + # Set up local variables for convergence checking + # coincide and it are counters, convergence is a boolean flag + # loglik is the initial pseudo log-likelihood + coincide, it = 0, 0 + convergence = False + loglik = self.inf + loglik_values = [] + + # Record the start time of the realization + self.time_start = time.time() + + # Return the initial state of the realization + return coincide, convergence, it, loglik, loglik_values + +
+[docs] + def compute_likelihood(self): + """ + Compute the pseudo log-likelihood of the data. + + Returns + ------- + loglik : float + Pseudo log-likelihood value. + """ + if not self.batch_size: + return self._likelihood() + else: + return self._likelihood_batch( + self.data, self.data_X, self.subset_N, self.Subs, self.SubsX + )
+ + + def _update_em(self): + """ + Update parameters via EM procedure. + """ + + if self.gamma < 1.0: + if not self.assortative: + d_w = self._update_W() + else: + d_w = self._update_W_assortative() + else: + d_w = 0 + self._update_cache(self.data, self.subs_nz, self.data_X, self.subs_X_nz) + + if self.gamma > 0.0: + d_beta = self._update_beta(self.subs_X_nz) + else: + d_beta = 0.0 + self._update_cache(self.data, self.subs_nz, self.data_X, self.subs_X_nz) + + d_u = self._update_U() + self._update_cache(self.data, self.subs_nz, self.data_X, self.subs_X_nz) + + if self.undirected: + self.v = self.u + self.v_old = self.v + d_v = d_u + else: + d_v = self._update_V() + self._update_cache(self.data, self.subs_nz, self.data_X, self.subs_X_nz) + + self.delta_u = d_u + self.delta_v = d_v + self.delta_w = d_w + self.delta_beta = d_beta + + def _initialize_eta(self) -> None: + """ + Override the _initialize_eta method in MTCOV class to do nothing. + """ + + def _file_initialization(self) -> None: + # Call the _file_initialization method of the parent class + super()._file_initialization() + # Initialiue beta from file + self._initialize_beta_from_file() + + def _random_initialization(self) -> None: + # Log a message indicating that u, v and w are being initialized randomly + logging.debug("%s", "u, v and w are initialized randomly.") + + # Randomize u, v + self._randomize_u_v(normalize_rows=self.normalize_rows) + # If gamma is not 0, randomize beta matrix + if self.gamma != 0: + self._randomize_beta( + (self.K, self.Z) + ) # Generates a matrix of random numbers + else: + self.beta = np.zeros((self.K, self.Z)) + # If gamma is not 1, randomize w + if self.gamma != 1: + self._randomize_w() + else: + self.w = np.zeros((self.L, self.K, self.K)) + + def _get_data_pi_nz(self, data_X, subs_X_nz): + if not scipy.sparse.issparse(data_X): + return data_X[subs_X_nz[0]] / self.pi0_nz + else: + return data_X.data / self.pi0_nz + + def _update_cache( + self, + data: GraphDataType, + subs_nz: ArraySequence, + data_X: np.ndarray, + subs_X_nz: ArraySequence, + ) -> None: + """ + Update the cache used in the em_update. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + subs_nz : TupleArrays + Indices of elements of data that are non-zero. + data_X : np.ndarray + Object representing the one-hot encoding version of the design matrix. + subs_X_nz : TupleArrays + Indices of elements of data_X that are non-zero. + """ + + # A + self.lambda0_nz = super()._lambda_nz(subs_nz) + self.lambda0_nz[self.lambda0_nz == 0] = 1 + self.data_M_nz = self.get_data_values(data) / self.lambda0_nz + + # X + self.pi0_nz = self._pi0_nz(subs_X_nz, self.u, self.v, self.beta) + self.pi0_nz[self.pi0_nz == 0] = 1 + self.data_pi_nz = self._get_data_pi_nz(data_X, subs_X_nz) + + def _pi0_nz( + self, + subs_X_nz: ArraySequence, + u: np.ndarray, + v: np.ndarray, + beta: np.ndarray, + ) -> np.ndarray: + """ + Compute the mean pi0 (pi_iz) for only non-zero entries (denominator of hizk). + + Parameters + ---------- + subs_X_nz : tuple + Indices of elements of data_X that are non-zero. + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + beta : ndarray + Beta matrix. + + Returns + ------- + Mean pi0 (pi_iz) for only non-zero entries. + """ + + if self.undirected: + return np.einsum("Ik,kz->Iz", u[subs_X_nz[0], :], beta) + return np.einsum("Ik,kz->Iz", u[subs_X_nz[0], :] + v[subs_X_nz[0], :], beta) + + def _specific_update_W(self): + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Iq->Ikq", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis, np.newaxis] * UV + + for k in range(self.K): + for q in range(self.K): + uttkrp_DKQ[:, k, q] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k, q], minlength=self.L + ) + self.w *= uttkrp_DKQ + Z = np.einsum("k,q->kq", self.u.sum(axis=0), self.v.sum(axis=0)) + non_zeros = Z > 0 + + self.w[:, non_zeros] /= Z[non_zeros] + + def _specific_update_W_assortative(self): + uttkrp_DKQ = np.zeros_like(self.w) + + UV = np.einsum( + "Ik,Ik->Ik", self.u[self.subs_nz[1], :], self.v[self.subs_nz[2], :] + ) + uttkrp_I = self.data_M_nz[:, np.newaxis] * UV + + for k in range(self.K): + uttkrp_DKQ[:, k] += np.bincount( + self.subs_nz[0], weights=uttkrp_I[:, k], minlength=self.L + ) + + self.w *= uttkrp_DKQ + + Z = (self.u_old.sum(axis=0)) * (self.v_old.sum(axis=0)) + non_zeros = Z > 0 + for a in range(self.L): + self.w[a, non_zeros] /= Z[non_zeros] + + def _update_beta(self, subs_X_nz: ArraySequence) -> float: + """ + Update beta matrix. + + Parameters + ---------- + subs_X_nz : tuple + Indices of elements of data_X that are non-zero. + + Returns + ------- + dist_beta : float + Maximum distance between the old and the new beta matrix. + """ + + if self.undirected: + XUV = np.einsum("Iz,Ik->kz", self.data_pi_nz, self.u[subs_X_nz[0], :]) + else: + XUV = np.einsum( + "Iz,Ik->kz", + self.data_pi_nz, + self.u[subs_X_nz[0], :] + self.v[subs_X_nz[0], :], + ) + self.beta *= XUV + + row_sums = self.beta.sum(axis=1) + self.beta[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + low_values_indices = self.beta < self.err_max # values are too low + self.beta[low_values_indices] = 0.0 # and set to 0. + + dist_beta = np.amax(abs(self.beta - self.beta_old)) # type: ignore + self.beta_old = np.copy(self.beta) + + return dist_beta + + def _specific_update_U(self) -> None: + self.u = self._update_membership( + self.subs_nz, self.subs_X_nz, self.u, self.v, self.w, self.beta, 1 + ) + + row_sums = self.u.sum(axis=1) + self.u[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + def _specific_update_V(self) -> None: + self.v = self._update_membership( + self.subs_nz, self.subs_X_nz, self.u, self.v, self.w, self.beta, 2 + ) + + row_sums = self.v.sum(axis=1) + self.v[row_sums > 0] /= row_sums[row_sums > 0, np.newaxis] + + def _update_membership( + self, + subs_nz: ArraySequence, + subs_X_nz: ArraySequence, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + beta: np.ndarray, + m: int, + ) -> np.ndarray: + """ + Main procedure to update membership matrices. + + Parameters + ---------- + subs_nz : tuple + Indices of elements of data that are non-zero. + subs_X_nz : tuple + Indices of elements of data_X that are non-zero. + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + w : ndarray + Affinity tensor. + beta : ndarray + Beta matrix. + m : int + Mode in which the Khatri-Rao product of the membership matrix is multiplied with the tensor: if 1 it + works with the matrix U; if 2 it works with V. + + Returns + ------- + out : ndarray + Update of the membership matrix. + """ + + if not self.assortative: + uttkrp_DK = sp_uttkrp(self.data_M_nz, subs_nz, m, u, v, w) + else: + uttkrp_DK = sp_uttkrp_assortative(self.data_M_nz, subs_nz, m, u, v, w) + + if m == 1: + uttkrp_DK *= u + elif m == 2: + uttkrp_DK *= v + + uttkrp_Xh = np.einsum("Iz,kz->Ik", self.data_pi_nz, beta) + + if self.undirected: + uttkrp_Xh *= u[subs_X_nz[0]] + else: + uttkrp_Xh *= u[subs_X_nz[0]] + v[subs_X_nz[0]] + + uttkrp_DK *= 1 - self.gamma # type: ignore + out = uttkrp_DK.copy() + out[subs_X_nz[0]] += self.gamma * uttkrp_Xh + + return out + + def _likelihood(self) -> float: + """ + Compute the log-likelihood of the data. + + Returns + ------- + l : float + Log-likelihood value. + """ + + self.lambda0_ija = compute_mean_lambda0(self.u, self.v, self.w) + lG = -self.lambda0_ija.sum() + logM = np.log(self.lambda0_nz) + Alog = self.get_data_values(self.data) * logM + lG += Alog.sum() + + if self.undirected: + logP = np.log(self.pi0_nz) + else: + logP = np.log(0.5 * self.pi0_nz) + if not scipy.sparse.issparse(self.data_X): + ind_logP_nz = (np.arange(len(logP)), self.data_X.nonzero()[1]) + Xlog = self.data_X[self.data_X.nonzero()] * logP[ind_logP_nz] + else: + Xlog = self.data_X.data * logP + lX = Xlog.sum() + + loglik = (1.0 - self.gamma) * lG + self.gamma * lX # type: ignore + + if np.isnan(loglik): + raise ValueError("Likelihood is NaN!!!!") + + return loglik + + def _likelihood_batch( + self, + data: GraphDataType, + data_X: np.ndarray, + subset_N: List[int], + Subs: List[Tuple[int, int, int]], + SubsX: List[Tuple[int, int]], + ) -> float: + """ + Compute the log-likelihood of a batch of data. + + Parameters + ---------- + data : GraphDataType + Graph adjacency tensor. + data_X : ndarray + Object representing the one-hot encoding version of the design matrix. + subset_N : list + List with a subset of nodes. + Subs : list + List with elements (a, i, j) of the non zero entries of data. + SubsX : list + List with elements (i, z) of the non zero entries of data_X. + + Returns + ------- + l : float + Log-likelihood value. + """ + + size = len(subset_N) + self.lambda0_ija = compute_mean_lambda0(self.u, self.v, self.w) + + assert self.lambda0_ija.shape == (self.L, size, size) + + lG = -self.lambda0_ija.sum() + logM = np.log(self.lambda0_nz) + IDXs = [ + i for i, e in enumerate(Subs) if (e[1] in subset_N) and (e[2] in subset_N) + ] + Alog = data.data[IDXs] * logM[IDXs] + lG += Alog.sum() + + logP = np.log(self.pi0_nz if self.undirected else 0.5 * self.pi0_nz) + + IDXs = [i for i, e in enumerate(SubsX) if e[0] in subset_N] if size else [] + + X_attr = scipy.sparse.csr_matrix(data_X) + Xlog = X_attr.data[IDXs] * logP[(IDXs, X_attr.nonzero()[1][IDXs])] + lX = Xlog.sum() + + loglik = (1.0 - self.gamma) * lG + self.gamma * lX + + if np.isnan(loglik): + logging.error("Likelihood is NaN!!!!") + sys.exit(1) + else: + return loglik + + def _check_for_convergence_delta(self, it, coincide, du, dv, dw, db, convergence): + """ + Check for convergence by using the maximum distances between the old and the new parameters values. + + Parameters + ---------- + it : int + Number of iteration. + coincide : int + Number of time the update of the log-likelihood respects the convergence_tol. + du : float + Maximum distance between the old and the new membership matrix U. + dv : float + Maximum distance between the old and the new membership matrix V. + dw : float + Maximum distance between the old and the new affinity tensor W. + db : float + Maximum distance between the old and the new beta matrix. + convergence : bool + Flag for convergence. + + Returns + ------- + it : int + Number of iteration. + coincide : int + Number of time the update of the log-likelihood respects the convergence_tol. + convergence : bool + Flag for convergence. + """ + + if ( + du < self.convergence_tol + and dv < self.convergence_tol + and dw < self.convergence_tol + and db < self.convergence_tol + ): + coincide += 1 + else: + coincide = 0 + + if coincide > self.decision: + convergence = True + it += 1 + + return it, coincide, convergence + + def _copy_variables(self, source_suffix: str, target_suffix: str) -> None: + """ + Copy variables from source to target. + + Parameters + ---------- + source_suffix : str + The suffix of the source variable names. + target_suffix : str + The suffix of the target variable names. + """ + # Call the base method + super()._copy_variables(source_suffix, target_suffix) + + # Set specific variables + source_var = getattr(self, f"beta{source_suffix}") + setattr(self, f"beta{target_suffix}", np.copy(source_var))
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/synthetic/anomaly.html b/_modules/probinet/synthetic/anomaly.html new file mode 100644 index 0000000..aafe2cf --- /dev/null +++ b/_modules/probinet/synthetic/anomaly.html @@ -0,0 +1,868 @@ + + + + + + + + + + probinet.synthetic.anomaly — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.synthetic.anomaly

+"""
+Class for generation and management of synthetic networks with anomalies
+"""
+
+import logging
+from pathlib import Path
+from typing import Optional
+
+import matplotlib.pyplot as plt
+import networkx as nx
+import numpy as np
+from scipy import sparse
+from scipy.optimize import brentq
+
+from ..models.constants import OUTPUT_FOLDER
+from ..synthetic.base import GraphProcessingMixin, affinity_matrix
+from ..synthetic.dynamic import eq_c, membership_vectors
+from ..utils.tools import flt, get_or_create_rng
+from ..visualization.plot import plot_M
+
+EPS = 1e-12  # Small value to avoid division by zero
+
+
+
+[docs] +class SyntNetAnomaly(GraphProcessingMixin): + """ + Class for generation and management of synthetic networks with anomalies. + """ + + def __init__( + self, + m: int = 1, + N: int = 100, + K: int = 2, + avg_degree: float = 4.0, + rho_anomaly: float = 0.1, + structure: str = "assortative", + label: Optional[str] = None, + pi: float = 0.8, + eta: float = 0.5, + L1: bool = False, + ag: float = 0.6, + bg: float = 1.0, + corr: float = 0.0, + over: float = 0.0, + verbose: int = 0, + out_folder: Path = OUTPUT_FOLDER, + output_parameters: bool = False, + output_adj: bool = False, + outfile_adj: Optional[str] = None, + rng: Optional[np.random.Generator] = None, + ) -> None: + """ + Initialize the SyntNetAnomaly class. + + Parameters + ---------- + m + Number of networks to be generated (default is 1). + N + Network size (number of nodes) (default is 100). + K + Number of communities (default is 2). + avg_degree + Required average degree of the network (default is 4.0). + rho_anomaly + Proportion of anomalies in the network (default is 0.1). + structure + Structure of the affinity matrix (default is "assortative"). + label + Label associated with the set of inputs (default is None). + pi + Binomial parameter for edge generation (default is 0.8). + eta + Parameter of the Dirichlet distribution (default is 0.5). + L1 + Flag for L1 norm (default is False). + ag + Alpha parameter of the Gamma distribution (default is 0.6). + bg + Beta parameter of the Gamma distribution (default is 1.0). + corr + Correlation between u and v synthetically generated (default is 0.0). + over + Fraction of nodes with mixed membership (default is 0.0). + verbose + Verbosity level (default is 0). + folder + Folder path for saving outputs (default is ""). + output_parameters + Flag for storing the parameters (default is False). + output_adj + Flag for storing the generated adjacency matrix (default is False). + outfile_adj + Name for saving the adjacency matrix (default is None). + rng + Random number generator (default is None). + + Raises + ------ + ValueError + If any of the input parameters are out of their valid ranges. + """ + # Set network size (node number) + self.N = N + # Set number of communities + self.K = K + # Set number of networks to be generated + self.m = m + # Set seed random number generator + self.rng = get_or_create_rng(rng) + # Set label (associated uniquely with the set of inputs) + if label is not None: + self.label = label + else: + self.label = ("_").join( + [str(N), str(K), str(avg_degree), str(flt(rho_anomaly, d=2))] + ) + # Initialize data folder path + self.out_folder = out_folder + # Set flag for storing the parameters + self.output_parameters = output_parameters + # Set flag for storing the generated adjacency matrix + self.output_adj = output_adj + # Set name for saving the adjacency matrix + self.outfile_adj = outfile_adj + # Set required average degree + self.avg_degree = avg_degree + self.rho_anomaly = rho_anomaly + + # Set verbosity flag + if verbose > 2 and not isinstance(verbose, int): + raise ValueError( + "The verbosity parameter can only assume values in {0,1,2}!" + ) + self.verbose = verbose + + # Set Bernoullis parameters + # if mu < 0 or mu > 1: + # raise ValueError('The Binomial parameter mu has to be in [0, 1]!') + + # Check if the value of pi is within the valid range [0, 1] + if pi < 0 or pi > 1: + # If not, raise a ValueError with a descriptive message + raise ValueError("The Binomial parameter pi has to be in [0, 1]!") + + # If pi is exactly 1, subtract a very small value to avoid issues with calculations + if np.isclose(pi, 1, atol=EPS): + pi = 1 - EPS + + # If pi is exactly 0, add a very small value to avoid issues with calculations + if np.isclose(pi, 0, atol=EPS): + pi = EPS + + # Assign the adjusted value of pi to the instance variable self.pi + self.pi = pi + + # Check if the value of rho_anomaly is within the valid range [0, 1] + if rho_anomaly < 0 or rho_anomaly > 1: + # If not, raise a ValueError with a descriptive message + raise ValueError("The rho anomaly has to be in [0, 1]!") + + # Calculate the expected number of edges in the network + self.ExpM = self.avg_degree * self.N * 0.5 + + # Calculate the proportion of reciprocal edges in the network + mu = ( + self.rho_anomaly + * self.ExpM + / ((1 - np.exp(-self.pi)) * (self.N**2 - self.N)) + ) + + # If mu is exactly 1, subtract a very small value to avoid issues with calculations + if mu == 1: + mu = 1 - EPS + + # If mu is exactly 0, add a very small value to avoid issues with calculations + if mu == 0: + mu = EPS + + # Assert that mu is within the valid range (0, 1) + assert 1.0 > mu > 0.0, "mu has to be in (0, 1)!" + + # Assign the adjusted value of mu to the instance variable self.mu + self.mu = mu + + ### Set MT inputs + # Set the affinity matrix structure + allowed_structures = [ + "assortative", + "disassortative", + "core-periphery", + "directed-biased", + ] + if structure not in allowed_structures: + raise ValueError( + f"The available structures for the affinity matrix w" + f"are: {allowed_structures}." + ) + self.structure = structure + + # Set eta parameter of the Dirichlet distribution + if eta <= 0 and L1: + raise ValueError("The Dirichlet parameter eta has to be positive!") + self.eta = eta + # Set alpha parameter of the Gamma distribution + if ag <= 0 and not L1: + raise ValueError("The Gamma parameter alpha has to be positive!") + self.ag = ag + # Set beta parameter of the Gamma distribution + if bg <= 0 and not L1: + raise ValueError("The Gamma parameter beta has to be positive!") + self.bg = bg + # Set u,v generation preference + self.L1 = L1 + # Set correlation between u and v synthetically generated + if (corr < 0) or (corr > 1): + raise ValueError("The correlation parameter has to be in [0, 1]!") + self.corr = corr + # Set fraction of nodes with mixed membership + if (over < 0) or (over > 1): + raise ValueError("The overlapping parameter has to be in [0, 1]!") + self.over = over + +
+[docs] + def anomaly_network_PB(self, parameters=None): + """ + Generate a directed, possibly weighted network by using the anomaly models Poisson-Poisson. + + Steps: + 1. Generate or load the latent variables Z_ij. + 2. Extract A_ij entries (network edges) from a Poisson (M_ij) distribution if Z_ij=0; from a Poisson (pi) distribution if Z_ij=1. + + Parameters + ---------- + parameters + Latent variables z, s, u, v, and w. + + Returns + ------- + G : DiGraph + DiGraph NetworkX object. Self-loops allowed. + """ + ### Latent variables + parameters = parameters if parameters else self._generate_lv() + self.z, self.u, self.v, self.w = parameters + + # Network generation + G = nx.DiGraph() + for i in range(self.N): + G.add_node(i) + + # Compute M_ij + M = np.einsum("ik,jq->ijkq", self.u, self.v) + M = np.einsum("ijkq,kq->ij", M, self.w) + + # Set c sparsity parameter + c = brentq( + eq_c, EPS, 20, args=(M, self.N, self.ExpM, self.rho_anomaly, self.mu) + ) + + self.w *= c + + # Build network + A = self.rng.poisson(c * M) + A[A > 0] = 1 # binarize the adjacency matrix + np.fill_diagonal(A, 0) + G0 = nx.to_networkx_graph(A, create_using=nx.DiGraph) + + # weighted anomaly + A[self.z.nonzero()] = self.rng.poisson(self.pi * self.z.count_nonzero()) + A[A > 0] = 1 # binarize the adjacency matrix + np.fill_diagonal(A, 0) + + G = nx.to_networkx_graph(A, create_using=nx.DiGraph) + + # Network post-processing + + nodes = list(G.nodes()) + A = nx.to_scipy_sparse_array(G, nodelist=nodes, weight="weight") + + # Keep largest connected component + Gc = max(nx.weakly_connected_components(G), key=len) + nodes_to_remove = set(G.nodes()).difference(Gc) + G.remove_nodes_from(list(nodes_to_remove)) + # Define the nodes list again + nodes = list(G.nodes()) + # Define the number of nodes + self.N = len(nodes) + # Redefine G0 as the subgraph defined by the nodes + G0 = G0.subgraph(nodes) + # Redefine the adjacency matrix A as the submatrix defined by the nodes + A = nx.to_scipy_sparse_array(G, nodelist=nodes, weight="weight") + # Similar to A but this time from the subgraph G0 + A0 = nx.to_scipy_sparse_array(G0, nodelist=nodes, weight="weight") + try: + self.z = np.take(self.z, nodes, 1) + self.z = np.take(self.z, nodes, 0) + except IndexError: + self.z = self.z[:, nodes] + self.z = self.z[nodes] + + if self.u is not None: + self.u = self.u[nodes] + self.v = self.v[nodes] + self.N = len(nodes) + + if self.verbose > 0: + ave_deg = np.round(2 * G.number_of_edges() / float(G.number_of_nodes()), 3) + logging.debug( + "Number of nodes: %s \nNumber of edges: %s", + G.number_of_nodes(), + G.number_of_edges(), + ) + logging.debug("Average degree (2E/N): %s", ave_deg) + logging.debug( + "rho_anomaly: %s", + A[self.z.nonzero()].sum() / float(G.number_of_edges()), + ) + + if self.output_parameters: + self._output_results(nodes) + + if self.output_adj: + self._output_adjacency(G, outfile=self.outfile_adj) + + if self.verbose == 2: + self._plot_A(A) + self._plot_A(A0, title="A before anomaly") + self._plot_A(self.z, title="Anomaly matrix Z") + if M is not None: + plot_M(M) + + return G, G0
+ + + def _generate_lv(self): + """ + Generate z, u, v, w latent variables. + + ------- + z + Matrix NxN of models indicators (binary). + + u + Matrix NxK of out-going membership vectors, positive element-wise. + With unitary L1 norm computed row-wise. + + v + Matrix NxK of in-coming membership vectors, positive element-wise. + With unitary L1 norm computed row-wise. + + w + Affinity matrix KxK. Possibly None if in pure SpringRank. + Element (k,h) gives the density of edges going from the nodes + of group k to nodes of group h. + + """ + # Generate z through binomial distribution + + if self.mu < 0: + density = EPS + else: + density = self.mu + z = sparse.random( + self.N, self.N, density=density, data_rvs=np.ones, random_state=self.rng + ) + upper_z = sparse.triu(z) + z = upper_z + upper_z.T + + # Generate u, v for overlapping communities + u, v = membership_vectors( + self.rng, + self.L1, + self.eta, + self.ag, + self.bg, + self.K, + self.N, + self.corr, + self.over, + ) + # Generate w + w = affinity_matrix( + structure=self.structure, N=self.N, K=self.K, avg_degree=self.avg_degree + ) + + return z, u, v, w + + def _output_results(self, nodes): + """ + Output results in a compressed file. + + ---------- + nodes + List of nodes IDs. + + """ + output_parameters = self.out_folder + "theta_" + self.label + np.savez_compressed( + output_parameters + ".npz", + z=self.z.todense(), + u=self.u, + v=self.v, + w=self.w, + mu=self.mu, + pi=self.pi, + nodes=nodes, + ) + + logging.debug("Parameters saved in: %s.npz", output_parameters) + logging.debug("To load: theta=np.load(filename), then e.g. theta['u']") + + def _plot_A(self, A, cmap="PuBuGn", title="Adjacency matrix"): + """ + Plot the adjacency matrix produced by the generative algorithm. + + ---------- + A + Sparse version of the NxN adjacency matrix associated with the graph. + + cmap + Colormap used for the plot. + + title + Title of the plot. + + """ + Ad = A.todense() + _, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(Ad, cmap=plt.get_cmap(cmap)) + ax.set_title(title, fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + plt.show() + + def _plot_Z(self, cmap="PuBuGn"): + """ + Plot the anomaly matrix produced by the generative algorithm. + + ---------- + cmap + Colormap used for the plot. + + """ + _, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(self.z, cmap=plt.get_cmap(cmap)) + ax.set_title("Anomaly matrix", fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + plt.show() + + def _plot_M(self, M, cmap="PuBuGn", title="MT means matrix"): + """ + Plot the M matrix produced by the generative algorithm. + + ---------- + M + NxN M matrix associated with the graph. Contains all the means used + for generating edges. + + cmap + Colormap used for the plot. + + title + Title of the plot. + + """ + fig, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(M, cmap=plt.get_cmap(cmap)) + ax.set_title(title, fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + plt.show()
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/synthetic/base.html b/_modules/probinet/synthetic/base.html new file mode 100644 index 0000000..f98e3f5 --- /dev/null +++ b/_modules/probinet/synthetic/base.html @@ -0,0 +1,1178 @@ + + + + + + + + + + probinet.synthetic.base — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.synthetic.base

+"""
+Base classes for synthetic network generation.
+"""
+
+import logging
+import math
+from abc import ABCMeta
+from enum import Enum
+from os import PathLike
+from pathlib import Path
+from typing import Optional, Tuple, Union
+
+import networkx as nx
+import numpy as np
+import pandas as pd
+from matplotlib import pyplot as plt
+
+from probinet.visualization.plot import plot_A
+
+from ..evaluation.expectation_computation import compute_mean_lambda0
+from ..input.stats import print_graph_stats
+from ..utils.matrix_operations import normalize_nonzero_membership
+from ..utils.tools import log_and_raise_error, output_adjacency
+
+DEFAULT_N = 1000
+DEFAULT_L = 1
+DEFAULT_K = 2
+DEFAULT_ETA = 50
+DEFAULT_ALPHA_HL = 6
+DEFAULT_AVG_DEGREE = 15
+DEFAULT_STRUCTURE = "assortative"
+
+DEFAULT_PERC_OVERLAPPING = 0.2
+DEFAULT_CORRELATION_U_V = 0.0
+DEFAULT_ALPHA = 0.1
+
+DEFAULT_SEED = 10
+DEFAULT_IS_SPARSE = True
+
+DEFAULT_SHOW_DETAILS = True
+DEFAULT_SHOW_PLOTS = False
+DEFAULT_OUTPUT_NET = False
+
+
+
+[docs] +class Structure(Enum): + ASSORTATIVE = "assortative" + DISASSORTATIVE = "disassortative" + CORE_PERIPHERY = "core-periphery" + DIRECTED_BIASED = "directed-biased"
+ + + +
+[docs] +class GraphProcessingMixin: + """ + Mixin class for graph processing and evaluation methods. + """ + + def _remove_nodes(self, graph, nodes_to_remove): + """ + Remove nodes from the graph. + + Parameters + ---------- + graph : networkx.DiGraph + The graph from which nodes will be removed. + nodes_to_remove : list + List of nodes to remove from the graph. + """ + graph.remove_nodes_from(nodes_to_remove) + + def _update_nodes_list(self, graph): + """ + Update the list of nodes in the graph. + + Parameters + ---------- + graph : networkx.DiGraph + The graph from which to get the list of nodes. + + Returns + ------- + list + List of nodes in the graph. + """ + return list(graph.nodes()) + + def _append_layer_graph(self, graph, nodes, layer_graphs): + """ + Append the layer graph to the list of layer graphs. + + Parameters + ---------- + graph : networkx.DiGraph + The graph to convert to a sparse array. + nodes : list + List of nodes in the graph. + layer_graphs : list + List to which the layer graph will be appended. + """ + layer_graphs.append(nx.to_scipy_sparse_array(graph, nodelist=nodes)) + + def _validate_parameters_shape(self, u, v, w, N, K, L): + """ + Validate the shape of the parameters u, v, and w. + + Parameters + ---------- + u : ndarray + Outgoing membership matrix. + v : ndarray + Incoming membership matrix. + w : ndarray + Affinity tensor. + N : int + Number of nodes. + K : int + Number of communities. + L : int + Number of layers. + + Raises + ------ + ValueError + If the shape of any parameter is incorrect. + """ + if u.shape != (N, K): + log_and_raise_error( + ValueError, "The shape of the parameter u has to be (N, K)." + ) + + if v.shape != (N, K): + log_and_raise_error( + ValueError, "The shape of the parameter v has to be (N, K)." + ) + + if w.shape != (L, K, K): + log_and_raise_error( + ValueError, "The shape of the parameter w has to be (L, K, K)." + ) + + def _output_parameters(self) -> None: + """ + Output results in a compressed file. + """ + + self.out_folder.mkdir(parents=True, exist_ok=True) + + output_parameters = self.out_folder / ( + "theta" + (self.end_file if self.end_file else "") + ) # Save parameters + output_params = { + "u": self.u, + "v": self.v, + "w": self.w, + "nodes": self.nodes, + } + + # Add eta if it exists + if hasattr(self, "eta"): + output_params["eta"] = self.eta + + # Add beta if it exists + if hasattr(self, "beta"): + output_params["beta"] = self.beta + + # Save parameters + np.savez_compressed(output_parameters.with_suffix(".npz"), **output_params) + + logging.info("Parameters saved in: %s", output_parameters.with_suffix(".npz")) + logging.info('To load: theta=np.load(filename), then e.g. theta["u"]') + + def _plot_matrix(self, M: np.ndarray, L: int, cmap: str = "PuBuGn") -> None: + """ + Plot the marginal means matrix. + + Parameters + ---------- + M : ndarray + Mean lambda for all entries. + L : int + Number of layers. + cmap : str, optional + Colormap used for the plot, by default "PuBuGn". + """ + for layer in range(L): + np.fill_diagonal(M[layer], 0.0) + _, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(M[layer], cmap=plt.get_cmap(cmap)) + ax.set_title(f"Marginal means matrix layer {layer}", fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + plt.show() + + def _extract_edge_data(self, edges: list) -> list: + """ + Extract edge data from a list of edges. + + Parameters + ---------- + edges : list + List of edges with data. + + Returns + ------- + list + List of edges with source, target, and weight. + """ + try: + data = [[u, v, d["weight"]] for u, v, d in edges] + except KeyError: + data = [[u, v, 1] for u, v, d in edges] + return data + +
+[docs] + def output_adjacency( + self, G: nx.MultiDiGraph, outfile: Optional[str] = None + ) -> None: + """ + Output the adjacency matrix. Default format is space-separated .csv with 3 columns: + node1 node2 weight + + Parameters + ---------- + G: MultiDiGraph + MultiDiGraph NetworkX object. + outfile: str, optional + Name of the adjacency matrix. + """ + + # Create a Path object for the evaluation directory + out_folder_path = Path(self.out_folder) + + # Create evaluation dir if it does not exist + out_folder_path.mkdir(parents=True, exist_ok=True) + + # Check if the evaluation file name is provided + if outfile is None: + # If not provided, generate a default file name using the seed and average degree + outfile = "syn" + str(self.seed) + "_k" + str(int(self.avg_degree)) + ".dat" + + # Get the list of edges from the graph along with their data + edges = list(G.edges(data=True)) + data = self._extract_edge_data(edges) + + # Create a DataFrame from the edge data + df = pd.DataFrame(data, columns=["source", "target", "w"], index=None) + + # Save the DataFrame to a CSV file + df.to_csv(self.out_folder + outfile, index=False, sep=" ") + + logging.info("Adjacency matrix saved in: %s", self.out_folder + outfile)
+
+ + + +
+[docs] +class BaseSyntheticNetwork(metaclass=ABCMeta): + """ + A base abstract class for generation and management of synthetic networks. + + Suitable for representing any type of synthetic network. + """ + + def __init__( + self, + N: int = DEFAULT_N, + L: int = DEFAULT_L, + K: int = DEFAULT_K, + seed: int = DEFAULT_SEED, + eta: float = DEFAULT_ETA, + out_folder: Optional[PathLike] = None, + output_parameters: bool = DEFAULT_OUTPUT_NET, + output_adj: bool = DEFAULT_OUTPUT_NET, + outfile_adj: Optional[str] = None, + end_file: Optional[str] = None, + show_details: bool = DEFAULT_SHOW_DETAILS, + show_plots: bool = DEFAULT_SHOW_PLOTS, + **kwargs, # these kwargs are needed later on + ): + """ + Initialize the base synthetic network with the given parameters. + + Parameters + ---------- + N : int, optional + Number of nodes in the network (default is DEFAULT_N). + L : int, optional + Number of layers in the network (default is DEFAULT_L). + K : int, optional + Number of communities in the network (default is DEFAULT_K). + seed : int, optional + Seed for the random number generator (default is DEFAULT_SEED). + eta : float, optional + Reciprocity coefficient (default is DEFAULT_ETA). + out_folder : str, optional + Path to the evaluation folder (default is DEFAULT_OUT_FOLDER). + output_parameters : bool, optional + Flag to save the network (default is DEFAULT_OUTPUT_NET). + output_adj : bool, optional + Flag to save the adjacency matrix (default is DEFAULT_OUTPUT_NET). + show_details : bool, optional + Flag to print graph statistics (default is DEFAULT_SHOW_DETAILS). + show_plots : bool, optional + Flag to plot the network (default is DEFAULT_SHOW_PLOTS). + kwargs : dict + Additional keyword arguments for further customization. + """ + + self.N = N # number of nodes + self.L = L # number of layers + self.K = K # number of communities + + # Set seed random number generator + self.seed = seed + self.eta = eta + self.rng = np.random.default_rng(seed) + + self.out_folder = out_folder + self.output_parameters = output_parameters + self.output_adj = output_adj + self.outfile_adj = outfile_adj + self.end_file = end_file + + self.show_details = show_details + self.show_plots = show_plots
+ + + +
+[docs] +class StandardMMSBM(BaseSyntheticNetwork, GraphProcessingMixin): + """ + Create a synthetic, directed, and weighted network (possibly multilayer) + by a standard mixed-membership stochastic block-models. + + - It models marginals (iid assumption) with Poisson distributions + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + + self.__doc__ = BaseSyntheticNetwork.__init__.__doc__ + + parameters = kwargs.get("parameters") + + self.init_mmsbm_params(**kwargs) + + self.build_Y(parameters=parameters) + + if self.output_parameters: + self._output_parameters() + if self.output_adj: + output_adjacency(self.layer_graphs, self.out_folder, self.outfile_adj) + + if self.show_details: + print_graph_stats(self.G) + if self.show_plots: + plot_A(self.layer_graphs) + if self.M is not None: + self._plot_M() + +
+[docs] + def init_mmsbm_params(self, **kwargs) -> None: + """ + Check MMSBM-specific parameters + """ + + super().__init__(**kwargs) + + if "avg_degree" in kwargs: + avg_degree = kwargs["avg_degree"] + if avg_degree <= 0: # (in = out) average degree + log_and_raise_error( + ValueError, "The average degree has to be greater than 0.!" + ) + else: + message = f"avg_degree parameter was not set. Defaulting to avg_degree={DEFAULT_AVG_DEGREE}" + logging.warning(message) + avg_degree = DEFAULT_AVG_DEGREE + self.avg_degree = avg_degree + self.ExpEdges = int(self.avg_degree * self.N * 0.5) + + if "is_sparse" in kwargs: + is_sparse = kwargs["is_sparse"] + else: + message = f"is_sparse parameter was not set. Defaulting to is_sparse={DEFAULT_IS_SPARSE}" + logging.warning(message) + is_sparse = DEFAULT_IS_SPARSE + self.is_sparse = is_sparse + + if "outfile_adj" in kwargs: + outfile_adj = kwargs["outfile_adj"] + else: + try: + message = "label parameter was not set. Defaulting to label=_N_L_K_avgdegree_eta_seed" + logging.warning(message) + outfile_adj = "_".join( + [ + str(), + str(self.N), + str(self.L), + str(self.K), + str(self.avg_degree), + str(self.eta), + str(self.seed), + ] + ) + except AttributeError: + message = "label parameter was not set. Defaulting to label=_N_L_K_avgdegree_seed" + logging.warning(message) + outfile_adj = "_".join( + [ + str(), + str(self.N), + str(self.L), + str(self.K), + str(self.avg_degree), + str(self.seed), + ] + ) + self.outfile_adj = outfile_adj # Formerly self.label + + # SETUP overlapping communities + + if "perc_overlapping" in kwargs: + perc_overlapping = kwargs["perc_overlapping"] + if (perc_overlapping < 0) or ( + perc_overlapping > 1 + ): # fraction of nodes with mixed membership + log_and_raise_error( + ValueError, + "The percentage of overlapping nodes has to be in [0, 1]!", + ) + else: + message = ( + f"perc_overlapping parameter was not set. Defaulting to perc_overlapping" + f"={DEFAULT_PERC_OVERLAPPING}" + ) + logging.warning(message) + perc_overlapping = DEFAULT_PERC_OVERLAPPING + self.perc_overlapping = perc_overlapping + + if self.perc_overlapping: + # correlation between u and v synthetically generated + if "correlation_u_v" in kwargs: + correlation_u_v = kwargs["correlation_u_v"] + if (correlation_u_v < 0) or (correlation_u_v > 1): + log_and_raise_error( + ValueError, + "The correlation between u and v has to be in [0, 1]!", + ) + else: + message = ( + f"correlation_u_v parameter for overlapping communities was not set. " + f"Defaulting to corr={DEFAULT_CORRELATION_U_V}" + ) + logging.warning(message) + correlation_u_v = DEFAULT_CORRELATION_U_V + self.correlation_u_v = correlation_u_v + + if "alpha" in kwargs: + alpha = kwargs["alpha"] + else: + message = ( + f"alpha parameter of Dirichlet distribution was not set. " + f"Defaulting to alpha={[DEFAULT_ALPHA] * self.K}" + ) + logging.warning(message) + alpha = [DEFAULT_ALPHA] * self.K + if isinstance(alpha, float): + if alpha <= 0: + log_and_raise_error( + ValueError, + "Each entry of the Dirichlet parameter has to be positive!", + ) + + alpha = [alpha] * self.K + elif len(alpha) != self.K: + log_and_raise_error( + ValueError, "The parameter alpha should be a list of length K." + ) + if not all(alpha): + log_and_raise_error( + ValueError, + "Each entry of the Dirichlet parameter has to be positive!", + ) + self.alpha = alpha + + # SETUP informed structure + + if "structure" in kwargs: + structure = kwargs["structure"] + else: + message = ( + f"structure parameter was not set. Defaulting to " + f"structure={[DEFAULT_STRUCTURE] * self.L}" + ) + logging.warning(message) + structure = [DEFAULT_STRUCTURE] * self.L + if isinstance(structure, str): + if structure not in ["assortative", "disassortative"]: + message = ( + "The available structures for the affinity tensor w are: " + "assortative, disassortative!" + ) + log_and_raise_error(ValueError, message) + structure = [structure] * self.L + elif len(structure) != self.L: + message = ( + "The parameter structure should be a list of length L. " + "Each entry defines the structure of the corresponding layer!" + ) + log_and_raise_error(ValueError, message) + for e in structure: + if e not in ["assortative", "disassortative"]: + message = ( + "The available structures for the affinity tensor w are: " + "assortative, disassortative!" + ) + log_and_raise_error(ValueError, message) + self.structure = structure
+ + +
+[docs] + def build_Y( + self, parameters: Optional[tuple[np.ndarray, np.ndarray, np.ndarray]] = None + ) -> None: + """ + Generate network layers G using the latent variables, + with the generative models A_ij ~ P(A_ij|u,v,w) + + Parameters + ---------- + parameters: Tuple[np.ndarray, np.ndarray, np.ndarray], optional + """ + + # Latent variables + + if parameters is None: + # generate latent variables + self.u, self.v, self.w = self._generate_lv() + else: + # set latent variables + self.u, self.v, self.w = parameters + self._validate_parameters_shape( + self.u, self.v, self.w, self.N, self.K, self.L + ) + + # Generate Y + + self.M = compute_mean_lambda0(self.u, self.v, self.w) + for layer in range(self.L): + np.fill_diagonal(self.M[layer], 0) + # sparsity parameter for Y + if self.is_sparse: + c = self.ExpEdges / self.M.sum() + self.M *= c + if parameters is None: + self.w *= c + + Y = self.rng.poisson(self.M) + + # Create networkx DiGraph objects for each layer for easier manipulation + + nodes_to_remove = [] + self.G = [] + for layer in range(self.L): + self.G.append(nx.from_numpy_array(Y[layer], create_using=nx.DiGraph())) + Gc = max(nx.weakly_connected_components(self.G[layer]), key=len) + nodes_to_remove.append(set(self.G[layer].nodes()).difference(Gc)) + + n_to_remove = nodes_to_remove[0].intersection(*nodes_to_remove) + self.layer_graphs: list[np.ndarray] = [] + for layer in range(self.L): + self._remove_nodes(self.G[layer], list(n_to_remove)) + self.nodes = self._update_nodes_list(self.G[layer]) + self._append_layer_graph(self.G[layer], self.nodes, self.layer_graphs) + + self.u = self.u[self.nodes] + self.v = self.v[self.nodes] + self.N = len(self.nodes)
+ + + def _apply_overlapping( + self, u: np.ndarray, v: np.ndarray + ) -> Tuple[np.ndarray, np.ndarray]: + """ + Introduce overlapping membership in the NxK membership vectors u and v, by using a + Dirichlet distribution. + + INPUT, OUTPUT + ---------- + u : Numpy array + Matrix NxK of out-going membership vectors, positive element-wise. + + v : Numpy array + Matrix NxK of in-coming membership vectors, positive element-wise. + """ + + # number of nodes belonging to more communities + overlapping = int(self.N * self.perc_overlapping) + ind_over = self.rng.integers(low=0, high=len(u), size=overlapping) + + u[ind_over] = self.rng.dirichlet(self.alpha * np.ones(self.K), overlapping) + v[ind_over] = self.correlation_u_v * u[ind_over] + ( + 1.0 - self.correlation_u_v + ) * self.rng.dirichlet(self.alpha * np.ones(self.K), overlapping) + if self.correlation_u_v == 1.0: + assert np.allclose(u, v) + if self.correlation_u_v > 0: + v = normalize_nonzero_membership(v) + + return u, v + + def _sample_membership_vectors(self) -> Tuple[np.ndarray, np.ndarray]: + """ + Compute the NxK membership vectors u and v without overlapping. + + Returns + ---------- + u : Numpy array + Matrix NxK of out-going membership vectors, positive element-wise. + + v : Numpy array + Matrix NxK of in-coming membership vectors, positive element-wise. + """ + + # Generate equal-size unmixed group membership + size = int(self.N / self.K) + u = np.zeros((self.N, self.K)) + v = np.zeros((self.N, self.K)) + for i in range(self.N): + q = int(math.floor(float(i) / float(size))) + if q == self.K: + u[i:, self.K - 1] = 1.0 + v[i:, self.K - 1] = 1.0 + else: + for j in range(q * size, q * size + size): + u[j, q] = 1.0 + v[j, q] = 1.0 + + return u, v + + def _compute_affinity_matrix(self, structure: str, a: float = 0.1) -> np.ndarray: + """ + Compute the KxK affinity matrix w with probabilities between and within groups. + + Parameters + ---------- + structure : list + List of structure of network layers. + a : float + Parameter for secondary probabilities. + + Parameters + ------- + p : Numpy array + Array with probabilities between and within groups. Element (k,h) + gives the density of edges going from the nodes of group k to nodes of group h. + """ + + p1 = self.avg_degree * self.K / self.N + + if structure == "assortative": + p = p1 * a * np.ones((self.K, self.K)) # secondary-probabilities + np.fill_diagonal(p, p1 * np.ones(self.K)) # primary-probabilities + + elif structure == "disassortative": + p = p1 * np.ones((self.K, self.K)) # primary-probabilities + np.fill_diagonal(p, a * p1 * np.ones(self.K)) # secondary-probabilities + + return p + + def _generate_lv(self) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: + """ + Generate latent variables for a MMSBM, assuming network layers are independent + and communities are shared across layers. + + Returns + ------- + u : ndarray + Outgoing membership matrix. + v : ndarray + Incoming membership matrix. + w : ndarray + Affinity tensor. + + """ + + # Generate u, v + u, v = self._sample_membership_vectors() + # Introduce the overlapping membership + if self.perc_overlapping > 0: + u, v = self._apply_overlapping(u, v) + + # Generate w + w = np.zeros((self.L, self.K, self.K)) + for layer in range(self.L): + w[layer, :, :] = self._compute_affinity_matrix(self.structure[layer]) + + return u, v, w + + def _plot_M(self, cmap: str = "PuBuGn") -> None: + """ + Plot the marginal means produced by the generative algorithm. + + Parameters + ---------- + M : ndarray + Mean lambda for all entries. + """ + self._plot_matrix(self.M, self.L, cmap)
+ + + +
+[docs] +def affinity_matrix( + structure: Union[Structure, str] = Structure.ASSORTATIVE.value, + N: int = 100, + K: int = 2, + avg_degree: float = 4.0, + a: float = 0.1, + b: float = 0.3, +) -> np.ndarray: + """ + Compute the KxK affinity matrix w with probabilities between and within groups. + + Parameters + ---------- + structure : Structure, optional + Structure of the network (default is Structure.ASSORTATIVE). + N : int, optional + Number of nodes (default is 100). + K : int, optional + Number of communities (default is 2). + avg_degree : float, optional + Average degree of the network (default is 4.0). + a : float, optional + Parameter for secondary probabilities (default is 0.1). + b : float, optional + Parameter for secondary probabilities in 'core-periphery' and 'directed-biased' structures (default is 0.3). + + Returns + ------- + np.ndarray + KxK affinity matrix. Element (k,h) gives the density of edges going from the nodes of group k to nodes of group h. + """ + + # Adjust b based on a + b *= a + + # Calculate primary probability + p1 = avg_degree * K / N + + # Initialize the affinity matrix based on the structure + if structure == Structure.ASSORTATIVE.value: + # Assortative structure: higher probability within groups + p = p1 * a * np.ones((K, K)) # secondary probabilities + np.fill_diagonal(p, p1 * np.ones(K)) # primary probabilities + + elif structure == Structure.DISASSORTATIVE.value: + # Disassortative structure: higher probability between groups + p = p1 * np.ones((K, K)) # primary probabilities + np.fill_diagonal(p, a * p1 * np.ones(K)) # secondary probabilities + + elif structure == Structure.CORE_PERIPHERY.value: + # Core-periphery structure: core nodes have higher probability + p = p1 * np.ones((K, K)) + np.fill_diagonal(np.fliplr(p), a * p1) + p[1, 1] = b * p1 + + elif structure == Structure.DIRECTED_BIASED.value: + # Directed-biased structure: directional bias in probabilities + p = a * p1 * np.ones((K, K)) + p[0, 1] = p1 + p[1, 0] = b * p1 + + else: + raise ValueError("Invalid structure type.") + + return p
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/synthetic/dynamic.html b/_modules/probinet/synthetic/dynamic.html new file mode 100644 index 0000000..68325a9 --- /dev/null +++ b/_modules/probinet/synthetic/dynamic.html @@ -0,0 +1,1132 @@ + + + + + + + + + + probinet.synthetic.dynamic — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.synthetic.dynamic

+"""
+Class definition of the reciprocity generative models with the member functions required.
+"""
+
+import logging
+import math
+from pathlib import Path
+from typing import List, Optional, Tuple
+
+import matplotlib.pyplot as plt
+import networkx as nx
+import numpy as np
+import pandas as pd
+import scipy
+from scipy.sparse import coo_matrix
+
+from probinet.visualization.plot import plot_M
+
+from ..models.constants import EPS_, OUTPUT_FOLDER
+from ..utils.matrix_operations import normalize_nonzero_membership
+from .base import GraphProcessingMixin, Structure, affinity_matrix
+
+
+
+[docs] +class SyntheticDynCRep(GraphProcessingMixin): + """ + A class to generate a synthetic network using the DynCRep models. + """ + + def __init__( + self, + N: int, + K: int, + T: int = 1, + eta: float = 0.0, # reciprocity parameter + L: int = 1, + avg_degree: float = 5.0, + verbose: int = 0, + beta: float = 0.2, # edge disappearance rate β(t) + ag: float = 1.0, # shape of gamma prior + bg: float = 0.5, # rate of gamma prior + eta_dir: float = 0.5, + L1: bool = True, # u,v generation preference + corr: float = 1.0, # correlation between u and v synthetically generated + over: float = 0.0, + label: Optional[str] = None, + end_file: str = ".dat", + folder: Path = OUTPUT_FOLDER, + structure: str = Structure.ASSORTATIVE.value, + output_parameters: bool = False, + output_adj: bool = False, + outfile_adj: Optional[str] = None, + figsize: Tuple[int, int] = (7, 7), + fontsize: int = 15, + ExpM: Optional[np.ndarray] = None, + rng: Optional[np.random.Generator] = None, + ): + """ + Initialize the SyntheticDynCRep class to generate a synthetic network using the DynCRep models. + + Parameters + ---------- + N : int + Number of nodes in the network. + K : int + Number of communities in the network. + T : int + Number of time steps in the network. + eta : float + Reciprocity parameter. + L : int + Number of layers in the network. + avg_degree : float + Average degree of nodes in the network. + verbose : int + Verbosity level. + beta : float + Edge disappearance rate β(t). + ag : float + Shape parameter of the gamma prior. + bg : float + Rate parameter of the gamma prior. + eta_dir : float + Parameter for Dirichlet. + L1 : bool + Flag for parameter generation method. True for Dirichlet, False for Gamma. + corr : float + Correlation between u and v synthetically generated. + over : float + Fraction of nodes with mixed membership. + label : str + Label for the models. This label is used as part of the filename when saving the evaluation. + end_file : str + File extension for evaluation files. + folder : Path + Folder to save evaluation files. + structure : str + Structure of the network. + output_parameters : bool + Whether to save parameters. + output_adj : bool + Whether to save adjacency matrix. + outfile_adj : str + File name for saving adjacency matrix. + figsize : Tuple[int, int] + Size of the figures generated during the network creation process. + fontsize : int + Font size of the figures generated during the network creation process. + ExpM : np.ndarray + Expected number of edges in the network. + rng : np.random.Generator + Random number generator. + """ + # Set network size (node number) + self.N = N + # Set number of communities + self.K = K + # Set number of time steps + self.T = T + # Set number of layers + self.L = L + # Set average degree + self.avg_degree = avg_degree + # Set seed random number generator + self.rng = np.random.default_rng() if not rng else rng + self.end_file = end_file + self.folder = folder + # Set evaluation flags + self.output_parameters = output_parameters + self.output_adj = output_adj + self.outfile_adj = outfile_adj + # Set plot parameters + self.figsize = figsize + self.fontsize = fontsize + + if label is not None: + self.label = label + else: + self.label = ("_").join( + [str(N), str(K), str(avg_degree), str(T), str(eta), str(beta)] + ) + self.structure = structure + + if ExpM is None: + self.ExpM = self.avg_degree * self.N * 0.5 + else: + self.ExpM = float(ExpM) + + # Set verbosity flag + if verbose not in {0, 1, 2, 3}: + raise ValueError( + "The verbosity parameter can only assume values in {0,1,2,3}!" + ) + self.verbose = verbose + + if eta < 0: + raise ValueError("The parameter eta has to be positive!") + self.eta = eta + + if beta < 0 or beta > 1: + raise ValueError("The parameter beta has to be in [0, 1]!") + if beta == 1: + beta = 1 - EPS_ + if beta == 0: + beta = EPS_ + self.beta = beta + + # Set MT inputs + # Set the affinity matrix structure + if structure not in [ + "assortative", + "disassortative", + "core-periphery", + "directed-biased", + ]: + raise ValueError( + "The available structures for the affinity matrix w " + "are: assortative, disassortative, core-periphery " + "and directed-biased!" + ) + + # Set alpha parameter of the Gamma distribution + if ag <= 0 and not L1: + raise ValueError("The Gamma parameter alpha has to be positive!") + self.ag = ag + # Set beta parameter of the Gamma distribution + if bg <= 0 and not L1: + raise ValueError("The Gamma parameter beta has to be positive!") + self.bg = bg + self.eta_dir = eta_dir + # Set u,v generation preference + self.L1 = L1 + # Set correlation between u and v synthetically generated + if (corr < 0) or (corr > 1): + raise ValueError("The correlation parameter has to be in [0, 1]!") + self.corr = corr + # Set fraction of nodes with mixed membership + if (over < 0) or (over > 1): + raise ValueError("The overlapping parameter has to be in [0, 1]!") + self.over = over + +
+[docs] + def Exp_ija_matrix(self, u, v, w): + """ + Compute the expected adjacency matrix for the DynCRep models. + + Parameters + ---------- + u : np.ndarray + Outgoing membership matrix. + v : np.ndarray + Incoming membership matrix. + w : np.ndarray + Affinity tensor. + + Returns + ------- + Exp_ija : np.ndarray + Expected adjacency matrix. + """ + # Compute the product of the outgoing membership matrix and the affinity tensor + Exp_ija = np.einsum("ik,kq->iq", u, w) + + # Compute the product of the result and the incoming membership matrix + Exp_ija = np.einsum("iq,jq->ij", Exp_ija, v) + + return Exp_ija
+ + +
+[docs] + def generate_net(self, parameters=None): + """ + Generate a directed, possibly weighted network by using DynCRep. + + Steps: + 1. Generate a network A[0]. + 2. Extract A[t] entries (network edges) using transition probabilities. + + Parameters + ---------- + parameters : dict + Latent variables eta, beta, u, v and w. + + Returns + ------- + G : networkx.classes.digraph.DiGraph + NetworkX DiGraph object. Self-loops allowed. + """ + # Latent variables + if parameters is None: + # Generate latent variables + self.u, self.v, self.w = self._generate_lv() + else: + # Set latent variables + self.u, self.v, self.w = parameters + + # Network generation + G = [nx.DiGraph() for t in range(self.T + 1)] + for t in range(self.T + 1): + for i in range(self.N): + G[t].add_node(i) + + # Compute M_ij + M = self.Exp_ija_matrix(self.u, self.v, self.w) + np.fill_diagonal(M, 0) + + # Set c sparsity parameter + Exp_M_inferred = M.sum() + c = self.ExpM / Exp_M_inferred + # For t = 0 + for i in range(self.N): + for j in range(self.N): + if i != j: + A_ij = self.rng.poisson(c * M[i, j], 1)[0] + if A_ij > 0: + G[0].add_edge(i, j, weight=1) # binarized + + # For t > 0 + for t in range(self.T): + for i in range(self.N): + for j in range(self.N): + if i != j: + if G[t].has_edge( + j, i + ): # reciprocal edge determines Poisson rate + lambda_ij = c * M[i, j] + self.eta + else: + lambda_ij = c * M[i, j] + + if G[t].has_edge( + i, j + ): # the edge at previous time step: determines the transition rate + q = 1 - self.beta + else: + q = self.beta * lambda_ij + r = self.rng.random() + if r <= q: + G[t + 1].add_edge(i, j, weight=1) # binarized + + # Network post-processing + nodes = list(G[0].nodes()) + assert len(nodes) == self.N + A = [ + nx.to_scipy_sparse_array(G[t], nodelist=nodes, weight="weight") + for t in range(len(G)) + ] + + # Keep largest connected component + A_sum = A[0].copy() + for t in range(1, len(A)): + A_sum += A[t] + G_sum = nx.from_scipy_sparse_array(A_sum, create_using=nx.DiGraph) + Gc = max(nx.weakly_connected_components(G_sum), key=len) + nodes_to_remove = set(G_sum.nodes()).difference(Gc) + G_sum.remove_nodes_from(list(nodes_to_remove)) + + if self.output_adj: + self._output_adjacency( + A_sum, + A, + nodes_to_keep=list(G_sum.nodes()), + outfile=self.outfile_adj, + ) + + nodes = list(G_sum.nodes()) + + for t in range(len(G)): + G[t].remove_nodes_from(list(nodes_to_remove)) + + if self.u is not None: + self.u = self.u[nodes] + self.v = self.v[nodes] + self.N = len(nodes) + + if self.verbose > 0: + if len(nodes_to_remove) > 0: + logging.debug( + "Removed %s nodes, because not part of the largest connected component", + len(nodes_to_remove), + ) + + if self.verbose > 0: + for t in range(len(G)): + logging.debug("-" * 30) + logging.debug("t=%s", t) + ave_w_deg = np.round( + 2 * G[t].number_of_edges() / float(G[t].number_of_nodes()), 3 + ) + logging.debug( + "Number of nodes: %s \nNumber of edges: %s", + G[t].number_of_nodes(), + G[t].number_of_edges(), + ) + logging.debug("Average degree (2E/N): %s", ave_w_deg) + logging.debug("Reciprocity at t: %s", nx.reciprocity(G[t])) + logging.debug("-" * 30) + self.check_reciprocity_tm1(A) # A_sum was passed originally too + + if self.output_parameters: + self._output_results(nodes) + + if self.verbose >= 2: + self._plot_A(A, figsize=self.figsize, fontsize=self.fontsize) + if self.verbose == 3: + if M is not None: + plot_M(M, figsize=self.figsize, fontsize=self.fontsize) + + return G
+ + + def _generate_lv(self) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: + """ + Generate u, v, w latent variables. + + Returns + ---------- + u : np.ndarray + Matrix NxK of out-going membership vectors, positive element-wise. + With unitary L1 norm computed row-wise. + + v : np.ndarray + Matrix NxK of in-coming membership vectors, positive element-wise. + With unitary L1 norm computed row-wise. + + w : np.ndarray + Affinity matrix KxK. Possibly None if in pure SpringRank. + Element (k,h) gives the density of edges going from the nodes + of group k to nodes of group h. + """ + + # Generate u, v for overlapping communities + u, v = membership_vectors( + self.rng, + self.L1, + self.eta_dir, + self.ag, + self.bg, + self.K, + self.N, + self.corr, + self.over, + ) + # Generate w + w = affinity_matrix(self.structure, self.N, self.K, self.avg_degree) + return u, v, w + + def _build_multilayer_edgelist( + self, + A_tot: coo_matrix, + A: List[coo_matrix], + nodes_to_keep: Optional[List[int]] = None, + ) -> pd.DataFrame: + """ + Build a multilayer edge list from the given adjacency matrices. + + This function converts the total adjacency matrix to a coordinate format and initializes a dictionary to store the source and target nodes. + It then loops over each adjacency matrix in A and adds the weights of the edges at each time t to the dictionary. + + Parameters + ---------- + A_tot : scipy.sparse.coo_matrix + The total adjacency matrix. + A : List[scipy.sparse.coo_matrix] + List of adjacency matrices for each layer. + nodes_to_keep : List[int] + List of node IDs to keep. If not provided, all nodes are kept. + + Returns + ------- + df_res : pd.DataFrame + DataFrame containing the multilayer edge list. + """ + # Convert the total adjacency matrix to a coordinate format + A_coo = A_tot.tocoo() + + # Initialize a dictionary to store the source and target nodes + data_dict = {"source": A_coo.row, "target": A_coo.col} + + # Loop over each adjacency matrix in A + for t in range(len(A)): + # Add the weights of the edges at time t to the dictionary + data_dict["weight_t" + str(t)] = np.squeeze( + np.asarray(A[t][A_tot.nonzero()]) + ) + + # Convert the dictionary to a DataFrame + df_res = pd.DataFrame(data_dict) + + # If nodes_to_keep is not None, filter the DataFrame to only include these nodes + if nodes_to_keep is not None: + df_res = df_res[ + df_res.source.isin(nodes_to_keep) & df_res.target.isin(nodes_to_keep) + ] + + # Get the list of unique nodes + nodes = list(set(df_res.source).union(set(df_res.target))) + + # Create a dictionary mapping node IDs to nodes + id2node = dict(enumerate(nodes)) + + # Replace the source and target node IDs with the actual nodes + df_res["source"] = df_res.source.map(id2node) + df_res["target"] = df_res.target.map(id2node) + + # Return the resulting DataFrame + return df_res + + def _output_results(self, nodes: List[int]) -> None: + """ + Output results in a compressed file. + + Parameters + ---------- + nodes : List[int] + List of node IDs. + """ + output_parameters = self.folder + "theta_" + self.label + "_" + str(self.rng) + np.savez_compressed( + output_parameters + ".npz", + u=self.u, + v=self.v, + w=self.w, + eta=self.eta, + beta=self.beta, + nodes=nodes, + ) + + logging.debug("Parameters saved in: %s.npz", output_parameters) + logging.debug("To load: theta=np.load(filename), then e.g. theta['u']") + + def _output_adjacency( + self, + A_tot: scipy.sparse.coo_matrix, + A: List[scipy.sparse.coo_matrix], + nodes_to_keep: Optional[List[int]] = None, + outfile: Optional[str] = None, + ) -> None: + """ + Output the adjacency matrix. The default format is a space-separated .csv file with 3 columns: node1, node2, and weight. + + Parameters + ---------- + nodes : List[int] + List of node IDs. + A_tot : scipy.sparse.coo_matrix + The total adjacency matrix. + A : List[scipy.sparse.coo_matrix] + List of adjacency matrices for each layer. + nodes_to_keep : List[int] + List of node IDs to keep. If not provided, all nodes are kept. + outfile : str + Name of the evaluation file for the adjacency matrix. If not provided, a default name is used. + """ + if outfile is None: + outfile = "syn_" + self.label + "_" + str(self.rng) + ".dat" + + df = self._build_multilayer_edgelist(A_tot, A, nodes_to_keep=nodes_to_keep) + df.to_csv(self.folder + outfile, index=False, sep=" ") + logging.debug("Adjacency matrix saved in: %s", self.folder + outfile) + + def _plot_A( + self, + A: np.ndarray, + cmap: str = "PuBuGn", + figsize: Tuple[int, int] = (7, 7), + fontsize: int = 15, + ) -> None: + """ + Plot the adjacency matrix produced by the generative algorithm. + + Parameters + ---------- + A : np.ndarray + Sparse version of the NxN adjacency matrix associated to the graph. + cmap : str + Colormap used for the plot. + figsize : Tuple[int, int] + Size of the figure to be plotted. + fontsize : int + Font size to be used in the plot title. + """ + for i in range(len(A)): + Ad = A[i].todense() + _, ax = plt.subplots(figsize=figsize) + ax.matshow(Ad, cmap=plt.get_cmap(cmap)) + ax.set_title(f"Adjacency matrix at time {i}", fontsize=fontsize) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + + def _plot_M( + self, + M: np.ndarray, + cmap: str = "PuBuGn", + figsize: Tuple[int, int] = (7, 7), + fontsize: int = 15, + ) -> None: + """ + Plot the M matrix produced by the generative algorithm. Each entry is the + Poisson mean associated with each pair of nodes in the graph. + + Parameters + ---------- + M : np.ndarray + NxN M matrix associated with the graph. Contains all the means used + for generating edges. + cmap : str + Colormap used for the plot. + figsize : Tuple[int, int] + Size of the figure to be plotted. + fontsize : int + Font size to be used in the plot title. + """ + + _, ax = plt.subplots(figsize=figsize) + ax.matshow(M, cmap=plt.get_cmap(cmap)) + ax.set_title("MT means matrix", fontsize=fontsize) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + +
+[docs] + def check_reciprocity_tm1(self, A: List[coo_matrix]) -> None: + """ + Check the reciprocity of the adjacency matrices at time t and t-1. + + Parameters + ---------- + A : List[scipy.sparse.coo_matrix] + List of adjacency matrices for each time step. + """ + if len(A) > 1: + logging.debug("Compare current and previous reciprocity.") + # Loop over each adjacency matrix in A, starting from the second one + for t in range(1, len(A)): + # Get the indices of the non-zero elements in the adjacency matrix at time t + ref_subs = A[t].nonzero() + + # Get the non-zero elements in the transposed adjacency matrix at time t + M_t_T = A[t].transpose()[ref_subs] + + # Get the non-zero elements in the transposed adjacency matrix at time t-1 + M_tm1_T = A[t - 1].transpose()[ref_subs] + + # Get the number of non-zero elements in the adjacency matrix at time t + nnz = float(A[t].count_nonzero()) + + # Log the number of non-zero elements in the adjacency matrix at time t, + # the fraction of non-zero elements in the transposed adjacency matrix at time t, + # and the fraction of non-zero elements in the transposed adjacency matrix at time t-1 + logging.debug("Time step: %s", t) + logging.debug( + "Number of non-zero elements in the adjacency matrix at time t: %s", nnz + ) + logging.debug( + "Fraction of non-zero elements in the transposed adjacency matrix at time t: %s", + M_t_T.nonzero()[0].shape[0] / nnz, + ) + logging.debug( + "Fraction of non-zero elements in the transposed adjacency matrix at time t-1: %s", + M_tm1_T.nonzero()[0].shape[0] / nnz, + )
+
+ + + +
+[docs] +def membership_vectors( + rng: np.random.Generator, + L1: bool = False, + eta: float = 0.5, + alpha: float = 0.6, + beta: float = 1, + K: int = 2, + N: int = 100, + corr: float = 0.0, + over: float = 0.0, +) -> Tuple[np.ndarray, np.ndarray]: + """ + Compute the NxK membership vectors u, v using a Dirichlet or a Gamma distribution. + + Parameters + ---------- + rng : np.random.Generator + Random number generator container. + L1 : bool + Flag for parameter generation method. True for Dirichlet, False for Gamma. + eta : float + Parameter for Dirichlet. + alpha : float + Parameter (alpha) for Gamma. + beta : float + Parameter (beta) for Gamma. + K : int + Number of communities. + N : int + Number of nodes. + corr : float + Correlation between u and v synthetically generated. + over : float + Fraction of nodes with mixed membership. + + Returns + ------- + Tuple[np.ndarray, np.ndarray] + u : Numpy array + Matrix NxK of out-going membership vectors, positive element-wise. + Possibly None if in pure SpringRank or pure Multitensor. + With unitary L1 norm computed row-wise. + + v : Numpy array + Matrix NxK of in-coming membership vectors, positive element-wise. + Possibly None if in pure SpringRank or pure Multitensor. + With unitary L1 norm computed row-wise. + """ + # Generate equal-size unmixed group membership + size = int(N / K) + u = np.zeros((N, K)) + v = np.zeros((N, K)) + for i in range(N): + q = int(math.floor(float(i) / float(size))) + if q == K: + u[i:, K - 1] = 1.0 + v[i:, K - 1] = 1.0 + else: + for j in range(q * size, q * size + size): + u[j, q] = 1.0 + v[j, q] = 1.0 + # Generate mixed communities if requested + if over != 0.0: + overlapping = int(N * over) # number of nodes belonging to more communities + ind_over = rng.integers(len(u), size=overlapping) + if L1: + u[ind_over] = rng.dirichlet(eta * np.ones(K), overlapping) + v[ind_over] = corr * u[ind_over] + (1.0 - corr) * rng.dirichlet( + eta * np.ones(K), overlapping + ) + if corr == 1.0: + assert np.allclose(u, v) + if corr > 0: + v = normalize_nonzero_membership(v) + else: + u[ind_over] = rng.gamma(alpha, 1.0 / beta, size=(N, K)) + v[ind_over] = corr * u[ind_over] + (1.0 - corr) * rng.gamma( + alpha, 1.0 / beta, size=(overlapping, K) + ) + u = normalize_nonzero_membership(u) + v = normalize_nonzero_membership(v) + return u, v
+ + + +
+[docs] +def eq_c(c: float, M: np.ndarray, N: int, E: int, rho_a: float, mu: float) -> float: + """ + Compute the value of a function used to find the value of the sparsity parameter 'c'. + + Parameters + ---------- + c : float + The sparsity parameter. + M : np.ndarray + The matrix representing the expected number of edges between each pair of nodes. + N : int + The number of nodes in the network. + E : int + The expected total number of edges in the network. + rho_a : float + The expected proportion of reciprocal edges in the network. + mu : float + The proportion of reciprocal edges in the Erdos-Renyi network. + + Returns + ------- + float + The value of the function for the given parameters. + """ + return np.sum(np.exp(-c * M)) - (N**2 - N) + E * (1 - rho_a) / (1 - mu)
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/synthetic/multilayer.html b/_modules/probinet/synthetic/multilayer.html new file mode 100644 index 0000000..07159be --- /dev/null +++ b/_modules/probinet/synthetic/multilayer.html @@ -0,0 +1,883 @@ + + + + + + + + + + probinet.synthetic.multilayer — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.synthetic.multilayer

+"""
+Code to generate multilayer networks with non-negative and discrete weights, and whose nodes are associated
+with one categorical attribute. Self-loops are removed and only the largest connected component is considered.
+"""
+
+import logging
+import os
+import warnings
+from abc import ABCMeta
+from pathlib import Path
+from typing import Optional
+
+import matplotlib.pyplot as plt
+import networkx as nx
+import numpy as np
+import pandas as pd
+
+from probinet.evaluation.expectation_computation import compute_mean_lambda0
+from probinet.input.stats import print_graph_stats
+from probinet.models.constants import OUTPUT_FOLDER
+from probinet.synthetic.base import StandardMMSBM
+from probinet.utils.matrix_operations import normalize_nonzero_membership
+from probinet.utils.tools import get_or_create_rng, output_adjacency
+from probinet.visualization.plot import plot_A
+
+DEFAULT_N = 100
+DEFAULT_L = 1
+DEFAULT_K = 2
+DEFAULT_Z = 2
+DEFAULT_AVG_DEGREE = 15
+
+DEFAULT_DIRECTED = False
+DEFAULT_PERC_OVERLAPPING = 0.4
+DEFAULT_CORRELATION_U_V = 0.0
+DEFAULT_ALPHA = 0.1
+
+DEFAULT_STRUCTURE = "assortative"
+
+DEFAULT_SEED = 0
+
+DEFAULT_IS_SPARSE = True
+
+DEFAULT_OUT_FOLDER = "data/input/synthetic/"
+
+DEFAULT_SHOW_DETAILS = False
+DEFAULT_SHOW_PLOTS = False
+DEFAULT_OUTPUT_NET = False
+
+
+
+[docs] +def pi_ik_matrix(u: np.ndarray, v: np.ndarray, beta: np.ndarray) -> np.ndarray: + """ + Compute the mean pi_ik for all entries. + + Parameters + ---------- + u : np.ndarray + Out-going membership matrix. + v : np.ndarray + In-coming membership matrix. + beta : np.ndarray + Affinity matrix. + + Returns + ------- + pi : np.ndarray + """ + + pi = 0.5 * np.matmul((u + v), beta) + + return pi
+ + + +
+[docs] +def output_design_matrix(X, out_folder, label): + """ + Save the design matrix tensor to a file. + + INPUT + ---------- + X : np.ndarray + One-hot encoding of design matrix. + out_folder : str + Path to store the design matrix. + label : str + Label name to store the design matrix. + """ + + outfile = label + ".csv" + if not os.path.exists(out_folder): + os.makedirs(out_folder) + + df = pd.DataFrame(X, columns=["Metadata"]) + df["nodeID"] = df.index + df = df.loc[:, ["nodeID", "Metadata"]] + df.to_csv(out_folder + outfile, index=False, sep=" ") + + print(f"Design matrix saved in: {out_folder + outfile}")
+ + + +
+[docs] +def plot_X(X, cmap="PuBuGn"): + """ + Plot the design matrix produced by the generative algorithm. + + INPUT + ---------- + X : np.ndarray + Design matrix. + cmap : Matplotlib object + Colormap used for the plot. + """ + + fig, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(pd.get_dummies(X), cmap=plt.get_cmap(cmap), aspect="auto") + ax.set_title("Design matrix", fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + plt.show()
+ + + +
+[docs] +class BaseSyntheticNetwork(metaclass=ABCMeta): + """ + A base abstract class for generation and management of synthetic networks. + + Suitable for representing any type of synthetic network. + """ + + def __init__( + self, + N: int = DEFAULT_N, + L: int = DEFAULT_L, + K: int = DEFAULT_K, + Z: int = DEFAULT_Z, + out_folder: Path = OUTPUT_FOLDER, + output_net: bool = DEFAULT_OUTPUT_NET, + show_details: bool = DEFAULT_SHOW_DETAILS, + show_plots: bool = DEFAULT_SHOW_PLOTS, + rng: Optional[np.random.Generator] = None, + **kwargs, + ): + self.N = N # number of nodes + self.L = L # number of layers + self.K = K # number of communities + self.Z = Z # number of categories of the categorical attribute + + # Set random number generator + self.rng = get_or_create_rng(rng) + + self.out_folder = out_folder + self.output_data = output_net + + self.show_details = show_details + self.show_plots = show_plots
+ + + +
+[docs] +class SyntheticMTCOV(BaseSyntheticNetwork, StandardMMSBM): + """ + Create a synthetic, possibly directed, and weighted network (possibly multilayer) + by a standard mixed-membership stochastic block-model + - It models marginals (iid assumption) with Poisson distributions + """ + + def __init__(self, **kwargs): + super().__init__(**kwargs) + + parameters = kwargs.get("parameters", None) + attributes = kwargs.get("attributes", None) + + self.init_mmsbm_params(**kwargs) + + self.build_Y(parameters=parameters) + + self.build_X(attributes=attributes) + + if self.output_data: + self._output_parameters() + output_adjacency(self.layer_graphs, self.out_folder, "A" + self.label) + output_design_matrix(self.X, self.out_folder, "X" + self.label) + + if self.show_details: + print_graph_stats(self.G) + if self.show_plots: + plot_A(self.layer_graphs) + plot_X(self.X) + if self.M is not None: + self._plot_M() + if self.pi is not None: + self._plot_pi() + +
+[docs] + def init_mmsbm_params(self, **kwargs): + """ + Check MMSBM-specific parameters + """ + + super().__init__(**kwargs) + + if "avg_degree" in kwargs: + avg_degree = kwargs["avg_degree"] + if avg_degree <= 0: # (in = out) average degree + err_msg = "The average degree has to be greater than 0.!" + raise ValueError(err_msg) + else: + msg = f"avg_degree parameter was not set. Defaulting to avg_degree={DEFAULT_AVG_DEGREE}" + warnings.warn(msg) + avg_degree = DEFAULT_AVG_DEGREE + self.avg_degree = avg_degree + self.ExpEdges = int(self.avg_degree * self.N * 0.5) + + if "directed" in kwargs: + directed = kwargs["directed"] + else: + msg = f"directed parameter was not set. Defaulting to directed={DEFAULT_DIRECTED}" + warnings.warn(msg) + directed = DEFAULT_DIRECTED + self.directed = directed + + if "is_sparse" in kwargs: + is_sparse = kwargs["is_sparse"] + else: + msg = f"is_sparse parameter was not set. Defaulting to is_sparse={DEFAULT_IS_SPARSE}" + warnings.warn(msg) + is_sparse = DEFAULT_IS_SPARSE + self.is_sparse = is_sparse + + if "label" in kwargs: + label = kwargs["label"] + else: + msg = "label parameter was not set. Defaulting to label=_N_L_K_avgdegree" + warnings.warn(msg) + label = "_".join( + [ + str(), + str(self.N), + str(self.L), + str(self.K), + str(self.avg_degree), + ] + ) + self.label = label + + # SETUP overlapping communities + + if "perc_overlapping" in kwargs: + perc_overlapping = kwargs["perc_overlapping"] + if (perc_overlapping < 0) or ( + perc_overlapping > 1 + ): # fraction of nodes with mixed membership + err_msg = "The percentage of overlapping nodes has to be in [0, 1]!" + raise ValueError(err_msg) + else: + msg = f"perc_overlapping parameter was not set. Defaulting to perc_overlapping={DEFAULT_PERC_OVERLAPPING}" + warnings.warn(msg) + perc_overlapping = DEFAULT_PERC_OVERLAPPING + self.perc_overlapping = perc_overlapping + + if self.perc_overlapping: + # correlation between u and v synthetically generated + if "correlation_u_v" in kwargs: + correlation_u_v = kwargs["correlation_u_v"] + if (correlation_u_v < 0) or (correlation_u_v > 1): + err_msg = "The correlation between u and v has to be in [0, 1]!" + raise ValueError(err_msg) + else: + msg = ( + f"correlation_u_v parameter for overlapping communities was not set. " + f"Defaulting to corr={DEFAULT_CORRELATION_U_V}" + ) + warnings.warn(msg) + correlation_u_v = DEFAULT_CORRELATION_U_V + self.correlation_u_v = correlation_u_v + + if "alpha" in kwargs: + alpha = kwargs["alpha"] + else: + msg = f"alpha parameter of Dirichlet distribution was not set. Defaulting to alpha={[DEFAULT_ALPHA] * self.K}" + warnings.warn(msg) + alpha = [DEFAULT_ALPHA] * self.K + if isinstance(alpha, float): + if alpha <= 0: + err_msg = ( + "Each entry of the Dirichlet parameter has to be positive!" + ) + raise ValueError(err_msg) + else: + alpha = [alpha] * self.K + elif len(alpha) != self.K: + err_msg = "The parameter alpha should be a list of length K." + raise ValueError(err_msg) + if not all(alpha): + err_msg = "Each entry of the Dirichlet parameter has to be positive!" + raise ValueError(err_msg) + self.alpha = alpha + + # SETUP informed structure + + if "structure" in kwargs: + structure = kwargs["structure"] + else: + msg = f"structure parameter was not set. Defaulting to structure={[DEFAULT_STRUCTURE] * self.L}" + warnings.warn(msg) + structure = [DEFAULT_STRUCTURE] * self.L + if isinstance(structure, str): + if structure not in ["assortative", "disassortative"]: + err_msg = "The available structures for the affinity tensor w are: assortative, disassortative!" + raise ValueError(err_msg) + else: + structure = [structure] * self.L + elif len(structure) != self.L: + err_msg = ( + "The parameter structure should be a list of length L. " + "Each entry defines the structure of the corresponding layer!" + ) + raise ValueError(err_msg) + for e in structure: + if e not in ["assortative", "disassortative"]: + err_msg = "The available structures for the affinity tensor w are: assortative, disassortative!" + raise ValueError(err_msg) + self.structure = structure
+ + +
+[docs] + def build_Y(self, parameters=None): + """ + Generate network layers G using the latent variables, + with the generative model A_ij ~ P(A_ij|u,v,w) + """ + + # Latent variables + + if parameters is None: + # generate latent variables + self.u, self.v, self.w = self._generate_lv() + else: + # set latent variables + self.u, self.v, self.w = parameters + if self.u.shape != (self.N, self.K): + raise ValueError("The shape of the parameter u has to be (N, K).") + if self.v.shape != (self.N, self.K): + raise ValueError("The shape of the parameter v has to be (N, K).") + if self.w.shape != (self.L, self.K, self.K): + raise ValueError("The shape of the parameter w has to be (L, K, K).") + self.u = normalize_nonzero_membership(self.u, axis=1) + self.v = normalize_nonzero_membership(self.v, axis=1) + + # Generate Y + + self.M = compute_mean_lambda0(self.u, self.v, self.w) + for layer in range(self.L): + np.fill_diagonal(self.M[layer], 0) + # sparsity parameter for Y + if self.is_sparse: + c = self.ExpEdges / self.M.sum() + self.M *= c + if parameters is None: + self.w *= c + + Y = self.rng.poisson(self.M) + if not self.directed: + # symmetrize + for layer in range(self.L): + Y[layer] = Y[layer] + Y[layer].T - np.diag(Y[layer].diagonal()) + + # Create networkx Graph objects for each layer for easier manipulation + + nodes_to_remove = [] + self.G = [] + self.layer_graphs = [] + for layer in range(self.L): + if self.directed: + self.G.append(nx.from_numpy_array(Y[layer], create_using=nx.DiGraph())) + Gc = max(nx.weakly_connected_components(self.G[layer]), key=len) + nodes_to_remove.append(set(self.G[layer].nodes()).difference(Gc)) + else: + self.G.append(nx.from_numpy_array(Y[layer], create_using=nx.Graph())) + + if self.directed: + n_to_remove = nodes_to_remove[0].intersection(*nodes_to_remove) + for layer in range(self.L): + if self.directed: + self.G[layer].remove_nodes_from(list(n_to_remove)) + self.nodes = list(self.G[layer].nodes()) + + self.layer_graphs.append( + nx.to_scipy_sparse_array(self.G[layer], nodelist=self.nodes) + ) + + self.u = self.u[self.nodes] + self.v = self.v[self.nodes] + self.N = len(self.nodes) + self.Y = Y[np.ix_(np.arange(self.L), self.nodes, self.nodes)]
+ + +
+[docs] + def build_X(self, attributes: Optional[np.ndarray] = None): + """ + + Generate the design matrix. + + Parameters + ---------- + attributes : np.ndarray, optional + The latent variables representing the contribution of the attributes. + If None, the attributes will be generated. + + Raises + ------ + ValueError + If the shape of the parameter `beta` is not (K, Z). + """ + # Latent variables + + if attributes is None: + # generate attributes + self.beta = self._generate_lv_attributes() + else: + # set attributes + self.beta = attributes + if self.beta.shape != (self.K, self.Z): + raise ValueError("The shape of the parameter beta has to be (K, Z).") + self.beta = normalize_nonzero_membership(self.beta, axis=1) + + # Generate X + + self.pi = pi_ik_matrix(self.u, self.v, self.beta) + categories = [f"attr{z+1}" for z in range(self.Z)] + self.X = np.array( + [self.rng.choice(categories, p=self.pi[i]) for i in np.arange(self.N)] + ).reshape(self.N) + try: + self.X = self.X[self.nodes] + except IndexError: + logging.debug("X couldn't be sliced by nodes.")
+ + + def _generate_lv_attributes(self): + """ + Generate latent variables representing the contribution of the attributes. + """ + # Generate beta + beta = np.zeros((self.K, self.Z)) + for k in range(min(self.K, self.Z)): + beta[k, k] = 1.0 + if self.Z > self.K: + for z in range(self.K, self.Z): + beta[:, z] = 0.5 + if self.Z < self.K: + for k in range(self.Z, self.K): + beta[k, :] = 0.5 + + return beta + + def _plot_M(self, cmap="PuBuGn"): + """ + Plot the marginal means produced by the generative algorithm. + """ + + for layer in range(self.L): + fig, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(self.M[layer], cmap=plt.get_cmap(cmap)) + ax.set_title(f"Marginal means matrix layer {layer}", fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + plt.show() + + def _plot_pi(self, cmap="PuBuGn"): + """ + Plot the parameters of the categorical attribute produced by the generative algorithm. + """ + + fig, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(self.pi, cmap=plt.get_cmap(cmap), aspect="auto") + ax.set_title(f"Marginal means categorical attribute", fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) + plt.show()
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/synthetic/reciprocity.html b/_modules/probinet/synthetic/reciprocity.html new file mode 100644 index 0000000..75c4709 --- /dev/null +++ b/_modules/probinet/synthetic/reciprocity.html @@ -0,0 +1,1306 @@ + + + + + + + + + + probinet.synthetic.reciprocity — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.synthetic.reciprocity

+"""
+Class definition of the reciprocity generative models with the member functions required.
+It builds a directed, possibly weighted, network.
+"""
+
+import logging
+import math
+import sys
+import warnings
+from pathlib import Path
+from typing import Optional, Tuple
+
+import networkx as nx
+import numpy as np
+from scipy.optimize import brentq
+from scipy.sparse import tril, triu
+
+from probinet.visualization.plot import plot_A
+
+from ..evaluation.expectation_computation import compute_mean_lambda0
+from ..input.stats import print_graph_stats, reciprocal_edges
+from ..models.constants import OUTPUT_FOLDER
+from ..types import EndFileType
+from ..utils.matrix_operations import (
+    Exp_ija_matrix,
+    normalize_nonzero_membership,
+    transpose_matrix,
+    transpose_tensor,
+)
+from ..utils.tools import check_symmetric, log_and_raise_error, output_adjacency
+from .base import (
+    DEFAULT_ETA,
+    BaseSyntheticNetwork,
+    GraphProcessingMixin,
+    StandardMMSBM,
+    Structure,
+    affinity_matrix,
+)
+
+if not sys.warnoptions:
+    warnings.simplefilter("ignore")
+
+
+
+[docs] +class GM_reciprocity(GraphProcessingMixin): + """ + A class to generate a directed, possibly weighted, network with reciprocity. + """ + + def __init__( + self, + N: int, + K: int, + eta: float = 0.5, + avg_degree: float = 3, + over: float = 0.0, + corr: float = 0.0, + seed: int = 0, + alpha: float = 0.1, + ag: float = 0.1, + beta: float = 0.1, + Normalization: int = 0, + structure: str = Structure.ASSORTATIVE.value, + end_file: Optional[EndFileType] = None, + out_folder: Path = OUTPUT_FOLDER, + output_parameters: bool = False, + output_adj: bool = False, + outfile_adj: Optional[str] = None, + ExpM: Optional[float] = None, + ): + """ + Initialize the GM_reciprocity class with the given parameters. + + Parameters + ---------- + N : int + Number of nodes in the network. + K : int + Number of communities in the network. + eta : float, optional + Reciprocity coefficient. + k : float, optional + Average degree of the network. + over : float, optional + Fraction of nodes with mixed membership. + corr : float, optional + Correlation between u and v synthetically generated. + seed : int, optional + Seed for the random number generator. + alpha : float, optional + Parameter of the Dirichlet distribution. + ag : float, optional + Alpha parameter of the Gamma distribution. + beta : float, optional + Beta parameter of the Gamma distribution. + Normalization : int, optional + Indicator for choosing how to generate the latent variables. + structure : str, optional + Structure of the affinity matrix W. + end_file : str, optional + Output file suffix. + out_folder : str, optional + Path for storing the output. + output_parameters : bool, optional + Flag for storing the parameters. + output_adj : bool, optional + Flag for storing the generated adjacency matrix. + outfile_adj : str, optional + Name for saving the adjacency matrix. + ExpM : Optional[float], optional + Expected number of edges. + """ + self.N = N # number of nodes + self.K = K # number of communities + self.avg_degree = avg_degree # average degree + self.seed = seed # random seed + self.rng = np.random.RandomState(self.seed) + self.alpha = alpha # parameter of the Dirichlet distribution + self.ag = ag # alpha parameter of the Gamma distribution + self.beta = beta # beta parameter of the Gamma distribution + self.end_file = end_file # evaluation file suffix + self.out_folder = out_folder # path for storing the evaluation + self.output_parameters = output_parameters # flag for storing the parameters + self.output_adj = output_adj # flag for storing the generated adjacency matrix + self.outfile_adj = outfile_adj # name for saving the adjacency matrix + if (eta < 0) or (eta >= 1): # reciprocity coefficient + log_and_raise_error( + ValueError, "The reciprocity coefficient eta has to be in [0, 1)!" + ) + self.eta = eta + if ExpM is None: # expected number of edges + self.ExpM = int(self.N * self.avg_degree / 2.0) + else: + self.ExpM = int(ExpM) + self.avg_degree = 2 * self.ExpM / float(self.N) + if (over < 0) or (over > 1): # fraction of nodes with mixed membership + log_and_raise_error( + ValueError, "The overlapping parameter has to be in [0, 1]!" + ) + self.over = over + if (corr < 0) or ( + corr > 1 + ): # correlation between u and v synthetically generated + log_and_raise_error( + ValueError, "The correlation parameter corr has to be in [0, 1]!" + ) + + self.corr = corr + if Normalization not in { + 0, + 1, + }: # indicator for choosing how to generate the latent variables + message = ( + "The Normalization parameter can be either 0 or 1! It is used as an " + "indicator for generating the membership matrices u and v from a Dirichlet or a Gamma " + "distribution, respectively. It is used when there is overlapping." + ) + log_and_raise_error(ValueError, message) + self.Normalization = Normalization + if structure not in { + "assortative", + "disassortative", + }: # structure of the affinity matrix W + message = ( + "The structure of the affinity matrix w can be either assortative or " + "disassortative!" + ) + log_and_raise_error(ValueError, message) + self.structure = structure + +
+[docs] + def reciprocity_planted_network( + self, + parameters: Optional[Tuple[np.ndarray, np.ndarray, np.ndarray, float]] = None, + ) -> Tuple[nx.MultiDiGraph, np.ndarray]: + """ + Generate a directed, possibly weighted network by using the reciprocity generative model. + Can be used to generate benchmarks for networks with reciprocity. + + Steps: + 1. Generate the latent variables. + 2. Extract A_ij entries (network edges) from a Poisson distribution; + its mean depends on the latent variables. + + Parameters + ---------- + parameters: Tuple[np.ndarray, np.ndarray, np.ndarray, float], optional + Latent variables u, v, w, and eta. + + Returns + ------- + G: MultiDiGraph + MultiDiGraph NetworkX object. + A: np.ndarray + The adjacency matrix of the generated network. + """ + # Check if parameters are provided + if parameters is not None: + # If parameters are provided, set u, v, w, and eta to the provided values + self.u, self.v, self.w, self.eta = parameters + else: + # If parameters are not provided, initialize u, v, and w + # Calculate the size of each community + size = int(self.N / self.K) + + # Initialize u and v as zero matrices + self.u = np.zeros((self.N, self.K)) + self.v = np.zeros((self.N, self.K)) + + # Loop over all nodes + for i in range(self.N): + # Calculate the community index for the current node + q = int(math.floor(float(i) / float(size))) + + # If the community index is equal to the number of communities + if q == self.K: + # Assign the last community to the remaining nodes + self.u[i:, self.K - 1] = 1.0 + self.v[i:, self.K - 1] = 1.0 + else: + # Assign the current community to the nodes in the current range + for j in range(q * size, q * size + size): + self.u[j, q] = 1.0 + self.v[j, q] = 1.0 + + # Generate the affinity matrix w + self.w = affinity_matrix( + structure=self.structure, N=self.N, K=self.K, a=0.1, b=0.3 + ) + + # Check if there is overlapping in the communities + if self.over != 0.0: + # Calculate the number of nodes belonging to more communities + overlapping = int(self.N * self.over) + # Randomly select 'overlapping' number of nodes + ind_over = np.random.randint(len(self.u), size=overlapping) + + # Check the normalization method + if self.Normalization == 0: + # If Normalization is 0, generate u and v from a Dirichlet distribution + self.u[ind_over] = self.rng.dirichlet( + self.alpha * np.ones(self.K), overlapping + ) + self.v[ind_over] = self.corr * self.u[ind_over] + ( + 1.0 - self.corr + ) * self.rng.dirichlet(self.alpha * np.ones(self.K), overlapping) + + # If correlation is 1, ensure u and v are close + if self.corr == 1.0: + assert np.allclose(self.u, self.v) + + # If correlation is greater than 0, normalize v + if self.corr > 0: + self.v = normalize_nonzero_membership(self.v) + elif self.Normalization == 1: + # If Normalization is 1, generate u and v from a Gamma distribution + self.u[ind_over] = self.rng.gamma( + self.ag, 1.0 / self.beta, size=(overlapping, self.K) + ) + self.v[ind_over] = self.corr * self.u[ind_over] + ( + 1.0 - self.corr + ) * self.rng.gamma( + self.ag, 1.0 / self.beta, size=(overlapping, self.K) + ) + + # Normalize u and v + self.u = normalize_nonzero_membership(self.u) + self.v = normalize_nonzero_membership(self.v) + + # Compute the expected number of edges between each pair of nodes + M0 = Exp_ija_matrix(self.u, self.v, self.w) # whose elements are lambda0_{ij} + np.fill_diagonal(M0, 0) + + # Compute the constant to enforce sparsity in the network + c = (self.ExpM * (1.0 - self.eta)) / M0.sum() + + # Compute the expected number of edges between each pair of nodes considering reciprocity + MM = (M0 + self.eta * transpose_matrix(M0)) / ( + 1.0 - self.eta * self.eta + ) # whose elements are m_{ij} + Mt = transpose_matrix(MM) + MM0 = M0.copy() # to be not influenced by c_lambda + + # Adjust the affinity matrix w and the expected number of edges M0 by the constant c + if parameters is None: + self.w *= c # only w is impact by that, u and v have a constraint, + # their sum over k should sum to 1 + M0 *= c + M0t = transpose_matrix(M0) # whose elements are lambda0_{ji} + + # Compute the expected number of edges between each pair of nodes considering reciprocity + M = (M0 + self.eta * M0t) / ( + 1.0 - self.eta * self.eta + ) # whose elements are m_{ij} + np.fill_diagonal(M, 0) + + # Compute the expected reciprocity in the network + Exp_r = self.eta + ((MM0 * Mt + self.eta * Mt**2).sum() / MM.sum()) + + # Generate the network G and the adjacency matrix A using the latent variables + G = nx.MultiDiGraph() + for i in range(self.N): + G.add_node(i) + + counter, totM = 0, 0 + for i in range(self.N): + for j in range(i + 1, self.N): + r = self.rng.random(1)[0] + if r < 0.5: + # Draw the number of edges from node i to node j from a Poisson distribution + A_ij = self.rng.poisson(M[i, j], 1)[ + 0 + ] # draw A_ij from P(A_ij) = Poisson(m_ij) + if A_ij > 0: + G.add_edge(i, j, weight=A_ij) + # Compute the expected number of edges from node j to node i considering + # reciprocity + lambda_ji = M0[j, i] + self.eta * A_ij + # Draw the number of edges from node j to node i from a Poisson distribution + A_ji = self.rng.poisson(lambda_ji, 1)[ + 0 + ] # draw A_ji from P(A_ji|A_ij) = Poisson(lambda0_ji + eta*A_ij) + if A_ji > 0: + G.add_edge(j, i, weight=A_ji) + else: + # Draw the number of edges from node j to node i from a Poisson distribution + A_ji = self.rng.poisson(M[j, i], 1)[ + 0 + ] # draw A_ij from P(A_ij) = Poisson(m_ij) + if A_ji > 0: + G.add_edge(j, i, weight=A_ji) + # Compute the expected number of edges from node i to node j considering + # reciprocity + lambda_ij = M0[i, j] + self.eta * A_ji + # Draw the number of edges from node i to node j from a Poisson distribution + A_ij = self.rng.poisson(lambda_ij, 1)[ + 0 + ] # draw A_ji from P(A_ji|A_ij) = Poisson(lambda0_ji + eta*A_ij) + if A_ij > 0: + G.add_edge(i, j, weight=A_ij) + counter += 1 + totM += A_ij + A_ji + + # Keep only the largest connected component of the network + Gc = max(nx.weakly_connected_components(G), key=len) + nodes_to_remove = set(G.nodes()).difference(Gc) + G.remove_nodes_from(list(nodes_to_remove)) + + # Update the list of nodes and the number of nodes + nodes = list(G.nodes()) + self.u = self.u[nodes] + self.v = self.v[nodes] + self.N = len(nodes) + + # Convert the network to a sparse adjacency matrix + A = nx.to_scipy_sparse_array(G, nodelist=nodes, weight="weight") + + # Compute the average degree and the average weighted degree in the network + Sparsity_cof = np.round(2 * G.number_of_edges() / float(G.number_of_nodes()), 3) + ave_w_deg = np.round(2 * totM / float(G.number_of_nodes()), 3) + + # Compute the weighted reciprocity + rw = np.multiply(A, A.T).sum() / A.sum() + + logging.info( + "Number of links in the upper triangular matrix: %s", triu(A, k=1).nnz + ) + logging.info( + "Number of links in the lower triangular matrix: %s", tril(A, k=-1).nnz + ) + logging.info( + "Sum of weights in the upper triangular matrix: %.3f", + triu(A, k=1).sum(), + ) + logging.info( + "Sum of weights in the lower triangular matrix: %.3f", + tril(A, k=-1).sum(), + ) + logging.info("Number of possible unordered pairs: %s", counter) + logging.info( + "Removed %s nodes, because not part of the largest connected component", + len(nodes_to_remove), + ) + logging.info("Number of nodes: %s", G.number_of_nodes()) + logging.info("Number of edges: %s", G.number_of_edges()) + logging.info("Average degree (2E/N): %s", Sparsity_cof) + logging.info("Average weighted degree (2M/N): %s", ave_w_deg) + logging.info("Expected reciprocity: %.3f", Exp_r) + logging.info("Reciprocity (networkX) = %.3f", nx.reciprocity(G)) + logging.info("Reciprocity (considering the weights of the edges) = %.3f", rw) + + # Output the parameters of the network if output_parameters is True + if self.output_parameters: + self.output_results(nodes) + + # Output the adjacency matrix of the network if output_adj is True + if self.output_adj: + self.output_adjacency(G, outfile=self.outfile_adj) + + return G, A
+ + +
+[docs] + def planted_network_cond_independent( + self, parameters: Optional[Tuple[np.ndarray, np.ndarray, np.ndarray]] = None + ) -> Tuple[nx.MultiDiGraph, np.ndarray]: + """ + Generate a directed, possibly weighted network without using reciprocity. + It uses conditionally independent A_ij from a Poisson | (u,v,w). + + Parameters + ---------- + parameters: Tuple[np.ndarray, np.ndarray, np.ndarray], optional + Latent variables u, v, and w. + + Returns + ------- + G: MultiDigraph + MultiDiGraph NetworkX object. + A: np.ndarray + The adjacency matrix of the generated network. + """ + + # Set latent variables u,v,w + if parameters is not None: + # If parameters are provided, set u, v, w to the provided values + self.u, self.v, self.w = parameters + else: + # If parameters are not provided, initialize u, v, and w + # Calculate the size of each community + size = int(self.N / self.K) + + # Initialize u and v as zero matrices + self.u = np.zeros((self.N, self.K)) + self.v = np.zeros((self.N, self.K)) + + # Loop over all nodes + for i in range(self.N): + # Calculate the community index for the current node + q = int(math.floor(float(i) / float(size))) + + # If the community index is equal to the number of communities + if q == self.K: + # Assign the last community to the remaining nodes + self.u[i:, self.K - 1] = 1.0 + self.v[i:, self.K - 1] = 1.0 + else: + # Assign the current community to the nodes in the current range + for j in range(q * size, q * size + size): + self.u[j, q] = 1.0 + self.v[j, q] = 1.0 + + # Generate the affinity matrix w + self.w = affinity_matrix( + structure=self.structure, N=self.N, K=self.K, a=0.1, b=0.3 + ) + + # Check if there is overlapping in the communities + if self.over != 0.0: + # Calculate the number of nodes belonging to more communities + overlapping = int(self.N * self.over) + # Randomly select 'overlapping' number of nodes + ind_over = np.random.randint(len(self.u), size=overlapping) + + # Check the normalization method + if self.Normalization == 0: + # If Normalization is 0, generate u and v from a Dirichlet distribution + self.u[ind_over] = self.rng.dirichlet( + self.alpha * np.ones(self.K), overlapping + ) + self.v[ind_over] = self.corr * self.u[ind_over] + ( + 1.0 - self.corr + ) * self.rng.dirichlet(self.alpha * np.ones(self.K), overlapping) + + # If correlation is 1, ensure u and v are close + if self.corr == 1.0: + assert np.allclose(self.u, self.v) + + # If correlation is greater than 0, normalize v + if self.corr > 0: + self.v = normalize_nonzero_membership(self.v) + elif self.Normalization == 1: + # If Normalization is 1, generate u and v from a Gamma distribution + self.u[ind_over] = self.rng.gamma( + self.ag, 1.0 / self.beta, size=(overlapping, self.K) + ) + self.v[ind_over] = self.corr * self.u[ind_over] + ( + 1.0 - self.corr + ) * self.rng.gamma( + self.ag, 1.0 / self.beta, size=(overlapping, self.K) + ) + + # Normalize u and v + self.u = normalize_nonzero_membership(self.u) + self.v = normalize_nonzero_membership(self.v) + + # Compute the expected number of edges between each pair of nodes + M0 = Exp_ija_matrix(self.u, self.v, self.w) # whose elements are lambda0_{ij} + np.fill_diagonal(M0, 0) + M0t = transpose_matrix(M0) # whose elements are lambda0_{ji} + + # Compute the expected reciprocity in the network + rw = (M0 * M0t).sum() / M0.sum() # expected reciprocity + + # Compute the constant to enforce sparsity in the network + c = self.ExpM / float(M0.sum()) # constant to enforce sparsity + + # Adjust the affinity matrix w and the expected number of edges M0 by the constant c + if parameters is None: + self.w *= c # only w is impact by that, u and v have a constraint, their sum over k should sum to 1 + + # Generate network G (and adjacency matrix A) using the latent variable, + # with the generative model (A_ij) ~ P(A_ij|u,v,w) + G = nx.MultiDiGraph() + for i in range(self.N): + G.add_node(i) + + totM = 0 + for i in range(self.N): + for j in range(self.N): + if i != j: # no self-loops + # draw A_ij from P(A_ij) = Poisson(c*m_ij) + A_ij = self.rng.poisson(c * M0[i, j], 1)[0] + if A_ij > 0: + G.add_edge(i, j, weight=A_ij) + totM += A_ij + + nodes = list(G.nodes()) + + # keep largest connected component + Gc = max(nx.weakly_connected_components(G), key=len) + nodes_to_remove = set(G.nodes()).difference(Gc) + G.remove_nodes_from(list(nodes_to_remove)) + + # Update the list of nodes and the number of nodes + nodes = list(G.nodes()) + self.u = self.u[nodes] + self.v = self.v[nodes] + self.N = len(nodes) + + # Convert the network to a sparse adjacency matrix + A = nx.to_scipy_sparse_array(G, nodelist=nodes, weight="weight") + + # Calculate the average degree and the average weighted degree in the graph + Sparsity_cof = np.round(2 * G.number_of_edges() / float(G.number_of_nodes()), 3) + ave_w_deg = np.round(2 * totM / float(G.number_of_nodes()), 3) + + # Calculate the proportion of bi-directional edges over the unordered pairs of nodes + reciprocity_c = np.round(reciprocal_edges(G), 3) + + logging.info( + "Number of links in the upper triangular matrix: %s", triu(A, k=1).nnz + ) + logging.info( + "Number of links in the lower triangular matrix: %s", tril(A, k=-1).nnz + ) + logging.info( + "Sum of weights in the upper triangular matrix: %s", + np.round(triu(A, k=1).sum(), 2), + ) + logging.info( + "Sum of weights in the lower triangular matrix: %s", + np.round(tril(A, k=-1).sum(), 2), + ) + logging.info( + "Removed %s nodes, because not part of the largest connected component", + len(nodes_to_remove), + ) + logging.info("Number of nodes: %s", G.number_of_nodes()) + logging.info("Number of edges: %s", G.number_of_edges()) + logging.info("Average degree (2E/N): %s", Sparsity_cof) + logging.info("Average weighted degree (2M/N): %s", ave_w_deg) + logging.info("Expected reciprocity: %.3f", rw) + logging.info( + "Reciprocity (intended as the proportion of bi-directional edges over the " + "unordered pairs): %s", + reciprocity_c, + ) + + # Output the parameters of the network if output_parameters is True + if self.output_parameters: + self.output_results(nodes) + + # Output the adjacency matrix of the network if output_adj is True + if self.output_adj: + self.output_adjacency(G, outfile=self.outfile_adj) + + return G, A
+ + +
+[docs] + def planted_network_reciprocity_only( + self, p: Optional[float] = None + ) -> Tuple[nx.MultiDiGraph, np.ndarray]: + """ + Generate a directed, possibly weighted network using only reciprocity. + One of the directed-edges is generated with probability p, the other with eta*A_ji, + i.e. as in Erdos-Renyi reciprocity. + + Parameters + ---------- + p: float, optional + Probability to generate one of the directed-edge. + + Returns + ------- + G: MultiDigraph + MultiDiGraph NetworkX object. + A: np.ndarray + The adjacency matrix of the generated network. + """ + # If p is not provided, calculate it based on eta, k, and N + if p is None: + p = (1.0 - self.eta) * self.avg_degree * 0.5 / (self.N - 1.0) + + # Initialize a directed graph G + G = nx.MultiDiGraph() + for i in range(self.N): + G.add_node(i) + + # Initialize total weight of the graph + totM = 0 + + # Generate edges for the graph + for i in range(self.N): + for j in range(i + 1, self.N): + # Draw two random numbers from Poisson distribution + A0 = self.rng.poisson(p, 1)[0] + A1 = self.rng.poisson(p + A0, 1)[0] + r = self.rng.random(1)[0] + # Add edges to the graph based on the drawn numbers + if r < 0.5: + if A0 > 0: + G.add_edge(i, j, weight=A0) + if A1 > 0: + G.add_edge(j, i, weight=A1) + else: + if A0 > 0: + G.add_edge(j, i, weight=A0) + if A1 > 0: + G.add_edge(i, j, weight=A1) + # Update total weight of the graph + totM += A0 + A1 + + # Keep only the largest connected component of the graph + Gc = max(nx.weakly_connected_components(G), key=len) + nodes_to_remove = set(G.nodes()).difference(Gc) + G.remove_nodes_from(list(nodes_to_remove)) + + # Update the list of nodes and the number of nodes + nodes = list(G.nodes()) + self.N = len(nodes) + + # Convert the graph to a sparse adjacency matrix + A = nx.to_scipy_sparse_array(G, nodelist=nodes, weight="weight") + + # Calculate the average degree and the average weighted degree in the graph + Sparsity_cof = np.round(2 * G.number_of_edges() / float(G.number_of_nodes()), 3) + ave_w_deg = np.round(2 * totM / float(G.number_of_nodes()), 3) + + # Calculate the proportion of bi-directional edges over the unordered pairs of nodes + reciprocity_c = np.round(reciprocal_edges(G), 3) + + logging.info( + "Number of links in the upper triangular matrix: %s", triu(A, k=1).nnz + ) + logging.info( + "Number of links in the lower triangular matrix: %s", tril(A, k=-1).nnz + ) + logging.info( + "Sum of weights in the upper triangular matrix: %s", + np.round(triu(A, k=1).sum(), 2), + ) + logging.info( + "Sum of weights in the lower triangular matrix: %s", + np.round(tril(A, k=-1).sum(), 2), + ) + logging.info( + "Removed %s nodes, because not part of the largest connected component", + len(nodes_to_remove), + ) + logging.info("Number of nodes: %s", G.number_of_nodes()) + logging.info("Number of edges: %s", G.number_of_edges()) + logging.info("Average degree (2E/N): %s", Sparsity_cof) + logging.info("Average weighted degree (2M/N): %s", ave_w_deg) + logging.info( + "Reciprocity (intended as the proportion of bi-directional edges over the " + "unordered pairs): %s", + reciprocity_c, + ) + + # Output the adjacency matrix of the graph if output_adj is True + if self.output_adj: + self.output_adjacency(G, outfile=self.outfile_adj) + + return G, A
+
+ + + +
+[docs] +class ReciprocityMMSBM_joints(StandardMMSBM): + """ + Proposed benchmark. + Create a synthetic, directed, and binary network (possibly multilayer) + by a mixed-membership stochastic block-model with a reciprocity structure + - It models pairwise joint distributions with Bivariate Bernoulli distributions + """ + + def __init__(self, **kwargs): + self.__doc__ = BaseSyntheticNetwork.__init__.__doc__ + if "eta" in kwargs: + if (eta := kwargs["eta"]) <= 0: # pair interaction coefficient + message = ( + "The pair interaction coefficient eta has to be greater than 0!" + ) + log_and_raise_error(ValueError, message) + else: + message = f"eta parameter was not set. Defaulting to eta={DEFAULT_ETA}" + logging.warning(message) + eta = DEFAULT_ETA + self.eta = eta + + parameters = kwargs.get("parameters") + + super().init_mmsbm_params(**kwargs) + + self.build_Y(parameters=parameters) + + if self.output_parameters: + super()._output_parameters() + if self.output_adj: + output_adjacency(self.layer_graphs, self.out_folder, self.outfile_adj) + + if self.show_details: + print_graph_stats(self.G) + if self.show_plots: + plot_A(self.layer_graphs) + if self.M0 is not None: + self._plot_M() + +
+[docs] + def build_Y( + self, parameters: Optional[Tuple[np.ndarray, np.ndarray, np.ndarray]] = None + ) -> None: + """ + Generate network layers G using the latent variables, + with the generative model (A_ij,A_ji) ~ P(A_ij, A_ji|u,v,w,eta) + + Parameters + ---------- + parameters: Tuple[np.ndarray, np.ndarray, np.ndarray], optional + Latent variables u, v, and w. + """ + + # Latent variables + + if parameters is None: + # generate latent variables + self.u, self.v, self.w = self._generate_lv() + else: + # set latent variables + self.u, self.v, self.w = parameters + self._validate_parameters_shape( + self.u, self.v, self.w, self.N, self.K, self.L + ) + + # Generate Y + + self.G = [nx.DiGraph() for _ in range(self.L)] + self.layer_graphs = [] + + nodes_to_remove = [] + for layer in range(self.L): + for i in range(self.N): + self.G[layer].add_node(i) + + # whose elements are lambda0_{ij} + self.M0 = compute_mean_lambda0(self.u, self.v, self.w) + for layer in range(self.L): + np.fill_diagonal(self.M0[layer], 0) + if self.is_sparse: + # constant to enforce sparsity + c = brentq( + self._eq_c, + 0.00001, + 100.0, + args=(self.ExpEdges, self.M0[layer], self.eta), + ) + self.M0[layer] *= c + if parameters is None: + self.w[layer] *= c + # compute the normalization constant + self.Z = self._calculate_Z(self.M0, self.eta) + + for layer in range(self.L): + for i in range(self.N): + for j in range(i + 1, self.N): + # The probabilities look like [p00, p01, p10, p11] + probabilities = ( + np.array( + [ + 1.0, + self.M0[layer, j, i], + self.M0[layer, i, j], + self.M0[layer, i, j] * self.M0[layer, j, i] * self.eta, + ] + ) + / self.Z[layer, i, j] + ) + cumulative = [ + 1.0 / self.Z[layer, i, j], + np.sum(probabilities[:2]), + np.sum(probabilities[:3]), + 1.0, + ] + + r = self.rng.random(1)[0] + if r <= probabilities[0]: + A_ij, A_ji = 0, 0 + elif probabilities[0] < r <= cumulative[1]: + A_ij, A_ji = 0, 1 + elif cumulative[1] < r <= cumulative[2]: + A_ij, A_ji = 1, 0 + elif r > cumulative[2]: + A_ij, A_ji = 1, 1 + if A_ij > 0: + self.G[layer].add_edge(i, j, weight=1) # binary + if A_ji > 0: + self.G[layer].add_edge(j, i, weight=1) # binary + + assert len(list(self.G[layer].nodes())) == self.N + + # keep largest connected component + Gc = max(nx.weakly_connected_components(self.G[layer]), key=len) + nodes_to_remove.append(set(self.G[layer].nodes()).difference(Gc)) + + n_to_remove = nodes_to_remove[0].intersection(*nodes_to_remove) + self.layer_graphs = [] + for layer in range(self.L): + self._remove_nodes(self.G[layer], list(n_to_remove)) + self.nodes = self._update_nodes_list(self.G[layer]) + self._append_layer_graph(self.G[layer], self.nodes, self.layer_graphs) + + self.u = self.u[self.nodes] + self.v = self.v[self.nodes] + self.N = len(self.nodes)
+ + + def _calculate_Z(self, lambda_aij: np.ndarray, eta: float) -> np.ndarray: + """ + Compute the normalization constant of the Bivariate Bernoulli distribution. + + Parameters + ---------- + lambda_aij : ndarray + Tensor with the mean lambda for all entries. + eta : float + Reciprocity coefficient. + + Returns + ------- + Z : ndarray + Normalization constant Z of the Bivariate Bernoulli distribution. + """ + + Z = ( + lambda_aij + + transpose_tensor(lambda_aij) + + eta * np.einsum("aij,aji->aij", lambda_aij, lambda_aij) + + 1 + ) + check_symmetric(Z) + + return Z + + def _eq_c(self, c: float, ExpM: int, M: np.ndarray, eta: float) -> float: + """ + Compute the function to set to zero to find the value of the sparsity parameter c. + + Parameters + ---------- + c : float + Sparsity parameter. + ExpM : int + In-coming membership matrix. + M : ndarray + Mean lambda for all entries. + eta : float + Reciprocity coefficient. + + Returns + ------- + Value of the function to set to zero to find the value of the sparsity parameter c. + """ + + LeftHandSide = (c * M + c * c * eta * M * M.T) / ( + c * M + c * M.T + c * c * eta * M * M.T + 1.0 + ) + + return np.sum(LeftHandSide) - ExpM + + # pylint: disable= W0631 + def _plot_M(self, cmap: str = "PuBuGn") -> None: + """ + Plot the marginal means produced by the generative algorithm. + + Parameters + ---------- + cmap : Matplotlib object + Colormap used for the plot. + """ + M = (self.M0 + self.eta * self.M0 * transpose_tensor(self.M0)) / self.Z + self._plot_matrix(M, self.L, cmap)
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/utils/matrix_operations.html b/_modules/probinet/utils/matrix_operations.html new file mode 100644 index 0000000..f4d2b76 --- /dev/null +++ b/_modules/probinet/utils/matrix_operations.html @@ -0,0 +1,648 @@ + + + + + + + + + + probinet.utils.matrix_operations — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.utils.matrix_operations

+"""
+This module contains functions that perform matrix operations, such as the Khatri-Rao product.
+"""
+
+from typing import Optional, Tuple
+
+import numpy as np
+
+from probinet.utils.tools import log_and_raise_error
+
+
+
+[docs] +def sp_uttkrp_assortative( + vals: np.ndarray, + subs: Tuple[np.ndarray], + m: int, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + temporal: bool = False, +) -> np.ndarray: + """ + Compute the Khatri-Rao product (sparse version) with the assumption of assortativity. + + Parameters + ---------- + vals : ndarray + Values of the non-zero entries. + subs : tuple + Indices of elements that are non-zero. It is a n-tuple of array-likes and the length + of tuple n must be equal to the dimension of tensor. + m : int + Mode in which the Khatri-Rao product of the membership matrix is multiplied with the + tensor: if 1 it works with the matrix u; if 2 it works with v. + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + w : ndarray + Affinity tensor. + temporal : bool + If True, use the static version of the function. + + Returns + ------- + out : ndarray + Matrix which is the result of the matrix product of the unfolding of the tensor and + the Khatri-Rao product of the membership matrix. + """ + + if len(subs) < 3: + log_and_raise_error(ValueError, "subs_nz should have at least 3 elements.") + + # Determine the shape of the evaluation array + D, K = u.shape if m == 1 else v.shape + out = np.zeros((D, K)) + + for k in range(K): + # Copy the values to avoid modifying the original array + copied_vals = vals.copy() + # Select the appropriate indices + indices = subs[0] if temporal else 0 + # Select the appropriate slice of the affinity tensor + w_I = w[indices, k].astype(copied_vals.dtype) + # Select the appropriate slice of the membership matrix + multiplier_u_v = v[subs[2], k] if m == 1 else u[subs[1], k] + # Transform the multiplier to the same data type as the values + multiplier_u_v = multiplier_u_v.astype(copied_vals.dtype) + # Multiply the values by the affinity tensor slice and the membership matrix slice + copied_vals *= w_I * multiplier_u_v + # Update the evaluation matrix with the weighted sum of the values + out[:, k] += np.bincount(subs[m], weights=copied_vals, minlength=D) + + return out
+ + + +
+[docs] +def sp_uttkrp( + vals: np.ndarray, + subs: Tuple[np.ndarray], + m: int, + u: np.ndarray, + v: np.ndarray, + w: np.ndarray, + temporal: bool = True, +) -> np.ndarray: + """ + Compute the Khatri-Rao product (sparse version). + + Parameters + ---------- + vals : ndarray + Values of the non-zero entries. + subs : tuple + Indices of elements that are non-zero. It is a n-tuple of array-likes and the length + of tuple n must be equal to the dimension of tensor. + m : int + Mode in which the Khatri-Rao product of the membership matrix is multiplied with the + tensor: if 1 it + works with the matrix u; if 2 it works with v. + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + w : ndarray + Affinity tensor. + temporal : bool + Flag to determine if the function should behave in a temporal manner. + + Returns + ------- + out : ndarray + Matrix which is the result of the matrix product of the unfolding of the tensor and + the Khatri-Rao product + of the membership matrix. + """ + + if len(subs) < 3: + log_and_raise_error(ValueError, "subs_nz should have at least 3 elements.") + + D, K = 0, None + out: np.ndarray = np.array([]) + + if m < 3: + D, K = u.shape if m == 1 else v.shape + out = np.zeros((D, K)) + else: + log_and_raise_error(ValueError, "m should be 1 or 2.") + + if K is not None: + for k in range(K): + # Select the appropriate indices + indices = subs[0] if temporal else 0 + # Copy the values to avoid modifying the original array + copied_vals = vals.copy() + # Select the appropriate slice of the affinity tensor + w_I = w[indices, k, :] if m == 1 else w[indices, :, k] + # Ensure that the affinity tensor slice has the same data type as the values + w_I = (w_I if temporal else w_I[np.newaxis, :]).astype(copied_vals.dtype) + # Select the appropriate slice of the membership matrix + multiplier_u_v = v[subs[2], :] if m == 1 else u[subs[1], :] + # Ensure that the membership matrix slice has the same data type as the values + multiplier_u_v = ( + multiplier_u_v.astype(copied_vals.dtype) if temporal else multiplier_u_v + ) + # Multiply the values by the affinity tensor slice and the membership matrix slice + copied_vals *= (w_I * multiplier_u_v).sum(axis=1) + # Update the evaluation matrix with the weighted sum of the values + out[:, k] += np.bincount(subs[m], weights=copied_vals, minlength=D) + + return out
+ + + +
+[docs] +def normalize_nonzero_membership(u: np.ndarray, axis: Optional[int] = 1) -> np.ndarray: + """ + Given a matrix, it returns the same matrix normalized by row. + + Parameters + ---------- + u: ndarray + Numpy Matrix. + axis: Optional[int] + Axis along which the matrix should be normalized. + + Returns + ------- + The matrix normalized by row. + """ + + # Calculate the sum of elements along axis 1, keeping the same dimensions. + den1 = u.sum(axis=axis, keepdims=True) + + # Identify the positions where den1 is equal to 0 and create a boolean mask. + nzz = den1 == 0.0 + + # Replace the elements in den1 corresponding to positions where it is 0 + # with 1 to avoid division by zero. + den1[nzz] = 1.0 + + # Normalize the matrix u by dividing each element by the corresponding sum along axis 1. + return u / den1
+ + + +
+[docs] +def transpose_matrix(M: np.ndarray) -> np.ndarray: + """ + Compute the transpose of a matrix. + + Parameters + ---------- + M : ndarray + Numpy matrix. + + Returns + ------- + Transpose of the matrix. + """ + # Return the transpose of a matrix + return np.einsum("ij->ji", M)
+ + + +
+[docs] +def transpose_tensor(M: np.ndarray) -> np.ndarray: + """ + Given M tensor, it returns its transpose: for each dimension a, compute the transpose ij->ji. + + Parameters + ---------- + M : ndarray + Tensor with the mean lambda for all entries. + + Returns + ------- + Transpose version of M_aij, i.e. M_aji. + """ + + return np.einsum("aij->aji", M)
+ + + +
+[docs] +def Exp_ija_matrix(u: np.ndarray, v: np.ndarray, w: np.ndarray) -> np.ndarray: + """ + Compute the mean lambda0_ij for all entries. + + Parameters + ---------- + u : ndarray + Out-going membership matrix. + v : ndarray + In-coming membership matrix. + w : ndarray + Affinity matrix. + + Returns + ------- + M : ndarray + Mean lambda0_ij for all entries. + """ + + # Compute the outer product of matrices u and v, resulting in a 4D tensor M. + # Dimensions of M: (number of rows in u) x (number of columns in v) x + # (number of rows in u) x (number of columns in v) + M = np.einsum("ik,jq->ijkq", u, v) + + # Multiply the 4D tensor M element-wise with the 2D tensor w along the last dimension. + # Dimensions of w: (number of columns in v) x (number of columns in w) + # Resulting tensor after the einsum operation: (number of rows in u) x (number of rows in u) + M = np.einsum("ijkq,kq->ij", M, w) + + return M
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/utils/tools.html b/_modules/probinet/utils/tools.html new file mode 100644 index 0000000..35eb3ed --- /dev/null +++ b/_modules/probinet/utils/tools.html @@ -0,0 +1,852 @@ + + + + + + + + + + probinet.utils.tools — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.utils.tools

+"""
+This module contains utility functions for data manipulation and file I/O.
+"""
+
+import logging
+from os import PathLike
+from pathlib import Path
+from typing import Dict, List, Optional, Type, Union
+
+import networkx as nx
+import numpy as np
+import pandas as pd
+from sparse import COO
+
+from ..models.constants import ATOL_DEFAULT, RTOL_DEFAULT
+from ..types import ArraySequence
+
+
+
+[docs] +def can_cast_to_int(string: Union[int, float, str]) -> bool: + """ + Verify if one object can be converted to integer object. + + Parameters + ---------- + string : int or float or str + Name of the node. + + Returns + ------- + bool : bool + If True, the input can be converted to integer object. + """ + + try: + int(string) + return True + except ValueError: + logging.error("Cannot cast %s to integer.", string) + return False
+ + + +
+[docs] +def is_sparse(X: np.ndarray) -> bool: + """ + Check whether the input tensor is sparse. + It implements a heuristic definition of sparsity. A tensor is considered sparse if: + given + M = number of modes + S = number of entries + I = number of non-zero entries + then + N > M(I + 1) + + Parameters + ---------- + X : ndarray + Input data. + + Returns + ------- + Boolean flag: true if the input tensor is sparse, false otherwise. + """ + + # Get the number of dimensions of the input tensor X. + M = X.ndim + + # Get the total number of elements in the tensor X. + S = X.size + + # Get the number of non-zero elements in the tensor X using the first + # dimension of the non-zero indices. + I = X.nonzero()[0].size + + # Check if the tensor X is sparse based on a heuristic definition of sparsity. + # A tensor is considered sparse if the total number of elements is greater + # than (number of non-zero elements + 1) times the number of dimensions. + return S > (I + 1) * M
+ + + +
+[docs] +def sptensor_from_dense_array(X: np.ndarray) -> COO: + """ + Create a sparse tensor from a dense array using sparse.COO. + + Parameters + ---------- + X : ndarray + Input data. + + Returns + ------- + COO + Sparse tensor created from the dense array. + """ + # Get the non-zero indices and values from the dense array + coords = np.array(X.nonzero()) + data = X[tuple(coords)].astype(float) + + # Create the sparse tensor using COO format + sparse_X = COO(coords, data, shape=X.shape) + return sparse_X
+ + + +
+[docs] +def get_item_array_from_subs(A: np.ndarray, ref_subs: ArraySequence) -> np.ndarray: + """ + Retrieves the values of specific entries in a dense tensor. + Output is a 1-d array with dimension = number of non-zero entries. + + Parameters + ---------- + A : np.ndarray + The input tensor from which values are to be retrieved. + + ref_subs : Tuple[np.ndarray] + A tuple containing arrays of indices. Each array in the tuple corresponds to indices along + one dimension of the tensor. + + Returns + ------- + np.ndarray + A 1-dimensional array containing the values of the tensor at the specified indices. + """ + return np.array([A[tuple(sub)] for sub in zip(*ref_subs)])
+ + + +
+[docs] +def check_symmetric( + a: Union[np.ndarray, List[np.ndarray]], + rtol: float = RTOL_DEFAULT, + atol: float = ATOL_DEFAULT, +) -> bool: + """ + Check if a matrix or a list of matrices is symmetric. + + Parameters + ---------- + a : ndarray or list + Input data. + rtol : float + Relative convergence_tol. + atol : float + Absolute convergence_tol. + + Returns + ------- + True if the matrix is symmetric, False otherwise. + """ + + if isinstance(a, list): + return all(np.allclose(mat, mat.T, rtol=rtol, atol=atol) for mat in a) + + return np.allclose(a, a.T, rtol=rtol, atol=atol)
+ + + +
+[docs] +def build_edgelist(A: COO, layer: int) -> pd.DataFrame: + """ + Build the edgelist for a given layer of an adjacency tensor in DataFrame format. + + Parameters + ---------- + A : coo_matrix + Sparse matrix in COOrdinate format representing the adjacency tensor. + layer : int + Index of the layer for which the edgelist is to be built. + + Returns + ------- + pd.DataFrame + DataFrame containing the edgelist for the specified layer with columns 'source', 'target', and 'L<layer>'. + """ + + # Convert the input sparse matrix A to COOrdinate format + A_coo = A.tocoo() + + # Create a dictionary with 'source', 'target', and 'L' keys + # 'source' and 'target' represent the row and column indices of non-zero elements in A + # 'L' represents the data of non-zero elements in A + data_dict = {"source": A_coo.row, "target": A_coo.col, "L" + str(layer): A_coo.data} + + # Convert the dictionary to a pandas DataFrame + df_res = pd.DataFrame(data_dict) + + return df_res
+ + + +
+[docs] +def output_adjacency(A: List, out_folder: PathLike, label: str): + """ + Save the adjacency tensor to a file. + Default format is space-separated .csv with L+2 columns: source_node target_node + edge_l0 ... edge_lL . + + Parameters + ---------- + A : ndarray + Adjacency tensor. + out_folder : str + Output folder. + label : str + Label of the evaluation file. + """ + + # Concatenate the label with '.dat' to form the evaluation file name + outfile = label + ".dat" + + # Create a Path object for the evaluation folder + out_folder_path = Path(out_folder) if isinstance(out_folder, str) else out_folder + + # Create the evaluation directory. If the directory already exists, no exception is raised. + # parents=True ensures that any missing parent directories are also created. + out_folder_path.mkdir(parents=True, exist_ok=True) + + # For each layer in A, build an edge list and store them in a list + df_list = [build_edgelist(A[layer], layer) for layer in range(len(A))] + + # Concatenate all the DataFrames in the list into a single DataFrame + df = pd.concat(df_list) + + # Save the DataFrame to a CSV file in the evaluation directory + # index=False prevents pandas from writing row indices in the CSV file + # sep=' ' specifies that the fields are separated by a space + df.to_csv(out_folder_path / outfile, index=False, sep=" ") + + # Print the location where the adjacency matrix is saved + logging.info("Adjacency matrix saved in: %s", out_folder_path / outfile)
+ + + +
+[docs] +def write_adjacency( + G: List[nx.MultiDiGraph], + folder: str = "./", + fname: str = "multilayer_network.csv", + ego: str = "source", + alter: str = "target", +): + """ + Save the adjacency tensor to file. + + Parameters + ---------- + G : list + List of MultiDiGraph NetworkX objects. + folder : str + Path of the folder where to save the files. + fname : str + Name of the adjacency tensor file. + ego : str + Name of the column to consider as source of the edge. + alter : str + Name of the column to consider as target of the edge. + """ + + N = G[0].number_of_nodes() + L = len(G) + B = np.empty(shape=[len(G), N, N]) + for layer in range(len(G)): + B[layer, :, :] = nx.to_numpy_array(G[layer], weight="weight") + df_list = [] + for i in range(N): + for j in range(N): + Z = 0 + for layer in range(L): + Z += B[layer][i][j] + if Z > 0: + data = [i, j] + data.extend([int(B[a][i][j]) for a in range(L)]) + df_list.append(data) + cols = [ego, alter] + cols.extend(["L" + str(l) for l in range(1, L + 1)]) + df = pd.DataFrame(df_list, columns=cols) + df.to_csv(path_or_buf=folder + fname, index=False) + logging.info("Adjacency tensor saved in: %s", folder + fname)
+ + + +
+[docs] +def create_design_matrix( + metadata: Dict[str, str], nodeID: str = "Name", attr_name: str = "Metadata" +) -> pd.DataFrame: + """ + Create the design matrix DataFrame from metadata. + + Parameters + ---------- + metadata : dict + Dictionary where the keys are the node labels and the values are the metadata associated to them. + nodeID : str + Name of the column with the node labels. + attr_name : str + Name of the column to consider as attribute. + + Returns + ------- + X : DataFrame + Design matrix + """ + # Create a DataFrame from the metadata dictionary + X = pd.DataFrame.from_dict(metadata, orient="index", columns=[attr_name]) + + # Create a new column with the node labels + X[nodeID] = X.index + + # Select the columns in the order specified by nodeID and attr_name + X = X.loc[:, [nodeID, attr_name]] + + return X
+ + + +
+[docs] +def save_design_matrix( + X: pd.DataFrame, perc: float, folder: str = "./", fname: str = "X_" +): + """ + Save the design matrix to file. + + Parameters + ---------- + X : DataFrame + Design matrix. + perc : float + Fraction of match between communities and metadata. + folder : str + Path of the folder where to save the files. + fname : str + Name of the design matrix file. + """ + # Construct the file path using f-string formatting and Path + file_path = Path(folder) / f"{fname}{str(perc)[0]}_{str(perc)[2]}.csv" + + # Save the DataFrame to a CSV file + X.to_csv(path_or_buf=file_path, index=False) + + # Log the location where the design matrix is saved + logging.debug("Design matrix saved in: %s", file_path)
+ + + +
+[docs] +def write_design_matrix( + metadata: Dict[str, str], + perc: float, + folder: str = "./", + fname: str = "X_", + nodeID: str = "Name", + attr_name: str = "Metadata", +) -> pd.DataFrame: + """ + Save the design matrix to file. + + Parameters + ---------- + metadata : dict + Dictionary where the keys are the node labels and the values are the metadata associated to them. + perc : float + Fraction of match between communities and metadata. + folder : str + Path of the folder where to save the files. + fname : str + Name of the design matrix file. + nodeID : str + Name of the column with the node labels. + attr_name : str + Name of the column to consider as attribute. + + Returns + ------- + X : DataFrame + Design matrix + """ + # Create the design matrix DataFrame from metadata + X = create_design_matrix(metadata, nodeID=nodeID, attr_name=attr_name) + + # Save the design matrix to a CSV file + save_design_matrix(X, perc=perc, folder=folder, fname=fname) + + return X
+ + + +
+[docs] +def log_and_raise_error(error_type: Type[BaseException], message: str) -> None: + """ + Logs an error message and raises an exception of the specified type. + + Parameters + ---------- + error_type : Type[BaseException] + The type of the exception to be raised. + message : str + The error message to be logged and included in the exception. + + Raises + ------ + BaseException + An exception of the specified type with the given message. + """ + + # Log the error message + logging.error(message) + + # Raise the exception + raise error_type(message)
+ + + +
+[docs] +def flt(x: float, d: int = 3) -> float: + """ + Round a number to a specified number of decimal places. + + Parameters + ---------- + x : float + Number to be rounded. + d : int + Number of decimal places to round to. + Returns + ------- + float + The input number rounded to the specified number of decimal places. + """ + return round(x, d)
+ + + +
+[docs] +def get_or_create_rng(rng: Optional[np.random.Generator] = None) -> np.random.Generator: + """ + Set the random seed and initialize the random number generator. + + Parameters + ---------- + rng : Optional[np.random.Generator] + Random number generator. If None, a new generator is created using the seed. + + Returns + ------- + np.random.Generator + Initialized random number generator. + """ + return rng if rng else np.random.default_rng()
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_modules/probinet/visualization/plot.html b/_modules/probinet/visualization/plot.html new file mode 100644 index 0000000..b3b689a --- /dev/null +++ b/_modules/probinet/visualization/plot.html @@ -0,0 +1,1023 @@ + + + + + + + + + + probinet.visualization.plot — probinet documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + +
+
+ + + + + + +
+ + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + +
+ +

Source code for probinet.visualization.plot

+"""
+It provides a set of plotting functions for visualizing the results of the generative models.
+"""
+
+from typing import Dict, List, Optional, Tuple
+
+import matplotlib.pyplot as plt
+import networkx as nx
+import numpy as np
+import seaborn as sns
+from matplotlib import colormaps, gridspec
+from matplotlib.ticker import MaxNLocator
+
+
+
+[docs] +def plot_hard_membership( + graph: nx.DiGraph, + communities: Dict, + pos: Dict, + node_size: np.ndarray, + colors: Dict, + edge_color: str, +) -> plt.Figure: + """ + Plot a graph with nodes colored by their hard memberships. + + Parameters + ---------- + graph : nx.DiGraph + Graph to be plotted. + communities : Dict + Dictionary with the communities. + pos : Dict + Dictionary with the positions of the nodes. + node_size : ndarray + Array with the sizes of the nodes. + colors : Dict + Dictionary with the colors of the nodes. + edge_color : str + Color of the edges. + + Returns + ------- + fig : plt.Figure + The matplotlib figure object. + """ + + fig = plt.figure(figsize=(8, 3)) + for i, k in enumerate(communities): + plt.subplot(1, 2, i + 1) + nx.draw_networkx( + graph, + pos, + node_size=node_size, + node_color=[colors[node] for node in communities[k]], + with_labels=False, + width=0.5, + edge_color=edge_color, + arrows=True, + arrowsize=5, + connectionstyle="arc3,rad=0.2", + ) + plt.title(rf"${k}$", fontsize=17) + plt.axis("off") + plt.tight_layout() + + return fig
+ + + +
+[docs] +def extract_bridge_properties( + i: int, color: dict, U: np.ndarray, threshold: float = 0.2 +) -> Tuple[np.ndarray, list]: + """ + Extract the properties of the bridges of a node i. + + Parameters + ---------- + i : int + Index of the node. + color : dict + Dictionary with the colors of the nodes. + U : ndarray + Out-going membership matrix. + threshold : float + Threshold for the membership values. + Returns + ------- + wedge_sizes : ndarray + Sizes of the wedges. + wedge_colors : list + Colors of the wedges. + """ + + groups = np.where(U[i] > threshold)[0] + wedge_sizes = U[i][groups] + wedge_colors = [color[c] for c in groups] + return wedge_sizes, wedge_colors
+ + + +
+[docs] +def plot_soft_membership( + graph: nx.DiGraph, + thetas: Dict, + pos: Dict, + node_size: np.ndarray, + colors: Dict, + edge_color: str, +) -> plt.Figure: + """ + Plot a graph with nodes colored by their mixed (soft) memberships. + + Parameters + ---------- + graph : nx.DiGraph + Graph to be plotted. + thetas : Dict + Dictionary with the mixed memberships. + pos : Dict + Dictionary with the positions of the nodes. + node_size : ndarray + Array with the sizes of the nodes. + colors : Dict + Dictionary with the colors of the nodes. + edge_color : str + Color of the edges. + + Returns + ------- + fig : plt.Figure + The matplotlib figure object. + """ + + fig = plt.figure(figsize=(9, 4)) + for j, k in enumerate(thetas): + plt.subplot(1, 2, j + 1) + ax = plt.gca() + nx.draw_networkx_edges( + graph, + pos, + width=0.5, + edge_color=edge_color, + arrows=True, + arrowsize=5, + connectionstyle="arc3,rad=0.2", + node_size=150, + ax=ax, + ) + for i, n in enumerate(graph.nodes()): + wedge_sizes, wedge_colors = extract_bridge_properties(i, colors, thetas[k]) + if len(wedge_sizes) > 0: + _ = plt.pie( + wedge_sizes, + center=pos[n], + colors=wedge_colors, + radius=(node_size[i]) * 0.0005, + ) + ax.axis("equal") + plt.title(rf"${k}$", fontsize=17) + plt.axis("off") + plt.tight_layout() + + return fig
+ + + +
+[docs] +def plot_adjacency( + Bd: np.ndarray, + M_marginal: np.ndarray, + M_conditional: np.ndarray, + nodes: List, + cm: str = "Blues", +) -> plt.Figure: + """ + Plot the adjacency matrix and its reconstruction given by the marginal and the conditional + expected values. + + Parameters + ---------- + Bd : ndarray + Adjacency matrix. + M_marginal : ndarray + Marginal expected values. + M_conditional : ndarray + Conditional expected values. + nodes : list + List of nodes. + cm : Matplotlib object + Colormap used for the plot. + + Returns + ------- + fig : plt.Figure + The matplotlib figure object. + """ + + sns.set_style("ticks") + + fig = plt.figure(figsize=(15, 5)) + gs = gridspec.GridSpec(1, 4, width_ratios=[1, 1, 1, 0.05]) + + plt.subplot(gs[0, 0]) + im = plt.imshow(Bd[0], vmin=0, vmax=1, cmap=cm) + plt.xticks(ticks=np.arange(len(nodes)), labels=nodes, fontsize=9) + plt.yticks(ticks=np.arange(len(nodes)), labels=nodes, fontsize=9) + plt.title("Data", fontsize=17) + + plt.subplot(gs[0, 1]) + plt.imshow(M_marginal[0], vmin=0, vmax=1, cmap=cm) + plt.xticks(ticks=np.arange(len(nodes)), labels=nodes, fontsize=9) + plt.yticks(ticks=np.arange(len(nodes)), labels=nodes, fontsize=9) + plt.title(r"$\mathbb{E}_{P(A_{ij} | \Theta)}[A_{ij}]$", fontsize=17) + + plt.subplot(gs[0, 2]) + plt.imshow(M_conditional[0], vmin=0, vmax=1, cmap=cm) + plt.xticks(ticks=np.arange(len(nodes)), labels=nodes, fontsize=9) + plt.yticks(ticks=np.arange(len(nodes)), labels=nodes, fontsize=9) + plt.title(r"$\mathbb{E}_{P(A_{ij} | A_{ij}, \Theta)}[A_{ij}]$", fontsize=17) + + axes = plt.subplot(gs[0, 3]) + cbar = plt.colorbar(im, cax=axes) + cbar.ax.tick_params(labelsize=15) + + plt.tight_layout() + + return fig
+ + + +
+[docs] +def mapping(G: nx.DiGraph, A: nx.DiGraph) -> nx.DiGraph: + """ + Map the nodes of a graph G to the nodes of a graph A. + + Parameters + ---------- + G : nx.DiGraph + Graph to be mapped. + A : nx.DiGraph + Graph to be mapped to. + Returns + ------- + G : nx.DiGraph + Graph G with the nodes mapped to the nodes of A. + """ + + # Define the mapping + old = list(G.nodes) + new = list(A.nodes) + + mapping_dict = {} + for x in old: + mapping_dict[x] = new[x] + # Return the mapped graph + return nx.relabel_nodes(G, mapping_dict)
+ + + +
+[docs] +def plot_graph( + graph: nx.DiGraph, + M_marginal: np.ndarray, + M_conditional: np.ndarray, + pos: Dict, + node_size: int, + node_color: str, + edge_color: str, + threshold: float = 0.2, +) -> plt.Figure: + """ + Plot a graph and its reconstruction given by the marginal and the conditional expected values. + + Parameters + ---------- + graph : nx.DiGraph + Graph to be plotted. + M_marginal : ndarray + Marginal expected values. + M_conditional : ndarray + Conditional expected values. + pos : dict + Dictionary with the positions of the nodes. + node_size : int + Size of the nodes. + node_color : str + Color of the nodes. + edge_color : str + Color of the edges. + threshold : float + Threshold for the membership values. + + Returns + ------- + fig : plt.Figure + The matplotlib figure object. + """ + + fig = plt.figure(figsize=(15, 5)) + gs = gridspec.GridSpec(1, 3) + + plt.subplot(gs[0, 0]) + edgewidth = [d["weight"] for (u, v, d) in graph.edges(data=True)] + nx.draw_networkx( + graph, + pos, + node_size=node_size, + node_color=node_color, + connectionstyle="arc3,rad=0.2", + with_labels=False, + width=edgewidth, + edge_color=edge_color, + arrows=True, + arrowsize=5, + font_size=15, + font_color="black", + ) + plt.axis("off") + plt.title("Data", fontsize=17) + + mask = M_marginal[0] < threshold + M = M_marginal[0].copy() + M[mask] = 0.0 + G = nx.from_numpy_array(M, create_using=nx.DiGraph) + G = mapping(G, graph) + edgewidth = [d["weight"] for (u, v, d) in G.edges(data=True)] + plt.subplot(gs[0, 1]) + nx.draw_networkx( + G, + pos, + node_size=node_size, + node_color=node_color, + connectionstyle="arc3,rad=0.2", + with_labels=False, + width=edgewidth, + edge_color=edgewidth, + edge_cmap=colormaps["Greys"], + edge_vmin=0, + edge_vmax=1, + arrows=True, + arrowsize=5, + ) + plt.axis("off") + plt.title(r"$\mathbb{E}_{P(A_{ij} | \Theta)}[A_{ij}]$", fontsize=17) + + mask = M_conditional[0] < threshold + M = M_conditional[0].copy() + M[mask] = 0.0 + G = nx.from_numpy_array(M, create_using=nx.DiGraph) + G = mapping(G, graph) + edgewidth = [d["weight"] for (u, v, d) in G.edges(data=True)] + + plt.subplot(gs[0, 2]) + nx.draw_networkx( + G, + pos, + node_size=node_size, + node_color=node_color, + connectionstyle="arc3,rad=0.2", + with_labels=False, + width=edgewidth, + edge_color=edgewidth, + edge_cmap=colormaps["Greys"], + edge_vmin=0, + edge_vmax=1, + arrows=True, + arrowsize=5, + ) + plt.axis("off") + plt.title(r"$\mathbb{E}_{P(A_{ij} | A_{ij}, \Theta)}[A_{ij}]$", fontsize=17) + + plt.tight_layout() + + return fig
+ + + +
+[docs] +def plot_precision_recall(conf_matrix: np.ndarray, cm: str = "Blues") -> plt.Figure: + """ + Plot precision and recall of a given confusion matrix. + + Parameters + ---------- + conf_matrix : ndarray + Confusion matrix. + cm : Matplotlib object + Colormap used for the plot. + + Returns + ------- + fig : plt.Figure + The matplotlib figure object. + """ + + fig = plt.figure(figsize=(8, 3)) + + # normalized by row + gs = gridspec.GridSpec(1, 3, width_ratios=[1, 1, 0.05]) + plt.subplot(gs[0, 0]) + im = plt.imshow( + conf_matrix / np.sum(conf_matrix, axis=1)[:, np.newaxis], + cmap=cm, + vmin=0, + vmax=1, + ) + plt.xticks( + [0, 1, 2, 3], labels=["(0, 0)", "(0, 1)", "(1, 0)", "(1, 1)"], fontsize=13 + ) + plt.yticks( + [0, 1, 2, 3], labels=["(0, 0)", "(0, 1)", "(1, 0)", "(1, 1)"], fontsize=13 + ) + plt.ylabel("True", fontsize=15) + plt.xlabel("Predicted", fontsize=15) + plt.title("Precision", fontsize=17) + + # normalized by column + plt.subplot(gs[0, 1]) + plt.imshow( + conf_matrix / np.sum(conf_matrix, axis=0)[np.newaxis, :], + cmap=cm, + vmin=0, + vmax=1, + ) + plt.xticks( + [0, 1, 2, 3], labels=["(0, 0)", "(0, 1)", "(1, 0)", "(1, 1)"], fontsize=13 + ) + plt.tick_params( + axis="y", + which="both", + bottom=False, + top=False, + labelbottom=False, + right=False, + left=False, + labelleft=False, + ) + plt.xlabel("Predicted", fontsize=15) + plt.title("Recall", fontsize=17) + + axes = plt.subplot(gs[0, 2]) + plt.colorbar(im, cax=axes) + + # plt.tight_layout() + + return fig
+ + + +
+[docs] +def plot_adjacency_samples( + Bdata: List, Bsampled: List, cm: str = "Blues" +) -> plt.Figure: + """ + Plot the adjacency matrix and five sampled networks. + + Parameters + ---------- + Bdata : list + List of adjacency matrices for the data. + Bsampled : list + List of adjacency matrices for sampled networks. + cm : Matplotlib object + Colormap used for the plot. + + Returns + ------- + fig : plt.Figure + The matplotlib figure object. + """ + + fig = plt.figure(figsize=(30, 5)) + gs = gridspec.GridSpec(1, 6, width_ratios=[1, 1, 1, 1, 1, 1]) + plt.subplot(gs[0, 0]) + plt.imshow(Bdata[0], vmin=0, vmax=1, cmap=cm) + plt.tick_params( + axis="both", + which="both", + bottom=False, + top=False, + labelbottom=False, + right=False, + left=False, + labelleft=False, + ) + plt.title("Data", fontsize=25) + + for i in range(5): + plt.subplot(gs[0, i + 1]) + plt.imshow(Bsampled[i], vmin=0, vmax=1, cmap=cm) + plt.tick_params( + axis="both", + which="both", + bottom=False, + top=False, + labelbottom=False, + right=False, + left=False, + labelleft=False, + ) + plt.title(f"Sample {i + 1}", fontsize=25) + + plt.tight_layout() + + return fig
+ + + +
+[docs] +def plot_A(A: List, cmap: str = "Blues") -> List[plt.Figure]: + """ + Plot the adjacency tensor produced by the generative algorithm. + + Parameters + ---------- + A : list + List of scipy sparse matrices, one for each layer. + cmap : Matplotlib object + Colormap used for the plot. + Returns + ------- + figures : list + List of matplotlib figure objects. + """ + + figures = [] + L = len(A) + for layer in range(L): + Ad = A[layer].todense() + fig, ax = plt.subplots(figsize=(7, 7)) + ax.matshow(Ad, cmap=plt.get_cmap(cmap)) + ax.set_title(f"Adjacency matrix layer {layer}", fontsize=15) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax) # pylint: disable=undefined-loop-variable + figures.append(fig) + + return figures
+ + + +
+[docs] +def plot_L( + values: List, + indices: Optional[List] = None, + k_i: int = 0, # 5 for ACD + xlab: str = "Iterations", + ylabel: str = "Log-likelihood values", + figsize: tuple = (10, 5), # (7, 7) for ACD + int_ticks: bool = False, +) -> plt.Figure: + """ + Plot the log-likelihood. + Parameters + ---------- + values : list + List of log-likelihood values. + indices : list + List of indices. + k_i : int + Number of initial iterations to be ignored. + xlab : str + Label of the x-axis. + ylabel : str + + figsize : tuple + Figure size. + int_ticks : bool + Flag to use integer ticks. + Returns + ------- + fig : plt.Figure + The matplotlib figure object. + """ + + fig, ax = plt.subplots(1, 1, figsize=figsize) + + if indices is None: + ax.plot(values[k_i:]) + else: + ax.plot(indices[k_i:], values[k_i:]) + ax.set_xlabel(xlab) + ax.set_ylabel(ylabel) + if int_ticks: + ax.xaxis.set_major_locator(MaxNLocator(integer=True)) + ax.grid() + + plt.tight_layout() + return fig
+ + + +
+[docs] +def plot_M( + M: np.ndarray, + cmap: str = "PuBuGn", + figsize: Tuple[int, int] = (7, 7), + fontsize: int = 15, +) -> None: + """ + Plot the M matrix produced by the generative algorithm. Each entry is the + Poisson mean associated with each pair of nodes in the graph. + + Parameters + ---------- + M : np.ndarray + NxN M matrix associated with the graph. Contains all the means used + for generating edges. + cmap : str, optional + Colormap used for the plot. + figsize : Tuple[int, int], optional + Size of the figure to be plotted. + fontsize : int, optional + Font size to be used in the plot title. + """ + + _, ax = plt.subplots(figsize=figsize) + ax.matshow(M, cmap=plt.get_cmap(cmap)) + ax.set_title("MT means matrix", fontsize=fontsize) + for PCM in ax.get_children(): + if isinstance(PCM, plt.cm.ScalarMappable): + break + plt.colorbar(PCM, ax=ax)
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+ + + +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/_sources/api.rst b/_sources/api.rst new file mode 100644 index 0000000..4671256 --- /dev/null +++ b/_sources/api.rst @@ -0,0 +1,49 @@ +API +--- + +.. autosummary:: + :toctree: generated + + probinet.evaluation + probinet.evaluation.community_detection + probinet.evaluation.covariate_prediction + probinet.evaluation.expectation_computation + probinet.evaluation.likelihood + probinet.evaluation.link_prediction + probinet.input + probinet.input.loader + probinet.input.preprocessing + probinet.input.stats + probinet.main + probinet.model_selection + probinet.model_selection.acd_cross_validation + probinet.model_selection.crep_cross_validation + probinet.model_selection.cross_validation + probinet.model_selection.dyncrep_cross_validation + probinet.model_selection.jointcrep_cross_validation + probinet.model_selection.main + probinet.model_selection.masking + probinet.model_selection.mtcov_cross_validation + probinet.model_selection.parameter_search + probinet.models + probinet.models.acd + probinet.models.base + probinet.models.classes + probinet.models.constants + probinet.models.crep + probinet.models.dyncrep + probinet.models.jointcrep + probinet.models.mtcov + probinet.synthetic + probinet.synthetic.anomaly + probinet.synthetic.base + probinet.synthetic.dynamic + probinet.synthetic.multilayer + probinet.synthetic.reciprocity + probinet.utils + probinet.utils.matrix_operations + probinet.utils.tools + probinet.version + probinet.visualization + probinet.visualization.plot + diff --git a/_sources/contributing.rst b/_sources/contributing.rst new file mode 100644 index 0000000..aa1bf8f --- /dev/null +++ b/_sources/contributing.rst @@ -0,0 +1,123 @@ +Contributing +============ + +Thank you for your interest in contributing to **ProbINet**! Your contributions help improve the +package and make it more useful for everyone. Please follow the steps below to get started. + +Getting Started +--------------- + +- Fork this repository to your GitHub account: `https://github.com/MPI-IS/probinet `_. You can fork it by clicking the "Fork" button in the top-right corner of the page. +- Clone the forked repository to your local machine: + + .. code-block:: bash + + git clone https://github.com//probinet.git + +- Navigate to the project directory: + + .. code-block:: bash + + cd probinet + +- Add the original repository as a remote named ``upstream`` to keep your fork updated: + + .. code-block:: bash + + git remote add upstream https://github.com/MPI-IS/probinet.git + +Setting Up the Development Environment +-------------------------------------- + +This project uses ``pyproject.toml`` for dependency management. To set up a development environment: + +- Install the package with the ``.dev`` flag: + + .. code-block:: bash + + pip install ".[dev]" + +- Verify the installation by running the following command: + + .. code-block:: bash + + pip show probinet + +If the package is installed, this will display details about it, such as the version and installation location. + +Syncing Your Fork +----------------- + +Before starting work on a new feature or bug fix, ensure your fork is up to date with the original repository: + +- Fetch the latest changes from the ``upstream`` repository: + + .. code-block:: bash + + git fetch upstream + +- Update your local ``main`` branch: + + .. code-block:: bash + + git checkout main + git merge upstream/main + +Making Changes +-------------- + +- Create a new branch for your contribution: + + .. code-block:: bash + + git checkout -b feature/your-feature-name + +- Make your changes in this branch. Ensure the code is: + + - Well-documented. + - Aligned with the existing code style. + +- Add or update unit tests for your changes. You can see the existing tests in the ``tests`` directory. + +Running Tests +------------- + +Tests are written using Python's built-in ``unittest`` framework. + +- Run all tests to verify your changes: + + .. code-block:: bash + + python -W ignore -m unittest discover + +Submitting Your Contribution +---------------------------- + +- Commit your changes with a clear and concise message: + + .. code-block:: bash + + git commit -m "Add description of your changes" + +- Push your changes to your fork: + + .. code-block:: bash + + git push origin feature/your-feature-name + +- Open a Pull Request (PR) to the **original repository**. Include: + + - A detailed explanation of your changes. + - The issue number your PR addresses (if applicable). + - Any additional context or screenshots. + + You can view all open and merged Pull Requests `here `_. + + +Code of Conduct +--------------- + +By contributing to this repository, you agree to follow our `Code of Conduct +`_. + +We appreciate your contributions and will review your Pull Request promptly! diff --git a/_sources/generated/probinet.evaluation.community_detection.rst b/_sources/generated/probinet.evaluation.community_detection.rst new file mode 100644 index 0000000..f451db9 --- /dev/null +++ b/_sources/generated/probinet.evaluation.community_detection.rst @@ -0,0 +1,15 @@ +probinet.evaluation.community\_detection +======================================== + +.. automodule:: probinet.evaluation.community_detection + + + .. rubric:: Functions + + .. autosummary:: + + calculate_metric + compute_community_detection_metric + compute_permutation_matrix + cosine_similarity + \ No newline at end of file diff --git a/_sources/generated/probinet.evaluation.covariate_prediction.rst b/_sources/generated/probinet.evaluation.covariate_prediction.rst new file mode 100644 index 0000000..e18b5e3 --- /dev/null +++ b/_sources/generated/probinet.evaluation.covariate_prediction.rst @@ -0,0 +1,14 @@ +probinet.evaluation.covariate\_prediction +========================================= + +.. automodule:: probinet.evaluation.covariate_prediction + + + .. rubric:: Functions + + .. autosummary:: + + compute_covariate_prediction_accuracy + extract_true_label + predict_label + \ No newline at end of file diff --git a/_sources/generated/probinet.evaluation.expectation_computation.rst b/_sources/generated/probinet.evaluation.expectation_computation.rst new file mode 100644 index 0000000..b3bddef --- /dev/null +++ b/_sources/generated/probinet.evaluation.expectation_computation.rst @@ -0,0 +1,27 @@ +probinet.evaluation.expectation\_computation +============================================ + +.. automodule:: probinet.evaluation.expectation_computation + + + .. rubric:: Functions + + .. autosummary:: + + calculate_Q_dense + calculate_Z + calculate_conditional_expectation + calculate_conditional_expectation_dyncrep + calculate_expectation + calculate_expectation_acd + compute_L1loss + compute_M_joint + compute_expected_adjacency_tensor + compute_expected_adjacency_tensor_multilayer + compute_lagrange_multiplier + compute_marginal_and_conditional_expectation + compute_mean_lambda0 + compute_mean_lambda0_dyncrep + compute_mean_lambda0_nonzero + u_with_lagrange_multiplier + \ No newline at end of file diff --git a/_sources/generated/probinet.evaluation.likelihood.rst b/_sources/generated/probinet.evaluation.likelihood.rst new file mode 100644 index 0000000..68ccd95 --- /dev/null +++ b/_sources/generated/probinet.evaluation.likelihood.rst @@ -0,0 +1,18 @@ +probinet.evaluation.likelihood +============================== + +.. automodule:: probinet.evaluation.likelihood + + + .. rubric:: Functions + + .. autosummary:: + + PSloglikelihood + calculate_opt_func + likelihood_conditional + log_likelihood_given_model + loglikelihood + loglikelihood_attributes + loglikelihood_network + \ No newline at end of file diff --git a/_sources/generated/probinet.evaluation.link_prediction.rst b/_sources/generated/probinet.evaluation.link_prediction.rst new file mode 100644 index 0000000..b22c47d --- /dev/null +++ b/_sources/generated/probinet.evaluation.link_prediction.rst @@ -0,0 +1,16 @@ +probinet.evaluation.link\_prediction +==================================== + +.. automodule:: probinet.evaluation.link_prediction + + + .. rubric:: Functions + + .. autosummary:: + + calculate_f1_score + compute_AUC_from_ranked_predictions + compute_link_prediction_AUC + compute_multilayer_link_prediction_AUC + mask_or_flatten_array + \ No newline at end of file diff --git a/_sources/generated/probinet.evaluation.rst b/_sources/generated/probinet.evaluation.rst new file mode 100644 index 0000000..f1f4a7c --- /dev/null +++ b/_sources/generated/probinet.evaluation.rst @@ -0,0 +1,6 @@ +probinet.evaluation +=================== + +.. automodule:: probinet.evaluation + + \ No newline at end of file diff --git a/_sources/generated/probinet.input.loader.rst b/_sources/generated/probinet.input.loader.rst new file mode 100644 index 0000000..28588f0 --- /dev/null +++ b/_sources/generated/probinet.input.loader.rst @@ -0,0 +1,17 @@ +probinet.input.loader +===================== + +.. automodule:: probinet.input.loader + + + .. rubric:: Functions + + .. autosummary:: + + build_adjacency_and_design_from_file + build_adjacency_from_file + build_adjacency_from_networkx + read_and_process_design_matrix + read_design_matrix + read_graph + \ No newline at end of file diff --git a/_sources/generated/probinet.input.preprocessing.rst b/_sources/generated/probinet.input.preprocessing.rst new file mode 100644 index 0000000..a7409b7 --- /dev/null +++ b/_sources/generated/probinet.input.preprocessing.rst @@ -0,0 +1,15 @@ +probinet.input.preprocessing +============================ + +.. automodule:: probinet.input.preprocessing + + + .. rubric:: Functions + + .. autosummary:: + + create_adjacency_tensor_from_graph_list + create_sparse_adjacency_tensor_from_graph_list + preprocess_adjacency_tensor + preprocess_data_matrix + \ No newline at end of file diff --git a/_sources/generated/probinet.input.rst b/_sources/generated/probinet.input.rst new file mode 100644 index 0000000..e4c1b47 --- /dev/null +++ b/_sources/generated/probinet.input.rst @@ -0,0 +1,6 @@ +probinet.input +============== + +.. automodule:: probinet.input + + \ No newline at end of file diff --git a/_sources/generated/probinet.input.stats.rst b/_sources/generated/probinet.input.stats.rst new file mode 100644 index 0000000..add8b1a --- /dev/null +++ b/_sources/generated/probinet.input.stats.rst @@ -0,0 +1,14 @@ +probinet.input.stats +==================== + +.. automodule:: probinet.input.stats + + + .. rubric:: Functions + + .. autosummary:: + + print_graph_stats + print_graph_stats_MTCOV + reciprocal_edges + \ No newline at end of file diff --git a/_sources/generated/probinet.main.rst b/_sources/generated/probinet.main.rst new file mode 100644 index 0000000..36c2709 --- /dev/null +++ b/_sources/generated/probinet.main.rst @@ -0,0 +1,13 @@ +probinet.main +============= + +.. automodule:: probinet.main + + + .. rubric:: Functions + + .. autosummary:: + + main + parse_args + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.acd_cross_validation.rst b/_sources/generated/probinet.model_selection.acd_cross_validation.rst new file mode 100644 index 0000000..ad28dd0 --- /dev/null +++ b/_sources/generated/probinet.model_selection.acd_cross_validation.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.acd\_cross\_validation +================================================ + +.. automodule:: probinet.model_selection.acd_cross_validation + + + .. rubric:: Classes + + .. autosummary:: + + ACDCrossValidation + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.crep_cross_validation.rst b/_sources/generated/probinet.model_selection.crep_cross_validation.rst new file mode 100644 index 0000000..5d06ad6 --- /dev/null +++ b/_sources/generated/probinet.model_selection.crep_cross_validation.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.crep\_cross\_validation +================================================= + +.. automodule:: probinet.model_selection.crep_cross_validation + + + .. rubric:: Classes + + .. autosummary:: + + CRepCrossValidation + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.cross_validation.rst b/_sources/generated/probinet.model_selection.cross_validation.rst new file mode 100644 index 0000000..ec4edde --- /dev/null +++ b/_sources/generated/probinet.model_selection.cross_validation.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.cross\_validation +=========================================== + +.. automodule:: probinet.model_selection.cross_validation + + + .. rubric:: Classes + + .. autosummary:: + + CrossValidation + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.dyncrep_cross_validation.rst b/_sources/generated/probinet.model_selection.dyncrep_cross_validation.rst new file mode 100644 index 0000000..ef118c3 --- /dev/null +++ b/_sources/generated/probinet.model_selection.dyncrep_cross_validation.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.dyncrep\_cross\_validation +==================================================== + +.. automodule:: probinet.model_selection.dyncrep_cross_validation + + + .. rubric:: Classes + + .. autosummary:: + + DynCRepCrossValidation + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.jointcrep_cross_validation.rst b/_sources/generated/probinet.model_selection.jointcrep_cross_validation.rst new file mode 100644 index 0000000..2de2272 --- /dev/null +++ b/_sources/generated/probinet.model_selection.jointcrep_cross_validation.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.jointcrep\_cross\_validation +====================================================== + +.. automodule:: probinet.model_selection.jointcrep_cross_validation + + + .. rubric:: Classes + + .. autosummary:: + + JointCRepCrossValidation + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.main.rst b/_sources/generated/probinet.model_selection.main.rst new file mode 100644 index 0000000..3f09197 --- /dev/null +++ b/_sources/generated/probinet.model_selection.main.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.main +============================== + +.. automodule:: probinet.model_selection.main + + + .. rubric:: Functions + + .. autosummary:: + + cross_validation + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.masking.rst b/_sources/generated/probinet.model_selection.masking.rst new file mode 100644 index 0000000..f64b8f9 --- /dev/null +++ b/_sources/generated/probinet.model_selection.masking.rst @@ -0,0 +1,17 @@ +probinet.model\_selection.masking +================================= + +.. automodule:: probinet.model_selection.masking + + + .. rubric:: Functions + + .. autosummary:: + + extract_mask_kfold + extract_masks + shuffle_indices + shuffle_indicesG + shuffle_indicesX + shuffle_indices_all_matrix + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.mtcov_cross_validation.rst b/_sources/generated/probinet.model_selection.mtcov_cross_validation.rst new file mode 100644 index 0000000..3497e41 --- /dev/null +++ b/_sources/generated/probinet.model_selection.mtcov_cross_validation.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.mtcov\_cross\_validation +================================================== + +.. automodule:: probinet.model_selection.mtcov_cross_validation + + + .. rubric:: Classes + + .. autosummary:: + + MTCOVCrossValidation + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.parameter_search.rst b/_sources/generated/probinet.model_selection.parameter_search.rst new file mode 100644 index 0000000..9120713 --- /dev/null +++ b/_sources/generated/probinet.model_selection.parameter_search.rst @@ -0,0 +1,12 @@ +probinet.model\_selection.parameter\_search +=========================================== + +.. automodule:: probinet.model_selection.parameter_search + + + .. rubric:: Functions + + .. autosummary:: + + define_grid + \ No newline at end of file diff --git a/_sources/generated/probinet.model_selection.rst b/_sources/generated/probinet.model_selection.rst new file mode 100644 index 0000000..543d813 --- /dev/null +++ b/_sources/generated/probinet.model_selection.rst @@ -0,0 +1,6 @@ +probinet.model\_selection +========================= + +.. automodule:: probinet.model_selection + + \ No newline at end of file diff --git a/_sources/generated/probinet.models.acd.rst b/_sources/generated/probinet.models.acd.rst new file mode 100644 index 0000000..352bf65 --- /dev/null +++ b/_sources/generated/probinet.models.acd.rst @@ -0,0 +1,12 @@ +probinet.models.acd +=================== + +.. automodule:: probinet.models.acd + + + .. rubric:: Classes + + .. autosummary:: + + AnomalyDetection + \ No newline at end of file diff --git a/_sources/generated/probinet.models.base.rst b/_sources/generated/probinet.models.base.rst new file mode 100644 index 0000000..8f239b3 --- /dev/null +++ b/_sources/generated/probinet.models.base.rst @@ -0,0 +1,14 @@ +probinet.models.base +==================== + +.. automodule:: probinet.models.base + + + .. rubric:: Classes + + .. autosummary:: + + ModelBase + ModelBaseParameters + ModelUpdateMixin + \ No newline at end of file diff --git a/_sources/generated/probinet.models.classes.rst b/_sources/generated/probinet.models.classes.rst new file mode 100644 index 0000000..43692bc --- /dev/null +++ b/_sources/generated/probinet.models.classes.rst @@ -0,0 +1,12 @@ +probinet.models.classes +======================= + +.. automodule:: probinet.models.classes + + + .. rubric:: Classes + + .. autosummary:: + + GraphData + \ No newline at end of file diff --git a/_sources/generated/probinet.models.constants.rst b/_sources/generated/probinet.models.constants.rst new file mode 100644 index 0000000..49ffa87 --- /dev/null +++ b/_sources/generated/probinet.models.constants.rst @@ -0,0 +1,6 @@ +probinet.models.constants +========================= + +.. automodule:: probinet.models.constants + + \ No newline at end of file diff --git a/_sources/generated/probinet.models.crep.rst b/_sources/generated/probinet.models.crep.rst new file mode 100644 index 0000000..e4e7a51 --- /dev/null +++ b/_sources/generated/probinet.models.crep.rst @@ -0,0 +1,12 @@ +probinet.models.crep +==================== + +.. automodule:: probinet.models.crep + + + .. rubric:: Classes + + .. autosummary:: + + CRep + \ No newline at end of file diff --git a/_sources/generated/probinet.models.dyncrep.rst b/_sources/generated/probinet.models.dyncrep.rst new file mode 100644 index 0000000..8777b98 --- /dev/null +++ b/_sources/generated/probinet.models.dyncrep.rst @@ -0,0 +1,12 @@ +probinet.models.dyncrep +======================= + +.. automodule:: probinet.models.dyncrep + + + .. rubric:: Classes + + .. autosummary:: + + DynCRep + \ No newline at end of file diff --git a/_sources/generated/probinet.models.jointcrep.rst b/_sources/generated/probinet.models.jointcrep.rst new file mode 100644 index 0000000..c5be6e4 --- /dev/null +++ b/_sources/generated/probinet.models.jointcrep.rst @@ -0,0 +1,12 @@ +probinet.models.jointcrep +========================= + +.. automodule:: probinet.models.jointcrep + + + .. rubric:: Classes + + .. autosummary:: + + JointCRep + \ No newline at end of file diff --git a/_sources/generated/probinet.models.mtcov.rst b/_sources/generated/probinet.models.mtcov.rst new file mode 100644 index 0000000..2313b37 --- /dev/null +++ b/_sources/generated/probinet.models.mtcov.rst @@ -0,0 +1,12 @@ +probinet.models.mtcov +===================== + +.. automodule:: probinet.models.mtcov + + + .. rubric:: Classes + + .. autosummary:: + + MTCOV + \ No newline at end of file diff --git a/_sources/generated/probinet.models.rst b/_sources/generated/probinet.models.rst new file mode 100644 index 0000000..668acf3 --- /dev/null +++ b/_sources/generated/probinet.models.rst @@ -0,0 +1,6 @@ +probinet.models +=============== + +.. automodule:: probinet.models + + \ No newline at end of file diff --git a/_sources/generated/probinet.synthetic.anomaly.rst b/_sources/generated/probinet.synthetic.anomaly.rst new file mode 100644 index 0000000..4922d83 --- /dev/null +++ b/_sources/generated/probinet.synthetic.anomaly.rst @@ -0,0 +1,12 @@ +probinet.synthetic.anomaly +========================== + +.. automodule:: probinet.synthetic.anomaly + + + .. rubric:: Classes + + .. autosummary:: + + SyntNetAnomaly + \ No newline at end of file diff --git a/_sources/generated/probinet.synthetic.base.rst b/_sources/generated/probinet.synthetic.base.rst new file mode 100644 index 0000000..d37e1e7 --- /dev/null +++ b/_sources/generated/probinet.synthetic.base.rst @@ -0,0 +1,21 @@ +probinet.synthetic.base +======================= + +.. automodule:: probinet.synthetic.base + + + .. rubric:: Functions + + .. autosummary:: + + affinity_matrix + + .. rubric:: Classes + + .. autosummary:: + + BaseSyntheticNetwork + GraphProcessingMixin + StandardMMSBM + Structure + \ No newline at end of file diff --git a/_sources/generated/probinet.synthetic.dynamic.rst b/_sources/generated/probinet.synthetic.dynamic.rst new file mode 100644 index 0000000..1e09e1a --- /dev/null +++ b/_sources/generated/probinet.synthetic.dynamic.rst @@ -0,0 +1,19 @@ +probinet.synthetic.dynamic +========================== + +.. automodule:: probinet.synthetic.dynamic + + + .. rubric:: Functions + + .. autosummary:: + + eq_c + membership_vectors + + .. rubric:: Classes + + .. autosummary:: + + SyntheticDynCRep + \ No newline at end of file diff --git a/_sources/generated/probinet.synthetic.multilayer.rst b/_sources/generated/probinet.synthetic.multilayer.rst new file mode 100644 index 0000000..cb00df7 --- /dev/null +++ b/_sources/generated/probinet.synthetic.multilayer.rst @@ -0,0 +1,21 @@ +probinet.synthetic.multilayer +============================= + +.. automodule:: probinet.synthetic.multilayer + + + .. rubric:: Functions + + .. autosummary:: + + output_design_matrix + pi_ik_matrix + plot_X + + .. rubric:: Classes + + .. autosummary:: + + BaseSyntheticNetwork + SyntheticMTCOV + \ No newline at end of file diff --git a/_sources/generated/probinet.synthetic.reciprocity.rst b/_sources/generated/probinet.synthetic.reciprocity.rst new file mode 100644 index 0000000..1c2fc6e --- /dev/null +++ b/_sources/generated/probinet.synthetic.reciprocity.rst @@ -0,0 +1,13 @@ +probinet.synthetic.reciprocity +============================== + +.. automodule:: probinet.synthetic.reciprocity + + + .. rubric:: Classes + + .. autosummary:: + + GM_reciprocity + ReciprocityMMSBM_joints + \ No newline at end of file diff --git a/_sources/generated/probinet.synthetic.rst b/_sources/generated/probinet.synthetic.rst new file mode 100644 index 0000000..1b134d7 --- /dev/null +++ b/_sources/generated/probinet.synthetic.rst @@ -0,0 +1,6 @@ +probinet.synthetic +================== + +.. automodule:: probinet.synthetic + + \ No newline at end of file diff --git a/_sources/generated/probinet.utils.matrix_operations.rst b/_sources/generated/probinet.utils.matrix_operations.rst new file mode 100644 index 0000000..d1a2c29 --- /dev/null +++ b/_sources/generated/probinet.utils.matrix_operations.rst @@ -0,0 +1,17 @@ +probinet.utils.matrix\_operations +================================= + +.. automodule:: probinet.utils.matrix_operations + + + .. rubric:: Functions + + .. autosummary:: + + Exp_ija_matrix + normalize_nonzero_membership + sp_uttkrp + sp_uttkrp_assortative + transpose_matrix + transpose_tensor + \ No newline at end of file diff --git a/_sources/generated/probinet.utils.rst b/_sources/generated/probinet.utils.rst new file mode 100644 index 0000000..4723ff3 --- /dev/null +++ b/_sources/generated/probinet.utils.rst @@ -0,0 +1,6 @@ +probinet.utils +============== + +.. automodule:: probinet.utils + + \ No newline at end of file diff --git a/_sources/generated/probinet.utils.tools.rst b/_sources/generated/probinet.utils.tools.rst new file mode 100644 index 0000000..fd4b984 --- /dev/null +++ b/_sources/generated/probinet.utils.tools.rst @@ -0,0 +1,25 @@ +probinet.utils.tools +==================== + +.. automodule:: probinet.utils.tools + + + .. rubric:: Functions + + .. autosummary:: + + build_edgelist + can_cast_to_int + check_symmetric + create_design_matrix + flt + get_item_array_from_subs + get_or_create_rng + is_sparse + log_and_raise_error + output_adjacency + save_design_matrix + sptensor_from_dense_array + write_adjacency + write_design_matrix + \ No newline at end of file diff --git a/_sources/generated/probinet.version.rst b/_sources/generated/probinet.version.rst new file mode 100644 index 0000000..ea512a0 --- /dev/null +++ b/_sources/generated/probinet.version.rst @@ -0,0 +1,6 @@ +probinet.version +================ + +.. automodule:: probinet.version + + \ No newline at end of file diff --git a/_sources/generated/probinet.visualization.plot.rst b/_sources/generated/probinet.visualization.plot.rst new file mode 100644 index 0000000..dc6e112 --- /dev/null +++ b/_sources/generated/probinet.visualization.plot.rst @@ -0,0 +1,22 @@ +probinet.visualization.plot +=========================== + +.. automodule:: probinet.visualization.plot + + + .. rubric:: Functions + + .. autosummary:: + + extract_bridge_properties + mapping + plot_A + plot_L + plot_M + plot_adjacency + plot_adjacency_samples + plot_graph + plot_hard_membership + plot_precision_recall + plot_soft_membership + \ No newline at end of file diff --git a/_sources/generated/probinet.visualization.rst b/_sources/generated/probinet.visualization.rst new file mode 100644 index 0000000..401a73d --- /dev/null +++ b/_sources/generated/probinet.visualization.rst @@ -0,0 +1,6 @@ +probinet.visualization +====================== + +.. automodule:: probinet.visualization + + \ No newline at end of file diff --git a/_sources/index.rst b/_sources/index.rst new file mode 100644 index 0000000..16405db --- /dev/null +++ b/_sources/index.rst @@ -0,0 +1,53 @@ +.. probinet documentation master file. + +.. include:: ../../README.md + :parser: myst_parser.sphinx_ + +References +---------- + +.. bibliography:: references.bib + +Thank you for choosing ProbINet. We hope you enjoy using it! + +.. toctree:: + :maxdepth: 1 + :caption: Contents + + api + +.. toctree:: + :maxdepth: 1 + :caption: First Steps + + Inputs and Outputs + +.. toctree:: + :maxdepth: 1 + :caption: Tutorials + + A Beginner's Guide To The MTCOV Algorithm In The Probinet Package + Generation Of Synthetic Networks Using The CRep Algorithm + Analysis Of A Real-World Dataset Using The JointCRep Algorithm + Decoding Temporal Relationships With DynCRep + Cross-Validation And Anomaly Detection With The ACD Algorithm + Analyzing Network Data With Unknown Community Structure + +.. toctree:: + :maxdepth: 1 + :caption: Contributing + + How To Contribute + +.. toctree:: + :maxdepth: 1 + :caption: References + + Bibliography + +Indices and tables +------------------ + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/references.rst b/_sources/references.rst new file mode 100644 index 0000000..74c4132 --- /dev/null +++ b/_sources/references.rst @@ -0,0 +1,5 @@ +Bibliography +========== + +.. bibliography:: references.bib + :cited: diff --git a/_sources/start.rst b/_sources/start.rst new file mode 100644 index 0000000..ae1df6a --- /dev/null +++ b/_sources/start.rst @@ -0,0 +1,12 @@ +Inputs and Outputs +=============== + +If you are not sure about where to start, take a look at the image we have created. This image +shows which types of graphs are accepted by the different algorithms, and which tasks can be +performed with the outputs that the algorithms generate. + +.. image:: _static/input_and_output_for_algorithms.png + :alt: Graph Types Accepted by Algorithms + +For the icons used in this documentation, please refer to the following link: +`Foursquare check in icons created by See Icons - Flaticon` \ No newline at end of file diff --git a/_sources/tutorials/ACD.ipynb b/_sources/tutorials/ACD.ipynb new file mode 100644 index 0000000..2015794 --- /dev/null +++ b/_sources/tutorials/ACD.ipynb @@ -0,0 +1,1164 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "# Cross-Validation And Anomaly Detection With The `ACD` Algorithm\n", + "\n", + "Welcome to our tutorial on the **A**nomaly and **C**ommunity **D**etection (ACD) method. This is a \n", + "probabilistic\n", + " generative model and efficient algorithm to model anomalous edges in networks. It assigns latent\n", + " variables as community memberships to nodes and anomaly to the edges {cite}`safdari2022anomaly`.\n", + "\n", + "In this tutorial, we will demonstrate how to use the ACD method. We will start by loading the data, performing cross-validation using the `model_selection` submodule, and then analyzing the results to determine the best number of communities \\(K\\)." + ], + "id": "7e10803b63866bcf" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Setting the Logger\n", + "Let's first set the logging level to `DEBUG` so we can see the relevant messages." + ], + "id": "24bbaaf5034c597" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:45:39.256734Z", + "start_time": "2024-10-30T09:45:39.246590Z" + } + }, + "cell_type": "code", + "source": [ + "# Set logging level to DEBUG\n", + "import logging\n", + "\n", + "# Make it be set to DEBUG\n", + "logging.basicConfig(level=logging.DEBUG)\n", + "logging.getLogger(\"matplotlib\").setLevel(logging.WARNING)" + ], + "id": "9dbba2cfc9d1861b", + "outputs": [], + "execution_count": 1 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Loading and Visualizing the Data\n", + "\n", + "In this section, we will load the synthetic data required for our analyses. We will start by \n", + "importing the necessary libraries and defining the file path for the adjacency matrix, and then, \n", + "we will use the `build_adjacency_from_file` method to read it." + ], + "id": "600d6df30883a002" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:45:40.390495Z", + "start_time": "2024-10-30T09:45:39.316630Z" + } + }, + "cell_type": "code", + "source": [ + "# Step 1: Load the Data\n", + "from probinet.input.loader import build_adjacency_from_file\n", + "\n", + "from importlib.resources import files\n", + "\n", + "# Import necessary libraries\n", + "import pandas as pd\n", + "\n", + "# Define the adjacency file\n", + "adj_file = \"network_with_anomalies.csv\"\n", + "\n", + "# Load the network data\n", + "with files(\"probinet.data.input\").joinpath(adj_file).open(\"rb\") as network:\n", + " graph_data = build_adjacency_from_file(network.name, header=0)" + ], + "id": "c2256462b5a70b0a", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:root:Read adjacency file from /home/dtheuerkauf/software-workshop/prob-gen-model-for-nets/probinet/data/input/network_with_anomalies.csv. The shape of the data is (2698, 3).\n", + "DEBUG:root:Creating the network ...\n", + "DEBUG:root:Removing self loops\n", + "INFO:root:Number of nodes = 300\n", + "INFO:root:Number of layers = 1\n", + "INFO:root:Number of edges and average degree in each layer:\n", + "INFO:root:E[0] = 2698 / = 17.99\n", + "INFO:root:Sparsity [0] = 0.030\n", + "INFO:root:Reciprocity (networkX) = 0.201\n", + "INFO:root:Reciprocity (considering the weights of the edges) = 0.201\n" + ] + } + ], + "execution_count": 2 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As we have seen in previous tutorials, the `build_adjacency_from_file` outputs a list of MultiDiGraph NetworkX\n", + "objects, a graph adjacency tensor `B`, a transposed graph adjacency tensor `B_T`, and\n", + " an array with values of entries `A[j, i]` given non-zero entry `(i, j)`. These outputs are \n", + " essential for analyzing the network structure and performing further computations. \n", + " \n", + "Now that we have loaded the data, we can proceed to visualize the network structure." + ], + "id": "cdd59474a334e5ad" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:45:52.022178Z", + "start_time": "2024-10-30T09:45:40.560616Z" + } + }, + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt\n", + "import networkx as nx\n", + "\n", + "# Extract the graph list\n", + "A = graph_data.graph_list\n", + "\n", + "# Set the seed for the layout\n", + "pos = nx.spring_layout(A[0], seed=42)\n", + "\n", + "# Draw the graph using the spring layout\n", + "plt.figure(figsize=(5, 5))\n", + "nx.draw(\n", + " A[0],\n", + " pos=pos,\n", + " node_size=50,\n", + " node_color=\"black\",\n", + " alpha=0.6,\n", + " edge_color=\"gray\",\n", + " with_labels=False,\n", + ")\n", + "plt.show()" + ], + "id": "bb66b2243a1a546f", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAAIHCAYAAAALof87AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9aXRd53mfjV/7zCPOjHkeCYAECHAWJ1OzZNlWk9pt2qRpu5q1mjf90sT90vWufms/tInd9816O2fFcWQ3bmzHTmRbEiVxJjgDJDHP83SAM+DM8/8D/vsxDkFSlCWKsv1ca3nBOsM+e+8D4rmf+/7dv1spFAoFJBKJRCKRSP7/aJ71CUgkEolEIvl8IYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDiUQikUgkRcjgQCKRSCQSSREyOJBIJBKJRFKEDA4kEolEIpEUIYMDyScik8mwtbVFJpN51qcikUgkkk8J3bM+AckvJ5OTk5w9e5Zz586RTCYxmUycOXOGl19+maampmd9ehKJRCL5BCiFQqHwrE9C8svFhQsX+OY3v4nf78flcmEymUgmkwSDQXw+H3/4h3/IqVOnnvVpSiQSieQXRAYHko/F5OQkX//614lGozQ2NqIoiniuUCgwNTWF3W7nT/7kT2QGQSKRSH5JkZoDycfi7Nmz+P3+XYEBgKIoNDU14ff7ee+9957RGf7qIPUcEonkWSEzB5InJpPJ8I//8T8mHo9TVVX1yNctLS1hsVj4zne+g16v/wzP8FcDqeeQSCTPGpk5kDwxiURCLFaPw2QykUqlSCQSn9GZ/epw4cIFvv71r/PWW28Rj8cxGAzE43Heeust/uiP/oiLFy8+61OUSCS/BshuBckTYzabMZlMxOPxx74umUxisVgwm82f0Zn9ajA5Ock3v/lNotEonZ2dRWWbyspKpqam+MY3vkFVVZXMIEgkkqeKzBxInhi9Xs+ZM2cIBoM8qhpVKBQIBoOcOXNGlhQ+JlLPIZFIPi/I4EDysXjppZfw+XxMT0/vChByuRwDAwM4nU6OHTv2yABCsptMJsO5c+dwuVy7AgMVRVFwuVycO3dOihQlEslTRZYVJB+L5uZm/vAP/5BvfOMbDA0N4XK5MBgMBINBUqkUGo2G0tJS/vZv/5a+vj46OzuprKzE7XbjcDjQarXP+hI+l/wieg6ZmZFIJE8LGRxIPjanTp2iqqqK9957j3PnzhGLxUin0xw9epR8Po/L5aJQKLC+vs76+jp6vR6bzYbL5aK3t5fOzs5nfQmfO6SeQyKRfJ6QZQXJL0RTUxO///u/z3e+8x2+853v8OKLL+JwOHC5XLtem8lkCAaDzMzMsLGx8QzO9vPPk+g5EokEGxsbUs8hkUieOjI4kHwi9Ho9iqI8UblAq9Vy6NChz+CsfjlR9RxTU1NEo1EymQz5fB7YFnqOjIxQKBTYs2eP1HNIJJKniiwrSD4xq6urKIrykQtWdXU16XQai8XyGZ3ZLxclJSUcOHCAs2fPcvv2bSwWCyaTCafTSSgUwm63097ezvXr1wmHw3R0dFBVVYXVan3Wpy6RSH7FkMGB5BOztrb2RK+LxWJcunSJ3t7exzos/roRCoUYHh6mv78fjUbDkSNHCIfDDA4Oks1mCQaDeDweWltb8Xq9ZDIZhoeHWV9fx263U1lZSW1tLXV1dWg0MhkokUg+OTI4kHxiPio40Ov16PV6QqEQGo2GbDbLnj172LNnzyPb9n4diEajjI6OMj4+zsbGBltbW+TzeXw+Hy+99BJf/OIXiUajzM7Oks1mgW39hqIoZLNZNjc3MZlMjI6OsrKygslkoqKi4hlflUQi+VVABgeST0QulyMQCDy0pKAoCl6vl2g0itFoRKvVEggExO42EonQ29uLTvfr92u4vr7OhQsXCIVCpNNpIpEIhUIBjUaDXq/HYDBgNBqJx+O7sgGFQgGtVks2m2V+fh63282ePXsoLy9/RlcjkUh+1ZA5SMknIh6Pk81mixYwrVZLRUUF//bf/luef/55SkpKSKVS2Gw2zGYzm5ubBAIBVlZWuHz5MrFY7BlewbPBZrNhs9kIh8OEQiEURUGj0aDRaDCbzSQSCWw2G4lEQogSd5LL5dBoNORyOWKxGC0tLb/WWRiJRPLpIoMDySfCZrPx8ssv87WvfY1/9s/+GXa7HbfbTaFQYHFxkdbWVlpaWrBYLEQiEXw+HxaLBb/fz8bGhtAh+P3+Z30pnykWi4XTp0/jdDopFArk83mROTCZTGSzWWw2G7FY7KHBAUA2m6WxsRGbzcaPf/xj0un0Z3wVEonkVxUZHEg+EYqi0NLSQmtrKzU1NdjtdlKpFDqdjuHhYRRF4fDhw5SWlmIymfD7/dTX12M2m9nY2GBtbQ2tVsv169cfasn8q0wmk6GiooKuri70ej2FQgFFUUQGoFAokE6nH3lPLBYLZ86c4dVXXyUcDvM3f/M3QpsgkUgknwQZHEg+NRRFoa6ujmw2i9lsZn19nc3NTex2O729vdjtdvR6PXNzc+zbt0+UGObn5ykpKWFoaIi7d+8+cqf8q0Qul6O/vx+bzUZNTQ3t7e34fD4qKirQarUYjUai0Si5XG5XcKDVavnH//gfc+rUKUZGRqiurubFF18kEAjw4x//mFwu94yuSiKR/KoggwPJp0pzczMAGo2GTCbD5OQkAI2NjTQ1NWG1WlEUhYmJCQ4fPizmMoyPj1NaWsrS0hJXr14lmUw+y8t46gwPDxOPx2lra2NpaQmPx0NNTQ2/+Zu/SUNDAyUlJbjdbnw+H62trZSVldHe3o7L5cJqtbKxsUFXVxfZbJaRkRFaWlo4deoUa2tr/N3f/Z0MECQSySdCBgeST5Xy8nLMZjPhcBir1crMzAzxeBxFUejp6cHj8QiB4ujoKCdPnsRgMBAOh7l//z5lZWXE43EuXbpEKBR61pfzVFhbW2N2dpaOjg4WFxcxGo2kUikqKiqwWq0kEgkcDgdOpxOv18sbb7zBCy+8gNVqFRqFyclJNBoN7e3tzM3Nsbm5SWdnJ8ePH2dpaYl33nnn1yIDI5FIng4yOJB8qlgsFjweD7FYjNLSUhKJBLOzs+K57u5u4fq3tbXF9PQ0J06cQK/XE4lE6O/vx+PxYDQauXr1KktLS8/2gj5lUqkUAwMDlJWV4XA4WFlZoaKiglgsRm1tLel0mkQiQUlJSdH7nE4n+Xye0tJSdDodoVCI2dlZ6urq8Hg83L17l1wuR3d3N0eOHGF2dpazZ8/+Wmk4JBLJp4cMDiSfOk1NTeRyOfL5PDqdjsnJSZHmrq2tpb6+Hp1Oh8PhYHl5mVAoxPHjx9HpdMRiMe7cuYPZbKa8vJw7d+6ImQK/7BQKBQYGBlAUhe7ubsbGxrDb7aTTaaxWKx6Ph62tLWDbSnlna6LD4QDA7XYL8aJ6X7q6ukgkEoyNjQFw8OBBenp6mJyc5Ny5c78S904ikXy2yOBA8qlTXV2NTqdjY2MDj8dDKBRicXERQCyMLpcLo9GI3W5neHgYvV7PkSNH0Gq1JJNJ+vv7SaVStLe3MzU1xY0bN8hkMs/4yj4ZMzMzrK+vs3//fiKRCH6/n8bGRlZWVqirq0NRFLa2ttBqtdhstqL3GgwGLBaLGH8NsLm5yerqKjabjba2Nqanp0Up5tixY+zdu5eRkREuX74sAwSJRPKxkMGB5FPH4/Fgs9nY2NigqqqKQqFQ1KZoMpno6uoSwYHJZOLy5ctUVlZy8OBBANLpNIODg6ysrNDb20swGOTy5ctEo9FneWm/MFtbW4yMjNDY2IjP52N0dBSn0ykCnurqagDC4fCurIGKw+EgkUhQVlaGXq8nnU4XCT5LSkpEt4eiKJw6dYq2tjbu3bvHtWvXPruLlUgkv/TI4EDyqWM0GqmoqCCTyZDL5bBYLKyvrxMIBMRr1GFBGo0Gl8uFVqvlvffeo7Ozk56eHmDb5Gd0dJSxsTEOHz4MwOXLl1lfX38m1/WLksvluHPnDjabjT179rC2tkYwGGTPnj3Mz89TXl6O0WgEtoOIB/UGKk6nk3A4THV1NXq9Ho1Gw8LCAuFwGI1GQ3d3N5FIhKmpKWA7S/PCCy/Q1NTEnTt3uH379md2zRKJ5JcbGRxIngoNDQ0oiiIEd5lMhpmZGfG8oijs27cPm82GRqPB6/WSSqX46U9/yuHDh9m3b5/QLUxOTnL79m0OHDiAy+Xixo0bv1SGSSMjI8RiMXp7e9FoNIyOjuL1etFoNESjUerq6oDtICISiQh9wYM4HA6y2SwOhwOTyYRGoyGRSIj76nA4aG5uZnx8nEgkAmzf51deeYW6ujquXbvGvXv3PpuLlkgkv9TI4EDyVPD5fJhMJpaXl6murkar1bK4uEgikRCvMRgMdHd3o9Vq0ev1+Hw+Njc3+eCDDzh58iSdnZ1iCuHc3BxXr16ls7OTpqYmhoaGGBgY+Nz386+vrzMzM0NHRwd2u52lpSUikQjt7e3Mz88LISJsT2ksFAqPzByoQUOhUMDlcol5FjMzM8I6WbWqvnv3rgieFEXhtddeo7KyksuXLzM8PPy0L1sikfySI4MDyVPB7XbjcDiIx+PAtvp+Z1ujSllZmdg5G41GSktLmZqa4vbt25w+fZr29nZSqRQajYalpSXOnz9PZWUlvb29rKys0NfX97k1TFLbFktLS6mvryefzzM2NkZFRQUWi4Xl5WVqa2uFviAcDqMoyq7gQF3kVVFiOBymqqoKnU6HTqcjEomwsLAAbLsndnV1EQwGi+61VqvlS1/6EqWlpVy4cIGJiYnP5iZIJJJfSmRwIHkq6HQ6ampqKBQKzM7OUl1djUajYW5ubtduv7OzE6vVik6nw2Qy4fV6uXnzJrOzs5w5c4aWlhYSiQRarVaMOjabzTz33HMkEonPpWGS2rYIsH//fpH9SCQStLW1ie6Nmpoa8Z6trS2sVitarRbgoaJEVXegihIVRSGfzxeVWTweD/X19YyOjorgDLa/ky9/+cu43W4++OCDojKPRCKR7EQGB5KnRnl5OTqdjsXFRSGii0Qiu4yNdDod3d3dYiaD1WrFarXywQcfEA6HeeGFF2hsbCQWi6HX69nc3OTChQuk02lOnjyJ2WzmypUrYsH9PDA7OyvaFo1GI9lslomJCaqrq7HZbLuEiLCdOXiU3kDF4XAQDofxeDzY7XYx5nlzc7NIqNne3o5er+f+/ftF2gyDwcCbb75JSUkJ77333ufqnkkkks8PMjiQPDW8Xi8Wi4VgMIhOpxN18tnZ2V1iQq/XS2NjI4lEQpQXAN5++22y2SwvvfQS9fX1RCIRjEYj4XCYy5cvs7m5yXPPPUdVVRX9/f0MDw8/c6FiJBJheHiYhoYGcR0zMzNkMhlaW1sJBoNEIhFRToHtTMPjOhVUnE4n2WyWVColsgd6vZ5sNluUCdDpdHR1dbG+vr4rGDMajbz55ptYLBZ++tOfsrKy8ilevUQi+VVABgeSp4bT6cTj8ZDL5ZicnKS2tpZCoUAwGCxqa1TZs2eP6F4oFAo0NDQQjUZ555130Gg0vPLKK1RXVxMKhTCZTEQiEfr6+lhYWKC7u5vOzk6mp6efqWFSLpfj9u3bWK1W2tvbgW3PhqmpKerr67FYLMzNzRUJEQHi8bjoRHgc6vOhUIjy8nLxuNoZstMHorS0lOrqagYHB0mlUkXHsVgsvPnmmxiNRt5+++1fuvZQiUTydJHBgeSpodFoxAjiubk5qqurMRqN5PP5XcJE2BbN9fT0kEwmcTqdJBIJWlpaWFxc5MqVK+h0Ol599VUqKysJBoOYzWYSiQQ3btxgcnKShoYGjhw58kwNk0ZHR0XboqodmJqaolAo0NzcTDqd3iVEBIpskx+HXq/HarUK3YHZbEaj0QhnyQfva2dnJxqNhsHBwV3HstvtfOUrX0Gn0/H2228/NGCTSCS/nsjgQPJUKS0txWg04vf7URSF8vJyscvd2dao4nQ6aW5uJhAI4PF4SKfT1NXVcf/+fUZGRjAYDLz22muUl5cTCASwWCyk02n6+/sZGRnB6/Vy8uRJFEX5zA2T1tfXmZ6epqOjQyzyyWSSmZkZGhsbMRqNLC0tUSgUioSIsK03MJlMRRoElQfLJKruwGg04vF4RNeCoigsLCyQzWbFaw0GA52dnSwvL7O6urrr2E6nky9/+csUCgV+/OMff+6EnRKJ5NkggwPJU8Xr9WKz2Ugmk8zPz4sdcy6XY25u7qHvaW1tpaSkhGQyiclkEpMeL168yNraGkajkddeew2fz4ff78dms5HL5bh//z737t3DYrFw4sQJ3G43N27cEDv3p8mDbYsq4+PjaLVaGhsbKRQKzM3NUVFRsSsIUG2TnwS1Y6FQKFBWViZGM2u1WqLR6C6RYWVlJWVlZdy/f/+h5RaPx8Mbb7xBLpfjb//2b39pLaolEsmnhwwOJE8Vm82G2+1Go9EwNTVFaWkpFosFg8Hw0LZG2C5H9PT0kEgkcDgcJJNJGhoaMBgM/OxnPyMej2MymXj99dfxeDysrq5it9uB7bT+7du30Wg0HDp0iObmZoaHh5+qYVKhUODu3bvAz9sWAWKxGPPz8zQ3N6PX64UQsba2dtcxtra2PlJvoKI6JUajUcrLyzEYDGg0GnQ6HRqNhpmZmaJgSHWjzGazjzRAKisr47XXXiOZTPKjH/2oqAVSIpH8+iGDA8lTRVEUysrKMBqNQhVfU1MjFPfLy8sPfZ/dbqetrY2VlRVqa2tZW1ujp6dHWCzncjnMZjNf/OIXcTqdLC0tYbfbURRFTHHM5XLs2bNHGCZdvXr1qRgmzc3Nsba2Rnd3d1FGYGxsDKPRKDIJc3NzWCwWvF5v0ftTqRTJZHJX5uBhPgfwc1FiOBzGZrNhs9lEWUHtetjY2Ch6j9lspqOjg/n5+V3PqVRVVfHKK68Qi8X48Y9//Lk1l5JIJE8fGRxInjperxej0Ug0GsXv94t6u9FofGhbo0pTUxMul4vV1VUqKipYWVnhwIEDrK+vc+7cOQqFAhaLhddffx2Hw8Hi4iJOpxONRsP8/DzXrl0jnU5TVVXF8ePHSaVSXLp0iWAw+Kldm9q2WF9fT1lZmXg8HA6ztLREa2srWq2WTCZTNJp5J6oY8UkzB6ooMRQKCR2HOolRq9U+UvBZW1uLx+Ph7t27RbqEndTV1fHiiy8SDof527/9211dDhKJ5NcDGRxInjqq7qBQKDA5OSna+BRFIRQKPVIEpygK+/fvJ51Oo9VqMZlMxGIx2tvbGRsbEw6Edrud119/HZvNxtzcHB6PB41Gw/LyssgWOBwOTp48icVi4erVq8Ju+JOgTlu0WCx0dHQUPTc6OorVahUlhMXFRfL5/C4hImwHEjqdDovF8sSfreoOYLskoM5ZMBgMKIrC2trartKAoih0d3eTSqUYGxt75LGbmpo4c+YMm5ubvP3228+sLVQikTw7ZHAgeeqYzWbcbjcGg4H5+XlgexebTCYxGo2PtfG1Wq10dHSwuLhIXV0dsVgMl8tFZWUl169fF4t8SUkJr7/+OhaLhenpabxeLzqdDr/fz5UrV4jFYhiNRo4dO0Z1dTUDAwMMDQ19IqHi6Ogo0Wi0qG0RIBAIsL6+zp49e0Sqf25ubpcjoopqfvSoMsLDzlHtWCgUCuLeGo1GCoWCEHw+LHtgtVppa2tjZmbmsZ0JbW1tnDx5kvX1dVHGkUgkvz7I4EDymeD1ejGZTIRCIaLRKBUVFej1eoxGI8vLy4+tb9fV1eHz+ZiamqKtrU2YHlmtVs6ePSt20E6nk9deew2TySTEjzqdjmAwyJUrV9ja2kKj0dDV1cXevXuZmZnh+vXrv9DO2O/3Mz09TXt7e5FWoFAoMDIygsPhoKKiAuChjog7eRJnxAdxOp3kcjmi0SgajYbS0lIKhQL5fB6dToder2d+fv6hi3pjYyMOh4OBgQHR6fAw9u7dy9GjR1laWuKdd9557GslEsmvFjI4kHwmqMGBavOr1WqpqqoimUwKk6RHoabDc7kcoVCIqqoqxsbGOH36NLlcjp/97GeiNu52u3n11VfR6/WMj49TVlaGTqdja2uLq1evEggEUBSFhoYGjh49Sjgc5tKlS0QikSe+llQqRX9/Pz6fj4aGhqLn1tfXCQQCImsAMD8//1AhIiAW+CfVG6jsdEqE7TkWmUwGnU4nZjmk0+ld1snw8/sZjUaZnJx87Ofs37+fAwcOMDc3x9mzZ2WAIJH8miCDA8lngjpnQafTiXR3bW0t6XSakpIS5ubmHrvwmM1m9u7dy/LyMj6fT4gZT548STAY5IMPPhDpd6/Xy6uvvopWq2VsbIzKykr0ej3xeJxr164JYySv18uJEyfQaDRcvnyZtbW1j7wOtW2xUCgUtS2qz42OjuLxePD5fABkMpmHOiKqbG1tUSgUHpo5eFSZAbZnJ9hsNpE18fl8QpeRyWTQaDQYDIZHCj5LSkpobm5mYmLisYGRoigcPnyY7u5upqamhBBUIpH8aiODA8lngl6vx+l0YrFYWF9fF3ME7HY7hULhsW2NKlVVVVRUVDA8PMy+ffuIRCJks1n2798vSgQqpaWlvPLKKyiKwvDwsJgKmUqluHnzpvgsq9XKiRMnxJjoycnJxy5+8/Pzom3RZDIVPbe8vMzW1lZR1kAVIj7M2wC2gwNFUYRPw8fB4XCIzIFerxezGrLZLBaLBUVRCIfDj+zOaG1txWKxiGDnUSiKwnPPPUdHRwejo6NcvHhRBggSya84MjiQfGb4fD4MBgPJZJLl5WUURaG2tpZwOIzL5XqsMBF+buajKAozMzN0dHQwMzNDbW0t9fX19Pf3F6XJy8vLefnllwEYHBykpqYGnU5HNpvlzp07opSh0+k4ePAgzc3NjIyM0N/f/9BafSQSYWhoiLq6uqKhRwD5fJ6xsTHKyspwu90AHylEhJ97FewUND4pTqdTZB5gu2shHo9jNBrR6XSkUin0ev0j76tGo6G7u5tQKPRE9/706dO0tbUxNDREX1+fDBAkkl9hZHAg+cxQ/Q40Go1YxKurq4HtskEoFPpIDwKj0UhXVxdra2totVoqKiq4f/8+x44dw+l0cu7cOfx+v3h9ZWUlL7zwAvl8nnv37lFfX49GoxH/rZ6Hoijs2bOHAwcOsLq6ytWrV4tmP+Tzefr7+zGbzXR2du46r4WFBeLxOHv27BGPhUKhxwoR4eM5Iz6Iw+Egl8uJskBZWRmFQgGr1UoikRAdDCsrK48UfLrdburr6xkdHf1IV0RFUXj++edpaGhgYGCAW7duyQBBIvkVRQYHks8Ml8uF0WjEYrGIAUQGg4Hy8nK2trawWCwPbb97kPLycmpqahgaGqKlpQW9Xs/Q0BAvv/wyGo2Gd955p2ihq6mp4cyZM2SzWe7evUtjYyMajQZFURgZGWFkZEQscpWVlUWGSeqkwtHRUSKRyK62RdgWFY6Pj1NVVVWkHXiUI6KK6mb4SYIDtXQA22OY1c9XtRzJZBKNRvNYweeePXswGAzcu3fvIxd7jUbDyy+/TE1NDTdv3hReExKJ5FcLGRxIPjO0Wi1utxuLxUI0GhVZgpqaGqLRKF6vl+Xl5Sdy5evs7ESv1zM8PExvby9bW1usrq7ywgsvEIvFeO+994pKA/X19XzhC18QA5JaWlqEo+DExAT3798XC6NqmGS1Wunr6+PevXtMTU2xZ8+ehy7kMzMzpFIp2traxGMfJUSE7dkLuVzuY7cxqqiixJ1+BTsDLUVRyGaz2O32xwo+dTodXV1d+P3+XUObHoZWq+W1116jsrKSa9euPXQctEQi+eVGBgeSzxSv1yt23lNTU8C2FsFsNpPL5VAU5bG7XBW9Xs/+/fvZ2NggFArR3t7O9PQ0ZrOZQ4cOsby8zOXLl4t2wo2NjZw6dYpkMsnt27fFYq7X65mbm+POnTtiAVUNkyoqKrhy5Qq5XG5X2yJsBwGTk5PU1dUVORwuLS09VogIiB3/RwUHj9vNq2ZIKmVlZULsGQ6HcTgcQvCpzrZ4GKWlpSIb8yQzFXQ6Ha+//jo+n4/Lly8/1nFRIpH88iGDA8lniupcaDQahVuioijU1NSwtrZGZWXlR7Y17jxWQ0MDIyMj+Hw+ysvL6e/vp729XUxjHBoaKnpPS0sLx48fJx6Pc+vWLaER0Ov1LC8vc+PGDTF3QN15q2WBGzdukE6ni443NTVFPp+npaVFPPYkQkTY1huYzWYMBsNDn39cK6OKw+Fga2tL3C+HwyG6KDKZDDabja2tLZxO50eKDjs6OtBoNE+cCTAYDLzxxhu4XC7OnTsngj2JRPLLjwwOJJ8pDocDg8GA3W5nc3NTiP7USY1ms5lkMvnYXe5O2tvbMZvNDAwM0NXVhU6n486dO5w+fRqv18vVq1d3GQG1tbVx9OhRotEot27dor29HdgOEDY2Nrh27RqZTEa0LZ48eZITJ04QDoe5fPmyEACmUimmp6dpbGwsamsMhUJsbW09NmsAiJ39J2GnUyL8fApmOBympKSEbDaLRqPBaDQSDAYfa5lsMBjYu3cvKysrT3z/TSYTb7zxBiUlJXzwwQdPpBmRSCSff2RwIPlMURQFr9eL2Wwmk8mI2QiqcG9zcxOv1/uRu1wVrVbL/v37CYfDzM/Pc+DAAUKhENPT07zyyisYjUbOnj0rJh+q59DZ2cnhw4fZ2tri5s2bdHZ2oiiKcFM8f/48d+/eFW2LXq+XkydPFhkmTUxMoNFoaGpqKjonVYioGiE9DFWM+IvqDVTUmQwP6g7i8Tgul4uNjQ1KS0uJRqOYzeaPXLwrKiooLy/n/v37T2wrbbVa+fKXv4zFYuHs2bNPpFuQSCSfb2RwIPnM8fl85HI5jEYj09PT4vHa2lo2NzcpKyv7yF3uTlwuF83NzYyNjaHRaGhvb2dycpJkMsmLL75IOp3m3XffLVrsVM+EAwcOEA6HuXHjBvv27UOj0YiRzxsbG9TX14v3WCwWTpw4gc/nE0LFpqYm9Hq9eM2TCBFhO+uQSqU+cXDwoFMigMfjQafTiQFMZrOZWCyG2+1maWlpV2lkJ+p9yefzu0oyj8Nms/GlL30Jo9HIO++8w+rq6ie6LolE8myRwYHkM8fr9aLRaCgpKWFlZUXU+MvLy9Hr9SSTySdua1RpbW3FbrfT399PfX09paWl9Pf34/F4OHbsGBsbG7usf9WR0Pv37ycQCHDt2jX27dtHKBQik8ng8/m4fv16kb2wTqfjwIEDGI1GwuEwoVCoqCtCFSI+bDTzTtRMxictK6jH2BlIabVafD6fMJeKxWJYLBahS1C1Ho/CZDLR0dHBwsJCkWfEk5zHG2+8gVar5ac//enHeq9EIvl8IYMDyWeOxWLBbDZjs9lIJBJi1oE6jEkdz7y0tPREbY2w3X/f09NDLBZjfHycnp4eNBoNd+7cobOzU2QTbt++XfQ+RVE4cOAA3d3dbG5ucuHCBbRaLV6vF4PBgKIoXLlypcicKRqNksvlOHz4sBgJnUgkioSIWq2Wra2tR6bmw+Ewer0es9n8kdf2Ud4DqlPiThFnWVkZoVAIn8+H3++nsrKS9fV1KioqHjlvYSc1NTV4vV7u3bsngrcnwW63c+rUKbLZLD/5yU+ET4REIvnlQvesT0Dy64eiKPh8PlZXV9FqtUxPT1NZWQlslxZmZ2cxmUwoisL8/HxRJ8DjKCkpoa2tjdHRUcrKyjhw4ABXr15lfHycEydOEAqFuH37Nm63m8bGxqLzOXjwIKlUihs3blBSUsJXvvIVBgcHyWQyGAwGrl27xsGDB/H5fIyOjmI2m+np6SEajXLz5k0uXbpES0sLo6OjhMNh/uN//I8kk0lMJhNnzpzh5ZdfLtImqHqDJ+lI+CgcDgf5fJ5IJCIyEWVlZcB20FQoFNDr9eTzeUwmE4lEgrW1tV0W0DtRFIWuri4uXLjA2NjYQ10hdzI5OcnZs2c5d+4cyWSSQqGAw+FgY2OD3/u93/tUMiQSieSzQ2YOJM8Er9dLKpXCbrezsLBQZEDkcDhYWVmhqqqK2dnZjzUmuKmpCafTycDAgAgWJicnCQaDvPTSS1itVs6fP79rR6soCiaTCZfLRT6f59q1a3R3d2MwGEin01itVm7cuMHY2Birq6u0tbWJ0siJEyew2Wz8j//xP/iLv/gLfvSjHxGPxzEYDMTjcd566y3+6I/+iIsXL4rP+zQ6FVQedEqE7c4Dt9tNMBjE7XazsbGBz+cjEAg80RwL2BYalpWVcevWrYeOfla5cOECX//613nrrbfEdasTKr/zne/wx3/8xx9rJLZEInn2yOBA8kzwer0oiiJS4jsXttraWuF5kEwmP5a4TVEUenp6SCaTjIyM0NzcjNfrpb+/H61Wy8svv0w+n+fdd98tMvtZWFhgdXWVV155hY6ODtbW1ujr62P//v2YzWbi8TgOh4NLly5RKBSoqqoS7zUajTidTj744AMA9u7dS1VVFR6Ph6qqKjo7O4lEInzjG99gamqKbDZLLBb7SDHik2YVtFrtLqdE2M4ebGxsUF5eLn4Gg0FKS0vZ2Nh4ogVbp9MRCAT4m7/5G27fvk0sFit6fnJykm9+85tEo1E6OzuLrru3txez2czf/d3f8Wd/9me73iuRSD6/yOBA8kwwGo2UlJRgtVrJ5/NFIrmqqiqxE/Z4PE/c1qhitVrp6OhgdnaWjY0Nenp6UBSF/v5+fD4fJ0+eJBwO8/777wuPgMHBQWpra6mqquLYsWO0tLSwsrLC1atX6e7uxmq1sra2hqIoJJPJoi4LgB/+8IdEIhHa29t3LeqKotDU1ITf7+e99977VMWIKk6nsyjAgu3gIJfLiW6KXC4nMiFGo/GJBJ+KomCz2chkMvT19fH2229z584d4atw9uxZ/H4/jY2ND73uvXv3otFouHHjBj/5yU+eyH1RIpE8e5SCHKsmeUYMDQ2xtLTE8vIyLpeLr3zlK+K5O3fuEA6HaWtr4/bt25w6depjLaaFQkF0GnzhC19ga2uLvr4+WltbaWlpoa+vj7t377J3714KhQLZbJZTp06h023LcDKZDJcuXWJqaorq6mqee+45/u7v/o5UKkVXVxerq6u0tLTQ1tZGJpPhlVdeIZPJPLY2Pzs7SyqV4vd///cJhUK7FtQH/ymm02kWFhaoqKh4pHBRfU84HCYQCBS1XgIsLi5iNBrJ5XLk83kMBgOxWAy73c7W1hY1NTVoNJqHfj5sd18Eg0G0Wi3pdBqDwUA+n8dsNvOlL32Jf/Nv/g3xeLwok/KwY2SzWb70pS9RUVHBF7/4ReEcmclkSCQSmM3mopZQiUTybJGCRMkzw+v1Mj09jcfjYX19XQj4YLu00NfXh9FoFOY93d3dT3xsRVHo7u7mwoULDA4O0tPTQ2trK+Pj47jdbo4cOUIwGOT27dt4vV7eeOMNERjAtlviiRMnyOfzzM7O8v7774sa/MbGBlVVVUxMTJBOp3E4HMTjcUpLSx97ThaLhWw2i06nw+1243K5iMfjJJNJEokEqVSK1tZWMaMhkUgQDAaprq7Gbrc/tswQjUYZHh6moqICq9UqHjcYDGxsbFBbW8vU1BTt7e2Mjo7S0NDA7OwsTqeTioqKXfdOZW5ujnQ6jU6nI5vNksvlsFgsGAwGbt26xfLy8mOFjbDdGpnJZOju7mZwcJB33nmHlpYWLly4IASMjxJuSiSSZ4MMDiTPDI/Hg6IoOBwOFhYWWFlZEcONPB4PFouFhYUF6urqmJiYoL29/ZFzCB6G2Wxm79699Pf3U15eTktLC5ubm8Jeubu7m4mJCUKh0EPT3QaDgZMnT5LP5xkcHMTj8fDKK69w7949VldXqa2tZX5+nlQqhclk+kjhZCaTETMOtFot4XAYRVGKpic2Nzdjs9mA7QV/fn6e+vp6PB7PY4+dy+VYWlrC6XRSV1cnHne73Vy5coWmpibW1tbQaDRUVFSg1WppbW0lHA7T0NCwK/DI5XJsbW1RKBTI5XJFXg6RSIRoNEo2mxUBzuPOT/WtOHz4MEajke9+97v8p//0nygUCrhcLkwmkxBuvvvuu/zhH/4hp06deuz1SiSSp4vUHEieGTqdDpfLhUajwWAwFNXx1WFMatdCoVD4SPOeh1FVVUV5eTn37t0jnU7T29sLwM2bNxkeHmbv3r3C9leto+/EaDTS2NiI2WwmkUhw5coVurq68Hq9LC4uUl1dzfr6Op2dnfj9/kd6AkSjUTY2Nnj++edFBiESiYjZEvl8HpfLJQKDj4tWq8Vut+/SHagWyn/6p3/Kn/7pn/Kv/tW/4o//+I/51re+RTqdJhaLsba2RjgcZm5ujnv37nHx4kV+8pOf8N577xGPxx/6eYVCQbguzszMPNI3IRQKsb6+zpkzZzAYDDidTu7cucPW1hYNDQ2PFW5KJJJnhwwOJM8Un89HJBLB5XKxvLxctEOtqakhl8uJNP6TmPc8iNqvrygK9+7dw2AwsH//fiYmJggEAhw/fpwvfOELJBIJ3n///V2mRblcjtnZWXp6eqirq2N+fp6+vj66urooKytjZGQEm81GS0sLqVSKW7dukU6ni84zEAhw8+ZNkskkbW1t1NTUcPDgQUpKSrBYLEIUubGxwdWrV5meniYej39sDwSn07mrY+HixYt8+9vf5oc//CGAGN/8wQcf8Ed/9Edcu3aNn/3sZ1y4cIFbt24xMTHB2toasViMfD6P2+1+5H0F6OzspKamhunpaXK5HIVCQWQbFhcXGR8fR6vVsm/fPgBxj5uamooGb6nH3CnclEgkzw4ZHEieKV6vl0wmQ2lpKbFYjI2NDfGc2WzG5/MxPz9PQ0MDiUTiF/LsNxqNQkS4uLhIKpUSswfi8TiNjY309vaysrLC5cuXixb2ubk5kskke/fu5dSpU5SXlzM7O0tfXx979+5FURQR3Jw+fRqtVsvVq1cZGBhgY2ODpaUlpqamMBgM9PT0cOXKFSYmJnA4HHR2doqsSVlZGb29vWi1WkZGRvjggw/o6+sjHA4TjUafKChyOBxEIhFR3piYmOCP//iPicfjYtiVRqMhn89TXl5OKBTi/fffZ2FhgXQ6jV6vx2AwYDabMRqNmEwmampqsNvt4jPU2ROKoogST09PD0ajkRs3bjA6Osrw8DDT09OMj4+j0+n4nd/5HYLBIGNjY5w7dw63243P58NkMuH3+4tcMBVFESOgn3Twk0Qi+fSRmgPJM8XpdKLT6YQaf3Z2Vrj7wXb24Pbt22g0GpHCflBA9ySUl5dTXV1Nf3+/aLFLJBJCf9Db20sgEGBsbAyXy8X+/fvJZrNMTExQW1sr0v2nT5/m3LlzTE9Pk0qlyGQy6HQ6IpEIx44do66ujvPnz7OyskI4HMbtdnPo0CHKysrQarXAds3+Zz/7GTabDZvNRiqVoq6uTrRBZrNZ1tfXmZubY2trixs3bjA1NUV5eTnl5eW4XK5dWYVCoYDJZCIWi9Hf308mk+Gtt95icnKS2tpaEokEuVwOu91OoVDA6/ViMplYWlpifHxc6DnUIKG2tpby8nIikQgLCwtEIhEURRGOixqNRmQpLBYLbW1t2Gw2otEom5ubmM1mOjo6aG5upqmpierqahEwqefv8/lYX19nfX2d0tJS0cFgMplIpVIkEgnZwSCRPCNkcCB5pmg0GjweD+l0GpvNxvz8PIcPHxaLX3l5OQaDgYWFBRoaGrh9+/YvPOq4o6ODu3fvotVqefXVV8nlcly4cIH+/n4OHz7M6dOnxQhnt9stFtSd9s02m43Tp09z/vx5MbVw3759rKysoNVqKRQKHDx4UKj6v/a1r/HTn/6UXC5HOBwWGYBsNks0GmVra0vU4tVr1ul0VFZWCvvhtrY2kskki4uLTE1NYTQahWBTURS2traEqNLv96PRaKisrBRtmDU1NWxublIoFCgpKWF9fV0s8kajkYmJCdbX16mrq6O2thafz8fS0hL37t0TYsO1tTUymQy5XA6dTrdLfOlwOPD5fPzO7/wOd+/exWAwcP36dXK5HHfv3sVqtdLd3U06ncbv9wsxqs/nY21tjfX19V2Dt55k7oREInk6yLKC5Jnj9XoJhUJUVlYSDoeLnPs0Gg3V1dUsLi5SWlqKyWT6WNMadzIzM4PNZsNsNrO4uIjJZKKnp4f19XWx6L744osYjUY++OADhoeHqa+v37VI2e12KioqyGazYtiSOptBdQHUarVkMhnu37+P0WgU7YA7yWaz5PN56uvrOXLkyCPPu6SkhMrKShoaGnA4HASDQW7dusWHH37I+fPnmZ+fx2az0dvbS3t7Oy0tLezduxedTofD4UCr1WI2m0kmk2SzWZLJJAsLC2SzWRRFwWq14vF4KC0tpVAocPHiRe7evYtGoxHZjurqauGHoGoLHkRRFPR6PV6vl2w2K3b9yWSSq1evMjs7y969e1leXmZ9fV1kIEpLS9HpdKytrZFOpwkGg5w5c0ZmDSSSZ4jMHEieOV6vl1wuh9vtZnR0lKWlpaLMgCp48/v91NfXMzExwZ49ez5WW+Pm5iaTk5N0d3cLa2Wfz0dpaSnNzc2Mjo7idrtxu908//zz/PCHPyQajfLCCy8UHadQKDA2NsbExAQ+n494PE48HmdoaGhX0KLVapmcnMRisWA0Gh/ayaAoSpH5UjabFZmAtbU1lpeXuXTpEiaTSSz2+/btw+FwsLq6ytzcHIlEQpxTNptldHSUsbExgsEgdrsdi8VCIpEQ7Yd6vR5FUaisrGRoaAiz2YzH4+HixYs4nU48Ho8QNxqNRvL5PLW1tdTU1HD16tWHagEURUGn04mJlaurqyKAKBQKJBIJrl+/jtvtxuPxMDk5ST6fp7S0FK1WS2lpKSsrK9y9e5fq6mpefvnlJ/5uJRLJp48MDiTPHLvdjtFoRKPRYDKZmJmZob29XTxfUlKC0+lkYWGB7u5uxsfHWVhYeGKznEwmQ39/P263m+bmZnK5HH6/n4GBAY4fP05bWxuBQIA7d+5w6tQpsTgGg0GuXr3KSy+9JEoGIyMjYsHX6XR4PB42NzcZHR3dtZvO5/MUCgVCoRBOp1OI+dSUvNlsJpVK8e1vf5uTJ0+STqeF+FCr1WIymTCbzbS3t1NXV4fNZivSGgSDQTY2NkSWIhqNEo/HKRQKBAIBmpqauHbtGtlsFpPJhMViwWKx4HA4WFtbE4t2aWkpwWCQVCpFaWmpKH84HA7C4TDV1dXs27ePO3fuiK6RB1EnP25tbeH3+0UZ4kGMRiOHDx8WwsXFxUV8Ph8ajYaJiQk8Hg/PP/881dXVT/TdSiSSp4MsK0ieOYqi4PV6CYfDQqS2U8EO246Jaiq6srLyidsaC4UC9+7dI5vNihkLOp2Onp4eQqEQk5OTaDQaent7RX18bGyMsrIy9u7dy+zsLDdv3iSfzzM0NMTU1BQNDQ3EYjEURaG3t5dIJPLQc1HnGuTzeWKxGOl0uqhWr9Fo8Pl8pFIpLly4gMlkoquri1OnTvHqq69y9OhRXC4X5eXlD3VIrKurI5PJ4Pf72djYEIGBet0VFRXYbDYWFxfJZrMYDAYikYhwOhwYGBDn4HK50Gq1DA8P43Q6MZvNRCIR9u3bR3d3N0NDQ6yvr9PS0kJra+sjU/6qhbNq1/wwKisrOXXqFL29vWg0GlZXV9FoNBw6dIhXX32VtrY2rl27JrsVJJJniAwOJJ8L1OCgpqaGRCLB2tpa0fOVlZVoNBohTIzH47te8zAWFxdZXl6mq6urSDvgcrloampifHycra0tzGYz+/fvZ2FhgeHhYVpbWzl16hQVFRXcvXuX999/n5mZGbq6uohEIkQiEfbu3Ut1dTXNzc2P/Hx1MU6lUhQKBXQ6HQcPHqSxsZFMJkN5eTmHDx8mn8/T19cnRlar9f1HsbKywrlz5wiFQqRSKZGlUFEUherqat58802MRqO4D6urq/T39zM+Po6iKPzDf/gPKSkp4caNGwQCAYLBIIODg6ytrXHw4EHq6+sZHx9nfn6e2tpaNjc36e3tZd++fbjd7iKr5kQiwdzcHOPj4491i8xkMuTzefbt28c3vvEN/vk//+d87WtfY9++fWi1WtHpcf369UeaSkkkkqeLDA4knwt8Ph+FQgGz2YxOp9uVutbr9VRUVLCwsIDD4cDlcn3ktMZYLMbg4CA1NTVUVlbuel5tv+vv7yefz1NWVoZerycSieBwONDr9Zw5c0ZkH2pqavD5fNy/f5/y8nL27NkDbBsBWa3Why7oTqcTm81GY2MjpaWlWCwWGhsb+ft//+9TWlrK1NQUTU1N9PT0EI/H+da3vrXLyEgln88zNjbGX/3VX/G9732Pqakp4UGgBgZq6ULtRsjn83zhC1/gq1/9KiUlJUKEuG/fPl566SXRVqiWMlKpFJubmySTSba2tpienmZiYkJMqSwrKyOdTpNIJKitreUrX/kK5eXl1NbWYjab2draIhaLiU6Kh6Geq5oxUkWfqtBxeXmZra0tlpaWuHHjRpExlkQi+WyQmgPJ5wKz2YzVaiWVSmG321lcXCSfzxctuLW1tSwuLhIIBGhoaODOnTtEIpEikx6VfD5Pf38/BoOBvXv3PvQzNRoNPT09XLp0ifHxccrLyykUClRVVdHf38/JkyeZmprC7XYLvcHMzAzpdJrq6mpu3LhBKBRidXVV7NxVxX6hUMDpdPLP/tk/E/Mc4vE4er2eu3fvksvlePHFF/mbv/kbzp49yz/5J/+EfD7P3bt3+fa3v80//af/tEikePPmTQYGBgiHw8Lzobm5GZ1Ox4cffkgmkxGiR0VRyOVyBAIBYDtL0tbWRm1tLWNjY+j1etGFkEqlxOCraDQqHq+qqsJoNHL37l2ampoIBoNoNBpaWlq4cuUKGo2G2tpaFhYWhB+B1WolkUjQ1taG3+8nk8kwODj4yO9cURShNamsrGRmZoZkMilcMe12u8hwHDly5COzKRKJ5NND/muTfG7wer1sbm5SW1tLLBZjc3Oz6Hk1jT0/P09FRQVGo/GR2YPx8XFCoRC9vb27Wgh3UlJSQmtrK5OTk9y5c4eSkhLOnDlDJpPhb//2b5mYmKCmpoaqqirm5+cZGhpCr9cTCARQFIW6ujrsdjs1NTUoioJWqxWlgWQyyd27d6mqqqKlpUVMH7TZbMzOzrK5ucn+/fuJx+P87Gc/4/XXX6ejo4NIJMJf/MVfsLq6ysLCAt/97nf58MMPicfjNDc38+Uvf5k333wTrVaL3+/n+PHjlJSUiNLFg/V+rVZLWVmZcCVUAwCAeDyOVqtFr9eL3X46nWZ6epr3338fs9lMoVBgc3OTnp4epqenhRYgGAwyNDQk9Ax79uyhvb2dZDKJoihEo9HH3ntA2CfH43HMZrPINqhDn+LxOIODg/T3939s62yJRPKLI4MDyecGn89HNBqlrKxMePPvZOcwplwuR319PYuLi7uEa2rbYltbGy6X6yM/t7m5WdgWm0wmhoeHhe1xNBolHA5jtVoxGo2iBfDFF1/k8OHDlJSUoNfrRfZCdV88fPgwWq2W8fFxBgYGhEWyVqtlfX2d1tZWVlZWMBgMlJeXMz8/z+3bt3nzzTeprKwkEAjwl3/5l2xubmI0GvnCF77Av/gX/4KvfOUrGI1G+vr6iMViHD16lP3791NTUyM6IR5cRE0mE1artWiwlUomk2F9fR2r1Uo2m6WlpYWKigoCgYBwQTx//jzpdJrFxUWmp6cJhUKEQiGRHTAajRw7dozjx49z5MgRtra2mJqawu/3U1FRIcovD2NhYQGAcDgsggO1JLK6uorb7aanp4eVlRXu3bsnAwSJ5DNCBgeSzw2qa56iKFgslod2JNTU1JDP51leXqauro5CoSAWGPh526LL5XqkUFBNuU9PT9Pf38+5c+eYn58nHo8zMTHB9PQ0BoOBffv24fF4OHDgAAAVFRV4vV6Wl5eFO+LCwgJOp1PsgO12O4cPH6ampgav14ter2d4eJihoSHKyso4ffo06XSakZERDhw4QCgUwuPxiPLAn/7pn7K2tiZ291qtltdff50jR46g0+m4desWAwMDlJeXc/r0afR6PX19fZSWlnLgwIFdqXd1J37nzp2HTp2EbQ1AMplEq9VSWVmJ0+kUrY/5fJ66ujrKysq4fPmy8JvQaDREIhFMJhOdnZ00NTWJhT0cDhOLxdBqtRw+fJivfvWr4vmdaLValpaWSKVSxONxMplM0WvUYLC3t5f9+/czPz/P8PCwDBAkks8AqTmQfG4wGAyit76srIylpSWi0WiRpsBkMlFaWsr8/Dx1dXWiVt3Q0ADA/fv3yWQyPPfccyiKQj6fF6ZC4XCYUCgkWg81Gg0OhwODwUBJSQn79u1jeHgYi8XCmTNn8Hq9XL58mXfffRen04nFYqG9vZ2RkRFu3LiB2WzG7/dTXl4udvjPPfccJpMJRVEoKSmhsbGR+/fvMzc3h0ajoby8nK6uLgYHBxkdHaW0tJSrV68SiUTI5XJks1kOHz7MiRMn+P73v8/MzAw/+clPePXVV5mamkJRFA4dOkR5eTnBYJBr164BiPbEQ4cOcfv2baHyV6cw7nQ7fBg1NTViymR9fT02m43V1VWi0SiNjY2srq6iKIool+RyOdGamU6n2djYEM6S0WgUvV6PXq+no6ODmZkZnE4npaWlbG1tibKDw+FAp9OxubmJxWLB7XYLYyuj0cjq6irT09Po9XoOHDhANpvl/v37aLXax2YjJBLJJ0cGB5LPnEwmQyKRwGw27+qX93q9LCwsUFdXx/T0NNPT0xQKBWEHDNsL2a1bt9ja2hKlhfX1ddLpNLOzs9TV1TE1NUUoFGJra4t8Pi8Wa5fLRX19PU6nU3gHXLhwgbq6OqHy1+v1uFwu4QEwODiIzWZDq9XS0tJCeXk5P/3pT/mrv/orFhYWmJ2dZW1tTUw1VDsUABobGwE4e/Ysa2trDAwM4HA4yOVyYvaATqfDYrEACGW+2WzmN37jN/hv/+2/EQgE+OEPf8ixY8c4fPgwRqORQCDA+fPnSSQS2O12XC4Xvb29DA8PC3GgmilQdQbpdLroXqtZGqvVyokTJxgcHCSTybBnzx4WFhYYGRnB7XaL70AdiHTgwAH27t3Lu+++SzQaJZlMcvHiRVZWVkin01itVurq6sQgq9nZWTweD7OzsyiKIgY6nThxArfbzY9+9CPq6uo4ceIEuVyO9957D7PZTCAQIJlMsrGxQV9fH4cPHyaXyzE8PIxOp3tsC6lEIvlkyOBA8pkxOTnJ2bNnOXfunBDnnTlzhpdfflm4HXq9XiYnJ4V98qVLl3A4HJSVlYlpjGVlZRgMBiYmJigrKyOVSnH27FkikQhms5mVlRVsNhsOh4Pq6mqcTiclJSUP3TkvLCwQDoex2+0kk0lefvll7t+/z+DgIA0NDUxPT9PV1cXIyAg1NTWYzWYR1Hzve98jmUzidrvR6/XYbDb++q//mvPnz/O7v/u7pNNpAoEAXq8Xq9VKPB7n/PnzwPa8AY1GQ0lJiVgYL1y4wOTkJIODg9TX1xel9pPJJKOjo3R3d7O8vMz58+fFUKjOzk4xn0KdOql2S/z2b/82iUSCoaEh5ufnCQQCpFIp3G630G+EQiEuXryI2+2mvr6e4eFhZmZmyOfzuN1ubDYbExMTwHZgdvz4cWZmZsRchGPHjnHu3DlyuZzQPaj/u3TpEuXl5aTTaSHY1Ov1OBwO7t+/z5tvvklJSQlra2tEo1FKSkrwer0kEgm8Xi9+vx+v1yvcKo8cOUImk2FkZASdTkd9fb2wjK6trf2FBnJJJJLdyOBA8plw4cIFvvnNb+L3+3G5XJhMJuLxOG+99Rbvvvsuf/iHf8ipU6dwu90oisLw8DDxeFxY/66vrwMIMdzm5ibT09NUV1ej1WrZ3NykrKyMM2fOiBr+R5HP5xkdHSWZTGIwGOjt7RXjh+/fv8/CwgIul4uOjo4icaLf7+e73/0uiqJQX19PMpnEaDRSXV2NwWBgamqK//7f/zsHDhzA7/eTSqXE4pjJZERHQ2lpKV/4whfo7+/n3r17fOELXyAWi7GwsMDbb78tjvfVr36VDz74gJWVFf7X//pf6PV6nE4nL730ElVVVaJ88uGHHwqrZofDgdVqJZPJsLy8TCKR4OjRo4yNjTE+Pk5JSQnpdBqn08nm5iYrKyscO3aMwcFBxsbG8Hq9tLa2sry8DEBraytra2skEgkWFhZYW1vDYDCg1+u5cuUK4XAYj8eD1+ulp6eHhYUFbty4IWyZYbt11GKxkMlk6Onp4ebNm0xNTeF0OgEYGBjgxIkTlJeXc//+ferr6wkGg4yOjvLmm29y48YNrly5IjII9+/fB2B+fp6pqSmy2Sz79+//9H95JZJfQ2RwIHnqTE5O8s1vfpNoNEpnZ2eR6EwdLfyNb3yDqqoqqqqqCAQCbG5uotVqSSaTBINBbt68SVlZGWazGafTyd69exkdHaWrq0s4KtbX11NWVvbE5zU1NcXc3By5XI6FhQX+/M//XCz0TqeTuro6/uAP/oCFhQXROnnnzh2GhoZYWlqipqYGq9VaZE+sKApNTU1cv36doaEhYTykejZoNBqy2azoBgiHwxw7doxr167R39/PkSNHRK0/GAxSXl6ORqNh//79bGxsEIlEsNlsvP7663g8HmC7HVD1ajCZTLS0tFBSUsLq6iqXL1/GZDJx8OBBKioqWFxcpFAoYDAYhHOj2r5448YNYHtktN1uF86LDoeDhoYGtFotW1tb/OhHPxIWy8FgkHw+T0lJCVarlSNHjojn7ty5Q1NTE+vr68RiMXQ6HRqNhlwuJ2ZIXLlyBbPZTEVFBTMzM+RyOY4dO8b9+/dFuWRzc5OlpSVOnDjBtWvX6Ovr49ChQyQSCd59913y+TxGo1HM3niU+ZJEInlyZHAgeeqcPXsWv9+/KzAAxGI6NDTEu+++i9FoxO/3k8vlRN1eq9Vis9l46aWXMJlM4r1qy1w8Hqe1tZVgMEg2m32irEEikeDy5cvMzMwwMDBAKBQSGY3NzU3u37/P3bt38Xq91NXV0djYSHV1NR9++CE/+tGPMBgM2Gw2MpkMBoOBQqFAJBKhpKRELFbT09P09PQULYo7Zx/E43EGBgb4zd/8TTo7Ozl//jzj4+M0NTUxNzcn5iWo457VMkAymeTtt9/mK1/5CqFQiKGhISF47OnpIRaLYbfbGRoawmq18tJLL4l7abVaRaYhkUgQDAbF4Ca11GE0GonFYrzyyiv87Gc/E+OU6+rqGB8fJ51Os7S0JEopPp8Pg8HAwYMHcTqdZDIZMS3y8OHDIhBSXSo3NzcZHh5ma2uLTCZTNM1xaGiInp4eXC4XyWSSiooKwuEwt27doq2tjePHj3Pjxg0uX74suixUPYkqOH2S9lWJRPJ4ZCuj5KmSyWQ4d+6csOl9GIqi4HK5OH/+PB0dHbS1tWG1WrFarWLhyufzu2x0KysrmZiYwGazcezYMZEB+CjS6TTvvPMOCwsL3Llzh1QqRWdnJ1VVVWJC5N69ezEajfyv//W/GB8fp7a2FqvVSktLC8FgUAj5EokEOp0Om83G5uammC2QSqXIZrMkk0my2SzZbHZXC14mk2Fqaopvf/vbfO973yMYDAojopqaGgqFglhAtVotzc3N/Mt/+S9xu90sLCzwl3/5l1y/fp1CoUA2mxUiy3g8zvT0tBhJrQYGAA6HQ0xtXF9fR1EUkZFRPSN6e3txu90sLy9js9lIpVLCElkNPHK5HIlEQgyy6urqIhqN8l//63/lt37rt/i93/s9vvOd7/Ctb30Lv9+P0WgkkUhgsVjo7e2lsrKS0tJS9Ho9uVxO3C+z2cy1a9eE3qCuro6SkhJCoRDj4+Po9XqOHj1KJBJhbGwMm82G1WolFAoRj8dZXV39BX5LJRLJg8jgQPJUSSQSQnz4OFQlfGdnJ2+++Satra10dXXR2NiIXq9HUZRdQ3gCgQCFQgGPx1OUmn5cH3wqleLy5csi1b21tUVjY6PYTfv9fvR6PW63m/b2diKRCLdv3xbvV88nGo0yPz8vuiFSqRSRSEQs8GrN/3HXrQYPs7Ozot1yfX2d+/fvMzw8DGxnGMbHx5menmZ5eZmLFy+KckIgEGBmZobh4WFSqRStra1iAmVnZyfd3d1Ct6EeK5lMkslkxA67urqaQqEgArCdBk7Dw8N0dHSIVsjNzU1SqRThcFh4GgQCAfL5PLOzs3z961/nrbfewu/3C/Hn22+/zQ9+8ANWV1fFTIY9e/ag0+morq4Wg5s0Gg0ulwuv18vU1BS3bt3C7/cTiUSE4PPWrVvk83m0Wi0nTpygurpatEaqLatTU1OP/T2TSCRPhiwrSJ4qZrNZiA8fx8bGhhi+k06ncTgcRKNRWlpahJ7A4XCI1y8uLrKyskJbW5sY5dzQ0MCVK1fw+/2Ulpbu+oxUKkVfXx9ra2t4vV7Onj1bNHhIXehKS0uJx+OkUimMRiODg4P8+Z//OQ6Hg0AgQHl5uVD5q0GL0WjE4/EIbcHGxgY9PT10dHQwOTmJoii7xlAbDAZhngTbbYyZTAaHwyH8A9SFPR6Ps7KyQiqVIpPJYLFYiEaj4pi5XI4PP/wQrVaL1+vlwoULwuHwhz/8IXq9XgxFyufzouNibW2NfD6PwWBAo9EwOTnJkSNHUBSFWCyGzWbDaDSSy+UYGxsjEomQyWSEfsJisTAzM8P/8//8P2i1WlpbW1ldXcXhcLC1tYVWqyUSifD+++/zW7/1W8Km2e12k8lkcLvdbG1tkUgkOHPmDF1dXfT39zM8PEwul6O/v1/MqvD7/YyMjNDZ2UldXR01NTUMDAwwODgosiwzMzNsbW2JroXHtc1KJJJHI4MDyVNFnWz41ltvUVlZ+dDSQjweZ35+nu7ubv6//+//w2w2YzAYioKEmzdvcvToURRFIR6Pc//+faqqqqivr+fKlStsbGzg9XpxOBzMzMzsCg6SySR9fX2kUiksFgvV1dWk02mxs4/FYsRiMbxer7A4jsViwkRoYWEBv98PbA+AGh0dJRAI4HK5hIBPq9WiKApjY2OYzWYhttRqtezdu5f19XXhBaAoCgaDAYPBIMR5sK0JcDgcxGIxIpGI8CJQRYw2m419+/ZRVlbGvXv3uH37NtPT02LGhN1u59ixY3R1deF0OgkGgywtLYlZC8lkEtgeJa0OWspms2i1WgqFAtPT0/z5n/85gUCAdDrNT37yE2w2GysrKyJLotFo0Ol0VFZW8uabb/Jf/st/we/309TURCAQQKvVYrfbxf2qqqpicXGRsbExTp06xdDQEDU1Ndy7d4/6+nrm5+cpFApicNX+/fvZ2toSx2psbOTatWtkMhnee+89QqEQlZWVlJeX09vbi8vl4v79+9TW1lIoFDAajU/UNiuRSB6NUpBepJKnzOTkJF//+teJRqM0NDQUWfwmk0nRknbmzJldfeqqqt5kMvF//V//FxaLhatXr5JMJjl16hQ6nY7z58/jcDjo7e1lYWGBgYEBnn/+eZGyTiQS9PX1CeV9IBDg1KlT/O7v/i7xeJzS0lJWVlawWq0iZe/3+1lZWSEajWIwGPh7f+/vFWke5ubmuHr1KvF4HLvdLnwM1Nr8kSNHqKmpIZvNotfrhShR1U7odDoxRVE1adJoNELYt76+js1mEy2d6j9TNXDSarXcunWLq1evEovFxKhrVRzpdrv50pe+hNlspqSkBLfbzcbGBgaDgcnJSSwWC06nU+y4nU4nqVSK0dFRFhYWmJ6eFkHMnj17hIeAep6A8I74y7/8S/L5PCaTSWQDdDodGxsb5PN5LBYL8XgcRVH4z//5P7OyssLBgwfFUKrz58+jKAqlpaX8xm/8BgaDgVAoxLlz54jFYrz88svMzc0xNTXF8vIyLS0t4l46nU7Ky8uB7WFbXq+XWCzG//v//r9FbbNq14vP5xNtsxKJ5NHI4EDymXDx4kX+/b//9ywuLtLQ0CD+YK+srKDVajl27Bh79uwhFArtcvKD7SDhtddew2KxMD4+znPPPYfb7Qa2WxJHR0d56aWX0Gq1vP/++1RXV9PZ2Uk8Hqevrw+Affv2ceXKFaqrq1EUhUuXLvHXf/3XwluhoqJClBhWV1dZWVnB7/dz4MABent7xe5bq9WK+QxLS0vMz89jsViEY6Mq5lNb83Q6HY2NjTQ2NuLxeIT5kcvlQq/Xs7m5SSgUolAokM/n0el0uFwuLBaL2PWr9sd2ux2z2czExAQ/+MEPSKfT4j4AYmS03+/HZDLxm7/5m3i9XiKRiBD8qaULvV6P2WzGZrPhcrno6+vjO9/5DpFIhKamJtLptPg+9Ho9x44dE9+d3W6no6ODaDTKv//3/16UHtTOCjXjUigU0Ov1pFIpUqkU//bf/ltisRiZTEb4MLhcLkKhEIFAgM7OThobGzEYDCwtLTEwMEBnZyfNzc3cvn0bv9+PxWLhq1/9Kuvr66yurrK+vi5GVU9OTvKDH/wAvV5Pc3NzUaaqUCgwNTWF3W7nT/7kT2QGQSJ5DLKsIPlMOHnyJL/zO7/D0NAQU1NTwk/ga1/7Guvr65SUlIj5BLBdK1bjVr1eTzab5b333sNisdDV1VWkP6iurmZkZISlpSUaGhqoq6tjZmaG6upq3n33XVKpFA6Hg7/5m78hkUiINHZHRwdGo5HFxUV6enooFApEo1GWl5dJJpNsbm5iNpuFYl41Y1IX8bKyMo4cOSI0AnNzc/T393P58mVisRhGoxGdTkc6nWZgYIDx8XGOHTtGc3OzSKM7nU6qq6uZmJggn8+Le7G0tMTMzAwjIyMYjUZSqRQ1NTU0NzdTV1fH3bt3icViwi0yl8uJVslsNktFRQWrq6uMjY2JkoFOpxO6hs3NTWETrToO/p//839IJpOiPKNmTdLpNKurq1y9ehWr1UpFRQWbm5tcu3aNyspKUZYwGo3U1tayurpKMBgUcxIcDgfr6+t4vV5Onz5NIpHg5s2bhMNhrly5wsLCAul0mlgsRmtrK6+88gqlpaUiy3Lr1i3C4TBra2ukUik2Njb4i7/4C7xeL5WVlZSVlZFMJolEIkxPT7O5uUljY6MIzFR2ts2+9957/P7v//5n+C/g0UhdhOTziAwOJJ8Jfr8fh8PBv/k3/wa73c57773H/Pw8r7zyCt/73vdIp9PkcjnRt67u4GHblEetjWezWQYHB5mfn2fPnj3s2bMHm81GWVkZCwsLIjgYGRnh7NmzhMNh0uk0mUyGSCQixgG3trbS3t7Oyy+/zPvvv8/g4CD5fF50EMTjcRwOB4cOHcLr9aLT6YQKX+3N93g8uN1ujh07xqVLl1hcXOTy5cuk02l8Pl/R9dvtdoLBIDdu3KCnp4e6ujrhM6Dubjc2NrBarYyPj/Phhx8SjUaxWq2UlJQIYeTk5CTPPfecyFaUlJRgMBiIRCKiXVANXiwWC0NDQ7S1tWE0GosWnnw+TyaTIRqNUlpaysjICJFIBK/XSy6XY3l5WWRI1HLM2toak5OTRSLOjY0N9u3bx8WLF+ns7BTBndrBoX6XGxsb9Pb2AtDQ0MDAwADf//73WVpawuPxUF5ezurqKrdu3WJjY4N/9+/+HcePH2dqaor33ntP+EeMjo6Sy+VYW1sTLZqJREKIN8fGxqitrQVgbW1NtEuqqG2z586d41/8i3/xTBdjqYuQfJ6RrYySz4Tp6WmcTqcQ8EWjUaLRKFNTU2LoEGwvKuquGrb/mLvdbrFwO51Ouru70el03Lx5k+9973u88847pFIpMXkxm80SjUaJRCK88sorOBwO4eRntVrx+Xx0dHRw//59Kisr6e3tpbm5mUwmQyqVQqfT0d3dzb/+1/+azs5OMpkM6+vrYqFUa+6qXbDdbqehoYHR0VFisZiwA96JoihihHM4HBa79qqqKjY2NgiHw6KOfu/ePex2Oy0tLcLrwWg0UldXRzKZ5Pz580SjUcxmM+l0mmAwiMlkorm5mdbWVrRaLalUSmgkfD4fJSUlVFRUiLIGgM1mw2az0d3dLXQIOp0OnU5XpIVQMZvNolRSKBTE7Aifz4fFYmFxcZFQKEQsFhNlEHXuQUlJCSdPnuTWrVv87//9v/mf//N/ksvl2Lt3L1arFZfLRWtrK7W1taytrfEnf/InzM3N0drais1m4/r164yNjZHJZMSCbjabaW5upry8HLvdLnbgNptNOEuurq7u6hJR22Z3dop8miwsLHD58mXW1tYe2VZ74cIF0foZj8cxGAzCTvyP/uiPuHjx4lM5N4nkSZGZA8lTJxKJ4Pf76e3tRVEUAoEA8XgcrVbL7OwsWq1WLIyA+KnRaKipqcHr9RKPx4lEIsI1sKmpiZ6eHiYmJhgbGyORSIhdq06nw+v1igVAzQaowrW6ujqGh4eZnJwUI6GPHDnCyZMnWV5eFgvb2toaLpeLRCIhBgntTM+rPfiwrUOYmZkR45pVdmZAVCe//v5+/tW/+lcMDw8zPT0tHAR1Oh0DAwNEo1H2798vdt+wPZDKYDCQz+eZnJwUds3qOOtUKsXi4qLQLKjWyKq2Qw181BZERVHo6elhdnaWubm5oo4JNTsC2wuwOt1RPa5qyqSi1+v5jd/4DX76059y584dcS25XE60Qx44cACdTsfhw4f5T//pPzE7O0tzc7PQJ8TjcWw2G06nk2w2y/z8PO+99x5f/OIXRWZAnZipBiejo6Piu3I6nTQ2NuJ2u0kkEng8HsrKyvD7/aytreHz+TCbzcC2CNZisYj//rQJhUJieFVNTQ0dHR34fD7xe/Fx7MRlBkHyrJDBgeSpMz09jclkElMVl5aWyOVyolaeSCSEaE1Fq9XS3d3N5uYmk5OTQt2u9vhPTk4yPz/P3r17iUajLC0tkUgkxK57//79bG5ucunSJSwWC+Xl5WQyGcxmM+Pj46K/H7YXwDfeeIN79+6xubkpHs9kMgSDQVHz37mTNplMRKNRsQtfXFwUYrydqK116pyIcDhMNBrlgw8+KBJk1tTU4PF4eOutt0RPv9VqxWAwoNPpWF9fFwI+s9lMJBIhFovh8XgwmUzCBGjn4p9IJGhtbSUWi4lz2Tkxsa+vT4gvVSMkVUioXr9qOqRmbvR6/UNT8R0dHeh0Ou7du8fAwAD5fB69Xk93dzfNzc14PB4mJyfJ5/Pcv38fj8dDOp1mZWVFlItUjYBqSPWd73yHdDotbJ13Bmh6vV5kgiorK0kmk8zPz+Pz+ejr68PpdKIoCjabjWw2y/Lyspj5sLa2xle/+tWiks6DP9X//6jHH/dzcnKSeDyOTqdjbGyMubk5qqur2bNnD1VVVU9sJ/550kVIfv2QwYHkqaLuaNva2kS9f25uTgjdzGYzoVCIXC4ndtlarZYDBw6IHaq6QDQ0NLC0tITP5xM2wTdu3BBjk8PhMMlkkkKhwK1bt8ScBYPBwP79+7l8+TKbm5titLDdbsdgMIiWx83NTaB4t6/W5tXAQD1eSUkJGo2G8fFxNjY2uHnzJhqNZlenhUajwev14vV6mZiYIBwOYzabWV5eJp1O4/F4cLlcBAIB5ubmSCaTWK1WAoEAKysrIrjIZDIEAgFgewevti6urKxQWVlZFJQUCgWCwSA2m42mpiZxLWpr4s7/VlFFjurshZ2ooko12Hhw9LXVamVoaIh8Pk9raytNTU0i/a8u9nV1dcRiMaamplhdXcVut4tzVvUgyWRSZCdyuRybm5sEAgHx/agaCEB0J1y9ehW9Xk86nRbaCKvVyr1798TMB7UEohpX2e12nE4n169f/0V/rR/L9PS08M1QWz8XFxcZGBjg6NGj/PSnP30iO/HPgy5C8uuLDA4kT5X5+XkURREisUAgIAYkqSIy9Y+k0+nEYrFgMBhYXFyksrKScDiM1+sVu7xcLkddXR2KojA9PU0mkyEej7O2tiYWm62tLaqrq3E6nYyOjjI/P8/8/Lw4J5PJhMfjEaLDTCbD4uKiCCx2stPbwOfzUSgUiMViwmRpaGiIXC6HXq+ns7OTa9euCUMkvV4vTI6cTic2m425uTlaWloIh8NUVFTw2muvUVZWRiwWY3BwkP/9v/+3KHUkk0lyudwud8lcLofD4eC5557jww8/ZGFhgbKyMtFNoXovHD58uKjNERA78Aevs7GxkampKYLBoBhctPN1O4ONB1G1GDvLEqohlDpwSvVi6Ozs5Ec/+hGJRIKKigpyuRxarZZwOCwyG2rAqNfrKS8vp729na2tLebn50kkEkJ0qf4+7PyOKioq+O3f/m2+/e1vs7CwQH19PbFYrGiA1de+9jV++7d/W/ze7bwXOwdj/SI/0+k09+7dE10jO4lGo7z//vvid+Bx7NRFyOBA8iyQwYHkqZHP50VLodrWprZsuVwuYejjdrtxOp10dnbS399PIBBgenqa6elpGhoaWFtbw+l0kkwmSSQSTE9P8+Uvf5nS0lL+6q/+SqS+0+l00Y4/FAqJP9BGo1F4AFRVVYn+fXXHqY5dfpSAzGaz8Q/+wT9gZGSEy5cvMzw8jMlkEp0UqVSK2tpapqenCYfDlJaWkk6ncTqdbG1tMTExgd/vx2az0dzcLHbBH374IZWVlTQ2NnLkyBH+/t//+/zZn/0ZmUzmoTvLQqFAIpGgpaWF0tJSXn75ZTF6Wm2f3LdvH/X19fh8vl2iuweHV6l4PB6ee+45zp07x/T0dNHCps6aOHr06K5gA37uuviwc1U/b2NjA5PJhMFgoKGhgZs3b2IymXC73djtdrH7VwcuxWIxurq6UBSF2dlZ9uzZI7wR+vv7xfemtmaq5Q6j0Ug4HObkyZPC1XFzcxODwUB7eztlZWUkEgl+8pOf8NJLLz1UPPpR5HI5QqEQq6urrK2tsbGxIayp1QFSj3uvatTk9Xof+bqnrYuQSD4KGRxInhrLy8ukUikaGhrEY9XV1fzGb/wGGo2G4eFhVldXOXPmjHi+vb2d8+fPYzab2dzcpKysjFwux8zMDG+88QYTExNMTEywvLxMNBoVbYVqBsJgMJBKpVhaWgLA7XYLNfva2prYyUejUWw2G2azmXg8TjKZFIvczlZKdYf6B3/wB2xtbTE6OgogFieXyyV0Cu3t7bz22mt8/etfZ3V1VQj7MpkM4XAYm83GkSNHKC8vF5MIXS4XqVSKwcFBxsbGaGpqwmQysbCwIBbinecSDAaxWq1iB+92u/F6vfT29ooyimp09KBK/6PYqanY+Znqf2u1WlEO+rjk83ni8TgTExN0dnYyNTVFIBAQAYLFYmFlZYXNzU2mp6ex2WxiAqbNZhMTGBsbG3E4HHzve99jcnKSmZkZcd1NTU00NzfjcDjweDyUlpbS3t7O0NAQiqJgNBqFGdTExAQbGxscPXpU+F3sRM0QbWxssLa2xvr6OsFgkGg0SiKRKBq/rdPpMJlMotS0sLDwyCBMq9XS1NTE7du3qa2tfWQAGAwG+eIXvyizBpJnhgwOJE8F1ae/tLRUKOpVVBGfajm8sz1w58Ccuro6bt++TUdHBz/72c/47ne/K9oUh4eHee2114SlbzgcFqljFZ1Oh8ViIZPJMDc3xyuvvEJlZSW3b9+mv78fg8FAMpkUAYXqQFhdXU1vby8/+clPCIVCaLVa+vr6RA18p7mOqlMwGo10dHRw5MgR/uAP/oD33nuPoaEh0b/e09NDY2MjPp9PBDLq4CZ1TsHExATT09McPnyYvr4+AoFAUWuh2qb3sB28WsJQd9Lw866PJ2Fzc1MIFFtaWsSuXP1etra2hOnRoUOHuHPnzhMf+0E0Gg2nTp3i0qVLTE5OsrS0RHV1tViMdTodR44cwe12k81micfjot0vFotx9+5d3n//faHf0Ol0ZDIZBgYGmJiY4OjRozQ2NoqpkXq9XozOVlEzSx9++CGDg4PU1dWRzWZFW2k8HieTyYhFXu2UUOdyqN0QAOvr6ywvL7O5uSnu/ePw+Xwiy9TY2CgeVwPOpaUlkRWSSJ4VMjiQPBUCgQDhcJgjR4488jUWi0WkyVXR2fLysvDMb21t5Tvf+Q5/9md/tsvl79KlS9y+fZtXXnkFl8slWt3U8oFal9ZoNEL3EAwGqa2tJZ1O093djdfrZXl5menpaTGqWa3J63Q6ISjL5/OMjIxgs9mw2+1YLBbRP69ONOzp6WF9fZ21tTV6e3tZWVkR4r0Hpzyqi1Q+nxcaDHW+BEB9fT0lJSXMzs4yNTUl0uaq2O/BwEC9L+rC9Is4ok9PTxOPx6mvrxfBy87Mg9vtZnV1lXv37okZFKqQ9ONSKBRwuVycPn2a8fFxZmZmWFxcxGQyiYmLqqW1Wprwer1sbm5y+/Ztzp07JwYyqZ0Y8HOjKbVboaamhlAoJEY670QNflRnxsXFRbRarRCcOhwOXC4XPp+PyspK3G43VquVSCQiOmUmJyd3tbnCdtC7tbX1yOuvqKjglVde4Zvf/CZDQ0PAdtkqlUqxvr5Oa2sr//pf/2vZxih5psjZCpKnwq1bt4hGo5w+ffqRqux4PM4HH3zAkSNHKC0tJZFIcOHCBWGqc+XKFb773e+ytLREW1sbHo+H1dVVIpGIGDcM8MYbb7B3714qKyvZ2NhgaWlJtBnW1tYKd0O1ve7u3bv4/X6x8JSVlVFbW0tNTQ2BQABFUUQ5QO3D12g0dHR0YLfbmZ6eFu1/6rCh48ePiy6EeDzO5OSk6DRwOBwi2IhGo0Js9rjaNCB2vGpw8GCXwIPs7ET4OORyOX7wgx+Qy+XEtMqdJkrqsSORiBD0+Xw+cY92ujL+IqiiQtUF8VFlC0VRuHHjBuPj40LQl8vl2NjYEK8pFAqsr6/T3d3N0aNHPzJ40Wq1lJSU4PF4RMnHYrGIjEk6nWZmZoa5uTmWl5dFWUL9LlQxplarxeVy0dDQgF6v59KlSw81WdLpdHzpS1+iq6tLuD9+61vfwmg04vV6KS8v57d+67c4efLkL3QvJZJPC5k5kHzqxONxVldX2bdv3yMDA9j2F9BoNGLqYH9/Pzqdjq6uLgD+y3/5LwQCARobGwkGg5SUlODz+dja2iIej1NRUcHy8rIYZawGDrDd+RCNRvH7/VRXV9Pa2so777zDBx98QDQaxePxYLFYiEajjI+P43A4+OpXv4pGoxG7QXVUMmzvNOfn54XlsNFoFIu8wWDg+vXr2O12MdZYJZVKCYMhNdOwc7f7ONRWzscFBaoJ0M5ZFI963aMW70wmIxa8SCTyyAXVbDaTz+fxeDx4PB42NjbEWGugqDtB9YZ4Enbu2NXOjJ1tiyq5XI7Z2VnR2mm320UApn6WoijCybG3t/eR906j0VBVVYXH4+H48eMMDQ0Ja2h1RsPi4iKBQKBI1GoymYQRVD6fx2az0dDQQHNzM6FQSAhbnU7nruBAq9VSXl4uNDhNTU189atfZXNzk/Lycn73d3+XO3fuiIFVj/u3I5E8bWRwIPnUmZmZQa/XU11d/djXKYqCxWIhFosxOTlJIBDg2LFj6PV6MpkM09PT6PV6obqfn5/HZrOJFLpOp8Nut3P79m2qq6vFQqn+YVUXvIWFBdbW1nj//fdJpVKiDVEd/mQwGAgGg3z729/m5ZdfFgY6O1FLALC9sKjnkU6nMRgMbG1t4ff7i9L7Kul0Wtj77lygf9Gd/oPn9Ulfp/oR7Kyx70Q9z0QiIe7NysoKdru96J7s7E54ktr7TlRXRdVy+WHnsTOISSaTojtFLYPsFAiqr1N9FrLZrAiQtFotra2tVFVVkUqluHfvHg6Hg4mJCQYHB0V5yWQyCUtpNZuSSqXQ6/XU1dXR0dFBZWUl09PTDA0NiSBtZWUFnU5HTU0NCwsL4h6aTCYaGxuFBqdQKDAwMCCuTRXvXr9+nWAw+NDOEInks0IGB5JPFdX6tqGh4SPT4LCtO/D7/USjUeGkB9stj1qtFrPZzMbGBnq9nq2tLfGHeXZ2llgshsPhQFEUOjo6WFxcJJFIYLFYUBSFdDpNfX09J0+e5E//9E/FxMGysjKi0ahYhAqFAm1tbczOzjIzM8OhQ4ew2Wzs3buXSCTC3NwcoVAI2F5IrVYrzc3NmEwm1tbWxHyBcDgsZjOou02r1YrRaBRdETt3of/oH/0jfvzjH4sFdicP2i7b7XZhBrUzqAKERmNnxwUgnBKfJLXe0NDA3bt3sdvtuwIjdaBTMpnkH/2jf4TX6xWTFNX2RNW3YqeATy3JPGmg8KCfw4Oo4sxCoYDVasVms4nduVoGUQNDp9PJmTNnhNh1aGiImpoarFYrKysr1NTUMDAwgFarJRAICDMsVcDqdrvRarUkEglhb+12u2lpaaGzsxONRsPU1BQXLlxAo9GI4CIej1NaWorRaBQ6hNXVVRRFwWq1FnXuLCwssLCwIIKK6elp9u3bh9VqZWZmRgYHkmeKDA4knyrz8/Pkcjnq6+uf6PUmk4nh4WExNGjn46rnfj6fx+12o9friUQiwkI4FouJkkJtba1wX1RTzGoGQq/XMzExIYY+bW5uUlJSQmNjozDWCYfD5HI5JiYmOHXqFKWlpRw+fJirV68Sj8fFYq3qEQYHB8Wx6+rqhF3z+++/X7QYq0r7cDhMVVUVBoNBiBl/9KMfFTlD7mTnf6vtfnNzc+IxdU6C3W7HaDQWpfefNCjYSWNjI5OTkwSDQTwezy5joFAohM1mE8OMVGFlSUkJW1tbIphTH7fb7UJfAR+dSVAX9sdlONQd/9DQEEajUQgE1a4XVayaSCQ4ffo0Bw4cEELXmZkZVlZWsNlsLC4usrGxIRw6y8vLiUQieDweFEXB7/eztLSEXq/H6XSyb98+9u3bh8fjIZPJMDU1xczMDAA1NTXMz8+LwKq1tVU4PWYyGb7whS+Qz+c5f/68GLQF20H0vXv3REeIXq9ncnKS9vZ2GhoaijpdJJJngQwOJJ8ahUKBmZkZKisrn/iPmt/vJ5lM0tPTI1LTKysrjI+PU11dzdzcnGgZU1O4KysrOJ1OQqEQgUCAyspKPvjgA1FWUFPHBoMBm83GxMQEoVBI7DzV+QNLS0sUCgUxoEddULe2trBarfzkJz9hdnZWpK01Gg3ZbFbMBXA4HCLNPjw8TCqVwufz4ff7RYZAtYM2GAycPn0ar9fLX/zFXxCLxQgGgyLtrYoed3oLqCSTSRYXF4vc+BwOB1/60pfQarXcuHGDpaUlkVX4RYSBHo+HY8eO0dfXx9raGhaLRRgTqeORjxw5QqFQoKamhkgkwuLiYtEgJPXcYNsNMJ/PCw3Ik/CwjMWDpZjq6mqmp6eZmpqipqZGtKOq2QJ1yueePXuYn59nbm6OlZUVMVXTZDJhs9lEsLm6uorNZiMej7OwsCBKLJWVlWg0Grq6uujs7BSB49TUFPl8noaGBjKZDNevXyeTybBnzx5gu4RksVhIJBL09PRQU1MDQHl5eZHb4cTEBGtrayIIttlshMNh5ufnqaurY3R0VJg/SSTPAhkcSD411tbWiMfjHDhw4Ilev7KyQjAYxOl0otFoWFtbY3R0lK2tLUpLS/m93/s9lpaWWF1dxeVyEYvF8Pl8zM/PE4lECIfDoo6rLsaqb0A+n8dkMlFbWyuGMiWTSXw+H+l0Grfbzfr6OrFYjHQ6LRYhdaDP6uoqq6uroktA3d1Fo1EMBgOvv/46Go2G2dlZMflPHRD0oMpfDW4SiQRTU1NCgAkI8V5HRwfT09Oi7U5V7KuBw4OOhZWVlVy8eJGNjY2HWvU+iBq0PI6dLZSqS6LRaKSlpUW0UKq+ARsbG8JTQU31q0GUmspXsztqq+XBgwe5d+/eQ8sHqnvlg8Gd2iao4vF4OHXqFB988AHDw8NUVlYKAd/ExARGo5EjR46wtbXFhx9+iNFoxOfzodFo2NjYwOv1ks/niUaj1NTUiIBWnabZ0tLC6dOnMRqNzMzMMDg4KAy1stksdXV1lJeXc+nSJZaXl/F6vezdu5e5uTmhUYhGoxw8eFBMAYXtNsudfh+Li4vCt0G1l9br9czOztLU1CQyEq2traJzQiL5LJHBgeRTY3p6WlghfxSJRIK7d+9SWVnJ4uIily5dEoOIjh8/LuqtX/7yl/nzP/9z5ubmmJ+fF+nqlZUVrFYrp0+fLqrN7qxxh8NhBgcHSSQSVFZWMjo6KhYGVdAGP69XZ7NZurq6hMGRTqfDaDSKDga1nh8IBOjv7xf6A3WctNqeuDNAKBQKbG1tUVtby7vvvis6FlQ1fqFQoLGxkeeee07MD9gZXOzMImg0GgwGA5lMhuHhYWEXrGY8HA6HcHt8ELXDQjX3eVRrpNvtxu12093dXfQ6u90usgBqC6l6j9QF3Wg0Cr+JyspKEeSoRlUbGxvk83nq6urY3Nws6mbYeZ1qJkcNxB7sfNBoNJSWljI5OcnIyAi5XA673U57ezudnZ3Clnjv3r1CswKISaA7Z1CYzWaMRiMvvPACqVSK6elp0uk0er1eCBkXFhaoqKjg+eefZ3Jykh/84AcAHD16FL1ez/T0NOXl5aKEdPToUaGdeRSnTp0Sg6iuXr3Kc889h81mw2KxANuB2szMDMvLyx8p7JVIngYyOJB8KoTDYTY3Nzl48OBHvlZtW1TV8RsbG1gsFo4ePYrX6xXp5Wg0Snl5Of/hP/wHvv/973PhwgUxPGf//v3U19fjcrke2vZmMpk4ffo0t2/fFu2Mk5OTTE1NUVJSIiYUms1mkskkwWBQjJVWU/xut5tkMkkkEhGiQNhOHbe3t5PNZrl27ZowbtJoNEWOjeqONxqNCttli8VCQ0MDExMTQrDm9/sZGBhgbW2tSPH/IDvHLSuKIjo01tfXaWlpQVEUYRX8YGlicXGRmZkZkRHQ6XQ0NDQ81FQJfj48SeVhu1fVUtnlcokBShsbGxgMBjGCW6vVcujQIVZWVlhYWCCTyWCz2VheXhaLtU6nExkbRVGEzkSdpqiWdPL5PLOzs/T19YlBTjabTbzO7/eztbUlsgN37tzh4MGDVFRUkE6nWVxc5N69e9hsNkpKSujs7OS5557jypUrrK6ucvjwYVZXV4V9dzKZpL6+ngMHDnDr1i0xTrumpobnnnuO8fFxVldXaW1tZWlpiWw2y3PPPYfD4fjIfwNGoxGj0Sg6G9SsjYrNZsPn8zEzM0NVVZVsa5R85sjgQPKpMD09jcViKUqlPop79+4xOjqK3W6npKSEmpoampqa8Pl8Ra9T08QnT54kHo/T1NREKpUSu1N1oVQX0wcXxTt37rC5uUmhUMDpdHLw4EGuXLnC+vq62DGqYjqHw8HBgwfFQpnP5wmHw2LOAmwv8haLRYjJlpeXCYfDGI1G9uzZw/79+/H7/QwPD4tyhYoaKKTTaUZHR0WbXSaTwe/34/f7nyh9rNbW1emEer2exsZGkU2A7cBoZ4/9gwuq+rl3795lcnKSY8eOfaSAVLWZVv0U1HuSzWYJh8NYrVbcbjfBYFCUaBKJBD6fj5KSEhYXF4UFsqqf2GmbbbfbRZtgJBIRLY0751uoFs/pdJrS0lLx3bhcLjGZ89q1a8IPIxqNMjY2Js5Zo9HQ3NzMq6++ytDQkJj02drayvXr1xkbGyOZTDI/P09jYyOnT5/GarVy9epVMSektraWAwcO0N/fj0ajobu7m9HRURRFEbv/j4OaEXmYRqehoYEbN24QCoXEpEyJ5LNCFrMkn5hUKsXy8jL19fWP3eFsbW1x8eJFLl++jN1u58SJE6Iz4ME6dDQaZWlpiebmZjQaDalUCqfTKSYhPmgSo4r5VJLJJGtra0INbjabqa+v58tf/jL79+8Xveuq6dLzzz+/a4FMp9NYrVZMJhOlpaVi6FA6neb+/fsEAgFqamp44YUXcDgc9Pf3s7KygsvloqKiomiIkfpT1Teozoc7ebC+/iCqQl+9V4lEAqPRyPLyMkNDQ+K9OwODBxdUh8OB1WqlpKRETI68du0a4XD4kZ8L299xSUmJSHtrNBo6OzsxGAwkEgm2trbELAS1Y8DlctHY2EgikWBtbY1UKoXX6xXtp4CYtKgufjvtiHd+v+qsjlgshsvlEh0ZatmmUCgI0d/U1JQIPpaXl2loaOCf/JN/gtfrFULLiooKotGoMH0KhUL09fUJYab63rfeeou7d+/S3NzM7/7u76IoCm+//TYGg4Guri6GhobQ6XQcP378YwcGgAgg1VLWTkpLS0Vbo0TyWSMzB5JPzOzsrLAqfhjqDm5xcZHNzU3q6up47bXXRNraarXu6vVXswZqi2IymRQitUgk8lBVPyB6znem9dWJfDqdjurqaiwWy66a+sMoFAoEAgEsFgsOh6PILQ8Q/f1zc3NUVVXR29uLz+fjxz/+MWtra2JKpNrattMDQF3YHhUM7PRKUEmlUqIOnslkCIVCbGxsPDTjoJZa1AW1tLRU6APUoERRFCHMHB8f59ChQw89l53ntLP2n8lkhAeCRqPh+vXr4hpjsRidnZ2sra1x+/Zt4cmQzWbF7ArVflmdf6A6SaqBnzqxUhXtzczMYDabi7o71GtVR1wbjUZmZ2c5dOiQ6BpYXFzEYrFgtVpFEOT1ekmn03zwwQfodDoqKioIh8M0NjZis9no7+9neHgYn8/HF7/4RaqqqhgYGECn0+H1egkEAly5cgWfz8fhw4fFSPKPixqgPqpsU19fz8jIiGxrlHzmyOBA8olQLW1ramp2jZeNx+OMj4+LoTolJSXo9XpOnTpVtCBbrVaRalYURQzCqaurY25uTnQD7OTBlj21JbGyslK41akLTT6fJ5lMUllZKRaWx9kSPziuOZVKMTY2VnQ8NVORSCSIRCJEIhFGR0f5wQ9+IMyU1DZIVXTY0NCA2+3+yFbDncOZHmR5eZnZ2VkmJycfqR3Y6VY4MzODxWIRMwTUDgM1eNBoNPh8PmZnZx9rNwwIMx+1pKOKInU6HWVlZULVD9uBw+LiIrOzs6KbQKfTUVJSwtLSkriH+XxelIrUYM9kMtHQ0IDZbGZ2dpZEIkE6nRbXq75P/T7U96rBI2z/XqqBXzweZ2pqCrvdLgKqsbExtra20Ol0vP7667jdbi5fvsyVK1fY3NwUpabDhw/jdru5dOkSqVSKo0ePkslkeO+991AUhSNHjvzCgQH8PDh4FDU1NYyOjjI3N0dbW9sv/DkSycdFBgeST8TS0hKZTKbI+S2RSDAxMcH8/DwGg0Gkn+/cuUNXV9eu9KvFYiGVSrG4uEg0GmVwcJBAICAWFIvFIsRnampeVeTvXOzVxdBkMpFMJikUCsLrIBqNsrCwsCvb8FEWxmqKe3Nzk+npaebm5oSfQk1NDYcPHxbnrqai+/r6xOAndVc7MDDA5OQkR44c+cj6/sNmEuh0Oubn57l8+bLoPHiUdkANPlTBp9o9ogorVcto1YsAtgVwatDwOAKBANPT08zOzorMS1dXF2azmcrKSubn54Htss7k5GTR8QwGg/Bj2OmguLOzw2w2YzKZmJmZEeevikPVbMqDngpqm6l6zTabjaamJiKRCO3t7dy7d0/s+v1+v5jaePjwYaampjCZTMTjcVZWVpiZmaGsrIyvfvWrhEIhBgYGGB8fx+VycerUKTY3N7l37x5dXV0UCgXu3LlDLpcTfgYfl4+653q9npqaGubm5mhpaZFtjZLPDBkcSJ4Idfqe2WwWf4jVHvGysjKsViupVIrJyUlmZ2fR6XS0t7dTX19PJpPhwoULVFRUiDKB6m4YCARYXV0Vam+1T3zfvn10dHRQUlJCMBhkaWlJDDZSURSFyspKkskk8Xhc9OA7HA5h7VteXk4sFuPQoUNcvHgRoOiP8c7AYGfGYCfLy8tcunSJaDQqBH25XI7+/n6Wl5c5c+YMbrebUCjEhQsXiMfjuFwuUTM3m81i19rX10dJSYmw531SF0O/3y+6NXZ2dMDuUcVqMGA2m7FYLEQiEWw2m1horVYr2WxWlDzU63ow87MTjUbD9PQ0fX19xONxof1Ip9NcvXqVe/fu8fzzz+NyubBYLCSTSbLZbFEGJJlMUl5eTj6fx2q14nQ6WVxcFCUBQLSMqpkh9Wc0GqWhoYHBwUGMRqNwllR/qmZCyWSSF198ka997Wt8+9vfJhaLYTKZhOFVNpulo6ODxsZGEUxeuXKF2dlZ8vk8tbW1VFVV4fV6WVtbIxwOU1JSwnPPPcfc3BwjIyPU1dWxb98+AO7fv8/AwACpVIqmpqaP3VWgBliPo76+ntnZWVZWVoTDokTytJHBgeSxTE5OcvbsWc6dOyfqnmfOnOHll1/G4XCwtbVFa2srIyMjzMzMCCOZxsZGsTO8c+eOEPfdvHmTYDAoWtTsdjsVFRWEQiG6u7uJRqPodDqOHDkiFnE1La3X62ltbWVtbU2YIqkzC9Tddi6XE50NqpK+v7+fb33rW0SjURRF2ZWGf1RQoNFoiEajIqVcXV2N2WwWfgYmk4nNzU3efvttXn31VSYmJgiHw0JJr6L+f5fLxcbGBouLi7jd7kd2Wex8n1pbX1hYENoB9Xg7xwarx56cnOTgwYP4fD5aW1uZmJjg4sWL2O12MUxIFVaqKv54PE5LS8tjd7Cbm5vcuHGDdDqNz+cruj6tVksoFOLdd9/l5ZdffuQESIvFQk1NDeFwmFAoRDgcLjJ7AsT38GB2AKC1tVWMh9br9RgMBuFhoE5i9Pl8dHZ2MjY2RlNTEwMDA1itViHIXF9fF10OkUhEdJw0NjbywgsvkE6nuXLlCu+//z7ZbJbjx4+LGQqJRILW1lZaW1vF+e7btw+j0cjIyAipVIqOjo6PFSCoJlKPw2634/V6RVujRPJZIIMDySO5cOEC3/zmN/H7/bhcLpF+feutt3j33Xd55ZVXKCsro7+/H0VRaGxspLGxkXw+j9/vJxAIMDExwdLSEqWlpczOzuJyuaivr8ftdotZB7C9M47H4ywtLdHR0VG0UKmLcTKZFDMQVHvchYUFUX9Wh+bkcjmR3v7BD34gxiZrNJqHpuEfVVaw2WzCtbC0tFQEGzsXc5fLJQR9anZjZ/sj/HyBs1gs2O12xsfH6ezsFNf4sM8vLS0VYjyDwcDU1JQQ46nHUs2bYDuQMRqNTE9P8+KLL5LJZLh586ZQ6IdCIaqqqrBYLKJGn8/nCQaDOBwOmpqaHvl7YLFYuHnzJtFodFe76c57tb6+ztTUlMgk5XI54fgI28LU69evF71PNXZyOp2Ew+FdY4534na7+fKXv8w777zDxMQEHo9HmDqFQiGMRiNvvvkmL7zwAleuXBHCT3UmhMVioVAocPfuXdbW1rh79y65XI7S0lJef/11zGYzfr9fBC5f+cpXRHZjbGyMU6dO7ar7K4pCW1sbRqORwcFBUqkU+/fvf+L0fyaTeSLNQkNDAzdv3iQUCj2RyZhE8kmRwYHkoUxOTvLNb36TaDRKZ2dn0WJXWVnJ+Pg4/+N//A/+6T/9pxw/fhyHwyF22WqrnUajIRQKsXfvXnp6eh468U/FYrEwOzuL2Wymrq6u6Dz+8i//knfffZdcLic6Dvbu3YvJZCKVSmE0GtFqtWJaYSgUYnNzk8uXL2M2mykpKSlK4e9Mw6sp/p2oO99gMMitW7fE/ICdu1v4+W5XFc6p7ojqcw/unndObFRHCqvsPD9FUYTmQqvVikVz5w5THQalouozstks6+vrGI1GAOE4ee/ePZaWloQlcTabJR6PY7PZdrlMPoiqAVAthtWZCyrqvVF372+++SZHjx7l/fffF10mWq226D3qNZvNZjEy+2Fai52ocy9OnDiB0+ksMnTau3cvFRUVWCwWBgcHKSkpIZVK0dLSwsLCgkjN63Q6IfBrbm7m1KlTwgo5n88zNjZGdXU1sViMZDLJ7du3yWQy1NbWEggEirwZdlJfX4/BYBDmXgcOHPjIjABsd2+ow6EeR1lZGRaLhZmZGXp6ej7y9RLJJ0UGB5KHcvbsWfx+/67AALYXL6/Xy8rKCqOjozQ2NrK6uorD4aC8vBy3201JSQk3btygsbGREydOfOROSq/Xs76+zgsvvCAWTTVzMTs7CyDU6ENDQ/zf//f/zeHDh6msrBTmPOpkQNg2ZQoEApSVlRUp4dXzV1v4pqamdi2MDwr69Hp9keBN7WJQ74tae1eNe3YeQ531oLbwJRIJ4Qq4k53BgWpipN4zVbz3oC/CgxmHbDYrFPo7Zzc0NTVht9uZnJxkbm5OBFnd3d00NTVRVlb2yKmJ6hRG9T1q5uFhqNc5OzsravyqHqCiokLMslDJ5XKi1KMGdx81OCqfz+PxeDh06BB79+4lHo+j1WrF+OZoNEowGOTAgQMYDAYmJycBhNmVGmSVlpZy/PhxERzevHkTq9VKS0sLra2tXLp0iXPnzuF0Ojl06BBms5lLly4xPj7+yGFI6u/izZs36evre6JOBvU7+yjUtsbR0VE6OjpE8CeRPC2k9FWyi0wmw7lz54pEdTvJ5/PEYjHKysqYn5/n0KFDvPbaa5w8eZLOzk4qKiqYmpoikUjQ29v7RCnWYDAoBGFQnLmoq6vDZrPhcDhoa2ujqamJaDTKjRs3MJlMwo0wl8uJnzMzMxgMhqLduNlsLjoXdSf2KFGgXq/HZDIJYx81M6C6G8LPF0S9Xk9DQ4Ooie80Psrn8xgMBtH6WFtbu8uaWA0qrFYrZWVlRW16Wq1WHBt4qDZAFeM1NDQUPa+OrVYdIt98803+3t/7e/zmb/4mhw4dwu12P3acsjoHQu26qKmpEUZIDxKPx9na2uKHP/whf/VXf8X3v/99bt++jdVqxWKxiMDgwd8pnU6Hy+US+opHHV99r2pEpXajaLVaEomEyGooisLt27fFmG5FUZiamhIZDo/HQ11dHbdu3RJtssFgkP3797Nnzx4RaIZCIZqbmykrK6OkpISWlhYmJycJhUKPPD+v18tzzz1HIpHgypUrDx0ytRNVGPok1NTUoCiKKJlJJE8TGRxIdqEqxh9luhKNRoHtlLW6m1TFe6urq9y8eZM7d+48tkVwJ/F4nFAohN1uF7tGNXPR0NAgdpeqyj4ej1NeXo5Go+HOnTu7nAUzmYxIN6s7UtU7YKfznurnDw9fcLVaLVVVVWJ36vF48Hg8mEwmHA6HSJUnEgkaGhpoaWnB4XAQCoXEQqcGB6lUShgqNTc3i89QswIbGxvcvHmTH/zgB/zxH/8xf/3Xf82NGzeEOZRqzqPei50UCgWCwSBWq3WXdmBn6x9sL8Qmk+kjWxZ3YjAYRHAyMTEhJgjuZGtrS0ymVIWm2WyWu3fv8l//63/lpz/9adF9NRgMtLe3i+BKFRaaTKai6YUPona65HK5ou9uZ0trKpXCYDCwurrKyMiICKqcTidms5lQKERPTw9bW1v83d/9nRDFqs6OV69eRaPR0NbWJuZdADQ3N1NSUsLAwMBjsxsOh4Pjx4+Tz+e5cuXKY8dWq5mpJ8FgMFBdXS06KySSp4ksK0h2ofaaP2zXUygUiEQiWK1WNjc3MRgMfP/73xd/mNVavbq7/qhRwrDthmg2m8UffkVRROYiGo2STqcxm83A9kRA1QgnGo0yOTm5S2mvGvOoZQHg/8femwbHdVhXwqf3fe8G0Nh3kCAJEgQBbiK1k5QdL5HsOOu4kvFMJT+SynhmfmZqampSU6n64iRVqfHMVCarp2xZlqxdJimJFEmABBeAIAgQO9BAA43e9337frDu1etGAwQlObalPlUqW0Ivr1+/fnc79xwOWiTiUywWWcsfwLbdAzJJ8nq9LBVMFrsUlGmv3mw24+jRoxgZGYHH4+F1v1wuh2QyCa1Wi+PHj/MqIiUr8/PzGBkZYZdAGk+UEyf/zb/5N/jJT36CjY0NlgFOp9P82seOHXvkBsZuEzYh8vk82tvbsbCwwORUSlDIsXJ9fR1isRiNjY1MADQajdDpdPD7/RgZGYFer0dDQwPsdjtXzHTN0FoiySfb7XZsbm5WXDUV8jVoJEGJWjabRSwWYzVJmUyGo0ePwu12Y2FhAUajER6PBzdv3uRrlmSKSVxKJBLh5MmTSCQSuHHjBjweD2prayEWi9Hf348rV65gdnYWe/fu3facaTQaPPHEE7hx4waGh4dZTEkI4n48johSa2srHA4HNjc3UV9f/zhfYxVVPBaqnYMqtkAmk+Hpp59GMBjcEkwSiQRyuRxUKhVcLheam5sRi8Xg9Xrh8/kQCATYy8BoND7SoS6RSGBtbQ09PT2sjkidC7FYjGAwCJlMxskAjQdisRhvMJQnIMI2fKXgmM/nORCVt+HLQVr7EokEKysrCAaD3D4n4p8wKDc3N+PMmTPo6+tjIqNMJsPBgwdx5swZJlsWCgVehRwZGeEVQZ1OB7VaXeJ9cP36dT6vp0+fxsGDB3n2L3ztcnGlz9LJj86DXC6Hx+NBJBJBIpHgxKBQKKChoYE7NMJNCjJGWl5eZg6D3+/H6uoqpFIpNBoNWlpa+HwRdwBACVmvUqIgNOACUGL6ZLFY8K1vfQtPPPEEvva1r0GtVrMPw8TEBAYHB3Hq1CmsrKwgk8ngwYMHnBhoNBpYrVaYzWbMzc3xe+t0OnR3d2NxcXHH8QLwUOnyxIkT0Ov1uHHjxhaVT+JuPE5yoNfrYbFYqn4LVfzcUe0cVFERzz//PM6fP4+lpSW0tLTwjD0ajUIqlWJjYwM2m41NdLRaLd946SasVqtx584d1NXVoba2tmL7dGFhAXK5HO3t7VhZWUEikUBtbS2799XU1DDHgWbwdFOmNTASJRJ6JVClGwqFePxBYjvFYhGhUIgr/keB7HQdDgfm5+eZY9Dd3V3R8thsNsNsNuPw4cMV/RsoaOZyuRLvg0rET1qVJOIkcQf6+/t39Ib4JB2C3Z6HxcVFLC8vMwdDoVDAYDCw5bBQo0AikaC2thapVAoOh4M7AxKJhIWLRCIR9u3bB5PJhImJCRQKBW7FNzc3Y2Njg1c6aTWS3oNei46lUChApVKhtrYWNpuNDZ2kUikOHz6MS5cucdfIYDDAYDDA6XTi/v37nFTSOI3WFK9fv87dA+DheGFzcxPj4+NbpMDLQZ2L8fFx3Lp1C319fcyroeTgccmFbW1tuH37NsLh8K7soauo4pOgmhxUURGdnZ347ne/i7/4i7/AyMgIGhoakMvlEI1GEYvF0NHRgX/7b/8tFhcXeS5OwS0ej7MBUiwWYx0Eq9WKuro61NXV8dhibW0Ne/bs4QoyHo9DKpWivb0d9+/fh8ViYW0BGj1oNBpmntfW1mJsbIyDldBr4Pjx4xgfH8fm5iaUSiVXpvF4HFqtFqdPn95xhU8ICvh9fX2PNGwiPMq/QSKRsJmQcAVSaFcsXBEUeh/I5XKoVKqKmwPEdQC2H5d8UpQnPoVCAa+//nrFz0ltfa1Wy1yAfD4PiUQCjUaDUCiEQqEAnU6HYrEIv9/PwlnpdBpisRjz8/OQSqVobm7GN7/5Tbz99tusbZHJZKDVaiGXy3nclM/n0dnZiSeeeAJXrlzhsdPCwgICgQCMRiMCgQCy2SyuXr2KI0eOIBKJwGAwIJfLYXNzE+3t7fwZiGcyNzdXYhN96NAhHi/09vbueM4kEgkGBgYwOTmJiYkJpNNpdHZ2Mhficb0Z6urq+Jo4dOjQYz23iip2i+pYoYptcfr0afz7f//vce7cOchkMoRCIahUKpw+fRq///u/j9/6rd9CW1vblv3/fD7PIjvJZBKNjY3o7OxEsVjE/fv3cfHiRVy9ehXDw8MoFovcalcqldjc3MT7778PjUbDIkRisZjlfynAUCt7dXUVExMTrFFPIkfnz5+HQqEoafHTrPrQoUM4c+YM2tramLS4W1DF+zjPqYRisYhwOFxiJqRWq5kTIawIibcg3CrYaQOEKutCoQCr1Yrf+73fQ11dXcUtARIqetwkgs4DeTxsxy0h18p0Og2JRMLbBMTdAB52oy5duoTNzU2IxWJOeEgkiyyVr1y5gmKxyJwFrVYLq9WKcDiMYrEIk8kEnU6H9fV1qFQqdHZ2YmZmBteuXcPMzAy6u7tx5swZPt9TU1O4du0a6uvr8bWvfQ0qlQozMzMlCZdIJEJ3dzdCoRA8Hg//d51Oh56eHiwtLSEYDD7yfIlEIhw4cADd3d2YmZnB9PQ0+4M8rtsirTWur68/Uhuiiio+Kaqdgyq2BYn2/PEf/zGuX7+OBw8eoKenB16vF9lsFuFwGENDQ3A6nSyHTNVuV1cXzp07h5WVFTgcDmSzWdTV1WFwcBCZTAZra2uYn5+HXq/Hz372M0gkEiwtLSEWi0Gv12P//v3I5XJ46623sLGxwWI5EomE/RWIcFfekheKHD3zzDMYHBys2OKnNUHyHPjXZoATcZK6BESa1Gg0HDiAj3fhheRJhULBj68Eauknk0m8+eabWxjzfr8fy8vLJUJC5bLSuwG14icmJkrUIZVKJa+W0grn3r17t3REiNAo5CgADzcLlEolampq4PV6kcvl8ODBAxSLRd6EiEajyGQyzHMg7494PI7l5WXU1NRgZGQEfr8fX/rSl3gsQJLbwEOnya997WuQy+U4fvw43nzzTdy+fRsnTpzgY7FarbBYLJidnS251jo6OrC5uYm7d+8+crwAbFVTpC7JJ3F1bG5uxtzcHFZXV9HV1fXYz6+iikeh2jmoYls4nU4ADys4t9sNhUKBQqGAbDYLr9eLO3fucNCmQAeAFe9u3ryJrq4uPPfcczhw4ACi0Shu3ryJ5eVlXl0kyVqHw4FIJIJUKoVAIACHw4Ha2lr85m/+Jg4cOACpVMoV8YEDB9jAqZIWA83qg8Eg5ufnIRaLYbVa2TKaQMx3AI9MDD5Lch+BAqvQF4I6ChS8KLC2tbUhFArh1q1beO211/CP//iPeOWVV3Dr1i0e65SDNjyoshaLxRCLxXA4HLhw4QLu3btX0nG5d+8ezp8/j5WVlcf6vO3t7dBoNExgJdInJQG0ZtnZ2cmvSxsNmUyGCYX0XOqKJBIJJBIJHD58GF/96lehUCjYPZG0J+x2e4mIklgsRiqVwu3btzEyMoL6+noYjUY+x3TN5PN5ll++evUqOys2NDRgZmZmC3mwp6cH4XC45L/TeCGRSGB2dnbX56u1tRUDAwPwer1IpVK7XmUUQi6Xo6GhAQ6H4+fCL6miimpyUEVFFItFOBwOlkqmKjUQCDCB6v79+xgdHWWmeaFQgMlkgtVqRTAYxPDwMN577z3EYjE0NzfjwIEDMJlMWFhYwL179+D3+5FOp2E0GqFWq0uIetFolPfZBwcH8eKLL+Lb3/42vvrVr6Kvrw9+vx8mk2lbQhZVr8RFICKbMAkQihk9CuQB8Fmjvb0dSqUSPp+PRwEk0StclVQoFLhw4QImJiaQyWRKfCIooAtBK6epVApSqRQymQy9vb3IZrOYmZlBNpuFzWaDXq+HWq2G0Wgs2Y7w+/27/gyVNhmImxIMBqFUKnHs2DHWsZDL5aitrUUkEuFOglQqhVwu50Afi8UQj8fh9Xqh1WrR1taG5ubmEifGQqEAl8vFWhGZTAYdHR0oFApwOBzIZDJ4/vnn0dbWxm38iYkJfg/g4TbEwsICbt++jUKhgP3797N+hlDNUcg9EAZjrVaLPXv2sCLnbmG329HS0oJ8Ps88hMdFa2srkskkNjc3H/u5VVTxKFTHClVUhM/nQzweR0dHB95//32WASb5WdpOWF1dxde//nVu8Z44cQLDw8MsUkOGRAaDgVv31CaXSqXY3NwskcwVtveFrXWJRMJiRNlslsmJ1FaudHOleTUlHeXdgfI5+3buiPTYz5rcB3wcWIkRT5bQQm2E3t5eTE1NsbPgdiMUoV0zgdj7CoUCm5ubmJ+fh9/vh8Vi2eJ+WGk7Yrco32QAHq7dnTp1itczgY/HGa+//jqbYbW0tKC/vx8dHR1wuVzYv38/ZmZmkEqlkM1mceHCBQwPD7N9Mn3X0WiUjZfIJnpubg4ymQwqlQputxtTU1PYs2cPnE4nXnnlFeh0OvT19SEYDCKZTMJqtSIUCsHlcmF8fBx79uyByWRCNpvF7du3cfLkSU4ge3p6MDIyArfbjbq6Ov7s7e3tcLlcuHv3Lp588sld81HkcjkbaI2MjODo0aM7qkOWw2Aw8Fqj3W7f9fOqqGI3qCYHVVSEw+GAXq/H+vo6wuEwotEopqensbS0hEKhAKlUitbWVnR3d2N2dhbPPvsskskkrl+/zpwAWkHMZDLw+/1QKpUso2s0GtHc3Ayj0YhgMIixsTF+znagClEikSCVSiGdTsNkMrGNsvBxwiSEquxHtV/LiZWfFuXrlduh0oqgcFVycXGxol2zVCrlc+DxeLCwsIBjx44hl8uVbD2QNkUqlcLk5CR3JYQQmklV2o4oh/BcUXIm3GQAwFoNLpcLqVQKKysruH79On//SqUSsVgM9+7dg8fjwenTp1lEaWBggMce1EUQkjAtFgtisRiKxSKy2Szi8ThyuRyCwSBqamqY3PnBBx/gH/7hH3Dr1i1EIhHU19fjS1/6EkKhEBobG5FIJHj273K5IJPJYDQaIZVKEYlEcO/ePfT397PsstVqxezsLGpra0sksml7YWZmBvv27dvV9ZHJZCCXy0vEko4ePcorobtBa2sr7ty5g0gk8ljPq6KKR6GaHFSxBalUCpubm2wTOzc3h6tXryIajUKtVnNQmpqawurqKlpaWtDe3o7z58/zfJtALXJqyWezWZhMJpw7dw42mw0ikQjvvvsuz4t3qs7NZjNkMhkSiQQ6Ojpw69YtaLXakq6DsAuRTCbR3d1dYohUDmGg3C4xIdli4GFQtlqt8Pl8Jfv2Qvj9fiwtLVVcr9yuGt9OG4F8IoR2zUBpJ4MC+tLSEvr7+0uMlwjkR0Acg+0SIKGyJT2WzpHwOcL/X961oYQiHo+zcqLf78f169e3dD/0ej1MJhNyuRwuXLiA3/md30EgEOARR7FY5Ap5c3MTkUgEhUIBTqeT+QmUIIhEImSzWXbqDIVC+NGPfgS/38/unPTfEokEvvWtb0Gv10Or1cLtduPpp5/G3NwcNBoNEokE9u/fj7t378JoNPJ6Y3d3N0ZGRrC5uVlSrdN4YXp6GnV1dbBYLBXPrxB0fklNcXR0FCMjIxgcHNzV8wHwWvDy8jIOHjy4q+dUUcVuUOUcVLEFq6urkEgkaG1tRSKRwJ07d1AsFlFfX4/6+no0NDSgqakJ+/fvh1wux9///d/j//yf/8PmSULXQpFIBJvNhq6uLuh0Oly+fBn/83/+T3zrW9/Cb/7mb+LP/uzP8ODBAygUikdW7D6fj5OP5uZmJsHRDJoSg0KhgEAgsEXkqNLanpAItx1ImVG4g7/dCuTKygpzA0ikSSaTlZD9dkL5qqTQJ2InVFp3LE+IhNsR24EMpoinADwMfBaL5ROtb2YyGRZASiQSWwikxWIRMpkMarUaiUQC4+PjCIVCGB0dhVQqRV1dHQYGBtjKW6PR8LiInk/jEIVCwaOhzc1NvPLKK4hEImhpaUFrayu0Wi00Gg3q6+uRzWbxxhtvQCqVIpFIoFAoYG1tDfv27UMoFEIgEIBMJkNHRwemp6eZg0Hdg3LuAfBQnMhkMuHu3bu7kg3PZDL8vZKaosFgwOjo6K55BGKxmNcat3PLrKKKT4JqclBFCYrFIlZXV9HQ0IBCoYDJyUkUi0V24+vq6kJraytMJhOLuQSDQTidTmi1WvYTEM6yAWBsbAx/+7d/i7GxMaTTaUSjUczOzuLll1/GT3/6UywuLu7qhkrSxSaTCSdOnIBCoeDVSmqhl8sa+/1+NjV67bXX8Oqrr+7I8icI29ikuiiXyxEOh5FOp7ccb3l1rNfroVAoIJPJtkgh7xbbBXTqtBBLvzygV0IlWelKJk7lstI0GvqkhMx8Ps9+EJW2IFKpFBt93b9/H+vr68jlcmhsbEShUMDy8jJcLheCwSCkUin0en3J9UWExubmZojFYoRCIVy7dg1OpxN1dXVQKBSw2+0wGo0oFovw+Xyoq6uD3+9HNBpFsViEUqnEwsICampqsG/fPsRiMdy/fx979+6F2WzGnTt3mAPT09ODSCSyJYDTeCGdTmNmZuaR5yWbzZYkfVKpFENDQ6ipqcHt27d37b5ImztVt8YqPktUk4MqSuB2u9lWeG5uDtPT0yXzVYJKpWLDHL1ej5mZGTZJovY83cCXlpbw9ttvszSy1WqFTqeDRqNBTU0NIpEILl++jFAoxCI5u7F53rt3L770pS/ht3/7t2GxWNiVsL+/n0WOaG2vklDShQsXdqzkiVkPPKzCFxcXkUqlKnYZDAYDlpaWkEgkYLFYSgIpPd5kMiEej2NxcfGRn42wk08E8Smom/Eonwhg69pheRUvNJIikF6BkOz4OOt3RK6k71b4nkKDKNpEqK2txZ49ezAwMICuri4eH4TDYQSDQea0CI+bSJQymQw6nQ5LS0v8frlcDrFYDEajEQ0NDSgWi0gkElAoFLh58yYaGxtZlGl0dBTd3d1suLW+vo6BgQGIxWLeaDCbzbDZbJidnd3ynWg0GuzduxfLy8uP3Pig8ZEQpKbY0tKCiYkJzM/PP7KjplAoqmuNVXzmqCYHVZTA4XDwauHy8jKkUilvBghv6nK5nM2QtFotstksz4jpZk6PX1tbQzgcRl1dHdRqNVf5tHev0+kQiUSwtrbGpEPSnwce3vyoIyF83UQiAYPBgK985Sv4kz/5E3znO9/Bc889h4GBAZjNZgQCAdy4cQPZbJYr+XJTo9HR0R0reWGrdic+BBkLKZVKrujLIZFImOz3OJsP5QEdAG9qZLNZtoLu6Oh4pOJh+dphKBSqaCRVPvMm/Qn6zkjFcTd6CAqFokT5UAghsZHcNwuFAvR6PYLBIOLxOAKBAG8XkKlTJVAS4/P52O8jlUohGo3C7XajUChArVbzSiTwsNtz6NAh5sXMz88jmUzi6NGjUKlUuH79OsLhMAYGBhAOhzE1NQXgIfcgGo3C5XJtOY7W1lZYLJZHjhfKOwfCc7J//3709PRgZmYGU1NTjwz6NAIs12eooopPimpyUAUjkUjA6/WipaUFDocDcrkcJpOJq+Xyio/8Ecj7gIhuQhGcfD6PyclJqFQqGAwG2O126HQ6SCQSmM1m1NTUcAIyOzsLjUaD5ubmksqVDHqI3EitdOBhdf/BBx9gYmICy8vLJVK2CwsLiEajMBqNEIlEJdW8SCSC0WhENBqtWMnT3n0lEIlMiGg0WlEKWQja8iABH+Hr7YTtHBFJlEehUKC3txeLi4u7Gp20trbi7NmzOHjwYEXnyNbWVh5nCD9DOp3m7yCdTrPR1qOgUChw+PBhNl0SqgIKu0yJRAL19fXweDwYHh7GO++8g9HRUUQikV2fL+pmUYKq1+uh0WgQi8UwPz+PVCoFtVoNs9nMmxBerxft7e08Krpx4wb0ej2ampogk8lKNBBWVlawtrbG3YNK3AORSISDBw8inU7jwYMH2x4rbaVUAsk29/X1YWVlBePj4ztu8hiNRpjN5qpbYxWfGarJQRUMstC12+1YWVlBa2srnn32WSYaloMU+MRi8bYtbTLnoZug2+1GNBqFXC5HNBqFx+NBPp/nCspgMCCZTJbY4VqtVk4INBoNv4+w6iy/QZez/GUyGTPaZTIZNBoN1Gr1tpV8LpfbluBF5k302YFSbkA2m902cFICQZ+XXA0fhZ0COukgbOcx4XA4tlSoZrMZg4ODeOmll/Diiy/ipZdewuDgIG9TUHdnu89A5303oHVLtVrN3Q8ikdLr0CoeJYXCpEF4Xe3mfEkkErS0tMDn8yEajaKmpoY5MktLS3C5XMhkMkgmk2hqasLs7CxisRhfAw8ePIDH40F9fT1bj4+MjEAkEsFut+PevXsIh8Po6enZtnug0WjQ29uLlZUV+Hy+iseZy+UeyeNoaWnBwMAAXC4Xbt68uWMnorW1lT9zFVV8WlRXGasAADYxamxshNvtRiqVQltbG9RqNc6fP4/FxUXU1NSwqx7wsKJfX19HsVjEnj17Kr4uBTKhEJHJZOL1MXKmy+VyUCqV8Hq9AB5uJpDngU6nY8Kj3W7nJKY8SFFXIZvNbmH5C+2Fqcuh0WhYspmC6uNCKPcr9BiodBMn/4Q9e/bwcwqFApPxpFIpr0xWQqV1x1AohAsXLuwokDQyMsIrg+XYzjmyUjW822RAo9HgmWeewaVLl1gG2mQylYg9aTQayOVyZDIZxONxGAwGPPXUUxVXPYWJm1DyuhLkcjny+Ty6urqwtrbGZkkGgwEajYbXKukYGhoamJ+Qy+W4M/Laa6/hm9/8Jq5cuYJQKITz588jmUyirq4ObW1tCAQC+Na3voWamhrMzc2xjLMQLS0t2NjYwMTEBJ588sktCdpOnQMh7HY7jh07hps3b+L69esYGhqqmCDZ7XZea+zr63vk61ZRxU6odg6qAPDQgCadTqO5uRnLy8uw2WzQ6XRs3axUKrGysoK5uTn4/X6sr69jbGwMUqkUTzzxBPR6fcX5s1QqRUtLC8LhMDweD5LJJFKpFNbX1xGPxyGXy2E0GpHJZNDV1YV8Pg+n04nh4WG8+uqrePnll/Ff/+t/xdjYGGQyGdbW1njEUB6sKDEAtrL8idFOMs9yuRyRSIQVHz+Jvj29LlW5lbgBwseRx0BbW1vJ32pra3Hs2LGS1TZCJQ6BcN1xaWkJ8Xh8R4+JeDyOhYWFise/G1dGGiHthl8glUrR0NAAi8XCYwj6roTdD4lEgkwmA7VajcOHD+P5559nd86dQOTL7UACUHa7Hf/u3/071NbWYnNzE2tra/D5fPB6vUgmk9DpdLzNIjwHhUIB+XweiUQCY2Nj+Od//mf88Ic/hFKphFwuh8vlwvDwML7//e/j//7f/4uurq5tuwe0vZDJZDA9Pb3l7/l8ftcbIBaLBSdOnEAymcTw8DAnXUKQ2qTT6SxZaa2iik8CUbFKb60CwMjICABgz549rNRWU1PDf//rv/5rjI6OIhgMQqFQQKFQ8OoY3WAraQa0t7fD6XTiBz/4AVKpFFeG1C7WaDQIBAIQiUR48cUXkcvl8JOf/ASRSAQqlYqDNt3Qicm9G9y6dQsTExMlFTWNGQqFAjKZDFwuFw4ePIjBwcHP5DwKVQArSSEfO3YMra2tj3yd3Qgp5fN5vPbaa8hkMjuq40UiEchkMrz00kvcJXgcoSZaTd1O9KkStus0EGEzGo1y94O2CnZD0hSJROxIKYRGo0EymYRYLMbevXuxsrICtVqNYrGIe/fuYWVlBR6PB9lsFn19ffid3/kdLCwslHAyhMcciURw48YN7nTRWiWtL4ZCIeRyOfy3//bfeBT25JNPVkygVlZWMDk5iWPHjsFmswF42DH6/ve/jyNHjuDo0aO7OqfAQ17QjRs3kM/nK6opptNpvP/++9izZ08Jb6eKKh4X1bFCFYjFYvD7/Th8+DCWlpag1Wr5JkawWq144okn8Nxzz8Fut0OlUmFtbQ2vv/46jwYAlKgR6vV6WCwW1NbWwul0YnR0lBnxJGTj8Xh4/u33+3H+/HneLqC1N7FYDKVSyR4CNTU1OHDgADY3N3dsw7e3t2NhYQHBYJAr62QyycRJn8+3ZW3v0+JRUsi78StYWVnBjRs3EI/HedxAHIKFhQUcP34cra2tPD55HIEkiURSMYGp9PqErq4uGAwGjI2NceudXhf4mIMgdO3cLomgv9E4gxK1R3UlJBIJLBYLIpEIJwLpdJqVJOPxOEQiEQwGA1paWjAzM4NoNAqVSoUvfelLaG9vR11dHT788ENsbm5iZWUFYrGYx17CxEckEmF2dhZra2s4cuQIEokEe3jU1NTA7XbDZDJhfX0dr7/+Ov70T/8UHo8HGxsbaGho2HLsLS0tcLlcmJiYwFNPPVXS0Xpc7Qi1Wo2TJ09uq6aoUChQX1+PlZUVtLe3/1zcRKv4YqCaHFTBmwkGgwHj4+M4cOBARaY98DDgU7VCGwjCFUa66el0OkilUiwsLCAcDuPAgQNobW3FlStXsL6+jnQ6Dblcjn379qGrqwt6vR7Xr19HIpEoSUyEaosmkwlerxdLS0uora19pM3ybkyNqLX8uKgkKUzYTgp5NyAhpXw+z/LSBKHJkl6vh8Fg4MC+EyhBkclk28oYV3p9Oi8ymQzRaBRarZY3U+hzl0tTKxSKbYmM9Hih7LNSqUShUHikKyG1/smLYWJigkmZtN1is9kQDAbx7rvv8rWRy+Xg8XjYLImSEoVCAZ/Ph1wuV7JlQ5/B4XBAqVRibW0NCoUC0Wi0RNDK7XZDqVRibm4Os7OzMBgMmJubQ319fcXxzsGDB/HRRx9hamoKBw8e5M7Hbsio5SA1xVu3buHGjRsYGBgoMYJqa2uD0+mEx+NBbW3tY79+FVUA1eTgC498Po+1tTVeX5RKpWhsbNzyOAoAtKFA/1+hULBDIwVxuVyOdDrNOve0ppbJZDA0NISvfOUrcDgcuHv3LhQKBTQaDeLxON+QhRD6LUgkEqjVanbao4C7k8HRZ1HJV8KjEhM63schOYpEIuYQlAdu+rvQNXFwcLCEBFmpSiTFQ/KY2M3r+3w+rK2tsXPj5OQkFAoFbDYbEwgBcGClZIG+850gJKfSsZUfQ6XEQiaTYWFhAVevXkUsFmP1yXQ6jfv378PlcuFP/uRP4PF4SubxpO7p9/vR09PDGg2FQgENDQ0YGxsr+S5JbCmbzTLPIp1Ow+l0Ip/Po6amBnK5HDU1NayUKRKJkEgkkE6nt+0eqNVq9Pb24t69eyWeDJ9UdVIqleLo0aMYHx/H7du30dfXx9og5M65vLxcTQ6q+MSoJgdfcGxsbCCbzaK+vh4jIyNobW2tGNCI6FWeHFAVRjd0kqtdW1sraS/H43GeXReLRdjtdkxPTzMprbW1lQWQhBBWdKQhQC3yUChUcW7e2dkJs9nMz/s0lTzwsFIja+DHfe7jIJfLVTRZEoK+g5WVFQwODlYcnRDKFQ+3M3ESBmSa6c/NzWH//v1cVafTabhcri28g0wms+X5crl8W+LgdrwCMngifYzyzwwAly9fRiqVQnd3NwqFAsLhMEwmE2w2GxYWFvBXf/VXeO6552A0Gvl98vk8Hjx4gGw2C51Oh6eeego6nQ6jo6Po7e3FwsICmpubsbKywh0wm83Gzp9KpRI6nQ7xeJwlnGtra1koLJVKwWAwIBaLIZvNYnZ2tmL3AHgoc0zjBRplfZLOAUEsFuPw4cO4f/8+JiYmWM5cJBKhra0N4+PjiEaj0Ol0n/g9qvjiopocfMHhcDhgs9kQCASQz+e3JcvRWqGw0pHL5ayUSGtypG1Pzo3Aw5u71WpFIBBAsVjE8vIyr0VSt0Emk0GlUpXoGwCoGIgUCgU2NjYwOjq667k58HiVPK0aer1eLC8vY2lpadcOi58U5euXQjMp+ncaD1CbXTg68Xq9zFGoNDpJpVIVTZwouNP/0rkUrndut0JYPlqh60SYLDyKxCgSidhmeWNjA6lUijkplDRcv34dsVgMHR0dLJ+s0+k4eBORdn5+ni2jCQqFAslkkl1E6+rq4Ha7eXvG7/ejt7cX6XQak5OT3GW4ffs28vk8otEoNBpNSReBTMCefvpprK2tcQIRCoWg0+lQU1ODhoaGknNN44XLly/z9sinSQ7oNffv3w+FQoGZmRmk02ns27cP9fX1mJ6exsrKCg4cOPCp3qOKLyaqycEXGKRVPzAwgJmZGRZ9qYRcLrdF9U8kEmHv3r0sOzs/P88OhsLEQCaTIZPJQKlUIpvNshANtXhzuRzm5+dht9vh8Xi2qDESisUiotEoOjo6MDo6+lhz83JIJBImwlUaEZBL37Vr1xCPx9kN8FEJyKeBVquFWq3mtj2w1RgJQAnLH9g6OiGnw/LRCa13Clv/lYK3kKNA4lGPg8d5POkSkHqi2WyG2+3m/55KpSCRSOByuaDVankjgTgy8XicK/yuri620qbkjq4l8vOora3F8vIywuEwMpkMxGIx3G43QqEQkxqVSiUOHTqEubk57sjEYjEolUpYrVZEIhGsrq7yb8XhcDC5MZ1O4/Lly2hoaMCzzz67pa2vUqmwb98+XLp0ibU9Pi1ITVGhUGBychLpdBr9/f1oaWnB0tIS9uzZ84lXdav44qKqc/AFhnDGH4/H2bO+EoQqh0L09vais7MTarUa6XQayWSSZ740j6axQyqV4ps+GTRRwM/n8+js7OSthEpugaFQiGWLd7Pbv5PBkVwuh0Qi4TW6cvj9fly7do0TEK1WC5VKVeLL8LgOi4+CWq1mkyUAPBsXKgnSOS5XpBQqHn7ta1/DN77xjRLFQ2CriZOwY0Aod2V8HA+ISiB9gEogMSoK2hqNBkqlkrkERNqj64nOh8FgQE1NDeLxOF8Xm5ubiEQiKBQK/J7kwyEWi3nDprOzE9/+9rfx5JNP8udLpVLMmens7IRWq0VDQwP+9E//FEqlkiWrA4EAFhcX4fF4oNfr8dRTT6Guro5trml7gpKOfD6PS5cubTH3ampqgkajQTqd/kxHVKSmuLm5idHRUTQ0NDCnqIoqHhfV5OBziO1Y9ELkcjmsr6+jubkZDocDJpOpxHWvHMQM3w6kMCeEXq/nICyXy9lSmeb2wrU3uVyO5uZmPP3001AoFHC73YhEIkin04jH4/B4PJDL5RgaGuLNg53m8mq1mtfVKoFc+CrNuAHsWlzocRwWy1F+bJFIBC0tLaz9QC16YXJQyTVRCBJI2u5zk1BTKBRijge1vguFAoLBIPR6PYaGhlgw6tOAOgKVQMlOJpOB3+9nv4jy50ilUsTjcWSzWZhMJg7GBoMBuVwOfr8f4XCY5/4tLS2wWq3MUSkWi2hvb4fZbMbGxgbW1tYQCAS2BOZ8Po/Z2Vl2U+zr68Mf//Efo7+/n5NakUiErq4uvPjiizh69CjUajUMBgM/n8yhnE4nXn75ZYyNjW0JziKRiLcLdmPt/DggNcVQKITx8XHU1NRgZWUFq6urGBkZ+dTfZxVfHFTHCp9D7GbOu76+jnw+D6PRiLm5OQwMDOz4eKF9cSWEQqEtXgThcBgGgwH19fXs6ieXy9njgIhcpEpXX1+PYDCIM2fOlGwXSKVSHDx4EB0dHVCr1RXn5vS5abWO1BITicS2rVvS+BdCLBYjm83umhi4vLyMw4cPf6IKsNKN2mg0MofA7XZ/puuXALZwFFQqFa8oJhIJ6HQ6DA0NlfhRfFpsJ3csFotRX1+P1tZW1NfX87hJLpezSBXwccdjcnKSj8fn80Gj0ZQkmLFYDHv27MHevXshFovxs5/9jL09aFwxMTHB4wCDwQCv14tisQitVguJRIJEIgGRSIRoNIpr165BpVLhySefxKFDh0q6Z/l8HpubmzAajUilUtDpdEilUjxOo9EQqSqWd2gKhQJUKhU2NjbQ2Nj4mW4VWCwWnDx5Ejdu3EAkEkE4HIbT6QTwcM1RuC1RRRXboZocfE6xk/hJsVjEysoKamtr4XK5oFKpdrxhkATudsnBwsICJiYm+N+FK4bJZBJOp5OFb/bv349MJoNIJAKv1wuNRsOjhenpaRSLxZLtgkqvudNuP5H4hHPz7WA2m7kzIfys5cTA7VAuLvRJUZ7M/bzWLyu9/vz8PJxOJwsG5fN5eL3eHfkanxUKhQKPdjY2NgA8tEImW2Ty2RCLxbyVsb6+zu1y8k0AHhp6qdVqdHZ2wm63o6amBuPj43A4HEgkEhgZGUEgEEA6nYbdbsfQ0BA0Gg3+7u/+jscWcrkcarUaBw4cgEajweXLl+H3+5kYKZPJYDabEY1G+bpJp9N8DdNnEiKTyfDa7r59+/g3lM1moVKpUFtby+JIn3StsRL0ej2eeOIJfPjhh3A6nZDL5dDpdHA4HNXkoIpdoZocfAFQXrWEQiFEIhF0dHRgYmICe/bs2TGZIMvmSsxqEmKhKo8IXcLqPZPJsIfCs88+i6tXr2Jubo6V7SrJLgMfJwRKpZL1EqiKrLTbXywWuYoU7vYLIdRE2I4vUIm4V45HJSA7aS+UYzshpdra2k+8fvkomM1mRCIRzM/PQywWo7a2lkdDuyVcEgfgcSF83tLSEubn51nUidwwST/AarXi6aefxvDwMGKxGG7cuAGn08kz+2w2yx2VoaEhqNVqjI6O8jqiSCRCKpVCIpFAc3MzkskkGhsbWcvj9OnT+NnPfoZkMomGhgZkMhm0t7ejpqYG0WgUIyMjnDwWCgX4/X5WJCSL50gkwiZSlZBKpXD37l1sbm6itbUVHR0drGzZ19eHy5cvY2pqCv39/Y99LncCnUuy2Nbr9XA4HDh06NBnQoSs4vONanLwBYTD4YBarUYsFoNYLGbxlO1ABDlhcpBOp/HOO++wWyL5I+h0OuYXkA0uBTWpVIpXXnkFLpeLEwNi1tPWQiXIZLISLf3y3X5KPKjKqzSXfxwvgZ0SEAIRLMsTkMd5n0eBOhI/D10FUkoUSlUTHrXxcejQIdy9e5fXHR8ncaFuDCldrq6ucvJKSofC7YqGhgYsLCxg79698Hg8MBqNWFpawsLCAlsed3d3o7OzEyaTCYVCAVNTUyzlXCwWWb+Atm0WFxdZfjoQCECpVKJYLMLr9aKtrQ02mw25XA5ra2vciRImcIFAgLcTaMVzJ4VHSipIvntlZQVer5f5Ifv378f4+DjsdnuJ0uGnQaFQwLVr1+B2u9HQ0ICNjQ0Eg0FkMhmsra2hq6vrM3mfKj6/qCYHXwAIb/yZTAYbGxvo7OzEysoKGhsbH7nmRG1XhUKBhYUFvPvuu/jhD3+IWCwGi8WCmpoadHR04Ld/+7fZ4lYor0vEv83NTb5h00xbaOqzHcr96WluPjIyAq/Xy/PeeDxecS6/Gy+Brq6ukk7BbsSFNBpNSQLicDj4fXbyRPgstgA+LR5HibE8Obhy5Qrm5uYeW/tBKpVCp9NhYmKCnQVpRTSXy2FqagqLi4s4ceIEmpubkcvlcP/+/RJnx/r6epjNZvT19VVMTOiaUqlU8Hq9uHfvHubm5mAwGKBUKtHT0wObzYZkMolYLAadTsddCJFIhPr6ehSLRZYfpm0RISkUeLiSSJ2L3XRQiGvjcrmg1+vhcrkgk8kwPT3Nvg/37t2D2Wz+TMYLIpEILS0tEIlECAaDUCqViEajCIfDuHv3LoslAeDui9DorIoqqsnBFwzC+X86nd5iH1wJlBxMTk7ipz/9Kebn56FUKmG32+Hz+djxrre3F5FIpGLgo4ra4XBwO763txetra1s2fwoUFANBAIIh8PcLg2Hw1AqldDr9UxcpCC1k5eAXq9HKBTCjRs3tlTIj+vLsN37FIvFXWsvbPd5P2tsp5QoxHaESzKFSqVSJeOXSqOI8oq7WCxiaWkJw8PDfJ6oM0LXo9/vx+joKPR6PZqamgCAVy8BsLXydh2VQqGA+vp6yGQyvPPOO1heXi6xZL5x4wbEYjGeeeYZPP/886itrcWNGzfYXnppaQnr6+vMwxByCYSfJ5vNwm63M+F1p3VBuVyOvr4+2Gw2/N3f/R2uXLmCRCIBhUKB+fl5HDlyBAMDA8hkMrh///4WEadPApFIhH379qG3txexWAxOpxMjIyNIpVJwuVwIhULw+/24ePEiLl26xFoRTz/9NM6cOVN1dKyimhx8kSAkIjqdTtTW1kKr1T7yefF4HIFAAG+88QaCwSDsdjtaWloQi8UQjUbR1taGXC6Hv/mbv8GTTz4JvV4PkUjELeT5+XmuqNVqNcvrTkxMYGlpCYcOHaqoR18J6+vruHr1KjKZDGQyGSwWC1c+YrEYNpuNZ8IUjLarkMluenNzEw6HAzU1NSWjjcchBi4tLSEWi/H7CG2FSUFyu0q8HBSEPmlioNVqd3SrfFzCJQVEv9/P/BKz2bwl0QoEApwACa2J6fn5fB4LCwv8fdDfSYhKIpHwVsH8/DysVivEYjE0Gg2i0SjP6MfHx7c9N4VCAQ6HA5cvX0axWMSJEyd4zGAymRAKheB0OvGzn/0Mv/7rv479+/fD5/Nhfn4eLS0tUKvVqK+vx9raGmsW0PELtSFyuRyOHDmCbDaL6enpHTc7stks7t27hw8//BBerxdWqxUulwupVAoXLlzA3bt34fP50N7ejvv378NisezalvxRoFHf3r17kUgkEAqFsG/fPkxMTOCv//qv4fV6YTKZoFQqkUgk8IMf/ADnz5/Hd7/7XZw+ffozOYYqfjVRTQ6+QAgEAojFYmhqaoLL5cK+fft29bxEIoGZmRlsbGygvb2d57U0N7VYLIjFYlhbW4PD4eDKRyQSlVTUtbW1EIlE0Gg0MJvNkMlkmJ2dxZUrV3D27NlHBk2v14tr164hnU7DbDazxG6xWIRer99SnT+qQqZWsFKpxMLCAvr6+rZUo8LNCQqolUiOwvchPgKBgspuVx/LCYpCi99KKG9r75QYALsjXAIfKyXSuaNEq66urmIb/VEJEJ2ncqVNiUQCjUYDjUYDv98PtVrN50kulzM3JZfLYWZmZsekqVgs4ubNm3A4HDh69Ch7f2QyGUilUsjlcnR2dmJubg5///d/j1gsxgTItrY2dlZsbGzEU089hXA4jCtXrnBnoVgswuPxIJfLsX243+/nxCafzyMUCpWIV3k8Hvzwhz+EVqvFoUOHuONFSfLq6ipefvllfPe730WxWMR7772HY8eOYc+ePZ8pcbCtrQ3Dw8NwOBz467/+a8RiMezbt6/ku6ivr8fi4iK+973voaGhodpB+AKjKoL0BcLKygq3uPV6fYkP/HYoFAqYnJzE4uIijEYjOjo6IJFIeG9apVIhkUhALBbDaDRibW2NhXXUajXm5uZKxIQoKJL9rkajQSKReKSYkFgsZsc9s9nMhDC6sVUSJiI9hUozXOEcmQJlPp/ftpOi0WhgMpkqBvXHqcRpi+Fx8KgOwuNuDJQrJVZCJaXE5eVltliuBGECVOmY6TwJzyEF/Ww2i3g8zn/P5/PQaDS8QUG8FKHjYqX3Bx4mMQqFAi6XC9lsFlqtFtlsFsFgEBaLBU1NTbBYLFhaWmJp5EQigfn5eaTTaUxMTMBoNDIZVaVSwWKx4NSpU6itrUVTUxPEYjFSqRSOHDnCGxHxeJyvIUrYSNCKEpwHDx4gGAyy8Fd7ezsOHz6MWCyGt99+G1KpFAqFgjsN9+/fL0k0Pw1MJhMMBgNee+01eL1etLe3V+SbdHR0wOv14sKFC5/J+1bxq4lqcvAFAbnq1dTUwOPx7IprkEql8Nprr8HtdrNdrVgsxvr6OrLZLKvGSaVS2O122Gw2FItFGI1G9ldwOBzQaDSQy+Ww2WzQarVQKBSoq6uDRqNBLpfbMaAQFAoFlpaWYDQamV1OwZ9QHpwUCgWvHNLjhBbDFBiFHYHtqu7t7IWBjyvxR1X3FPh2S/oqFApslkSv8VntwpNSIgUqIYSEy8bGRk5oPm0CVOk8iUQiaLVaJqbSeZLL5Th06BCbK9H3s5O4V7FYRH9/P7RaLTQaDTKZDHNs6L3IoVCr1SKRSKCzsxMvvPAClEolUqkUkskkFhYWEIlE4Pf7kUqlWKXSZDKhubmZk5ZoNIqNjQ1Wo4zFYmzjbDab0dPTA6VSiQcPHsBqtbL3wsrKChKJBOsk6PV6dHV1IRgMIpFIsHCRQqGA0+nEBx988JkkCSKRCA0NDRgeHt52C4ceZzKZcOnSpc9EBKuKX01Uk4MvCFZXV1n9j1bEgMo79gAQDAbx4x//GF6vF3a7nVuzpJFAe93UgfB6vbzOSBUUMbllMhl0Oh0aGhr4dXw+H1ZXVwGAdRF2uhGR8IxGo4HVaoVCoUAul9uSUJQLE3V1dXGFTIFZKpWWEAYreRWUQ6VSVQyiwKMrcbrZFgoFtLe38wrbdoHW7/fj1q1b+MlPfoLXXnsNr776Km7dusWaEJ8E5e9FhEu5XI5AIIBoNMqBaWNjA4lEAqlUCpcuXcKrr76KiYkJFAqFHRMgADsmQJXOE1XQTU1NMBqNEIvFSCaTaGlpwe3btxEKhfh7EfJYtoNEIoFWq0U+n4der0ckEkEkEmGXUEq4fD4fUqkUpqamkM1moVQqYbFYcOzYMcjlcgSDQYyMjODOnTtIJBIsnbx3715otVoYDAbk83mMjY1tSVBTqRS8Xi/m5+fR3NzMXQSJRAKbzcbnJpFIYGFhAYuLi6wF8tJLL2FoaAi5XA537txBPp9HU1MTJwmTk5NbktTdghQcSTp8J5C2yCd9ryp+9VHlHHwBQHPNmpoauFwuDlD0t3KRJIfDgfPnz0MikeC5557D3bt30d3djbm5Odb7p8RArVbD5XIhk8kgGAziyJEj3MalIE6VlFgshsViQTwex+bmJorFIiwWCxwOB6RS6Y4Vtclkgk6nY0Oe7YKUUJhIo9HgyJEjePDgAQKBAM/BqUrdjVcBodxKuhw7rT5KpVIsLCxwGxkA2y2HQqGSG/Vu1i7b2tp2rKCpM6JWq6HRaFgiuFyopxLhkuSGqUtBQlYkXVwoFHbUfthOfKrSeSIb6ZmZGdy9e5f1ArRaLaxWK3/HlDQKk4TtPv/Y2BjsdjvW19d5k4ASRSKu0qiiu7sb9+7dY5vo1dVVSKVSNDc3Q6FQ4NChQ7h9+zZcLhc8Hg97O8RiMfZ/2NzcLLluhZbVpAtCiSDxEerq6rC2tgaJRAKVSoVcLsd22zdu3MDhw4fR29uLV155BbOzs3A6nejt7YXVasXq6ipWV1fR3NyMzs7ObV1UAbAdNf1DYxuFQsG8iO08OFKpFNRq9Y6vX8XnG9Xk4AsAr9eLRCIBq9WKQqFQonpXfpO/e/cuk/q+8pWvIJVKoVAooLu7GwsLC9jc3GSferFYDKfTiVQqxT72J0+eZL3+SCSCvr4+vP/++3yToTY/ueclEgnEYjEcPHhwS0BRKBSQSCSs0Nje3o5r166x410lCIMTWUI/8cQTGBkZ+bl4FdBn2mn1USaTwWAw4ODBgyXvEwwGSzoBwm2AT2pFDXxMgKypqcHTTz+Nf/7nf952+0FIuPR4PLh06RJ3Osrf3+PxIBQKwePxbDm+3SZadJ5u3LiBtbU17oZQdU1jhevXrwMAj7+Ir0KkQmGyJtwUKBQKaG5uxsTEBJxOJ44ePYpAIAC/349CoYBQKIRkMgm73Y5z586VJMmbm5vw+XxQq9VIpVJ8bZPY0/LyMpaWlniNkgI+cSTo2Il0K5VKsbq6iqeffhpvv/02Ojo6sLa2hs3NTe6upNNp6HQ6KBQKHD9+HGtra1heXobRaERrayubQN27d4+tpLVaLZspNTU1oauri7k/wmSA+Bk6nQ41NTWwWCwwm81YW1vD97//fcRiMej1+orXTzAYxJe//OWq7sEXGNXk4AsAh8MBvV4Pr9eL+vr6ijLIhUIBly5dwszMDBobG/HCCy9wexV4eIMZHBzE7du3sbGxwTNgMjcyGAz4zne+g/b2dsjlckQiEUgkEgwODuLGjRuYm5tDW1sbNjc3kclkuP0qDCjC3XWqcCkYSCQSWK1WKJVK+Hw+WCyWEuVEsVgMn89XEpzC4TCAh1a2Wq0W8/PzO64k7sawqhLoOdutPnZ0dKCtrW1LQC8fEZSvQwqPqVyYyGazlawJloOUKkdHR7napW2ASiCSaSKR2FYYqaamhl0Ud6P9sB1aW1tRKBRw/vx5VsgkgSRyU/T7/bh9+zZ6e3t5nZAqcqEXBlkzAw+rdjJHGhgYwOjoKO7evYvm5mZODDweD5qamtDb28sdlUAgwDoIlHgKLcYtFgtEIhFOnjwJm80Gl8uFlZUVPHjwgLcdSKiJvldq3dOYg4iJNpuNlTyJuLu0tASDwYDf/d3fxcDAAKampjAzM4PZ2Vmk02moVCoMDAxgdXWVNTkGBwd5e2N8fBxyuZw7FHq9HrW1tbBYLCwQFolE4HK5cOXKFWi1WtTW1mJubg79/f0lSXk8Hsf6+jpqampw5syZHb/HKj7fqCYHn3Mkk0m43W7U19djfX2d29pCZDIZvP3229jY2MD+/ftx8ODBkufTrPLAgQPo7OzEtWvXsLy8zLParq4udHR0sHVtNpuFxWKBQqHA2toannzySUxOTuLmzZsQi8XsnJhIJGA0GnHkyBFeA9PpdDh+/DjOnz/P7ngkgVtXV4fTp0/jzp078Pv9MJlMbJFLN9FKwYncJwcHB3f0KvgkiUE5hJV4KpVizYNH2R9vt3YplUphMBgQiUTYrGd5eRlDQ0NbVCiFiEQizDGhjYBP8v5CiEQiGI1GFItFdHV1saCVRCLBgQMH0NXVtesOjN/vh0wmQ09PD5+jQqEAvV7PVtKhUIhllZ1OJzKZDFt9E7LZLBQKBRQKRQmZtKWlBSaTCXNzc1hbW+NErbOzE11dXbDb7dxtIPJqIpGAVqtFW1sbb96Q2BYJCalUKnR1daGtrQ2FQgFjY2MlxyPUQaDPcezYMQwODuJ//I//gYWFBSbFJhIJHr89+eSTWFlZgcFgQF9fHw4ePAi/34+xsTHcu3cP165dg9FohMlkgt/vx5tvvgmFQoHa2lro9Xokk0m2q96zZw8CgQDu3LlTsqoZjUaRz+dx9OhR/Mf/+B/x53/+57h27RqamppgMBiQSqW4kDh69CgbSu3ku1LF5xfV5OBzjtXVVfYxsFgsHMAJoVAIb731FmKxGJ588kns2bMHb7/9NtLpNJ566im4XC6sr69zYAgEAjh8+DCOHDnC1TfwUD3R4XAgGo2iqakJx48fx4cffohgMIg9e/bAbDbj7t27rImvUqkwNDSEmpoabm2KxWJEo1FcvnyZiWMU+JRKJVQqFbPs6aafz+f5OHp6epiNvh1+Xl4FwEPSIs15H9dfYbttgFwux8RLmUzGvhW0Jw98vOpIgZNEhYTSvuQ5sR0edxuB/DiWlpaQz+fhcDi4gn9UglAoFLC6ugqVSsXJIhFX6RikUilMJhOuX7+OF198EWazmYmMsVisZONkOxa/1WqFxWLBE088gWg0yqJbi4uLsNvtaGhoQFNTEzQaDQwGA1tWDw4OYmFhgTkUBw4c4GtteHiYSXpqtRoGgwHhcLhi4iWVSnHo0CGcOnUKwMPRwP379zE2NoZkMon6+nrU1tait7cX/f39CAaDGBsbQzAYRH9/PxQKBbq7uyEWizE5OckbFGKxuMRBs7W1FWfOnEE4HMbi4iI+/PBD7hJRJ4USq/r6egwNDfGq59WrVzlJIcJlU1MTJBIJXnvtNezduxc9PT2w2+3VJOELBlHxsyiXqvilRKFQwAcffACtVgufz4fBwcESY5e1tTX87Gc/g0gkwrlz59DY2IilpSVcuHABPp+PdQSobUpBRywWo66ujtu1sVgMs7OzHMRramqg0WjgcrkQDochl8shk8nYiCmbzeK5555DKBTC1NTUjhW7RqNBKpWCyWTCnj174HK5WMeAXouEYojV/ahLWqVSMY/hs0YlQiG13TUazbZOh/l8Hq+++iqT3irxAyQSCcLhMKRSKV588UWutssDE3EtKNg2NTVhbW1tx20Q4ftXmkMTqIMhl8uRSCQe6zMSaEVWIpEw6Y0Ik8lkkkcF4XAYuVwOL774InQ6HfL5fEn3gNr/lUB6AUajEQ8ePMD4+Dhv7AjXLalKbm9vRyaTwVNPPYVTp06hWCxicXERP/3pT6HRaJDNZlFXV8fHViwWkU6nmYch5E1Q4qJSqTA4OIj29nZsbm7iww8/hNVqhUgkgtPpxNe//nW0tbXhnXfeQTAYhNVq5S0RElVSKpWcgGQyGZw8eRILCwuYn59HLBZjfQ6FQoHe3l4cPXoUbreb7a0DgQBvCxWLRRw9ehT79+8HALz33ntYX1/HN7/5TYhEIly8eBH379/na4hsnrVaLerq6tDT04PGxsafW3JdxS8Xqp2DzzHcbjdSqRQ0Gg3UajVqa2v5b5OTk7h27Rq0Wi2++tWvwmAwoFgsYn5+HtFolCt3AHwzpHVAEojR6/WYn5/nNSwib5GCHHEbZDIZz4mpcg8EAjhw4ACmpqZKjrlc7Y+smuVyOZ588km88cYb/DcihVGA2NjY2FXA/3mtZ+3k4/AoQmFbWxs6OzsxNja27TZAPp9HIpFgJUdqlZcnB5QwUPBcWlp65LHv1omSrg2RSFRyPT3qMwr5HOUKjSR9TUkobSnQtgHxW0g/o7GxEdlsFj09PXj99ddLri1Kqqjj4nQ6mRDb3d3NPAP6PKFQiFv2er2e3RWTySSi0SjzWkiAiUSUfD4f3G436urq2BKazgspPppMJigUCly9ehVOp5M7QDqdDjqdjlv4XV1dGB8fx8rKCouH0fe4Z88etni+fPkyHA4HTpw4gePHj8PpdOLevXtYXV1FLBbDzZs3MTk5iYGBARw5cgSxWIy1GkhqvLOzE8DDUSIlR+vr6+jt7S35zqnzFI/Hodfrsbq6CrfbjYGBAfT29j7yeqriVx9VnYPPMRwOB9spt7W1ceV/+fJlXLlyBbW1tfjWt77Fowav14uVlZUtVTUFH7lcDr1eD41Gg3g8jmAwCL/fj2g0ynN8qshqamo4cJM6nBChUIgJaQRqJwvXq2hWXigUMD09jeXlZf5buSjOpzEpEprzVMJ2SotCkLxwOdNfJBKxv4JQwVH497W1NbS0tOwoTBQIBLY4QQq7AeXH+Lidkd0IIxEx0GQybXl+JZXKSseynd4BXWdisRharRaZTAZHjhxBbW0tXnzxRbS2tqKvrw/5fB6dnZ0syU1jCdJBaG5uhsFgwL59+7C5uYlIJALgYdeDZuj0nRiNRkSjUczPz0MsFmNqagqXL1/GBx98gKWlJSb31dTUYHBwED6fD++//z4WFhbQ1dWFAwcOwGAw8HkXi8VQKBRQqVSQSCQIBoPM+6B/X19fZzGk0dFRZDIZnD59GqdPn4ZGo+HjAh4m8ePj4xCLxejr64Pb7cb6+jpbrf/ar/0a/uAP/gDPPvss7HY7UqkULl++jP/1v/4XYrEYfuM3fgO1tbVIJpNIp9OYmZlBPB6Hy+WCWCxGT08PVldXkc1mEY1GS3579FumrlN9ff2OHaEqPl+odg4+p4jH42yqIpFI0NzcjEwmg/feew9OpxPd3d0YHBwsCWKzs7Pwer3bEtfkcjlXFMFgkIMFMbJVKhU8Hg+rF5LVcqUgJfSzJzVFYt/Tmhe9Fz3+7bffLtE3+KSCQELshh8gkUhQW1vLFSJ1M4TYidAnVOir5K+g1WqRTCYfywlyO8fGT6NoZ7FYcPTo0W3fX6PRoFAoQC6XP7abI1DaFSrXhRAil8vB4XBAoVCgvr4esVgMV69eRSwWQ1dXF3K5HMLhMFwuF9RqNfbs2YNYLMbXHn0W0iOgZI3eW/h9iMViqNVqzM/Po7+/H5FIBFNTUzhx4gQMBgOmp6eh1WoxNjaGmZkZ1NbWoq+vDx6PBzdu3EChUIBarYZarebvo729HVarFffv32cuBqk+khgSPS+dTqOxsZHXg7u6uvDee+/B4/HAYDBALBZjdXUVkUgER44cQWNjI+7fv8+bO8BDHYWBgQEcPHgQIyMjuHv3LqLRKHs2NDc3o7u7G93d3VhdXYXT6UQymURtbS26urp4fZJk0MsJn7TB8cQTT1TcdKri84kq5+BziunpaaysrEAsFqOpqQlNTU148803WY1tfn6+xKb1+PHjuHjx4o7a9VqtltnpqVQKRqMRKpUKer0eKpWKuwkej6fkZlwOkUgEs9mMeDzOFWIikUAul+MqjDzoE4lEidRx+et80suXbtA//OEPEY/HuX1daXauUCgglUr5WCqhfI6+HUht78UXX+SbO1X81HYOBAIl65C7ITR+2vMhTJJo7g08JN0plUq0tbWhsbERly5d+kSfEXjYGdJoNLxiuh0/g0Zhx48fR29vL5PlJBIJ6urqoFAooFareUQ1ODiIV199FXq9Ho2Njbh37x6kUikikQheeeUV2Gw2+Hw+Dt6UhNJrks34N7/5TSiVSj5mnU6HbDYLjUYDj8eD/v5+PPPMM1hbW8ODBw9QKBSYJEijL4/HA61Wi+7ubiwvLzNZkbQPMpkMLBYLisUinn76aVy5cgUqlQomkwn19fVoamqCTqfDxYsX2SPCbDZDLpdDKpWit7cXc3Nz0Ov1GBoa4iQtGo2ymuOBAwdgt9tx6dIlTExMIJVKQSqVorW1lQ3Erly5AqPRiJ6eHsTjcYTDYczPzyOZTG6xT29tbYXJZEJjYyP6+/urxMQvCKqdg88hCoUC1tbWoFarEYvFoFQq8eMf/xgzMzOYnJxELBbbYtP6xhtvwG63l7QNKYBSwDGbzWhpaUEwGITT6UShUEBnZycL0iQSCdYw2Kmqp1EDzXdJOIbmzrTXTup26XS6hPcgfJ3toNVqd1RSDAQCuHDhAtLpNHtG0DFXmp3TsQqx0xy9vAIj0H57ubiM0HBIuA653dplJRAr/XFRHqRVKhVkMhlXkkeOHEF7ezsf+27dHEmlksY1VPETttOF6Onp4erbZDIhGo1ygKNuAbHnn3rqKQ7Icrkcvb29iEajyGQyiMViTBpsbGzkzR0AW6p5+v6KxSIngm63m/U4AGBmZgarq6vI5XIwmUys1mmxWOByuUq2KWQyGb7xjW9gcnISd+7cgUKhYEniSCQCkUiEUCiE9vZ2xONxtLa2YmNjA6urq9Bqtejq6oLVasWdO3fgcrlgsVhgMplw7949WCwWuN1uOJ1OJptOTk5CrVbj1KlTvLHz/PPP49lnn8XIyAhu3ryJxcVFOBwOqNVqKBQK7N27Fx6PB+FwGF6vd8tYTa1WQyaTobW1lfkwRqOx4jp0FZ8/VJODzyFcLhfS6TQHr4sXLyIajeLBgwfI5/NbbFrtdjuGh4exvr4Ok8nERCoSOSJxGWq/jo+P4/bt2xCJRHj33Xeh0+nQ3d3Nssm7qV4pwORyOWZDe71exONxiMVi1NbWckAWi8XQ6XRQqVQlRjc7gXwYKBiVG/4sLi4iEonAZrMBKB1RlAsObVetV5qjE6FPCJpxE6GwXA2S1AvLxwSPu3b5SRKD7UiUdM6DwSBGR0dhNBphNpvR1dWFO3fu7Gjck06nWaUymUzydkAlVEqEKEgXCgV4PB7IZDKoVCpeNyTdA6PRiJGREfj9fnR3dyOVSmF6ehp1dXXw+XzYu3cv+vr68NFHH/H1TIkoreWSfXJvby9zWMhNkYK9SCRCNptFJpPhzRmXy4V8Ps9qipSMSqVSxGIx3L59m7sgdD23trbi/v37UCgUyGazrCy6ubkJhUKBgwcP8ibD/Pw8CoUCOjo6sLy8zOTipqYmBAIBpNNpjI2NweVywe12o7m5Gfv3799yvZBC6NDQEG7cuIG7d+9ycnL16lXU1NTAarXC4/EAeGjZTATihoYGhMNhOJ1OdHR0oKOjA9PT09Dr9bBarY99rVXxq4VqcvA5BM1rHQ4HkskkGhoa2DSpPDEAHt5ADh48iPHxcSwuLuKZZ56BXC5HPB7nKh4A3n//fdy8eRPRaJSrD6fTiUgkgsnJyYorbFQh5/N59PT0sCKcWq1GJBKBSqVCT08PV5Wk/05qh7lcDpOTk1haWuJj2bNnD+rr67cN2iKRCAaDATqdjpMDq9WKzc1NPpaFhQXmOwhB1TvNzldWVtiW91Ho7Oys6K9AK6F+v39XPg5CEClst92DxwWRKMu3K6hrVJ4ktbS0YGZmpqKHBJEW1Wo1f0YSsHoUhImQMOmiTpLBYOAgHovFcPr0adTX1+Pq1avI5/O8IROJRNDe3g6/3w+NRoO2tjaMjY1hfX2duw0UmOn6NZvNrNoIPExumpqakEgkkEwmWeJZJBIxsY80CPbv38+Ev6tXr6K7uxtvv/02MpkMFhcXWQiLRg/ChAEAampqkEgkMDc3x8fc2NiIgYEBJJNJOJ1O1NTUYGNjAz6fD/F4HN3d3XwNu91uvPDCC2hqatrx/Mrlcpw+fRp79uzBq6++inQ6zZtFxNUg3QYabc3Pz3MSODU1hWeeeQaRSAR37tzBqVOndhwtVfGrj2py8DlDNBqFz+eD0+lEPB5Hf38/Tp06hd/7vd/bcjMXgm7g6+vrHLiFM3a/34/h4WEAQFdXF/L5PLehNRoNfD4fbt68icbGRhw4cADz8/O8aUDzdGKVUzdCq9VylT41NbVF8Mdut+Ptt9/G/Pw8lEola9Hfvn0bKpUKx48fR3Nzc4nDIrHF0+l0if5+PB7nla5Kgj80fxY6/6nVauRyOWQymV0RsUwmExMKyUiHZt80Rz927Bjq6+t5lUwY+IVjik8ipPS42IlESZ2dcoKh2WzeNWkS+Pg7+bTkUbJCXl1dRXt7O/bu3Quv1wsAOHfuHPR6PY9Hbt26hVwuB51OB7VajZMnT+L27dtYX1/nzgQ5NcpkMpw+fZoTCuDhb2FlZYWPmcSnmpubsbGxwZsJCwsLWF5eZjniTCYDv9+PJ598Eh988AFSqRRUKhXzBYrFImpqaljEiZQNbTYbQqEQS1PTyE6lUrEfgkajwfLyMstKK5VKNiJzOp1obGzcVQIbCoXQ2tqKgYEBXL9+HU6nk9cnNzc3eb2SOEDU9drc3MTS0hIOHz6Mq1ev4vbt2zh58mSJoRWNo6r4fKCaHHzOMDs7y6TDI0eO4Nlnn+XgJCSHCZFOp+H1elmHfXl5eUswJN3/xsZG5hYAYOtks9nMVs6hUIhnzqlUime2mUwGbrcbADgxiEajmJubg8fjgU6n4532eDyO73//+ygUCrDb7cjlciVOd7FYDKOjo9Dr9bz2BYCrMzo+CrIOh4Pd+VpaWrgSFIJuhMR0J3lnpVK5a6Jfa2srjEYjFhYWsLS0tMXHoaenh9vGMzMzyGQyWwL/bpwZyzs0nyQAP44qotAGezuuQLlXBaFYLEKn0/H2yuOCvhfiD6hUKly5cgVerxdmsxnZbBb37t2D3+9HTU0NALBcMG0DDA0N4fXXX2fZb5lMhra2NrS3t6O2thYNDQ2cQAqh1WrR0NCA5eVlOJ1O1NXVoba2FkNDQ1hdXcXc3BwLcxUKBayvr6Ouro5HKjKZDE899RSCwSAntVKpFDabrUSm3GazYXNzE0ePHkU6nYbb7YbL5YLX64XH42ESaCqVQjgcRjQa5YB87do1lj6n8ZtKpYJCodjS2aHjq6mpwde+9jWsra1heHgYfr8fOp2OOzg0HqTRSjqdxt27d9HU1IQjR45geHgYb7/9NtbX13H58uUScvOZM2ceqztWxS8nqtsKnyM4nU68/PLLKBaLaGlpwUsvvcSV+u/8zu8gkUigoaGh5DkkkpPJZKBWqxEIBPDCCy9s2Xd+9dVXkcvlmGldrk5HN28A+PrXv86VsDBgyeVyriTphk+KdyKRCA0NDcjlctjY2MC9e/cwPj6O7u5uBAIBvtlSZU9GSgcPHsSRI0f4fagDkMvlSoIsKfGl02mWiyX1QLqB5vN5JJNJhMNhiEQixONxlr99nIqIRHDkcjmcTmfJSGBlZQU3btzgjQiaedO/79u3D1NTU8hkMtu27eVyOc6ePctBmHQntsNO5MjdqiLKZDK89NJLW0YbtJpHnaHtYDabWQ/jUSAZaqECplQqZcnjYDCIeDyOUCgEuVzOHgPUop+fn+dOg1gsZmLjzMzMljENnd/nn38e6XQaV65cKbmum5qaYLVasbKyArPZDJ/Ph3Q6jYGBARw/fpzP/fT0NB48eMDOn6lUir+Tjo4ONDc3s5ES2VI/++yzaG1thVQqRTwex6VLl9Db21tC+CPexcLCAqanp1lDxOfzIRgMllwfGo0GtbW13O4Xi8UsO04qlLOzs+jv70dDQwMnKoVCAXNzcxgZGYHX64VarS5RfSS+jEQiQXt7O37t134NFy5cwP/3//1/yGazsNvtUCqVbKRms9nw3e9+F6dPn37kd13FLy+qnYPPCWZmZnDhwgUUi0U0Nzfj0KFDAMDOck8//TR+8IMfoL6+vuSGQkQno9EIt9uNnp4erlAIFEjr6uqYFEY3OYlEAp1Ox0E+FArxbnQ5aMxAmwcE0jVQqVQcQGZmZqBQKODz+QB8TBik55F63vLyMgYHB5krQJ2DcqKdWCyGwWBAoVCAVCrFzMwMotEo/H4/bDYbIpEIPB4PjzSIvDg/Pw+32/1ISWAhpFIps9zVajUfu/CYLBYLV+wKhYLJf8PDwxCJRFu+J2B7oiRxGirl+USQq8RZEJIoSSGzHFQ9EsGQIAyy9Fo7IRAI8PbJo7C+vs5dCfq+2tracPbsWdjtdgQCAbZW3rt3L/R6PQKBAMbGxtg8id5HpVIhl8thfn6ej5OSAiIg5vN53LhxA/v37+edfoVCgUwmg42NDZasDgQCeOedd7C5uYmXX34ZQ0NDeP755/HEE0/gyJEj6O/vx5tvvolMJoNgMMhjOUooIpFIiajXnTt3MDMzg56eHrS1taGpqQkLCwtoaWnh80lJdzgcRmdnJxobG3nNl5RGRSIRJ1A+nw/19fVoa2vj85BMJpFIJNhIan5+ns8H/e7I+XF8fJzHGpTc0/VFY6i//du/xfXr1yESidi/grqS9fX1WFxcxPe+9z00NDRUOwi/wqgmB7/iKBQKuHHjBkZHR1EoFKDVauH3+zExMYHh4WFEo1Hs3bsXzz//PM6fP4+lpSW0t7dzZez3+6FQKLC0tASVSoX6+vota3s0pw0EAkzWo5XF1tZW6HQ6rK6uwufzQaVS4cSJE5iYmOAbLTHVhV0D+hv9f+BhokIENDIWoscIK1+y1qV2O62f0WOpG0JEO3p9kv4FHrZxU6kUk77I/VEikSCdTkMmk6GmpgZarZbXGpuamlBbW8sJy3bQarUwm828ekekyHLyHyVKwMeOh5ubmzxyqYRKIkPErRAmCIFAAKurq1heXuaNgUriTu3t7VhcXGSXy0qdCiGJ8tNwIbYzSBJ+tuXl5ZKRilKpRCaTwd27d7G4uIiNjQ0cO3YM3d3dqK2thd/vh16vx/Hjx2Gz2TA6Ogqfz8ffM43Ayrcl6Pppb2/H9PQ0IpEIxsbG+DoymUwIBoNQKBR48OABrl+/DrVaDavVitraWmxubuKjjz7C1NQU5ubmMDQ0hNbWVnR0dLBRWSqVQjQaRSwW402CeDyOQCCAZDKJSCSCQCCAtbU16HQ6tLS0IJFIYGVlBR0dHcjlcrh37x7W19fR0tKCffv2cdKQTqe5w/bgwQNEIhGo1Wq0t7cjEAggEonAarWivr4ezc3NbFzV29uLrq4uJJPJLf+EQiHo9fotK8zkmULKmFevXoXf78f+/fvh9Xrh8/lQV1fHSXFHRwempqZw4cIF/NEf/dGO33kVv7yoJge/wsjlcjh//jxWVlbYXIn0ATY3N3nF6sCBA6itrcV3v/tdfO9738Pdu3dhMBhY2jUcDkMikWBoaAgNDQ2IxWJcUVGF1dbWhtnZWej1eq7KiNhFLc5IJIK+vj6MjY1tO6MnIRiqCE+dOoVYLIaOjg7U1NTgwYMHuHLlCksxU4tZiEKhwOQthULBiozAx2uBQqKdyWRibQdiZlMwJh5DOByGTCbjG6Ber2d+Az1vbGwMg4ODj/xeYrEYjEYjd0iIIU9OhEICpTBoUfJE8tXCbQdhxV3OASAQ4XNubq4kwNK5JM7CyZMn0dzcjHw+D4vFgueeew4XL158JMGwnAtBXYPJycltuRCPg0QigZs3b6JYLJb4NtDYYGNjA2+99RbMZjO+8Y1v8Lmcnp7GnTt3oNfrWX6bEkfymBCCquBisYj9+/fzxo3ZbObE1O/3M/Hw3r17SCaTMBqN0Gq1aGxsZCOxbDaLa9euYd++fZiZmUE6ncbm5iaUSiVaWlrgcDgQiUTw4MEDiMVitLS0IBKJoLa2Fu3t7dyZCAQCcLvdyOfzWFtbw5EjR+D1epHNZnHkyBG0tLSUfAaFQoG2tja0tbVhaGgIr732Gvx+P2ZmZtDa2op4PA63241isQin0wmRSIRgMIi9e/dyp6ASisUi/v7v/567TeTsmMlk+Hlzc3PsqElbQF6vF3V1dTwuNJlMuHTpEr7zne9USYq/oqgmB7+iiMViePvtt+H3+zE0NIRCoYCRkREOvOSDcOLECb7Rnj59Gg0NDfibv/kbjIyM8Jx7YGAAdXV1vDpIVRe1YDOZDDo6OrC6ugqPx4OmpiYmIGq1WmxsbJTo/m+nZigWi3ktTKfTscDK3bt3WaI2EAgAAO+E19bWlryeVquFVquF2+3mdnf5+9EYhG5K5O0QCAS2vFYymUQul0NDQwO0Wm3F9vhOksCVkE6nsb6+DpVKhVgsxjLQ6XR6R/IfuSlS25neh0Ym9L0IRYaAj50ri8UiNjc3t+gW0D/kmzA8PMzdDYVCAbvdjrNnz+5IMNxOD4ECt8Ph2NZUare4f/8+79fT1goAFr8iYuCVK1dQU1MDg8EApVKJ3t5eJBIJLC4uIhgMcrfI7XZzd6OSzkKhUMC1a9fw3HPP4Y033oDb7caRI0eY41IsFnH79m0Eg0HeillfX0c0GoXNZmPDsfX1dayvr+MP/uAPsLy8jIWFBYRCIW75U5eupqaGdRR8Ph+OHz+OI0eO8IbR6uoqFhYWMDs7iwsXLrBok9FoxNNPP42vfvWr6Ovr29JVstvt+KM/+iP85Cc/wcjICG7dugWXy4V4PA65XI6TJ0+ip6cHEokEY2NjWF1dRVNTE+x2+5ZrmdY1Sb1Uq9WymFUsFuNOFHW+JBIJkykDgQDMZjOPOYhLU00OfjVRTQ5+BRAIBOD1etHd3Q2RSAS324133nkH2WwWZ8+eRXNzM37605/yjcdkMrFRyp49ewA8vMF6PB4EAgG0tLSgpqYG9fX1CAQC6OrqQjQaRT6fx+rqakkLn9q6FosFQ0NDuH37NrfJSfSFRFyEK2zlIHth2iKg2SndOFwuF8bHx5FMJln8xeFwYH19ndvsRESkVu12mgE0BgHAY4Jy0GiElPIqrRMKIazWybaXKncKPBQIyNFS6MFQrqBY6X0oCYlGoyUBQNiOr8QBiMfj/PjFxcWKugU0wijnLNA52EmVUSwWb6uHQOJARqPxkaJR5edTSGqlbg9tv5B/A8l5JxIJDjqrq6sIh8NoaWnBsWPHIJfLMTk5iVu3bvF57enpQVdXF8bGxkpUGekcErxeLxKJBFpbW7G4uIjJyUkm8VmtVrzxxhuQy+Us7BQIBOD3+5FMJnnVVSaT4bXXXsPevXuxsrLCiQ215+kaDIVCOHv2LJaWliCRSHDt2jW2Pm9tbUVbWxsWFhZw5coVRCIRnuO73W784z/+I15//XW89NJLOHv2LOrq6mC1Wrm7RUJLd+7cwdraGlQqFWpraxGNRvHWW2/hww8/xEsvvYQDBw4gnU5jfHwck5OTaGhoQFNTEzteFotFaDQaRCIRTlKJwEsuqOSt4na7YbfbIZfLYbFY4PP52OaZ+DbbdSiq+OVHNTn4JUexWMTdu3fhdDoBPLwJfPjhh5DL5XjxxRchk8lw/vx5uN1uGAwGVgXUarU4fPgwUqkU1tbW4HQ6WZAlm82ipaUFL7zwAn70ox9haWmJW9flVQndnIvFItrb2/HUU09hZGQEExMTzPzv7+/H4ODgjr4M5fNmr9cLuVyOmzdvYmFhAYuLi8xMJ2vcZ555BhcuXOB2t1KpxMrKCjKZDGQyGYaGhioGIhqDTE1NwWw2b3GZFIlE0Gq18Hg8OHDgAFZXV/n4thuHUBCgdu7Kygq/llBZbzt5ZzqmycnJbd+Dxgo6nQ6hUGhXHADh34TjFApMwuOgUUV5F0SYDFZSZcxms3A4HFv0EITjkcftrgAPZarJMZE6VpRspdPpEpEq+gyUpMnlcmxubuLixYsQi8WsPPjiiy8im81idnYWIpEI+/btw40bNyAWiyGTyZh/QbLJRFYk3gZpYSQSCeh0OnYspXPQ3NwMnU4Hp9OJUCgEqVQKvV6PcDiM69evb3GXpGPN5XKIRqN45ZVXeL2SRhjj4+O4desW1tfX8dprr0GhUODUqVMQiUSIRCIIhUK8BvzKK6/w2EWpVMJqtaKpqQmxWAx/9Vd/BYVCgSeeeIIr/NraWjQ2NuLBgwd4++23UV9fD7vdDo1GA4lEgo2NDXZvbWpqQmNjI44ePcrkZvpuSHG0oaEB3d3duHPnDjY3N5FMJlFfXw+NRoN0Os3dkkAggCeffJK7PrvRYKjilwvV5OCXHIFAAC6XC7lcDh988AEymQy3gVdXV+FwOBAIBGCz2VBXV4fOzk5cvXoVNpsNc3NzXJ2T89ubb74JiUSCs2fPIpVK8U5zKBSq+CMWBjK1Wo2vfvWr+NrXvobr16+zRKxOp4NGo9kxOaBVOQoGPp8PMpkMgUAAUqkUnZ2d3AqlYGs2m/H8889jcXGRkwK5XI4DBw6gubmZ5/qV1vQGBgawsbHBSVP5Z9rY2CixPybZ40o3sfJq3el08jYDcSdIj38ntLe3Y2lpaUd1QaPRiN7eXkxNTe1KZEgI4Thlpw1lYRfEZrPxKKccIpEIarWauSlEOCMyabnXxXZciErI5XKIxWIlz5XL5cwvoSSWqlBKXIlF7/P5uGUdDoehUqlY6At4yJqfmprCzMwM83AUCgVLEB85cgQejwcjIyPY3NzEwYMHsby8DI/Hw1wFp9OJYrHIIki0Hmuz2dDe3s6tdLfbDavVioaGBg7kuVyOE1pKVCORCHfGaNxEXBe/3487d+4gEomgpaUFGxsbfB5oe0av18PtdmNycpJdVldWVrCwsIDr169jZWUF/f39kMlk2Lt3LxNNaXzndDpx//59nD59mrdzALCj5NjYGIaHh/k7LPeeaG9vh1wux4kTJ7C2toZIJAKxWIzFxUW2to7FYrhz5w5vAP3TP/0TrFYrDAYDFy8Gg4H5CVX88qKaHPySY2lpiYWEiE3c29vL2wnNzc2sLGg2m+H1eiGVSpFMJqHX65lPIBaLceXKFQSDQdjtdlgsFiwsLEAulyORSJTYJW+HQqGA8fFxtLS08JYAtdhpNipUJRRCKpWiubkZExMTJRWJQqGAwWBgedjyVTdhu5sqS51OB71ej0gkwm3tcphMJpw4cQIffPAB3G73FtdFrVaLo0ePspY8zaspaFPSUV6t08hAeE5yuRyMRiO3vssDM21oVLJEpo6NMPC3traisbFx1yJDBOHoYqfkQMhZKE8MhMdPSpNWqxVSqZTlq4nTUn7ey7kQjwIpRMrlcrYVpySNqm56T/o+xGIxOjs7mUhLu/x1dXVYXFzEwYMHucNz+PBhBINBdhukYCQSiWC32zkAF4tFhMNh7NmzB36/n9cHA4EAWltb8f7776O2tpZ5NoFAAIlEAiaTCXK5HC6XCzU1NQiHwyzLTI9VKBSw2Wzo6+vDyMgIgIe/hY6ODjidTrjdbhiNRhw9ehTXrl1DW1sbamtruaVP/wgVSaemptDb2wuNRgO1Wg25XI7Z2VnejiEr9Pr6evj9fvj9fuTzedTV1eH+/fuYnZ3FoUOH0Nvbi4mJCczPz/NvjwI4fZ+0qWCz2Vh0Sq1Ws8Kix+OByWRCPB7H2toae7AcO3YMnZ2d8Hg8SCaT8Pv9nFTabDZ85Stf+bnIgVfx2aGaHPwSgzTXQ6EQCxAlEglcuXIFQ0ND6Ovrw927d3nFcGVlBTqdDv39/WhqaipRRFxdXcXk5CTsdjvMZjMkEglb85L6IFXs20GhUGBubg7T09P8uMbGRnR1dUGtVuPKlSvbPtdms2HPnj2YmJjg/0bCRsSEFqoWlh8HzTtlMhkaGhpgt9vZmU64LklMaRJjOXv2LMvcVgqyuVwONpsNx44d21ES+MSJE2hoaNiyOQGACWaVjhsA60Akk8ldqwt+EmdGiUTC7nm77YIIUR7wKQmKxWJobW0tCdz0XQlHFtu9bjn8fj+cTidmZ2dL1iGtViv7YZAdOBFsKUlTKpUsrkPW0LR14fF4cPXqVQwMDMBgMMDv92N6ehoSiYTdHek4Z2ZmkEgkmONAa5KU7AEPFT1bWlpQX1/P4kbCNV6Hw8GqjH19fdz1Im0RhUIBk8nE4xOLxQKv1wuJRIL79++zqmChUMDq6io2NzdLTLsoERMSM0lwivgsiUQCGo0GNpsNKpWKDaBIhImur3w+D6/XC5VKhfX1dczOzpZYWAMfk4ZjsRh3w6hbQ4mU3+9HOp1GXV0dnnnmGe5e2mw2eDweNDc34/DhwzAYDKyfQsdLyXAlg6gqfvlQTQ5+SVBJn3xiYgKrq6sAHt64Y7EY5HI5TCYT1Go1bt68iYmJCRQKBXR1deHo0aMV/RNSqRTef/996PV6tLe3cwBYWVnhm5VYLIbRaGR9+UqIxWI4efIkgsEg7t27B+Bh+1YikWB9fR16vX5bDYDZ2VksLy/zDY4qknw+j+bmZq46tiMEAh/fLH0+HxKJBPbv349QKFRSyYvFYkQiEX4Nk8mEwcFBHDlyhPULhDcm6rq0trbCbDbzcQqDdk9PD6xWa0ViI4FusKQ4J/ws0Wi0RBTqcQJ/OQdgp/MDAC0tLZidnd1xdFGJs0DdjXKCJZ3z9vb2ElMpYTVfKBQe+bo0MhAqRAqdPycmJqDRaNDZ2cntfZ1Ox8mCsNtDTp7xeJw7L+Pj47Db7bDZbLhy5Qr0ej2CwSAHqMbGRqysrPCa4tzcHJ577jlurwu7FEKkUikcPHgQly9f5qpcKpUiFAohFotBpVJxsKNjoRFGKBSCRqPhwE+rkfl8nrsedrudFSipO0hrhNQJot8nPVcul7MwEXmJEEnXaDTyaCWfz8PlcvH1SaqHm5ubW1Zg6fpoaGhAZ2cnEokEbt++XdLNKx/fGQwGHDx4EPv27UNfXx8ePHgA4OFvLpPJsPCVTqeDXC6Hx+NBTU1NyZpqFb+8qMon/4KxsLCAixcv4tKlSyX65IODg7h8+TKy2SxUKhX0ej0aGxuhUqmYSQw8nN2bTCacPXt2W2bwW2+9BafTiZdeeolbiLOzs/jRj36EdDoNvV6P/fv3sziKWCzmdqWw7axQKPDkk0/i2rVrrI5oMBjQ2NgIjUYDp9PJRL1K+gQAeK1rfn6ede7r6+vR39/PLeKdIBI9NKwhwhrZIJMw0qcx+KHA+EmcECUSCRQKBWsmCNdBRSJRiV304xwL8HF7f7egAEzBqxJnQahHYDQaEYvFthxjeSJCOgfUOicW/3avSyAL8OnpaVy8eBHpdJrZ8UKVQpKGPnbsGOLxOHcWFAoFq+3ZbDY+LzTOolGKRCJhTwFqXy8vL7Py4YMHDxCNRqHT6dDQ0AC9Xs/tcOLCbAf6XXz44YclpN6urq4tvzsK5sING6/XWzGpI36IXq/HgwcPcO3aNbS2trJ8NOk2FItF+P1+eDwe9Pf3s3Rza2srxGIxLl++jHfffReNjY3QarWsJ+JyubgLsLa2hv379+PAgQMVfyckatbc3AwAWF5ehtfrrSgiVQ6Sx6bEra2tDRsbGyzxbDAYYLPZYDQakc/nsWfPHrS1tVV5B7/EqCYHv0B89NFH+Ku/+it4vV6YTCbWJyfhkVOnTqG/vx9Wq5XFcVQqFbOKb9y4wZLHAwMDFd9jcnKSxxCDg4P4y7/8S7z99ttwuVzc9qTqRiqV4rd+67dw+PBhTE1NcdAVruABH1cYwsqtWCxCq9Vic3MTYrEYjY2NWFtbA4CS1igFLiKJ0Q2UuiKHDx/eUUhHJBLxTDYcDkOpVJYoH1aCQqHgm6WQBFfptT/Jz0Gr1bIQE7Vh1Wo1t3U/CYSte3qtx0EgECgZXeh0OpbVLecsEKeARHN287orKyt8bbS0tDxSIVEsFmN0dBSTk5Noa2sr4YoQUZDWbQ8ePIjjx49z0tDb2wsAePDgwRYCJAC+jmjLQSwWw2az8crduXPn4PV6cevWLQDgtUGFQoEbN24gHA4/MvjJ5XJ0dXVhc3MT8XgciUSCxZa2+46psidVze2sq+VyOUuOv/HGG0ilUrDb7dyVAR4mEcQROnfuHHsokGx5T08P/uIv/gJer5f9T2i11m63w+PxwGg04s///M9x//59zM/PM6mUrnthskbXnVgs3pZHVP79AmC1UqPRiM7OTvh8PiwuLgJ4SMg9e/Ys3G435ubmoNVqMTQ0tIUwXMUvB6rJwS8ICwsL+E//6T8hFouxnDGBiH8A8Pu///toa2uD3W5HU1MTLBYLRCIRy7dKJBI8++yz3EoUIhgM4sc//jFsNhu+/vWvY2FhAb/3e7+HRCIBs9kMvV7PZMVYLMZiRF/72tcAgOfBdJOiS0WlUqGnpwfhcJiJXdlsFs3NzRgdHYVEIoHVaoXf70dvby/27t2Ld999F0tLS7hw4QIymQzq6urQ2NjIFrgymYxHKGfOnNkx0FAlRF0V2sXe7rHU+p2ent6y817+2J2CubCaF4LY5FQlSiQS1NfXY3p6+hMnB0Ko1WoUi0UmiO2UCFGCSaAuiMlkqtjJIZBrIiVru/FAIHLg6uoqYrEYizhVApk8icVi1NXVIZlMcjeEiGpAqcmTUqmEUqlEX18fotEoEwsJtIZJqoVutxsajaZkY6BYLKKxsZEdE+VyOWpqahCPx6HT6ZDL5eB2uyEWi7cN3nSMVquVEzVK4IW/DwIlBbTiKFzD3O68SqVSKBQK5gYJJYldLhd3xgYGBtDR0QGJRMJaEGTENDk5idHRUeY8CL0smpqa8Lu/+7uwWq2swbG6usquiwBgsVhKvB/S6TRvbjwOaNSh0+nQ2tqKWCyGlZUVVlQlCW6/3w+pVIpz587hW9/6Fjo7Ox/rfar4+aLKOfgF4eLFi/B6vdi3b9+W1ppYLMaBAwdw584dhEIhPP/885DJZDwvdDqdGB8fRy6XQ19fX8XEoFAo4L333oNEIsG5c+cgFovx1ltvsTELedDTzZx2mB0OB8bHx9HX18evJQyIKpUKzz//PJaWlhCNRqFSqXi17uWXX2YmO7XYW1tb0d3djY2NDXzwwQcspJPJZLC2tsZKakQqW11dxeLiIqxW67Y3JeJk1NbW8l46vYYQIpEIZrMZ8Xgcd+7ceWSgFj6/UqJA3RFS0KORA92AqTUuEokQCoUeWY2WY7uxCLXK3W73tpsCBAoMtFpJx7lTYgCA7ZQpCdkNfD4fxsbGMD8/z66M2/ksUJARGjUJBZAI5euQhUIBS0tL2L9/P/NcCPS8VCqFRCKBxsZGpNNpTswo+VhfX2eZ7Xw+j1AoxOqge/fuRSqVQj6f3/acSqVSTp7IzltozlXpO2tpaYFer8fMzAwna9slBjSGiMfjqK2txR/+4R/ib//2b7G2toZkMgmJRIKuri4cPHiQkz/iSJCHA5EnTSYTZmdnefVXoVCgr68Pra2tSKVS0Gg0PJKYn5/Hhx9+yDwjMgmrq6tDW1sbRkdH2Sfica7lQqGAZDKJbDYLjUaDkydPQiQS4datW/jggw9YTZWSkR/84Ae4cOEC/uzP/gzPPffcrt+nip8vqsnBLwDZbBaXLl2qSB4kyOVyXu3yeDzw+XxYWVlh10PaiRfauwpx9epVBINBnD17ll0WX3/9dcjlcqjVavacJ5AwEAkNkclL+U1Br9ejpqYGU1NTiMVi2Lt3LywWCz766CPEYrESxrNMJkNdXR2/Pim30WNyuRy3y+lGq1KpsLKygoGBgRJTImGDi+a/1LJdWFjYcpwKhQJKpRKxWIzV6rLZ7CPn96QIKZQyBj42HHI4HMhkMhUNh4Q6EbR297g3VeF7UtUvFovZ4Q/AjhUu8DHBjBT86Ea9Ww7FbpqJQp8FjUbD4yXybyj3WSCOAvCQg0BiOeXvRURQMvohUh3t5FdCPp/nrgGRUevr61kIiTgC9Ni+vj6sra3xFsri4iLW1ta4/V/+nUmlUtTV1cHpdMLhcPC1KxT4KRe8crvd3AkjASaS0S5HJpPh70cmk2FpaQmnT5/Gl770JUSjUXaCJH4NfSZ6f7oeKHkdGBjAoUOH+DWJ/EpkzKmpKXR1daG7uxtKpRJvvfUWQqEQQqEQnnvuOXg8Hu7w6XQ6dnt8nA6CWCzmNenR0VHE43F88MEHTPBMJpOIxWK8YbO2tob/8l/+CycvTqeT1yar+MWgmhz8ApBMJpl8uBPIQOlf/uVfWCRGpVIxaY7aruRgSIFpZWUF9+/fx549e9DZ2YlisYiRkRGe0dfX11fU+NdoNJBKpYhGo0z4K4fX68UPfvADvnGTI6RQaz2fzzNp8t69e7BYLLh//z4LytBnI6JTJSGdTCbD718pWBWLRbjdbjanEUIkEqGhoQFer5crZlrLKk8Mym/sdrsdoVAIwWAQAPhmfe3aNd4zp/bwxMQEFhcXmYhX/jnUanXJGIPOzXbcBkpIwuEwHA4HZmdnOREhx7/dSBPTZw6FQkz8fFwHxZ1APgvZbLZETlmpVLJ/w/Xr11FbW8uclnA4jObmZty7dw/RaJQTsHLjKVqHBD42nKpkniQESXPHYjGcO3cO169fh8vlglwux9GjR3H//n3+PgEgHA6joaEBCwsLeP/99+H1enkFFng4jitPwNLpNJqbm7G0tMSJ2nYEQ+LgaDQa9Pf3Y35+HlKpFKlUqiTJqeRwuXfvXu54ffDBB8jn8yWeIML3pd9QuRImULrlkkwmYTabsW/fPrhcLszNzWF4eJiFyxoaGtgf4eLFi/x58/k8rwwLf7tWqxWJRIK3NoCt3R+tVguTyYREIgG3243h4WHEYjHU1dUhFovBZrPxe1Kh4/F48C//8i/IZrNwOp2w2+148skntx1VVfHzRTU5+AWAlNN2UtSj1pzRaGQiFJn3ECs4k8lgeHgYAJipLZVKcffuXcjlcnR0dJQYupAOO1Vw5ZBKpUwo2k7IhsSOxGIxfD4fV1E0X6VWMAVAssEl86NsNgu1Ws0BrPwGK6ygKkEohpPP5xGNRrdUxGKxGA6Ho+SGtV1Lt3xXf3V1teR5m5ubuHbtGhsO0ftQEkOBUmg4RImSkFUv3F4on0/T7nqhUOCxjt/v5+p5p4p8O5Q7KFJCc+/evZKE5nEh9FmgmTjt9lMVTf4N09PTGBwchFarhVgsRldXF+bn5zE7Owuz2cz79/S6Pp+vZB2S1AGFCZ3w+6LWvkKhgFgsxurqKnshJBIJXg9sbGxk+eJisYj5+XlYrVZEo1Hcvn0bLS0tWFtbQzqd5oBG4yPgYTcjFArxuGa7EQ1t25CaYk9PDydCkUiEeQX5fJ5VDYXfTy6Xw9jYGKanp/HUU0+ho6ODu15C0DkgOfTyDl/5tk0ul8Pw8DBsNhvq6+tRV1eHsbEx5jV1d3ejvb0ds7OzuH37NpM6zWYzXC4X0uk0d6Hoty6VSrFnzx4sLS1hYGAA4XAYk5OTLB4ViUSYh6JQKLCxsQG9Xs/8IJfLxc6U4XAYHo8HYrEYt27dQlNTEyQSCWKxGOx2O/vDVPGvi2py8AuATCbD008/jR/84Aeor6+vOFrw+Xy8huV0OtmoRri2d+jQoS3e7Ddu3GDt9snJSYTDYbjdbkgkEuzZswejo6Pwer184xCKnfh8Pvj9fhw4cICrdmqfElpaWniGTSxxo9HIoiwymYzNkVpbW9HV1YW5uTmsrq7i1KlTeOutt2C327lDQaCK6FFCOoVCoWLFJayIH7eVL0T5c5eXl0sMh+jxtJlgsVjgcrnYcEgoL0ybEUKRmUo8BnpPv9/P8rVEPAXAqpCBQGBH50Oz2czGQJWcGQGU+AB8EgdFGjuRZS8ADibCNrtKpcLi4iL6+/sRjUaZFHn8+HEWm9JoNHxOaB5+7NgxZtsLq2JhG50gNGKKRqO4ceMGd5waGxvR29uLhoYGPs/z8/N8vl0uF3e66Dfg9/vR1tbGyS19JuKSULeuUCjwOIxWEWUyGYsdtbW1sQmVxWJhjsoLL7yAsbExbG5uYnx8fMv3UywWoVarsb6+jitXrsBut6OzsxOpVIpHFOUov362+13IZDJ89NFHOHfuHGZnZ7G5uYkTJ07AZDJhcXERd+/e5fETvS6RKUUiEerr6+H1ehGLxdjbxOPx8HdAPBGr1cq/EzJs8vv9LOMul8s5sSGrbL1ezyuZ6+vriEQiUKlUCIVCuHLlCiwWC2w225bPXkkbporPDtXk4BeE559/HufPn8fS0lLJtgLpB4RCIUgkErS3t7MHArVPSfO8p6cHer0eRqMRAHD37l2kUik8/fTTGBgYwOrqKj744AMYjUb09fUhn8/j3r17cDgcqKur21JZOxwOqNVqdHV1sdZB+RqT3++HwWBAU1MTIpEIOjo68Oyzz+KDDz7A2NgYB0xSUnO5XJzQGI1GqNVq+Hw+tLS0sH2zVCpFOp3eVkhHCIfDwXbTCoWipMX/OJX1bkDKcCaTiavcSu3dcsOh7ZKT7Yh+BoMB4XCYK3K73b5l/KBSqbY4KpaDdvXLHRSFssH0fm63e9cOikIEAgH2WRAaDAmDOHWeqLtFO/8A0NXVBZPJhLm5OQ5icrmcFSItFgtUKhVLKxOEjH9i0+dyOWxsbODq1asIhUJQq9Ws/DkxMYG1tTX09fWhrq4Oer0eEokEra2tWF1d5eCez+cxPz/PFfbs7CyKxSIikcgWjQqheBep/lHFT8p/fr8fPp8Per0eTqcT4XCYj4uUTBcXF1EoFDgJos9HxD+bzQa/3w+NRoPnnnsON2/eLEkO6DlCNdHtOkX0uzhx4gQKhQJ++MMform5GYODg8wHstvt8Hq9+Od//mfuylGXj669uro6VoNMpVKora1l4TOSkA4Gg9xtoe0mEsCirSJKZuj78/v9iMViUCqVrDBJCRclKz/96U/x67/+65wgbKcNc+bMmR3vHVU8HqrJwS8InZ2d+O53v4vvfe97mJqagk6nQzKZRC6X46Db3d0NlUrFbGchI99ms5V0HPx+P0ZHR1lQiKpQADh69Cg2NzeRTqfx27/927h+/Tq8Xi+MRiNkMhkikQg2NjagUqlw6tQp/hEK17CAh1UjVWLT09NIpVJwu924evUqtwXJEVAikeDEiRNobm7Gu+++i2w2C6PRiOPHj+PWrVuYnp7mm2Y6nS6pHClgkbStsDIaHR1FPp/nCoUCqE6nQzAYxI0bN2AwGCpucBB2KyqUyWQQj8d5dFIJFAwfZThEVX0lvoFSqUQgEMDy8jKUSiUHIbq5UnucKvJKzoe0wUDOjBqNBjqdjn0zCMJkY2VlZdcOimazmU2ChP4NQvVD4b48Va5U0QnVFq1WK4xGY0WFSHoMBSlKionsSiJYkUgE4XAYH374ITKZDF+XpAdCzpZ/+Zd/id///d/HkSNHUCwWEQgEkMlk2HeAmP/CBIDWX2lk4vf7+TEkha3T6fi6VSgUsFqtOHr0KAKBAF599VX+PVB3rba2FhMTE4hGoxgdHeU1XI1Gw74JFDg1Gg2KxSLee+89/PEf/zE0Gk3FTRY696lUCjdv3izpRBDod3H9+nUYDAYewVBVT0qLtMZKhQZZuAMPC4fl5WU0NDRgZmYGt2/fRjQaZQXEjY0Nvo7KVx/peiA76t7eXnaYJH0J6nqSS2q5gqnb7caPfvQjPPPMM/B4PPibv/mbEm2YRCKBH/zgBzh//jy++93vsrx2FZ8O1eTgF4gDBw7g7NmzSCQSuHDhAku91tbW4lvf+hZsNhuGh4f5xyYMUAqFApcvX0ZtbS3a2tpw/vx5SKVSnD17FvF4HB9++CHC4TBqa2tx+/ZtOJ1OiEQi/MZv/Aa+8Y1v4MKFC7h06RJvP+zduxeHDx/G008/jWvXrjFL3mAwcBdjaGgIWq0W09PTXE0Xi0U4nU5sbGzwOtjCwgKvKqpUKlaH8/v9aG1thdVqxdLSEjY2NhAOh6FQKCqaCpUHcFqfpMRIWKXTjNTj8WBhYQGDg4PbnvedEgOZTFZitUuVqrBtTqBgRY/dqbVJI4ZKJDbasydRnXLzJBrZACipVA8cOACfz4f19XUm0FG1R7NxjUbDSWc5YZJm049KDqRSKWpqarg93tbWxj4L9LpC0SaxWIxkMom+vr6S16bgJ5RqrvTelAxT5W4wGNDQ0MCKicSEn5mZQSwWQ01NDbfkSa+ASH1utxvvv/8+2zWTjwdpbSQSiRKSII0zLBYLfD4ffx76vnt7exGLxTA1NcWfmUYKc3NzuH//PhKJBFQqFV8TXq8Xm5ubAIB4PM4EYnIzpX8nlcpYLMay0S6XiwWJKNGj1yYRpIWFBeRyOdTW1pZ8z3SOTSYT/H4/5HI5vv3tb2N1dRUPHjzAzMwMGhsbYbVaMTw8zCub1K6n7pVCoUAymUQ0GsVbb72Fzc1NmEwm5hL9v//3//DTn/4U+/btQ1NT05bvs1gscqdxenoanZ2daG5uRiAQQCwWQzabxfr6OtRqdcXKv1h86CHx05/+FJcvXwaALSvg9fX1WFxcxPe+9z1W06zi06GaHPyCEIlE8N577zFh6oUXXmADl3feeQerq6uoq6uDTqdje1chEevw4cNQq9VYXl7Ga6+9hkgkgqeeegoA8Oabb8LlcnFgDgaDHDwNBgPMZjP+8A//ECdOnMDMzAyamppw7do1FItFvtEUCgX2hr9+/TokEgmCwSCcTifq6+vx1FNP4cqVK0xKe/311yGTydDb24v79+8DAG7dusXVkhAWiwUHDhyA2+1GIBBAW1sba8BvB+G6Gt0UypnuQGlFTATL3UDYoqXqRywWo6enB3fu3Nl2pYqIo93d3SXvJ+wQiESiHdcPi8UiLBYLtFot/H5/CeGNXoMSISLg7du3D36/f4urokwmK1npI2JeeWt8Nw6KFMhtNhvLYgMPCWxkPW2xWEquzUKhgEAgAIPBgK6uLn6OkIhZnqhUAnVMxGIxO43S+IVsvqnTQo8jOWfiANTX1yMajWJxcZF9EUwmE7RaLZLJJIaGhnDr1q0STQtKrug9yHPE5XIhk8nw9k1NTQ10Oh08Hg8H6Pn5eej1euzbtw9ra2tIJBKIRCLscqhWq3n0Q+cgm83CbDZDq9XyWCOTycDpdEKpVOL1119HOp1GOp1mjgStVZKN8ttvv80dJ7oGiHRM16dOp2NOBq01OhwOLC0t4fr165BKpRgYGIDJZML9+/dZEvvAgQNYWFjA+vo6hoeHkUgk0NbWxmMV0jTx+/24ceMGNBpNxVGVyWTC0NAQ3n//fdy4cQM6nQ6NjY2IRCIIhULQ6XTYv39/xecWi0WoVCo4nU7EYjH09fVt4WmJRCJ0dHRgamoK0Nms5gABAABJREFUFy5cwB/90R/teH1V8WhUk4NfAILBIK5cucIVi9vt5iw9n89zS3R6ehoKhYLXhqji7e/vx+LiInQ6HSwWC1KpFOrq6rCxsYHx8XGEQiFIpVI2QhKJRFylqNVqZLNZ3LlzBz6fD4ODgyzBmslksLq6ypUguUBKpVK0t7dz1RMOhzE+Po5EIoFwOIx4PM4GSmfOnMH6+joAsO5+OcxmM8srK5XKRyYGAFhudztdCAKJ3ey0k02BhypdqtIrqd01NTVhZmamxMhIOCcOBAJbeBIkaiMkdwE7KzAmk0kcOHAAP/vZz/i7IvU6ui6IyLV3716k02kkEomS8ysWi1km2e12szMjVeJ0I49EIjsSPyORCBtQ5fN5mEwmNDY2oqWlBUajEWazGc8//zwuXryIzc3Niv4NR48eZQlj4GGiIVzzo+9gu6SJ2t1arRahUAjhcBhHjhzBrVu3mAlPowuq9skWmDo8oVCIDZqoQ2IwGHj2Pzw8XFE8C3hY4Wu1Wv7N3bp1C6urq9wl+upXv4qhoSHE4/GS8VNTUxPEYjHLi1Plr9Pp+HfR3t6OyclJqFQq2O127kzQ2IKkrDs7O0tWMOk8Li8vAwBrMrjdbubE0HmlMYhKpeJRX6FQwNWrV3HgwAHs2bMHHR0dcLvdsNlssFgsCAaD7DMhEonw1FNPcafkypUrWFhY4O4EdRYpWe3v7+fV3koBXqFQoLa2Fl/60pewurqKqakpJJNJ2O12DAwMoL29vaK/hUql4kTzvffe43FiJdCmzKVLl/Cd73ynSlL8lKgmB//K8Pv9uHLlCnw+H7d+iZQXj8dZ1jUWiyGdTjMJkX6Mer0em5ubOHToEHw+H86fPw+tVotvfvObuHTpEuLxOAwGA2QyGdbX11EoFNDQ0IBUKsVtyNu3byObzeLYsWMwGAx4++23kc1mS26StH4WjUYRjUbhdDrR2NiItrY23Lx5k1e/hIptNpuNORNAKVGNgodUKoVSqdyyavgoCG94O4EUAilIlEMsFqO/vx9er3cLA5zasMLkwGQy4dy5c3j//ffh9/t55l5uZGQ2m/n9SIei/H13+ryJRAJqtRpqtZpVFoUoFh86Kmo0GmafE1lUJpPBbrcjGAxi//797H/g9/t5/EOVajKZ3JH4ubKygtHRUVa/lEqlyGQymJubw9TUFE6cOIGmpiY0NTXh+eef39F6unx9NJfLlSRXlfbXadSRz+eh1+thMBh4k+DmzZv8mtT1IAEhoUMkIRwO86orBQqanQeDQd5AEB4PJYm0bUKrpTRfpzXFN998E2+88QYGBgbQ1dUFnU7Hssr9/f2QyWS4evUqV9ikPgg8bImHQiGsra1Br9ezTXMkEkEikYDP54PBYNiVnHAwGCwJ1vRdZ7NZyOVydlpNJpOor69HY2MjJiYmMDMzw1yD9vZ2yOVyxONx9o4Qi8W4cuUK3n//fUSjUUxMTHByR6AEO5lMwuFwoFgsVuTDAA8LBRqfdXZ2sqQ1+Spst9ZNfAQabVit1h3PB+m+JJPJanLwKVFNDv4V4fP58NFHH7EYERnzkO5BKpWC1+sFAJ4TGgwGvvE1NjbizJkzuHz5Mm7fvs1VgtVqxY9//GNEIhH09vbixIkTeO+999iaNRQKQalUQiqVYnh4mImHSqUS77zzDubn5wGAbW6FNrCDg4MYHx9HMBjEl7/8ZahUKszMzLAAClX0YrEYHR0dbLyk0+mYyAV87NOgUqmgVquxsLDwWOeufNYtJCMSdrMK2dXVhUwmwzyKR2khiEQifOlLX0J/fz/ee+89TExM8I23Ek9iO1TqZJTvowtX/dxud8WK/OTJk7BYLJiZmeHXfOKJJzA5OYnu7m6srKygs7MTp06dwuXLl+HxeKBWqzn5pCRESPyk81hpBZJApMBr167h7NmzEIkeavrv1nq60ucXnm/hGh4ZOrW2tmLPnj1obW3lzQetVsvbFq2trSXXg3CMQ2JMyWQSzz33HJMzi8UiG4JRckIcCLoW5HI5BgYGcPHiRYyMjCCbzcJms3HyQNcNtdKHhobw3HPP4c0330QwGMRbb70FhULBhlwSiaSkO6ZSqXDmzBn86Ec/wrVr16DT6ZgrQSOAJ554AjU1NbvyuKDzQIVEOp3mjhhxB7xeL1paWjAyMoJisVgyplhfX0exWCwZ99BzgIcJdzKZZOE0Oib6bQu7PzvxWISmTkQ0tVqtfO9zOBwVP59Op8Pzzz+Pd95555Ey4FQEbedQW8XuUU0O/hVB4kXAQ6VBqqRovp/NZuH1etmXgDzYaW/66NGjaGhowJe//GX85Cc/4Ruk3W7H6Ogo5HI5zGYz5ubm4PV6MTg4CJVKhbGxMW4lHzx4ECdPnkQsFsMbb7yB1dVV9ligG5hEIsGRI0fg9/sxOzvL7dh79+7h2LFjPIfXarXcJRCJRHC5XNxqpBtdOTKZDEux0vrYbtHe3o6FhYWSFj/wcVW+m1XIhYUFbvtbLJYdZXkpCNy8eRNKpRKHDx9GZ2cnMpkMbDYbr2I+LnbaR29tbYVer69YkXd2dsJut5cYK9ntdiwuLkIsFqOtrQ3z8/Nwu91obGzEuXPnsLi4iMXFRQ7efX19OHjwYMWqqnwFUohCocAqduWt4+2IhduBrLbp3NEaHmlnkFjQvXv3eD2VZMLj8ThzWITXA2lMUHALBAIIBoPQ6XQwm80l50y43kldO2GSGI/Hce3aNczOzvL5oMcCH3dArFYrfD4fSw0LDYtEItG22gT0Ws899xx/z/T97N27F3v27IHNZis55p1A3zv9LoQOiaSwSPbOwhVDGsmUX8O0JQKAOzi0NaXX6yGTyZhISImVRqNhn5O6urqSFWg63waDgddgSbRt3759GBwcRLFYxH//7/+94u8pmUzi7t27eOaZZ3bUhqHu2pe//OVq1+AzQDU5+FdEW1sb6urqMDMzg48++oh/mKlUitns4XAYNTU1UCgU6OzshMvlYlEcukFS8KWW4cbGBurr63H06FGMjY1hZWUFjY2NeOaZZ7giuHfvHgfzV155hV3lGhsb8eKLL+Kf/umfkMvloFQq2a3R4/HA4/FAqVSip6cHuVwOIyMjOHjwIJO00uk0ZDIZ9Ho9MpkMZmdnudIQkumIJEbJgfCmVGm9rxIsFkuJiA6tQpa3+G022xadAGq3UhuZBGt2en/iewg5GSQAQwHiceFwOHD9+nXEYrGK++ik07BdRS4MGGTWk0qlUFNTg4sXLyKVSjGXwmg04sknn8TBgweRzWah1+srmgVREFleXmbvi0qgIECt408K4Weg6pvGUgQKMuUKlMLvSXg9bNdpOX78OAcKquYTiQSMRiPcbjfzGtLpdMn1IZfLMTs7u+35oMSRHtff38/XOW0cPApmsxkWiwVHjhzhaps4MzRaoUC/UxIqPA8+nw8ajYbXCmk74/jx42hqauLxgVqt5oKExoLCVVGtVstiT1arFYODg/jwww/ZXpqOibghNMo4duwYk0OFng8ymYw7N8Q/USqVWFpawr59+1gLoZI1eT6fx9zcHM6cOYN3330Xs7Oz6OnpKfleisUiFhcXUVNTgzNnzjzy3FfxaFSTg39lEDlo7969aGlpgcvlwvz8PNra2iCXy7G4uIh9+/ahu7sbcrkc//t//2+4XC6cPn2a1dl+9rOf8SbBO++8U+JOFwgEoNPpoNVqMTIywrarDQ0NqKurw/LyMhOYZDIZmpubEQ6Hkc1m0d7ejkAggMbGRgwPD3MnYnNzEwqFAkNDQxgdHcX4+DiamppYathgMECtVvPctZxkRnNAYncDYF4A8QiIV0FVxXbYqbLu6OhAXV0dB0BhINFqtZDL5SxnS9WnkJhIgYFubuXKcysrK3yMbW1t6O3tZSb6bkA6Del0esd9dAqE21XktPYoEolYKIZWVYWGRXS9RaNR3t/v7OzEgwcPtrwmbWhU8twQglrAu1mB3A2WlpaQSqWwb98+xGIxXtej89zc3AyPx4OVlZWK45tHXQ+UUFDApXNEybFIJEI4HN5itEU7+NtVoHSNEfGUeAXCLsR2PBOhHgRV6TSyoO5DoVBATU0NnnrqKVy7do3JjNuhtbUVBoMBi4uLcDgcPK48ceIEGhsbmTtCpF6hdge9L41ASB2ROmPhcBhmsxm1tbXwer2sl5DJZFgd0+PxwGaz4fjx4yVeL+QNQv4axWKRdRtI3+PixYvsx1ApOSgWizCbzejo6MDBgwdx4cIFjI2NwWazccciGAyipqYG/+E//IfqGuNnhGpy8K8MUt2jeWpPTw/i8Ti6urpQU1ODSCSCxsZGaLVaAA9v7pFIBPX19QCAy5cvIxwO4+TJkxgZGYHZbOb26jvvvAONRoNvf/vbWF9fx9WrV1EsFnm1yufzQS6X45lnnkE8Hsfq6ipCoRBefvll5gwEAgHo9Xqsrq7i6NGjiEQicDqdHDCPHz+O0dFROJ1OZnKTUpzf76/IPqeKgQKyTqeDXq9HNpvF4uIiZmZmsLa2xrPm5uZmtLW1bTvLN5vN21bW27HfqUtAIxuZTIa2tjZMTU1xhaZSqTg4Wa1W6PV6XLhwAVevXkUikeCWdzabxeTkJFZWVjA4OLhrRcalpSVEIpGKbXtiWu+kgEigMVS5sRNtJgiTonA4zMEokUggFAqVrG0SqAvzKMfHRCIBnU4HlUq16zXR7UDdCplMxlW88LzkcjnelllaWsLBgwcrJiQ7XQ9CkKQvkQOFGgbC0R7wMJmkzhHNr8s7TCTypFAocOrUKeTzeSbD6XQ6jI2NVfzcws9YnjwIOwTRaBQ/+9nP+HfxqBGcyWTCkSNHMDg4yJoZVKnn83lWWtXr9TCZTOyXEIlEkEql2GZceE0Rampq8Oyzz+LSpUusTZJIJLhLo9FocOLECf6t08YMJSMWi4WFlSipoC0SADhx4gR0Oh28Xu+WLolEIoHVasWVK1dgMBjwn//zf8alS5ewtrbGXi1f/vKXqwqJnzGqycG/MtxuN1fyAEramHQTcrlcsNlsiEajKBQKkMvlePDgAbLZLB48eIDOzk5MTk6iUCjgy1/+MiwWC8u+KhQKfPTRRygUCuju7kYoFMKtW7eQTCbR3NyMZ555BiqVClevXsUTTzzB1X9NTQ3u3buHeDwOj8eDrq4uhEIhrsQLhQK8Xi/cbjeSySSry1HlRNWYcJ+eqhGhmA/w8EazurqK5eVlDA8PIxqNwmq1siHT9PQ05ubmdiWFTNyMnSCs4Pbv389qbCsrK8jlcjz/FDKm3W43m+MICXpC0hu1vI1GI6xWa0nngRzz6Hzstm2/nQKiENTVELr1AZVbz+WCTxsbGwDAyn1CA6xygl85hITPzs5OJrJWOt8k4rMThCMfuk6EFTxJ6dJo51HdCvobBZxKjyXNALoe6H9JdpmQzWaZ2a/T6VhPgXwggIfJSzAYxMGDBzE1NYVTp05h3759+OCDDzA1NbVlC0KoBfEoCPk0Op0OhUKBV54fBeF7qdXqLSvFqVQKPp8PVqsVBoMBKpUKDocDer1+i1w6HQvdswYGBuBwOFjYTC6X4ytf+QrzkigJp/EKjV8cDgeLinm9XiwsLGBjY4OPc2JiAidPnsS+ffvYwZW+f4VCgZmZGb7fmEwmvPDCCxgYGMA777yDF154AY2NjY88L1U8HqrJwb8y1tfXYTAYeH2JKjWa3aVSKZw/fx63b9/mFm53dzcWFhb4B0yrSefOnUNNTQ3eeecdZLNZPPHEE3jw4AFmZ2dhNBq5PavValkTPhwOY3l5GVqtFmq1Gvfv30d3dzfOnTuHf/iHf+DqRy6XY3Nzk+eJ9+7dg9PpRLFYhNfrxfDwMMbHx/kmfubMGWi12pINCrJ6JdBN0eVyIRKJ4ObNm9xiJ6W2QCCAQCAAp9OJ0dHRiuZA5cx22mTYbnNAeDMmO14aL9Dfy2fE2WwWMzMziMfjbIIkJFAWi0Wu9NfX11FTU8Pkwvb2diwuLnJlSt8D/X0n7EaK2WKxIJvN8q4/VYfbvVYl0EybqvVCobAt4ZM+r5DwSTbENKenil2r1ZbMy3cKhFS15/9/9t4zOO78vA//bO99Fwssei8kABaQBOs1Hq9KJ+kkjywpzjiWM1EmL2InzkzeOjMev4mVcVySeGLJiiyr+CSddHc8knfHDgJs6CA6FmXRtveG3f2/QJ6Hv13sAuDdSf9Ix2dGcyK5WPzq9/uUT8lkWNJa+PlsNgu9Xs/dnN1AZvRMLC8vI5FIlLSnLrW50khFeL1aWlqwuLiIQCCAiooK9gOg6xEMBqHRaJij/+GHH+LGjRs7RL8K2/j7iWw2yx4O1M0TSmTvFdSKb29vR19fX94oit5Jov2SQFRzczNGRkZ2uGBS4r6yssJdmrKyMqyurkKhUKCqqorvOckwC42p6HdpNBpsbGzg2rVrzMSisd79+/cxMzOD8+fPw2g0st8Cebysr68jl8txUku+L6FQCIODg6isrPxYGKCnUTqeJge/xiBN8fb29ry/Ax7bKFNrkzoMAFj+liRXA4EAXnjhBdTU1OD69etYWlpCT08Pg48SiQSCwSDzguvq6pBKpdDU1ISRkRF4vV6cOXMGH3zwAaRSKc6fP4/19XWWJm5pacHMzAzW19fhdDqZ8200GjE9PY333nsP6+vrUCqV0Gq1CAaD+MUvfgGZTIaTJ0/ixIkT8Pv9JTeGTCYDl8vFErdU6RDdLh6Pw263Y2VlJc/tMJfb22Bmr24DVbvFBI8oqL3udDpZGVG4ARPfmyr96elptLW1caVD817SjaefoWMVBiULQsrnXsqF6+vrjOinhTIYDD7R5kPnQtdeJpOhrq4uD/BZDOAnpEBubGzsYF00NjaiqakJVqt1zwqZkrqRkRGYTCaedwOPjXs2NjYQCAQY8FcshM+EEIz3JGZcZGcuvIZmsxlnzpzB9evXeaYei8UYcKvVavHiiy/y9UgkEjsAo6SL8HFYLaTSSMJVT3J/c7kcaxbQ/SVHRKlUiurqaqyurjKOprOzk6W7KTkgLEQ0GmXhKPp7onb6/X6WaXe5XIxdIYVRACxrLZPJuJCxWq0wmUx87bxeL1wuFz766CP8+Z//OWZmZviZJkolJVjr6+vo6OjA8vIystksXC4XFhYWGLD9ND6d2KlC8jR+ZbG2toZcLscjBWBnckAdBeHmQGjiRCIBr9eLkydPoqWlBcPDwxgbG0NdXR1bPCuVSjQ1NfE8kRZZjUbDjnharRb9/f1wuVw4ceIEFhcXceXKFW7dzs3NQSKRwGw28wtOLfI7d+4gl8uhqqoKVVVVsFgsMJlMMBqNSCQSuH37Nubm5nblIxsMBtY5IP18UsGjtmYmk2F5aDqHQh6+Xq+HWq2GXq9HWVkZUqkU7ty5s0NSuFgIJX+FFQdRrohZIZxf07FSxU0zZwLoURAegGyv6Wfr6+vzWBwAGJBJnYlkMon6+vqiG6EQKyBUXQTAC3+xlnnh+QmDgIrUPamrq8NLL73EdEcC5R06dAivvPIKb7JOpxOXL19m3QfakAcHB/Hee+8xvZKCZt6FktcNDQ1Qq9W8AQiTFepWUHVaLAqfCeqIFXsmdqssU6nUDupgJpNBeXk5XnzxRRw4cIC9GWQyGbq7u3HhwgWUl5dzYlEY2WyWj+dJkgPSA6HjpbY+qSfuN3K5HCKRCM/56dmTSCR49OgRu6XqdDpMTU1hYGCADbRoFCKXy/lzwu+1WCw8NiDJZGHyTM8zHYNEIsHly5cRCARQVlYGjUYDi8XCY0yShI/FYrh79y6ef/55Fm2j7iSZRpE0tdvtZuzL8PDwnhoIT+PJ4mnn4NcYKysrsNlseYuJUPEN2BYiAoqbA1Fbs7u7G06nE319fSxcRB4N1O5rbm5moRai+LhcLsRiMfT09ODdd98FAFy/fp1toqmqMBgMsFqtsNlsmJ+fx8DAADQaDa5cuYLV1VVUVFRwlUaaBQqFAkajER6PBysrK3m6+oWhVCp5xk+bXCqVwtzcXN6GLdRMINpTKR7+boA+YXtbrVZDJpMxa4Q6GMD2oldeXo4zZ85gcHCQHf6olVleXs6qk5QkFLoPxuPxomwAoLROA/1ut9udZz5TTORJ6JNAwjTr6+tYW1vD6OgodzQaGhrQ1NQEg8Gw4zsoJBIJ1Go16urqMDMzw89cKYAfdUZcLhfr9BfeC71eD5/Ph9u3b/NmNjU1hfn5+TxNh9bWVrYMPnnyJMt50+8iMGJht6Iwij0TlLil0+knAnkWBuFm6HqQ7blQB4Cud7FQqVRM+S1GlxUeJ7EcaEOma0332WKxoK6uDqurqyxatB930aamJmxtbcHpdObhGGijpd9B94YwPGKxGJFIpCh7IJvNsloleV9QYkDXkb6H9CxEIhFWVlag1Wo56STFRBpbFMofnz17Fj/96U85eaXEKJfL8diVzK18Ph9GR0dx/PjxXa/H09h/PE0Ofk0Ri8Xg8/l28MNJXZAWG71eX1SYhCIYDOL9999nulIkEoFGo8HJkycRj8fhcrlQV1eHjo4OZLNZ3Lt3D4ODg3C73XjnnXeg0Wjw7rvvIplMwmQyMZqdXs7jx4+js7MzTz3u/v37XMWbzWamL1FVQYtNOp2GwWDA/Pw8mpub8xQIhYvj5uYmJzRKpZLBS8Kgv6MWeylAXyFIUAjoowWQgG7A9iKo1+u5hUqLC1W10WgUFy9ehMViQXNzM+7fv89YCq/Xy99VX1+P+fl5dh+k2eluIeSju91uZj8Ua9tTl6LwutD5EtZienoad+7cYSlrquBXVlbg9/vR0tKCmpqaosdD7d7p6Wn+PqGccCGVklDvCwsLvGEVS9IsFgs2NjYwMDCAQCCAaDSax/QYGRmB0+nEuXPnYLfbUVdXB5PJBKfTienpaU5Iuru70djYCJvNxs+nUH9/N5Cn0GeAnomjR4/mjS6EQRsQbbqktAeAMQTEACi8z8LvEz6P8XgcHo+Hq97CzgTRK4Htblomk0EgEGCGBrENtFotysrKoFQqodFooNfrEQwG85gl1HEkOXZKiD0eD9rb2xlITPTEqqoqzM/PMxbBYDDg9OnTPMrw+/1YW1sryh4AtpMii8UCo9GIdDqNmpoaLC4uYn19HRqNBkajEeFwGKFQiLuOdP0I+EkmcMJnjGjP4XAY9+/fh0ajYffMQCDAksvEsCDDKrlcjunpadTV1bFo1dP4ZPE0Ofg1xcrKCqRSKVdLFKlUijnBALjS240mdvfuXSgUCtbZJ7R0MpnE0aNH4XA4GDCl1+v5ZSN0dTabZYOYmpoatLe348MPP8yzaaUghHEsFkMkEoFarea/29zc5MWUFjOTyQSPx4NkMgm9Xs/JAVnTptNpPPPMM3j06BGuXr0KrVbLrAzhwprLbZsMtba2Qi6XM+6isK1ayCUXasuTLgQAWK1WJJNJVFRUwO12IxaLoaamBuXl5Whubsb169c5SaJOSH19PSYmJrjSp8XYYrEgFAoxUKy7u5vPYy963354+eQGKLRfpiSBxh00j+/r60Mmk+GOFFVztbW1mJiY4O6S0WjccSzZbBYajYZBboXCUcUik8lgfn6euymFIaxOx8fHYbFY2GKbgjQdrl+/jpdeegkGgwEGgwHHjx/HqVOn4PP5WFKcWtrUZRICKEuBPKkDRjNz4TNBxmOFoD4hjZK+LxKJwGAw5CW5eyWA9LspcSYTtN1+TqFQwGAwYHl5OU/vQK/XswhRPB7Hw4cPuetG0usAmJ5IHSC/3w+ZTAaj0Qi1Wo0HDx5w8kdJ9+zsLP+eiooKVhUkszebzcYOscXwLJRs02a+vLzM3YJ4PM7HpFKpeGxAYzOVSsXSyYXPECVl4+PjcLvdqKmpgUQiwRe/+EXcvHkTw8PDyOVyzIYJh8PQ6/WoqKhgvMnT+HTiaXLwa4hcLoeVlRVUVFTseHhJp5+CWAaFuv9AfntcpVLhlVdegUwmYynjo0eP8sxuaWkJ4XCYLWwlEgnkcjmjhmnmd+rUKa4chFVhV1cXU6jkcjk0Gg1yuRwjt8mJjqp12tCIk02iKxRCNsDVq1dhMplYpbBYYkAmQw0NDbxpFwP0FV4jqjppQyDEdzgchkKhYAGqzc1N9oGYnp7mY6BOjsFgQENDA86cOYO+vj6WtZZKpfB4PPB4PFAqlTh//jwaGxsRiUTyVBd3i714+dSKLUZ9E9LtqHNBlRLRJzOZDONGIpEIZmZmcOzYsR3HQUZfVD3uR7eANuS9PBQoETQYDCW7C4FAAIuLi+jp6eHNp6amhmfHwk2f2vm1tbV49dVX4fF48Itf/CLvmRA+Q9SNIxwNAUJLSRILEzF6Bki+/ElCIpGgtraWKaPAY5AjOaUKwYXEQHA6nVAoFJyg0UgmlUphfn4ecrmcFS7b2tqwtbUFj8fD50rFAukKSKVS+Hw+2O12HDp0CA8fPuT3UXiutGGvr6/zyKu6uhperxcjIyMIh8PQaDR5+CXg8TtKxlb0d6Rh8uqrr0Kr1eLq1aswGo1wuVyoqKjAxsbGDrlqCvrO06dP49GjRygrK0Mul0NzczNUKhXOnTsHp9PJ61FnZyfu37+PXC6Hl19++Wli8CnH0+Tg1xDUWu3q6trxbwRwIpMUlUqFxsZGuN1u3mhoYyZwDqm8+f1+nuMlk0n84he/4IVVrVajsrKS/dlp4yJnwc3NTTQ0NPC8LpvNssLZ5OQkbty4gebmZlYyrK2tRV1dHe7evcutPKq2Kioq2F8+Go0ycr/UZpNKpWCxWHDu3Dl89NFHecyDYi124ax6Lx4+UT/p98fjcRgMBkaYV1VVobu7GwMDAzwHJzdEqqra2toQCoWg1WrR3d0NvV6PxcVFNjvKZDI4cOAAGhsbWV8fAMrLy/fVPaAopYBY2DkqlDoG8lvqVMVR25ViL90E+rNOp2Mg417HXop1UXj84XA4T+2ykNZItLSlpSWcPn2a8Rxzc3P8ORrh0J8JHb+wsIBDhw6xpPjQ0BC31SmEcsh7mXEBj7szuzEC9uqq0DGura0VBccR1U+4wQ4MDGBxcZGV/ioqKtDU1AS5XI5QKMRdRZJqFolEWFxcZNwSAWhVKhVcLhdfd1orent7kUwmMT4+npesi0QiVFdXI5fLYW1tDe+88w7fk5WVFU4CSd+Biorjx4+juroaY2NjcLlc8Pl8DDjU6XRobGyE0+nE+++/z06MlOy2tbWx74vJZEIikWBtl1xuW/7YYrEwloAsvwkEGwgEYLPZ2M2W1pqRkRFcvnwZL7/88lM646cYT5ODX0OsrKxAqVTCYrHs+Le5uTk8ePAA/+2//TeewZNUaEdHB3Q6XR6yWKVSIZ1OY319HdevX+fEgVqTra2trBkgl8vhdDqRSCRgNpsRi8UYTGiz2bC0tIREIgGTycQLQ3l5OcrKyjAzM8Pz30wmg+rqajQ2NmJ0dBSrq6tMZVIoFJDL5Ugmk/D5fKioqMDBgwchk8lKgqWow2C32/HSSy9hfn4+b/7Z3t7O/gIUW1tbDOjz+Xzc7hWCCQOBAPPwhZ0X2ui3trYwNjaG8fFx7m6QpW5FRQX0en0eeI5a0EajEUajEZ2dnTzbpyAkuEQiwdLS0r4TgyeJQvdG4HEFr9VqmXFAG4IwdtNNoPGJcJy02/HTDF+4IRdbjGlEIewaFPpoUGIZj8c5OaXEi6LwfAio+ODBAwSDQQSDQRw4cADz8/OIRCLQ6/V5YyYSitrLjKtYFOvc7XZtaJ4uk8mgVquLWhALMQZut5tZFGRIlMlkMDY2hvn5eZw5cwbV1dUsP6xQKODxeHh8Re8WjfcGBgYwNjbGNu9NTU2oqanBw4cPMT8/v0N7IZfLYXNzM+88aRQAbCe6Go0G8XicpZRPnz6Nrq4uLC0tsYbJ4cOHMTMzA5/Ph1AohAcPHrBgWuH10ul0eP311/H+++8zSLOsrIzPx2az4dy5c2zItL6+npfUer1e6HQ6dHd3o6+vj99ri8WCubk53Lx5E2fPnn2aIHxK8TQ5+BUHySXX1NTseGivX7+Ov/zLv0Q4HEZVVRXPWKempjA2NoY/+7M/Y3MjqhyElVQ6nWYnv4qKCgbOCYMqsdXVVcjlclitVjz//POMUfB4PJibm4NCoWBgl0QiQVtbGxwOBz766CPE43GMj4+jsrISvb29uHPnDtbW1pgyNjMzg5WVFdjtdhw/fpxZBqVEcIR/Z7PZYLVacfjwYQDbXRKDwcB4hsKgTghx/TUaDbv8abVanDhxIo9WBTyuZIF821hKYNLpNFZXV3mTpJEGiQwByANtCs9LSPsqHI980tjNvdFgMHCbXKvVQqVScbUqtCDeTTeBulHA/lT7KMFqbm7OcwEsZF0Eg0FIpVLGJRRjS1CXR6FQQKlUoqGhAYuLi3ljmUIpZxLnisfjGBkZQS6Xg81mw/nz5/Hhhx9yRZrLbUtFF9NmKBXCjgF1sUiKupQehjAosSGU/27h9Xrx4YcfcgdNJpNBo9FAq9Wyl0lfXx8+97nPcYeAxoN0THSv19fXWdJYq9VyV+fu3bsYHR1FOBzOo05TSCQS7qq9+uqrmJ6ehsvlyqvml5eX+Xfq9XooFAp88MEH2NragkKhQEtLCysmOhwO9nbZTaTpa1/7Gnp6evCP//iPWFhY4BHL1772NTQ3N2NhYQF1dXWIx+MwGo0sG0/XjTAsBw8eZCt5mUwGh8OB0dFRqNVq9PT07Hr9n8b+4mly8CuOzc1NpFKpHTzt2dlZfPvb30Y0GkVLSwtMJhP/m1qtxszMDP70T/8Up06d4vYsvfg0WxaLxXjhhRdKtkvj8TiWl5d5kW1oaMCJEydgNBqh0+kwMDCASCTCc3+qTqgNmMlkYLVaMTMzw9oFBKhbWlrCzMwMwuEw4vE4Dhw4gMOHD0OpVDK9q9QmKfw3qljpHAg8Wdi6FgrdWK1WJBIJhMNhrmo6OzvR29sLo9G46+Zss9lQVVWFmZkZZLNZ6HQ6bj8LN1BS5aMWv1BqmDYK4eYNPJ43NzQ07LkZ7RX7EXuqr6/H6OgoysrKEAgE8jAKwrHKbi11OjcAXClms9m8ZIOCQKFWq3VPsaSDBw9iZWUFQOl2PB2bWCzGSy+9hBs3bjB4jo4NeJzs0EZFYE069rKyMpw/fx6zs7NYWlriUZ0Q5LlXUMJHyWEhDkSYBNJxWSwWZrBQCG3MSwV1OoRW0GRcRl0+l8uFsbExnDx5klUwiaVCv8/r9eLy5ctIp9OoqKiA1WplEPLW1hZX0xcuXEBFRQU7qEokEv5zLBZj2i5pldjtdkSjUYRCIX4/aQRUU1ODhoYGBroGAgEkk0m0tbXB5XLB7/fvOF96vmQyGTumfuMb38DMzAzMZjM0Gg2OHTuG/v5+aLVaNDQ0YHJyEqdOneKfTafTCIVCqK+vB7C9lgUCAUxOTiIUCuHo0aNMsdRoNHlCc0/j48XT5OBXHCsrK3lyyRRXrlyB2+2G3W7fsXDLZDKYzWbMz89DpVLh7Nmz3Lon0yBygnv33XfZp11o/ELtRjI/IXBhX18fb27hcBgul4uRzLTZU2sR2J7z0UJMm7XZbIbVakVnZydXtBKJBOXl5bw4CBd24QYLbC8WBA6kxZSOGQA7uNGGUCh0IxwlANtKcsFgkIWASoVIJMLGxga8Xi9UKhUikQhrB0gkEuZdU2uarhMlY8KgzZsMmeieDA0NYWZmBidPnkRjY+O+pG4Lg843nU7v6t544sQJ1sUvrOBpkyvWUpfL5QzUFAL0lEolDAYDwuEwV+gUQg+Lra2tPVkXBC7zer07jk0ul8PtdvOxpdNp/OVf/iWPSCgpo/ui0+kgkUg4ITx48CCWl5fznhGTyYRjx47tab5ULMRiMbxeL2ZnZ4t2aUjFkxJ0GhkQ1gQAd2rS6TTsdjvP2oXywXRfCumXmUwGa2trLBEMbK8BTqeT7zH9TmGiNT8/j1gshqqqKuj1enZFJcVMo9EIt9uNhYUFfhY7OjowPT2NXC6H3/u938PS0hJ++tOfIp1Oo6urCxaLBcFgkE3U6H5IpVLodDpUVlZCpVIxy2psbAwajQYzMzPwer0A8kcy1KEjOjK5kup0OpYcD4fD+OijjyCRSPDcc8/B6XSivLw8bwxLSRj9nUgkQnd3N4LBIDY3NzE+Po4LFy4gHo/j2rVrUKlU+zZEexrF42ly8CsMkkFua2vb8feE4qVWJAVVR9Tec7lcrN5GvHehyt78/DwMBgPW19dx//59DA4OIp1OQ6FQoKKiAhaLBXa7HSdPnoTVauU5/cLCAjY3N1mCF9iuqqnFWVlZyVKx2WyWUdBCTQFCDdPCZ7FYsL6+DgC8GJSXl8NsNmNzc5N514SRMBqNOHLkCN5//32eQSuVSq6gqGIqJX5EPHD6/rGxMRw7diyPlkaLNrC9KanVaqZOqtVq1jegjYTU6Apb4cI/C5MVm83GVXoul4NarYbf70d/f39RX4hSQZWpRCLBwsLCvsSeSC2zWAVPrd/ClrpcLkdZWRnKysrQ3NyMO3fusAGOkEJYKH4jxI/QtdiLdSE8NnJ9pHtqsVhw9OhRPrZ0Or1D2ZI6OiTr7fP5IJFIMD8/z89tYdImkUi4e7XfmJ+f35ckN1kelwqxWIxgMMgCRrSBCpMswhYI6cvUORN2qug+kvBZIXNFmGQQC4k+LzRFU6vVWFpaQiwWY/aGw+FAOp1GKpXC2toaVCoVzGYzM5wCgQB8Ph+bwZGOQSwWw82bN2G321nDYX5+Hn6/nzf8XG5bSIyEwOjcmpqasLa2hqamJoyPj2NjYwPANh5IpVKxJgetf729vXnXlhJ6GnkA2+//iRMnMDU1hWAwiKGhIbz66qv4+c9/jsuXL+ONN96A3W7f93PwNPLjaXLwKwxadAtnfvF4nOet9NIC4CqZrE2pnSr0AaAKnCoZMkW6ePEi/H4/zGYzjEYj4vE4+vv7IZFI8G//7b/FiRMn+HffvXsXCwsLUKvViEajkMvlvHErFApsbGxgamoKVVVVPHOljVQmk0Gv17MyopCGOT4+DmBbU6CjowMPHjxAJBKBQqFAa2sr+vv7AWwvGNFoFCaTCZcuXcprI9P3EZe/lNANyevSwkio/J6eHpSXl0MikcDj8UAkEjF+gKyl6c8kqELIdovFAr1ez26NwOPOh0KhQC63LU9MyUpFRQXfDyEGYT+qfGKxmGfMTqcTAFjXnjpGpYBVhSwEYQVP1WpzczOqq6vzBGGI997U1ASz2Yy2tjb4fD643W7ezGKxWFEw3W5RinVRV1cHo9GImZkZ1vCXy+Vob2/Ha6+9hs997nP4+7//e8RiMa6wM5kMNjc3eVxDI5KWlhbU1dWhuroaoVBoh76FMJ7EgyAYDOapPdL9JjohdWn2SvSI6ZJOp+F2u/l6FI5mKEEl8bBCfQVKwqh7QV4FhUGAVLlczonQ2toaAxjJ6p0cPMPhMMrLy9HW1oZUKoWHDx/i8uXLzOA5duwY+vr6MDc3x6MLh8PBwFwS1zKbzXC73VhcXOQOhEKh4E4AWYLTiIpcFb1eLwM2Kysr2ZflF7/4BQKBAMRiMQKBAK5du4Zjx45Bq9XmScsT3qDwndBoNKiurobH48Ha2hqmpqbw+c9/Hm+99RbeeecdvPnmmzAajazxYrPZ9v1sfNbjaXLwKwyXywWr1ZqHbgfA1RnNJgnA53a7+aWnF5QQ2ADyEgT6czQaxS9/+UuIxWKUl5ezhn0qlYLRaEQwGMRPf/pTHD9+HEajEQ8ePODNIBaLIRqNIpVKQa/Xo7q6GjMzM5iZmcHIyAgrmzkcDrz22mts7CQEaBWjbBmNRkxNTXGrORqNYnJykhcxpVKJsrIyeDwelmv2er2Qy+WorKxEU1MTkskktzeLCd0I3fGAx6j8ZDKJzc1NBs9RK7isrIwrU7lcDofDAZfLhVAoBIPBgIqKCqyvr8Pn8+VtLtRSraurYxMqYbJSiLAH9m+9nM1uOyE6nU5OPOiaP4l7o7CC39zcxNLSEpxOJ2ZnZ7k9fvDgQZSVlSESibDhTiwWYwtjGg0Jn69PI4xGI86ePYsTJ05wEkACQffu3cPBgwdZipe6TTdu3OBKkZKW+/fvY2pqCm+88Qbz7kvFfo6fOl+UENPYTZh87zfR2w04Sv4kQjqmw+HAyMgIj0vo91FiQPiWQ4cO8eZeGDKZjAGfxJSgMRkZmAFgYDDphND50mdJG2FwcBAGgwE1NTXY3NxEOBzmzmJPTw/a29sxMzOD2dlZpkzS+kSjCGJCud1uGI1GmEwmxONxVFdXIxAIIBwOY3x8nP+tpqaGRyAEJA0EAnj48CEkEgnW1ta44FlbW0NXVxd3Y4RBwmGBQACzs7Mwm8343Oc+h5/97Gd4++238cYbb2B4eBgbGxssuvU09o6nycGvKGKxGLxeL6PwhSGTyfDcc8/hO9/5DkwmE1cb1AInYRpyVRRuwFRp5HI53gCj0SiOHDnCZkuEGibr5NXVVfzd3/0dmpqaGCwoNNwhrMLDhw/xy1/+El6vFxqNho9hZGQECwsLOHnyJE6fPs0twWJBYku0gPf29kKv1+Ott97iz3R2dkIul7NyWjQa5Zbn4uIiW8jSQlcodAM83gCIShkKhbgyyWazbB0LbC+Q1dXVLIfr8/kQCAS4gxAKhdDS0gKDwYC7d+8WvZcTExMA8iu2UuqOwN7Wy2R09NFHH+24fnS+hecqjGIshOXl5bz2OKnXDQ8PY25ujtvjJKFLaHTaFC0WCytoPklbvlTQxkfeGEJQncfjyTNiIkYJeX6Qkmgul2OPAo/Hg5/+9Kd46aWXPjHgU6VSIZlMYmhoaAfYUHi990r0Po5LaHNzM+bm5tiEiBQPhRgbjUaD+vr6kt0RiUSC6upqjIyM8DNDyRV1HWkt6erqQkVFBXw+HyYmJniNIBppXV0dVCoV3G43A6dFIhEzPoTJqsvlYmyB3W5n/ZRMJgOn0wmZTAa/3w+j0QiLxYLR0VF4PB5EIhHIZDLuihkMBty7dw9isRgqlQpqtRqZTAZnzpxh3xixWIxQKITNzU0kEgk8fPgQU1NTaGlpyVtXicZttVoxOTmJoaEhPPvss3j11Vfx9ttv43vf+x5LhW9ubj5NDvYZT10Zf0XhcrmKyiVTkNWry+XiCnprawvBYJBb+Hq9Hh0dHXk/J1y8xGIx880DgQBUKhW0Wi0ikQikUikcDge0Wi2qqqowMTGBiooKxiGQGhslBy6XC2+//Tbi8Tjq6+uh0+kgl8thMBhgs9m4evN4PHkYicLI5batYtfX1/l83nvvvbzNxu/34/79+3wMyWSSEyMCRJK2gESS72ZIHu+U4BCgKZFIsHiMRqPJG0+EQiFMT0+zHn1FRQUAcPUjlUpx9+5d3LlzZ08AIYkApVIpBIPBPMEeYdDMX6vV5v09GT6VCuH5lqriiYUgdG8s5lhJFt9lZWVIJpPo6+uD1+vlrpQQdJlOp+HxeFhR8NMIolKSpC6dCyV+4XA4b4QxMTGBUCjE4F0hiJWwJdFoFHNzcx/7mCi5VigUbOpFCZ+QNSMMYaInbGsLgaN2ux0Gg2FfLqHksWEymfh+EDtgY2OjKFakWJCjpd/v53Mh3Q3SeFCr1Whubobb7WYtEupQiMVimEwmlJWVYWFhgV1fV1ZWGMuQy+Vw8eJF/OVf/iXeffddpj9qNBoeDx48eJAVGUOhEJLJJDo7O9Ha2spJCgFMqZi5f/8+r0mVlZV8XMeOHcObb76J9vb2vOSSsAjBYHCHCyYZUB06dAiVlZUIhUK4e/culEolezyQdTVhop7G3vG0c/AriFxuWy65vLy8ZHu4oaEBL7/8Mr7zne9gbW2N2Qg0v7VarXj22Wdx8OBBViIr3CgkEgnrF5DnOnG8y8vLGa9AY40XXniB8Q/ZbBZjY2MYHR2FVqvFe++9B4lEgubmZsY80O8Atj0fPB4PHjx4gAMHDpQ8dwKDkb761NQUv5gULpcLWq0WlZWVkEqlmJiYwJ07d9gAyGAw4OTJk9x2FboZUjuYFnmSkSWfCap6tVotMzrIrpbsaAuv417OdsKQy+X7UmqMx+Nob2/f0f4WdoHEYjFsNtsO9zs630AgkEdxpe8uxkL4uI6VwtjPrF4kErHxT6mgbobVaoXb7c4D1FGQbDCNMrLZLGZmZthnIRAIMMuGkjiqMvca15SiTpIOQCgUQiQSgcVi4eOghJOOnzY0whJQl4a+V6fT4cGDB4jH4+wdUdhxKHXNM5kMamtr2bqcxhFKpRLNzc1sNkVdgFLsC4vFgrNnz+LWrVs8LiimMkoYJOH9yWazPJoIh8Po6upCT08P7t+/j+XlZTQ2NmJiYgJyuRyBQAB+vx8SiQQmk4l1HEwmExcoJJVNXcDx8XEcPnwYWq2WcU1KpRJKpZKtmGlMabFYWPUxHA7DbDbj9OnTyOVyePDgAYutkQDZ0tISMpkMqqqqYDQa+d+kUimOHz+OaDQKl8uFxcVFZLNZOBwO1k1ZXV3l6/k0do+nycGvIILBICKRCA4ePFj035PJJB48eICysjJ84xvfwOzsLAYGBiCVStHY2IgXXngB7e3tiEajOHDgQJ75DIF0TCYTDh8+jB/96EeIx+MQi8VYWVnh6poWcMroiQNsMplgt9tht9uRyWRQU1PDlCSaddJiWFtbi7W1NfYlUKlUmJiY2JM3TwtrNBpFJBLZsVlRtbi8vAy/34+33noLgUCARwTpdBrvvvsu5HI5jh07hrq6Opw8eRIDAwPY3NxkedV0Os1GLb29vbDb7Uin00in05zgFIK5qNvwJCGsXsnvYTfrZb/fz0puhd8jdD7U6/V44403cOXKFdZKEIlEsNlseOGFF/DRRx/B4/Gw0VUxaWlgd3dC+k5qjzudTvT09ECj0fC1epKgFvZuQRU2KfoV+hPQpidUuCRqJbXV6biFnRzCf+w2rqGEiyi4BFgFthOzhoYGZhWQpO+9e/fYyZDGYgQYpGte+MzHYjE2oAIedzmKjSScTmfRZMZoNKKnpweHDx+GVCpluWC/3w+Px7MrtZKCVFQXFxcxNTXFJlx2ux3V1dVMwxQG+SFks1msr68zdfXmzZuYnJyEXC7HysoKyyJrtVr+DlpTyCVycnKSu3lra2uQSqXQarXM2CFqNT0XVVVVWFxchFqtxtGjR5FMJvHo0SPI5XJsbW1bS5NT4+nTpzEzM8Mb+9GjR9Hd3Y21tTW4XC44nU5oNBoGdpOR2LFjx3D16lVsbGyw+ZpGo0E4HMb6+jo8Hg93D59G6XiaHPwKguSSrVbrjn8LBoO4d+8eSyFrtVp0dnbi8OHDeP3112G32yGTybCxsYG7d+/CbrfjmWeewTvvvJPHM89kMlhfX8err76Kn/zkJ6yuSC50q6urjFxeW1vDiy++iMrKSshkMiwtLWF2dharq6tQKpXw+XyIxWKwWq0MViorK4NWq+URAgGBqIIScrSFUVdXx8IotLgXSueKxWIkEgkEAgFcvXoVsViMK16pVAq73c6ufoQU//KXv4zq6mo8fPgQCwsLzJ/u7u5GVVUV+ycIW8MOhwPBYJArPqGTHQDuShBXulQIF9dQKJRnvVxKBKi3t5fNhYRBVRApG964cSNPa4BYKDU1NXjppZcwNzfHcs4SiQSdnZ1oa2vLm5uWcicsPAeah5MzXrHEgNz8aN5M9Exy9SwEA1ZXV7MUrhCcKeS6k1hQYQifHdK5oHOhKKRU7qb4CICR8fQddG2F+hVqtRqBQACBQAA1NTXsvGm1WiGTyfi8t7a28iS5hUFJNHX6So2A6JxKJTN0rSipiUajGBwc3BeOgfA6NN8/cOAAz+3HxsbY+pkSYiG+g4CvZWVlMJlMaGxs5I6KWCxmDQeVSsWiY263mxNbr9fLjCWNRsPnIhz3WSwWxGKxvOczkUggFotBr9fDbrcjFovB6XTyqG5ycpJt7WktINMziUTCAkdtbW08Apmbm8P6+jpu3LiB+vp6VFRU4OjRoxgYGAAA1NbWMsMiHA5jYGAAX/jCFwAgz9PmaTchP54mB59ykFRxVVXVjirO5XJheHiYH3Sagcvlcrzxxht52SyB50jk5IUXXsC7774LlUqFkydPQq1WY2BggPX1ydKWqh9qua+vr0OtVqOiogIzMzMoLy9HY2MjVlZWEI1G8+aBpDao1Wphs9kQDoe5patUKvO0FoRtWGFQ1UWbt0ql4o1ZKPACbFtPu1wu1leginJ1dZWdEVdXVzE3N4epqSlIJJI8oRtqVRKwkmhf9fX1WFtbw9bWFpqamrC1tYXNzU0eMQgBaOFwGEajcdfkoFjsJQJEjnIUEomE59wkhUsVUW1tLTY3N3nxFjIkaMOdn59HJpPB4uIipFIp2tvb+RnZjxkSkL+xFroTikQi1NbWwufzwWQyQavVYmlpCYFAAGtra+jr6+O5fF1dHRobG3HgwAH+HpJUlkqlUKvVcDgczK/X6XQ7FBf1ej1LWhMltbGxsahnA6H9aVyzW+eqGHuGrmk2m8X8/Hxeha/T6XDs2DHcuXMH6+vrjAmhTaOU/DIlBYQ3WFtb2/Oa7xaZTAbj4+P7FsAqpFYKE5XBwUHWDCkrK2MVwuHh4Txp52w2i42NDbjdbu60JRIJ7lTZ7XZ8/vOfx9LSEisRkgU84Sh0Oh02Njag1WqRyWSY+bG6usqyygRyFYlECIVCvJ7Mzs5iZWWFZeFDoRDm5+dx5coV1NfXQ6PRQCqVwmg04pVXXsHk5CRu376N48ePQ61Ww2q1wmq1oqamBleuXAEAjI6O4uLFi5DL5SxGFQwG8eKLL8Lr9eKDDz7g53l4eBhXr15lT5vnnnsOFy5ceGIfjt/WeJocfMpBwB+hXHIul8Pk5CRmZ2d5I6fZfDqdxssvv7yjzSVMDiwWC5qbm3Hq1ClMTk4ikUjg0KFDaG5uxo0bN+Dz+XDlyhXE43Go1WpotVq4XC7EYjEYjUa8+uqrqKyshMfjwcbGBoaGhqDRaGC1WvHGG2/gxo0bOH36NH7+85+zaMj09DS36mijdrlcaGtrywMzAo8BWyKRiKVhKUkh1URKXoDtRUmpVMLpdHLGTkqJhJonmiW1ZQOBAG8ItAhSR4C8FYSiSSQBS/K8fX19fH1MJhN8Ph/i8Tjcbnce+4KSBppF70aLKyUCRB0ToqqSVS9tpFRZ0f2n6yUUYxKLxRgZGUFfXx+r3lECMDg4iOnpaa4gCcRYCgdBs/N4PM6MFToOYQQCAcRiMahUKq7KHj58yP4TVFVTBZvL5bjDtLa2xpx3qVSK9fV1tLa2YmlpiRUvhZFIJPJGPKS/MD09vWNcQ4lBqSqegkYyVNmW8kMovKeU6C0sLGBhYWFf8svCa+5yuXbFnuzlCCmM/WJH5ufnYbVaS2ogUMfAYrGgo6MDk5OTqKysxOzsLD/jGo2GWTMkdQ1sdwkVCgXq6uowOTmJQCAAi8XC3bmpqSnG/kSjUR6JeDweNDY2orOzE/fu3UMwGEQgEGBgo1Dy2u/38xpisViYGRUMBvHw4UPuvpLx2fT0NORyOVZXV/HOO++gu7ubzaHIVbW9vR0GgwF//dd/nWerHo1GIZPJcP78efzBH/wB/vf//t/4z//5P2Nrawsmk4m7rt///vdx6dIl/PEf/zHOnTu3r/v12xxPk4NPOVZWVqDT6RhxnU6n8fDhQ24/k8lSNBpFIBBAY2MjWltbd3wPKb0J26rHjx9He3s7+vv7cfv2bfT29uLChQusW0Bzx0AgAJ1Oh/b2dtTW1rKwEY0FdDodgsEgwuEw+vr6kEgkUFlZyS56xH0HHrdFZ2ZmoNVqWV1NuNhRxUttTlLoIw2DhYUF3nAJvU72wjT7pA1SJBKhqqoK8/Pz3AqnFm+h1j3NttPpNMRiMS9CuVyOK5t33nkHNpuNzasaGxuh0Wjg9Xp5BEObtnAkIRShEZ5nMXCYUARI2LWhoApucXGRj5UQ8w6HI6+9Tu14l8uF/v5+riBpQQeKV5B74SA8Hg/fx7m5OZ5hNzc3sx8FjUBGRkYQDAZx69YtyGQyWCwWFo0iPIvf78eVK1fw2muv4Y033sDt27d5Rk9V+tTUFAPazGYzd8q2trYQCoW4os5mswiFQujo6EAkEsGNGzd2HdfshuLv7OxES0sLfvSjH7FnyF6mSRKJBDabDZWVlTwHLwTxFYv9YE+exBGSFFHJ4KtYEI5hfn6ehc2KBY0DNzY2+J2md4KYH6FQiE3KCAdEz1k8HkdfXx+kUikqKyuRyWTQ2tqK2dlZficomc3lcnA6newoW1VVhUQigZmZGfT09GBwcBDDw8NIJpOoqamB3++HQqFAKBRicyWxWIxwOMyqsoODg5yAymQydHR0sLyzx+OBy+VidohSqcTGxgaGh4dZ64U6kdTFHBkZ4efwl7/8JaRSKVpbW/Ous8PhwNzcHP7iL/4ClZWVn/kOwtPk4FMMerBbWlogEokQDodx7949nv0lk0l0d3cjEongzp07MJlMRRMDCo1Gs0OtTqfT4fTp0+jv78etW7dgMpkQCATw1a9+FblcDlevXkUoFOJ5Oy0MQkngZDIJq9WKra0tzM/Ps6rZK6+8gvfeew9ut5uR3KFQiHXaDx8+nAeCAx63fIFtk6mZmRlOBmw2GyYmJmA2m1FRUZG30Uql0ryNXYiAp8SFNllqc1KIxWJ0dHRgdnYWIpGIKYxerxfRaBTRaJRVD2kEQlxsqnCpGhVW80J+P3VHgL1FboRBIwFh6zqRSGBlZYXR+XV1dbwJnDlzBpubmyw3S1UrdW5IFa4Q6Ga1WrG2tob5+XmYzeaiOAjqfgQCAZ6rEuYhlUqx/sG5c+dw7Ngx/hxt7NFoFA6Hg0dL9LvFYjFLZS8sLODOnTswGAwoKytDNpuFy+WCRCKB3+9nsJtEsu0CODo6ipmZGcbDCK+jy+VCTU0NXn/9dUxOTu4Y19TV1UGn0+V1WIRB6Pbh4WHWcijEuxQL4cgC2E7myMp6t9gv9oSekd10K4Btii91VHYL+h3RaHSHwBoFdaX8fj//PhojAkAkEkEikcDq6ip3GQAwu4CS+Vwuh8XFRUb6CwWISD2R5I/D4TB34ajD9Z3vfAcejweBQAAOhwMtLS1wOBzQaDSoqKiAwWDAxsYGHA4Hjh49iu9973u4ceMGv7cEgB0aGsLi4iK++tWv4siRI3A6nXxuW1tb7GY7Pj6e504qvN4rKyv44IMP4HK5cOTIkaKdmcbGRoyPj+Py5cv41re+tet9+G2Pp8nBpxhra2vIZrOorKzExsYGHj58yK1ushINhUK4efMmysvLoVard6h9CUOtVhe1f1Wr1Th9+jRu3ryJ69evw+Fw4MiRI6y+9r3vfY89DAiVTosjaQ94vV7YbDaeMwPbC8Mbb7yBiYkJLC4u8qLe2dmJxsZGWCyWHVUY/blQDEav1yMWi+HGjRvQaDR46aWXOCGh1mJTUxMGBwdZzAnYXlScTicv7MXasnK5HFVVVQgEAvB6vSwmQ3LONDelOff6+jovdNXV1VAoFBgaGso7D2qTEm6BOidPInIjBGoKNwBayPV6PTo7O5FMJrG+vo5UKsW6EcLPp1IpzM3N5envF3YkJBIJV5CHDx/mpEOIg6CEUMhnF/L8NRoNAoEAbt26hYaGBmg0Gk6clpeXYTAYGJNSTCiIdPs3NzcRCoXQ2NiI8+fP491332VWCQHSZmdnce/ePUSjUWa+xGKxHddRKpXi4MGDMBgMPK4Jh8NwOp24evXqnskZSSsXdgxKbcjkYChMwoVdlL1iL+yJMDEQ3mf6LyW9tBmT4ySF8OeEgOS9cAz0/YSdEI71AOSdr7DLJRz/0LpByVOhOBYlVFKpFGazGVtbW1haWsKPf/xj/OAHP4Db7c5z+hwZGcHc3Bx6e3tRV1eH9vZ2PP/883C5XJiensajR49w5coVRKNRHD9+nJlW5MQaDAbx7rvv4vnnn8fp06cxOTmJ6elp9m/RaDRYXl7mcV7hWhWLxTA2Ngar1bprZ8ZkMuHq1av45je/+ZkGKT5NDj7FWFlZgdlsxsrKCiYnJ9nutKqqCt3d3QiHw7h48SI0Gg1ef/11XLlyZdfkQKPRlFQjJE4wSaMuLi4iGAyyZLPH4+EKhoJedOAxz/zhw4dMq6usrMTy8jI6Oztx6NChPMlgYOfLRlEowCMWi9HV1cUOjX6/H5cvX2bpUtqI29vbMTU1xckJLYJkTLOxscEbqjByuRyWlpZYFGdzcxNSqZT12xsbG1kIZmFhgQ2kKioqmGZFTovUtmxvb2cL5NXVVRaEKeYGCRRv7RsMBsRiMb62wqBNeXp6muWtpVIpu9kJRwuEnxB2S8hSmxZy+vdCWl8hDmJkZASjo6NwOBw8shAu+CaTCX6/H3fv3uU2NWEmKBkRiUSorKxkPQ4y9TGbzdyCD4fDmJqaYkEqqj4J+U7I8erqak4QSKSp8DouLy+zp0Kh6mOx5KyxsRHV1dVYWlratVsg7HIB2wkWjUsKY7dOQ2HQNT969Ch3fgqrf3quqQ0vvNd6vZ4ZIYXYEfo5Oibq+rS2tu7aYaBnlUZ7ZrMZ6XQa6+vrfO/VajWy2SzsdjuWl5d5dCeXy7lzQs8x/a5CdlI2m81LKPx+P/72b/8WqVSKZZUJi2Kz2fLu9aNHj/Dtb38bp06dwokTJ/AP//APSCQSsFgsLAJntVqhUqnYFGx1dZWr+vb2dmi1WgwNDXEyV6rbQ898KBTiLmEpMTdSFiVviM9qPFVI/JSCwG3RaBRjY2O8eHd3d+PIkSPY2trCL37xC4hEIrzxxht5wLdSQWIhxXj54+Pj3B5Lp9N47733MD8/j7a2NvzO7/wOV2dUMdO8PJPJsFIiLeAymYwNbahTIZPJWHJ0ryAQFc1dc7kcpqamsLq6CpFIxN7xpGxHC1BjYyNefvllWK1WpFIpRCIRxGIxhEIhRjGTZS2FQqFATU0NDAYD6yAkEgksLy9DLBajurqaeeOk106bAlVCDoeDwZYmk4mNp5qbm9nRjs4rFoux2IswRCLRDsU+AmcRCh8A4wssFgs6OztRV1fHQCuSrCbjJfp8R0fHDsogJRdCLX5ChxcqxtE1NplMcLvdUKvVyOW25bYJMEjfRUZABA6lrgDwWByKAJw0oqLjpHHZmTNnUFFRwQI1m5ubfL0UCgXm5uYQCoVY3lt4LalSE15H2qyLqT4WUyB0u90sBS2Mwj8XJgHFdDCE169UdUnHXRhisRhKpXLXTVv4LNMxxmIxlpOmDo5wHCD8LGEImpqa+O+L3X+6jzTSWl1dZXt2IRgxl9tWDZRKpVAoFJz0feELX0BjYyMUCgXKy8vR09ODM2fOlDwv4LHNdCqVQk1NDSe39OwWu9exWAwffvgh/vmf/xlXrlzhJJzWJkrg1Wo1b9jf/e538Y//+I/4h3/4B1y8eBHz8/NYXl7G4OBgUcosHUNZWRnjrcgCuliQKV7hvfqsxdPk4FOKubk5uN1uBAIBVvk7e/Ys6urqkMvl8Mtf/hLxeByvvfYa9Ho9Z+S7ZabEWCjkekciEVy7do1n6VarFe3t7VyxGAwGtoMmmpuwkohEIlhcXMTW1haam5tRV1eHSCSSR+ej+fxeIRKJigrw0MyfUMpqtRrz8/PQarU4deoUbzQHDhzA7/3e7+HChQtsMiOXy9HV1YULFy6gtrY27yVOp9NYWVnB1NQUi8XIZDKk02nWaLfZbIjH45iYmOANEdiuampqavDgwQNWxaurq0NnZycWFhbw13/911wFEW1QaG5TGNTap+5KPB7fYclL1R59Lp1Ow2Kx8OZebAObnZ2Fw+Fgvj19T2FLN5VKoaGhoejsFHhsh2u327nCE4JAFQoFs2pII4Ook3V1dVyFJRIJTgqIkkagUrvdjl/+8pfczqWfz2QyvAEtLCywGA0BQ9PpNF9bAtmRqyRFYdJZeI7CjabYtdwrdtv8i6k6CuNJfxfRBKmSFgbhA0gb4OTJk+w9EgqFOGHe2NiAVCrF0aNH87AGeyl80u+mapmAo+SvQC6x1IVaW1vDD37wA0xOTjKLYHh4GDdv3uTvFG749GeZTMbjMCF2x263w2g08ucK7zWZ0DmdTgSDQSSTSWxsbGBiYgIzMzNYXFzE+vo6EokEm0ptbGzAaDSioaEBnZ2dqK2tZQXGwqBE2O/3o729HfF4HF6vt+jIloCkzz333Ge6awA8HSt8KuHxeNDf389VUW1tLbq7u/nhunTpEjY3N/HCCy8wZVFoR1oqhHRGmv+urKzg4sWLiEajOHr0KLvtAdva9KOjo9zSI811ooklEgk8evQIXq8XIpEIvb290Gg0iEajGBoa4kqVuhqpVGpPpHehMQsFbTRisRh2u52V2Gj+nMlkcOTIEayvr3My9fnPf55bryQMI6xkRSIRt5VpjqrRaNDU1IRHjx7B5/OhubkZm5ubcLlcfC/InXBraws/+tGPeOFSq9W8mZP+AAX53ROOQLhpCTdRAnPRhksbKiUsWq0WJpMJzz33HG7fvo1IJML67oSopha6cHxTDAlPIMlEIsGjkdra2h33hK6XWCxmd0Oi0JLGAnWVyIVSJpMhHA7zc0m/PxgM5t0Putc+nw82mw29vb1550DXi1rUwutEQZ0U8gMoNiLZS/WRvmc/csqFQaZLdI8K768w6B6RSM9uUWwUsReYtdjP7IZjOHz4MKtJAvliU8D2ZlzK5hkAU387OzsxPz/P6qkymQwGgwF+v59xD1KplA3LSABpc3MT2WyW2VjUQVIoFLwxE/iUEluSLacovNepVIo1DUggKZfLscU4JacOhwMrKyv8/Kyvr0Ov10Or1UIul8NkMsFkMmFkZGTHOdM7b7fb0dTUhOXl5bwRCn1ubm4OZWVluHDhwq73+rMQT5ODTxBE4bl//z7C4TAqKytx5MgR1NXV8ctw584dzM/Po6enB21tbfyz+0kOCKU/PT2N8fFxbG1t8eiit7d3Bxe3o6MDcrkcExMTjA5eXFxksM7S0hKDxIDtysxkMmFjY4NZA+ToJvq/IipU6RULqhaELoLCljdt5nTMtBj7fD5kMhlOqGhzEboqAjvbwFSxEqWusrKSed+kujg8PIyxsTEA4L+rrKxkm1lh9S2Xy1FeXo6ZmZkdG5DwvAqZAgS2pI1NIpFAp9OxhwPwuNuztbXFtD86b9I8IJ44sL1gCq25bTbbDiQ8Xb9StL7CjUYikaCjowP379+HRqNh9gslsQS8I1dPYXJUWVmJc+fOoa+vDxsbG6yCR5LVOp0On//85/Hiiy/izp07CIVCOwCToVCINwAhhTOTycDr9XLiROwUIchuP6qPZFW8m5wyBc3qacOi30FeIqurqzt+hr4vm83umRgA+U6huVwO09PTRfESY2NjJR0bKUppaJhMJsYaEUiwMEGgpIxCJpOxIuHS0hIikQgGBga4c0MjrHQ6zf/faDRCJBIhEAhgY2ODExRK1gn4Sc8cGZEBYA8Eukd0DSmEgEqdTge73Y5Dhw5BLBbju9/9LoxGI+uQKJVKlsJOJBJcZDU1NSEcDiMYDMJsNqOyshKjo6N49tlnMTY2VjI5qq6uxiuvvII//dM/hdPpZGo5MTvKysrwR3/0R595GiPwNDn42JHNZjE6OsqAOq1WixdffDHPKGdiYgIPHz5EU1PTDk4ybVK7ta7i8TgDvUjqNBwOo7q6uuj8TyQSobm5GalUCteuXUNrayucTieWl5fh9XrR1tbGIi/EUlhYWGD9ApfLxeeWzWZ3GCYVBoGr6uvrMTY2xvN9mUzGFSptBuFwGN3d3XkLLSURQgDZXtecql6Hw4HGxkZ4PB5UV1cjEolwa1uhUEAmkyGVSnHFUwyoVFdXh5mZGfj9/h2LfylhIbKQpj8TmyKZTPJCKNykyX5byL0msCQdEyVRhFegSr2xsRFWqxXT09OYnZ0tiYSnEN4rSjYaGhowMzODlZUVBndlMhmmt9KzK+xAiMViaLVaNDc3MwJ8ZWUFgUCAf39LSwvOnDmDmZmZPGohjRSESQJdRxp10edoc89ms4jFYuju7ubv2U31ka5vNpvdtwIh0UjpugvpbaVAbHQuwmu6H18OYqcQXoKExejYgcd4ikKlw8IQamgA4I4RSUALkx3g8YiBkiqi80YiEdYFoPNPJpN5DAQhBXBra9tVlCihQjMq+gwlCnR8IpEI9fX1GBoagtls5u4UPf/UpRAykCKRCK9t9fX1kMlkWFlZgVqtRigU4qRToVBgc3MT1dXV+Pf//t8z5mJ9fR3Dw8O4d+8e/H4/3n77bbbALgylUomXX34ZjY2N+J//83/ib//2b3H9+nVsbm7CZrPhG9/4xlOFREE8TQ4+RiQSCdy7dw+Li4uQSCRQq9Xo7u7OSwxWVlZw48YN2O12vPjiizu+g9DqxaqdQCCAubk5rK2tsamS1WrF5uYm0uk0jh49uiva1mw2w2q1siY/SQpThm8ymWC1WqHVarG8vIxMJgO3280bu16vh8fjYcCbcKGnTZcWHQA4ePAgS+0KjV6opRgIBNifnjjy0Wh0x9hit/YuBSGfaU5JHu6k1ZDNZqFSqfDKK69w1U2LXWGQlDXNYwujsbERCwsLCAQCXEnRd1GlYTAY0NjYuMMfQRhUSdLvoc4NLeykFEitf1KLJNMbMpwp5c5XKghs+cUvfhE///nPsbq6yhVsJpNhqewTJ07kbVDkXJhKpWA0GmG1WnHo0CFmGdDG09/fzyJS1B2gzcJkMjHavbGxEbOzs0yfFWpMlJeXY3p6GlqtlvVB6DtKqT4K6YD7VSCkZEKpVOYlA4WbiND7QghmBXZ3rRR+LpPJYHR0FLFYDDabDUC+r0gmk9nVJbOQVVEY9BzRGlDss5Q0UUKUTCbhdDrzqv1Sv4NGQbS20UhFrVbDbrdDqVSit7cXXq8Xt27dYswCsJ1wT09PY3NzE5WVlSxxHg6HWZKbEk869kQigb6+PohEInR1deHWrVvchRC+bwaDAefPn+dElt4fMoDyeDz8vBLmiUIqlaKhoYE7NU1NTfjzP/9zvPPOO5iamoJYLMaXvvSlvETusx6i3JMiaz7jEQgEWIfdYDCgrq4OKysrbO7R29uLra0t/PM//zMUCgW+8pWvFAXJTE5OYmVlBefPnwew/aC73W7Mzc3B4/FArVajsbERgUAAN2/ehEqlgsfjgV6vh1KphMPhwPPPP190LHH//n3cunWL/0wvJvGRiQa5tbUFn8+HsrIyuN1uJBIJqFQqnD59muVLZ2ZmEI/H0dzczD7vpKFAUVFRgUePHuH9999HPB7nyj2XyyESibBrIo1bKCmiKkfIo6eNY68wGo3sYkcsC8IIEMZicnISIpEIp0+fxtWrV3eMCIRR2JIXiUQwGAyYmJjAjRs3WHCGkiWajX7hC1+ASqXaE8CmUqmYkjk6Opq3QQkNrShhKvQ+EEZhG7lU0JiHAGL379/HzMzMnloBhC8QyiyTqx35glDVSF0QWqS1Wi2ampqQSqWg1WqRSCQwNDSEqakp3LlzhyWsadEnTMyJEyfQ2NiYd4+8Xi8uX77MCW1hgkBKexcuXNi1+gYes0Z2u25kYUzHRZvkfq4xeQuQuuhbb72Fra0tVuekZ1yYcJBK5JtvvrnvhO+TBmELKEmh9wd43A2gJJvYFw6Hg7uW4XAYkUiE323qJgivk9PpxN27d5FMJpmySiM3hUKRtxYUvnPUTVhfX8fdu3fzntWDBw/C4XDg+PHjsNvtmJubw8jICIaGhjA5Oclsoba2Nk6mKRQKBV5//fUdTrnhcBjf+c53EAwG0dLSgjfffHNP19HPSjxNDp4gVlZW0N/fj1AohMrKSpw4cQLz8/PsCTA5OQm73c68/S9/+cuM0i0MkvM8c+YMmwuRnGhjYyMqKiogEokwPj6OS5cusdGQ0WiEWCxGTU0Nzpw5k9dOzWazuH37Nu7duweRSIQLFy4whTKbzfLcmRIMck9Uq9UwGo1YWFhAKBTCyMgIFhYWUF5ejrW1NdTW1uKb3/wmJiYmuBUJgD0Nqqursbm5iaWlJQZfUdehra0NtbW1MBqNu85tqbqmRbkwyJ8gFArlASeFnH0ADGAjZLxWq2W/eNpc9gJZAkB5eTmD9fx+P5aXlzExMcEo//b2dhw4cIABVaWCFkDapElfwe/3w2az8YZCG+x+XkfSJigWdE1oc6fNi2bT1NalqpLUGun5Ela/pH9BmxslX4WtfuoGkeseGS8RzmBlZQV+vx8bGxuYm5tj1oZMJkNdXR2am5thtVr554VRTISKwKPCpLNYCOWudTodAyBL3SdiEdEIqFhrujCEiRrdv0QigZ/+9KfMHCpliEVg3i996UsllQ6fNApBvBQkQ070abPZjMbGRszNzWFjYyPvnSCsERmn0f2nZ4q6K/RcE/NBmHz5fD6sra2x3gutBTU1NcxiKQw6rrKyMng8HiwvL+/oltG4jIzkrly5gnA4zJoNmUwGkUgEWq0Wr7/+OrRaLQDAYDCgoaFhR5csmUzin/7pn7C8vAyZTIYXXngBx44d+1TuxW96PE0O9hG5XA7j4+MYHBxEJpNBe3s7y29evnyZxXPS6TRcLhey2SwuXLjA1qPF4u7du9jc3OQWZllZGZqamhjBTDExMYGf/exnEIm2JXMdDge6urpQXV2d97mlpSVcuXIlrx1Nmw+BGbVaLaqrq3H69GnYbDb87Gc/Y5CeWq3G0NAQpqenMT09nbcwEACNhJGAbaR/JpOBUqnE5z73OfT392N+fj6Pyka2wmRDPTc3V3JjFlZswqAFV6VS8Qwzm83uEA4SBiURhd9B18toNOZtroR7oBm4TqdDIpHgKpb43+RvTxtuMSU+Yn8UOwev14ulpSXMzc2xG2ddXR0aGhqKVr7CFjsld/F4HG+++SZ+8pOflEwkpFIpXnnlFXz00UdIJBJ8nWicIPw5AgQK5+m0yKtUKmg0Gmi1WtZiELaxSWOhoqICer0ey8vLiMfj3BGiZ4QqTUqQiDVRzKOi2D31+Xx5yH1qER84cKAoF70UQ4CSkL3GA6Vm1vuNTCaDt956C+l0Gnq9nv++MPn7pJ0DlUqVZw5WXV0NvV6PqampPIS+TqeDRqNhyWThmJCeYyGjhGimqVQKZrOZR0fpdJqVFul/Go2G8SuFQXgSiUSC48eP49ChQwwYJtEiYbdCo9HAYDDAZrNhfX29JJVaqVRCo9HgBz/4AaLRKMrLy1kbgUDNHo8HcrkcX/va19h5MxQKwe/349ChQ6isrAQALC4u4qOPPoLf72eg71e+8hU4HI4nvh+/bfG0f1IQhCfo6OiAxWJBKpXCwMAApqamoNFocOrUKeaW07yeFm1SW9Pr9RgZGUEkEtnBKEgkElhYWMD4+DhEIhEOHTqExsZGpgYB+R7jJMlsNptx5swZnsv6/X74/X74fD6MjY1hc3OTK8FkMgm73c7zO5JQTiQSrAsgl8tRVlaGtbU1OBwOjI6O4urVqzCZTGhoaIDRaEQgEGDzGCGAymazQavVwufzob6+HrOzs2xwAjwGUVGrPZVKwWq1MqgJ2Dm/FQL6gMcLC7EryGBlP61eYWIA5M+oCegEPN5EqJKVSqU4cOAAOjo6uNKiYxWC7oSgLJPJlOcASNr0whCJtn02PvzwQ9YeIK+NoaEhzMzM4OTJk3jhhRewtLS0Y6GlSpbGA0tLS0UTA+KwZzIZ+P1+BoZSFNsUhUmSEJshEol4ti0U2aHz1Ov1+IM/+AP88Ic/RDAYhFKpRFVVFUtYu91urK+v8zNA+ghEaytWKRfO+ClKIfeLxX7lrknwqbBTQUDcTxKl8BLCe/YkeIlSIZfLORmNx+OIRqN48803sbi4yEZmtIkbDAYeWdEYQKiCScdE7yDpgEilUjzzzDOwWq1YXFzE7du389glQq0AoV8K8Ph5q6urw7PPPsvJaXd3N/r7+7kjQc+GyWTCiy++CLPZjL/7u78red5SqRSTk5Pw+/1oaGjg86CuWXl5Oerq6jA0NITZ2VmcP38eJpMJHR0dGB4exsOHDxGNRnlUmsvl+D5Fo1FcunQJX/va14qKS32W4mlyUBALCwtsG9vb24v+/n6sra2hoqICZ8+e3QE6JMc6Mq0xGo2QSqXweDwIh8M4dOgQe9fPzc0x/16n06G+vh6HDh3i75udncWVK1fYY5y4uxaLBc888wwymQz6+vp4jJFIJLC+vs6UrBdeeAE6nQ7vv/8+GhoaMD8/j7W1NRw5cgRLS0twOp2synf8+HGeHSsUCkxOTiIcDqO1tRXBYBA6nY6d6UjKVGgVSxv0gQMHMDg4WDTLJ0611+vlhYkW9kIBElo4KAjNTlWF0EiHkoZCbYL9BIEBaRMh+2zaRO7du4epqSmmpBKeoDAhkcvlqKioYN14AIyjoEqfNgO3240rV64gmUzukGEmWuTdu3fZw54WV6q0qfqlSnN8fLzoudHGLJFI8ODBg13xG8IqlsZVxI4BHm9kyWSSWSwAuDLTaDSYmZlhRgtpOnR0dMDpdGJqaopHOxSEqyCnRhp3CI9/tyhE7hfGfuWuhUqev6oo5dhI51zo2PhxjieZTMJms3HS5fP58Hd/93d5QF+iyy4sLECn0+XhAygBBx4nBgaDAeXl5VhaWkIsFsPa2hp+/OMfQ6fTIRqN4u7du1hcXOSEtaKigjtfpbp+Xq8X165dQ1dXFyKRCNLpNHp6evD++++zwRYApml2dHSUxNzQd46MjOQJvVHSSEZQAFBWVobV1VWUlZXh4cOHqKmpwcGDB6HVajE5OYlgMIiVlRXWDiFqNrlC9vb2PtH9+G2Lp8mBILa2tjA1NQWJRAKXy4Uf/vCHUCgUOHDgAI4fP54H/iOVra6uLty9exfhcJjFZgjZK5fLMTIywj4BSqWS527Xr1/neRgAXL9+Hd/+9rexsbEBrVYLsVgMt9vNxkRisRgXLlyA0WhEdXU1ZmZmsLy8DK1Wi+eee47b/TS/Jl/0hoYGnDx5kjeWra0t6HQ69Pf3s/tiJBLBzMwMDAYDvF4vNBrNjkWYBGcWFxdx+PBhBINBiMViDAwMsGtb4eep2haLxby5k2xwYTWVy+XyKl1axIQqfZQwqdVqVFRUMKNiP/QyYdAmsrW1xehkSkJEIhE8Hg93Sex2O/sx0HmRNLNard4xngiHwzyioEV4fn4ekUgkb8OiSgcAa01MTEzg6NGjecdK7V0CeFqt1jy/DaENNgVtAqTWWSzoulOHx+Px8D0X0t0KQ6FQQK1Ww+fz4caNG/x3NK64ePEifD5fHgiPOhpqtZp1FiQSCZqamuB2u0tK3j5pkKIiXWfa/KgytVgscLvdmJ6eLjpXFmIU9lPNZzIZ2Gw2JBIJlpKuq6vDwsICLBYLzpw5g1u3bu3bsbEQnLdXskCbs1wu5/eRlC6F30OJr9/v35GM0f2nz0ajUfa2IK8QYl/cvXsXwWCQAY25XI5dNotpNggT+/X1dfj9fiwtLaGhoQGDg4N8bShhjMVi+O///b9Dp9Ph+PHjLBhX+J1erxdutxs2mw0KhYKxRQDyMCUkU97e3g6Hw4GxsTF4vV4cOXIEarUad+/eRSgUQkVFBdNPOzs70d/fj6mpKRw4cCCvo/tZi6fJgSCWlpZY05ykYBsbG3Hq1Cl+4ajlv7a2xvPJubk5qNVqnD17FvF4HLOzs+x5/+DBAxw4cIDnXMK2HUl6Dg4O4r/8l/+CYDDIlYBEIkF5eTlqamowMzOD27dv4w/+4A+gVqvxwQcfIBQKoaWlBc8880xe0kIueHfv3oVer8eLL77Ic3Rq0Wu1WtZp6Orq4sq+pqYGkUgEUqkUGxsb7HVAQUIyQsGZ2dnZoteSFrdwOMyLtBB0R4sLhRBvsNvCWF5eDovFwpVnRUUFNjc38zT/96pA5+fnEY/HUVlZyR0LSlxyuVwezayioiIPvSzELqTT6TzTGeCxMQ0lOzRGEir9qVQqrqqpratSqTA+Po6Ojg4Ajzn1NN6hsQt1BuiaUoue7hMJ2TQ3N+PmzZt7jmDontDP0jXUarWMFaCQSCSIxWKcOKRSKe5u+P1+OJ1OqNVqVFdXo7Kykum4RKs7cOAAFhcXme++vr4OnU73iZMDuoaF11n4PFEoFIodiorFMAoNDQ1oamoqCiimzy8uLnIiVVNTg5aWFmY8pNNp7gTtx7GxMDEgjMBe5z0yMsKUUYVCgdraWhY1Ax6rgJIQGClYErBY+K7Qs0LJUTQa5ZHY7du3kUwm2byM3hWlUomNjY2Smg0EMp6bm+Pk+/bt27hy5QrS6TTKysr490okEpjNZni9Xty4cYNHDIVB+KNUKsVqsFqtFsFgMI8FROBYtVoNg8EAi8WChw8f4tatW2htbcW5c+dw7949yOVy1NTU4NGjR+jo6IDRaMTFixfxwQcf4HOf+9xnlr3w2TzrIpHNZvHo0SMEAgF+0XQ6HTweD1sIC1v+YrEYPT09LC707LPPcjuKaDtKpZJb/42NjUy58/l8rNinVqtx8eJFeDwetLW1MchLaPxSX1+Pqakp/PVf/zWampqgUqnw2muvFUVpRyIRVkJ89dVX+cGmboBUKsXAwACampoglUqxvr7OVQ9ZG/t8vqKIZwKR7SU4Q4uAEM1Mhif0nTRqoc2JgJnA7rr1GxsbPJrp6OjAuXPn8O6772JhYWFX7jZFJpPB0tISVCoV3x+hEBMdv06nw9LSEpLJJNxud953pFIpbG5usgxysSAKF1FGaVHO5bbFZ2iTp9kvtebJ9IUWTPKbSCaT3NkhBUW32w2RSITjx49jcHAQwWAQmUwGq6urrMO/19hFKOEsDKKbFnZlCp8LOh/ymairq4NYLMbi4iKSySSbXzkcDpjNZszPz7MDYSAQ2HMDLBXCDZWuXSlFRUrICakvTHD3wigUsiEKP08bLX3++eefR29vLysu7gcvUex538+4jJI30gEgnExjYyOrBCoUCmSzWbjdbk5WDQZDnhiZSLRtImY0GtlK/Ny5cxgdHYXH48HExARSqRRTh4VgQgCwWq1YX18vqtlQeJ7E6goEAgyYFtI8RSIR7HY71tbWdnyfWCzmBOTAgQN48OABWltb89QYhYBbv9+P1157jdcrjUaD06dPY3p6GlNTUzCZTOjp6cHo6CjGx8eRTqcRjUZRU1ODnp4eDAwM4M6dOzhz5kxegvlZic9kciAE/NGDMz8/zy+BSqViup9Go0F/fz9+/OMfw+12w2Qy8aby3nvvQafT4U/+5E8YyEJJAWnVx2Ix+P1+rK2tQaFQQKvVwmw2QyqVoqWlBVVVVfje976H2traki8WZfjXrl3Dc889xw+r2+1m0xZaHG/fvo1YLIaGhgZMTEzwv62vryMajbKhC0mwZjIZBAIBNDc348GDB+zTULhgPSmAihYOAmuS0hnweA5Ki5kQqLife0fVqtfrxc9+9rO8Gf1erVjyTCA1QupiEE6AqnHaJBKJRFHw3F5JCBnakAS28FoA4LY7BY0O6LP0bwRQzOVynFwplUocOHAAt27dYj2Bb3zjG/hf/+t/8THTtRbOlQuDwGO0wSiVSuavCxMUCuGf7XY7wuEwysrKkE6n4fF4EAqFMDExwe8UyeDSMzUwMMBJL+lFqFSqPBfL/UbhfS5UVBRSOIVUQ0pwNRoNNjc3n8iS2+v1or+/H+l0Ok8sRy6X8+jp2rVr0Gq1MBgM0Gg03FkS+m8Ioxj1UMg02C0CgQCmpqa4K6FSqXDo0CH2Q0ilUjyC0uv1O7qW9L5Qqz4YDLKeBdnJEwDWYDDAZDKxOBadk0ajgVqtRjQaxerqah5wt1hkMtuGZiqVKk+eGniMZwG2gb0rKyt44YUXmGEhk8mg1WqhVqvx+c9/ni3qCSBO704mk4HT6SzqkSAWi9HW1oaysjIMDg7i3r17aG9vx/LyMkZGRjA/P4/Dhw/jyJEjcLvdGBsbg91uR0tLy57347ctPlPJQSHgT6lU4rnnnsMzzzyD/v5+ZDIZNDY2oqOjA2azGSaTCaurq/iTP/kTRCIRHDhwIG8BcTgcmJubw1/91V/hP/yH/4Dy8nLkcjn4fD4EAgGeBRNKXiaTIR6Pw+VyIR6PY3NzE1qtFoFAAFKpFIFAIA90R0IpxAQQiUSIxWJ5AkfA47liKBTi73Q4HFzlU9UaDodRW1vL3gN1dXXo6OjA22+/jZ6eHszOziIcDsNkMuXN7nK53A4AVbEgpHA6nUZNTQ3LPpMZDLC9kNrtdubW09/pdDq2eN5tgydQY0NDAxobG+H1ejE3N8dJw16JC1VulASSVS1RtCgSicS+uiSk9VBqMReLxaivr8fIyAhsNhsqKyuxvr7OizI9T/tJvOj4EokEbt26xZvf2NgYJiYmsLm5idnZWTidTk56Dh48iMbGxqLn4fF4uD2eTqfZDrtUO10YarUawWCQ2+e1tbWYnJxkvEUkEsHa2hoymQxbBkskEla2JEzKkyYGVPEK3UZpdi5kCBTeA3qf4vE4WltbkcvldmAUKOj/m81m1magrgdhRwqD0Pabm5uYmJhAb2/vjq5IsSSNrteTghGdTif6+/v5OSXTog8//BBarRYnT57MczQlBgYlwpSkCumjW1tbnMxQyz6VSnE3i4y56Lmlf/f7/SwLvpfHBXUKqXNGiqbZbJZHaSS+FI1GEQqFoNPpuJOVSCTQ2tqKsrIyJBIJvPXWWxgfH2dbda/XC7/fD4fDsatHgtlsxrlz5zA2NobR0VFUVFRAp9NhfHwcarUaLS0teP755/HWW2/hxo0bsFgssFgsT3SPftPjM5McEOBPWP3HYjF8//vfx49+9CO8/vrr+Ff/6l/tePE/+OADuN3uHYkBRV1dHQYHB/EP//APOHHiBI8lKCmgl9Pn80Eul3OVlsvlMDMzwzNcyuaFlqoEKKPqSq1Wo729HRUVFSxjSwtDIBDAT37yExiNRvT09KCnpyfvOF0uF8rKyvjnUqkU1tbWsLKygmQyyfiFq1evsjribgCqYiGVStnxkZKvbDaLN954A//0T//E1bLP58u7lolEYl+Od1Sh0LWJx+OYmprCO++8w7TSUqp/FMJNxGq1cheDOgYAeBPZT5dkNyVDCkKuE9BLKDZE10Ov1xddyIq1l+n+EdXK6XRicXER/f39iEQiUCqVkMvlkMvlGB8fx/T0NLq6unZtj0ulUrbmXVpawrFjx1BdXc2f12g0EIlEvOGtrKwA2G5tT01NMdCUrgd1IQiQSIwPwlnQhiRMrnZLDEkjYnZ2llvohfe6kCFQGJTgNjU1IZ1Ol3R9pGR+a2sLGo0GTqcT3d3dvzKXSOpu7BcMKWRlCDcsqvTp33U6HeumCP0ShInsfhgiBHQkUCwVKkJWDnUA90qmhVgZs9nMssjr6+sQi8Uwm81IJBLwer2QSqWwWq3Q6/VYWVlhRszy8jKuX78OhUKB//pf/ysuX76Mq1evsjvk5z//ebz55pt7eiTIZDIcPnwYZWVlGBkZYW2W6elpRKNRdHd34+WXX8Zbb72FS5cu4c033/xM0Rs/E8nB7Owsvv3tb5es/mdmZnDz5k188YtfRFlZGW/g4XAY77//Plc7NB8uNJcBgHv37sHhcOz6YhN1UKVSQSwWo7u7G1qtFs8//zzeffddbv15vV4G8tXU1CCVSsHpdKKzsxODg4NYWFhAZWUl7HY7A3ree+89Vk4kBz0KMl5RqVQYGxtj8B9t5FKpFB0dHYwin5mZ2RVAVSoOHTqEhYUFeDweTE9P49ChQ3A6nRgfH0cul+MqhayW4/E4VxJClkKxoLEGjSKGhobwV3/1V3nKfltbWzv47MWCRi7T09N5M0+dTge9Xs/J0KdlwGKxWHDy5En09/djaWkJRqORzycej8NgMKC3txdlZWX7Yl4Uaup7vV4W6LLb7bxokwjR6urqjvZ4sXa6SLQttOV2u3H79u08WeJCcyLaYEhW2mq1QqfTYXFxkSm9mUwGOp0OCoWCgZN2ux23b99mrQkh06LUvadEhuR3S2kX0HUWOllSdyEcDkOj0aC3txdGo5Fb1aXAZqTHQJLW9Lv3iv26RFLsZelcLObn5xGLxWC32/NYMaQeaLPZ8mb2BB4FdnpJ7NaxkMlkMBqN3PkyGAyMLaEg981oNIquri7GyJQKsViMuro6jI+Ps7Mj2USTLDk9E1//+tfx6quv4u7du9x13dzcZKxNU1MTLBYL/s2/+Tf45je/iWg0iqtXr6Knpycvsd0ryN313XffhdvtRkdHB/vaHDt2DM8++yzeeecdfO9738Pv//7vf2YAip+Js7xy5UrJ6l8kEvG8/X/8j/+BV155hUFqNEejTFmtVvPsUKlUMu86k8mw3kCpBYGqUULHb21toa+vDwBY1vXevXswGAyc6edyOSwuLmJjYwNqtRr19fXweDzY2NhgsxBavKiVT0Awv9/Pmv1kfkSSsDRPpo3RbrcjEonA6/XCaDTi2LFjOHfuHL+8VD3sVWWMjIygq6srj0opFovx8OFDqFQqVlokm2CqNAqd5GgWLrxHBDbM5XLweDy4fv06VxKkHpjJZHj2u5vjHYEEaaEUotZDoRBqa2tx6tQprro+DT58XV0dTCYT1tfXMTk5ye3glpYWNDc3w2Qy7ZuSSS1y+vzCwgKCwSAnBiqViq+xSCSC0Whk3w5qjxdrp9MmQpoWQkAYceCptQyAN/zXX38dVVVVWFhY4CqYRg7r6+u8wRw+fBhXrlwBAKb81tbWYmlpqWQHRpjI2Gy2vOewGC6grq4Oer1+B0Ogq6srb8PdzfWRrgWBLYVqoel0uqgqI8V+XSKB/Qs2UQhZGYSDEYJ/hUJkxToYpZ7lwr8nVgytS0eOHGHjLKr2hSZboVAIGo0GjY2N+5Imb25uxtzcHFZWVhjkCDweOYTDYdTV1eHgwYMYGxtjozUhBZqApTdv3oRcLofFYoHNZmPQ5ZOGWq1GZ2cnRkZGuMvr9/tx69YtiMViFpm6du0a++H8tsdvfXKQTqdZ+W+3dqDBYMDw8DC++tWvQqfTIRKJ8OKaSCRgNpuL8m6BbWR6a2srDhw4wAtksaAxAC3qVCn09vYikUjg/fffh8fjYdohsRu0Wi16enp4UdJqtfziUptdKpVidXUV6XQakUgEi4uLrBhGs0FaWIX0RGB75PHBBx/kHTcZ4hDAjaxXd4tkMomxsTFotVre9Ok7bTYbnE4nYrEYv9gikQhlZWVYXFwEsF1hk/yucBMgEF46nUYmk8H8/Dx7E5DWuxB0tpvjHW02UqkUjY2NCIfDXMWSsBIBN4WVY6kQcun3CovFgmf/r9888dFp1EQL+H6AaBS0QSwsLHDLN5fL5bE+qCuiVCqxsLBQsj1ObeKtrS2m0i0uLuLIkSNcaRNKXbiZxGIx/OQnP8Err7wCp9OJ+vp6xONxbGxsQCwW8+Z64MABXLlyhcdbarUaKysrey7ki4uLiMVieYkMPRul7vV+GAK7uT5SCEG4crn8iT7/JKOB/YAh6fuFrAzqcBYeAz23VITsJlEtTC6En6HNPx6PQyKR4NSpU+jr68PGxkaesyetjYcPH4bNZuOR124JtdFoZIE5v98Pi8XCMtuZzLZjZWdnJxYWFuBwOJDL5fLUHElP5uzZs9BqtfB4PPB4PBgdHcXq6ioikQji8TisViuPDvcTWq0WKpUKvb29TBF1uVw8DhSJRBgaGkJbWxuqqqr29Z2/yfFbnxyQwt9exiZmsxmhUAhXr16FTCZjc5GDBw/ixo0bJVuK6XQaPp8PZ8+ehV6vx7FjxzA5Ock0I3qoqN1Gxi5CVPzY2BgsFgu+8pWvwOPx4NGjR8hms7BYLKiqqoLVauXEgB58miuT85lareYXUqlUcvdBo9GwpW4mk2GxEdqEaL4qXKRtNhs2NzcxODjIts8ErCvV7qR5J7XKC4NU0Mhhj4BOy8vL/BmPx5M3+xcG0UelUimmpqaQTCYxPz/Pi6Fer4der+cWdqnZr7BqJuCT1WplUJtIJGJaVkNDQ1GzHuECu1diIExy5HI5gyepshQaNwlHL8DeojwE6KOOFc31CwFu9JwRfqRYO506YyTmZbPZONmMRqN5jpn0/fR34XAYP/nJT9iHYX19HZFIBFtbW6iqqkJlZSV++MMfsqw3iR9FIhGEQqGS9EPqPFAiQ7+zcHMrda/3UlQspWJI96IQhPukny8WxHSi0cBe4MbCBHevjgcdC3l30MZIx0qbLCW9xSjLxfAfra2t0Ol03JEhZULqfBE7g56zvdhHXV1dqK+vx8TEBJaXlyGXy6FQKNDQ0IDe3l5UVVVx1yQYDCIajTJbhwogt9sNiUSCiooKNDc3I5PJMNjc6/Wy2RpJvlutVpjN5pLPBI1jZTIZzp07hwcPHuDRo0f8vlBy8t577+HrX//6jvHtb1v81icHxGcvrJaFQTP5XG5bSpgkcaPRKBuPTE9PQyKRMH+d5twPHjyAVqtFLpfD8PAwI7Ip+wa2FfAOHz6M4eFhnquR0Qn9l+iNlZWVaGlpgc/ng0aj4WMXAtNobh+NRiGRSPDlL38ZW1tbmJ6eZnU2GoGQnwLN8YhGJqRLkYsksL2BzczMYGBgAOvr61AqlVCpVIjFYhgeHsbc3Bx6e3vR0NAAq9WKzc1Nvs4kBVx4rWlTp02QEhGqPIS+80DpOWg2m8Xk5CT7TVASl81mmYplt9sZ3Vw4+81kMnlVs5AtINSVoM3G6/XmLST0ncJNYa+OgfDfiz2DdE3oc5lMZs85NMnFUuJAmwV1CArlqanCpPZ4qc2Fqky6FqRGSZ0DAhQKkx16jqjy6+vr481BJBIhEAgwM0UsFrMXCI0fCO8yODiYd50JBEdmV/RMUBIn3Hz2O+cvTLaEGAW3283KkqVAuKUwDWRIpNPp9gTt0nUUjgaKRamkZz8dD+p2trS0cCInlUqh1Wq5M0cdB+riFUbhO0hgwcKOjNCDJBwOMxupmKMiBa2NWq0W586dY4fZDz/8EI8ePUIikUBzczNaW1v5/EhUjtZpAvKSbDtJ0sfjcYjFYnR2dkImkyEUCrHD4+zsLAstUVeBxrjA4+SA7NgfPHiQ16Wh5zUajeK9997Dl770pY/ti/GbEL/1yYFMJsNzzz2H73//+3A4HEVfplAoBKfTiZMnT7LZDD3wZWVlOH36NEZGRjAzM1N0QWhpaWEbUvofLbLZbBbNzc2orKzE6OgoMpkMV2hyuRy1tbWora1ln3RgewGkStnhcDCjQBh0fAqFAu+99x4voEIaEPG59Xo9IpEIL/REpSusEAhFfvXqVUilUlRXV/PvJU6zsN0pDNqsaC5IFDM6H+ECtLKykmftLJFI0Nrairq6OthstpK2zV6vF/fv3+f7WtguTCaT2NjY4Hlp4ey3mFCOcGxA16HUZiMcB+0nStnn7hbCOTQleMXm0PQcK5VKNDY2YmhoCHq9nu1zhVGqPS68hzRuosp8eXkZzc3NPHIzmUzweDxIp9N8b2hsQF022lSFIRxFEN2OkiSqcIlaS1FbW4v19XVotdod+BPqxgmD7jV1jQqv927JViFGgbprbW1tqK+v37HRCz8/NTUFr9fLmimZTAZut7sk1oWi2HNYmPAApZ/DvXwbqLBoaWnha0HjJqI1k0LnXiwhCmFiK+zIFGIVPB4Pbt++zR3HYgBLGnVubW3h0KFDrMBIYmxbW1u4c+cO/H4/jhw5wl2A9vZ2LC0tMcahs7MTVquVR4OhUIjluO/cuQNg+/3Q6/Worq7mAiUcDmNmZgaPHj2CXC7nRIHM4ciLgjoVwj2DANAbGxu4efMmnn32Wf77Qu2c3/T4rU8OAODFF1/EpUuXMD8/z4IZFARwUyqVMJlMXPHQopxKpdDS0oJ//a//Ne7evYv/83/+D6RSKSwWCw4fPozOzk7Mzc3tqOwpwSBBlLGxMbS1tWF0dBSBQAAKhQJf/OIXUV9fzz9H6mOTk5PcViX/A8IWCIOOk8R86H9k21xeXs665lKpFAcPHkRraytu377NFb/w5ZbJZBgdHUU0GsWJEycgEokwOzubJ5tMLoSF7U6aTRZSOAujlOHR/fv38ejRI+5KFAtqxZrNZlZxFN5L6vrQS104+y3Wki22OD4JqKxY0DEJE7j9KN59nDl0Op1GXV0dpqen4fP5nqg9Lvy8UK2R1BWrq6u5yi1M+ADkSfBSZUUh3OwaGhpw+vRpbG1tYWxsjEVwCNdDmxRVmTQuArY342JVMiUBtOmRW2nhOGVhYWFfoL/CiriYYBEFjSBnZmYgk8mg1+sZS7QXW4bWhkL1yWJt+GLPITFKTp48iYGBAbjdbhZdk8vlXAScOnWKWTH0XUI56f2CjIXHJ7w2QjoqsJ0YrKys4Pr168yMKnWthW166qbmcjmUl5cDAK9hDx48wOzsLEQiEaqrq9lISaFQMLi3oqKCOxrAdvU/PT2Ns2fPcsJABkuUNEsk25b2lIh4vV64XC6IRCJ4vV4eJVIXOJ1OM+U2Go0ikUigtrYW4+PjUKlUePjw4Q7tnAsXLnxqbKf/v+IzkRw0NTXhj//4j/EXf/EXLJhBs7+VlRXodDqcOXMGJpOJKyHhnJbEQRwOB15++WUYDAb8u3/377hy7e/vx6VLl/J+J72UqVQKt2/fRllZGcvxyuVyHD16NC8xALY3L5vNhtnZWWg0Gm7z2u12RtLT91KHgNr5ZNFLSQ1VMuvr61wNDQ4OYmhoiKsRClpUVSoVZmdnoVQqEQ6H2cxEWMnTWMLpdHK7k2aYtOAQ2JDQ5SQzXGzzo/MptflRCEcCCoWCldoKsSASiQSBQACtra04cuTIjn8TtmSLzeafRONA+HPxeJypX4lEIq8Nud/qrBSLgH5HqTl0qXb3k7bH6fM6nQ4nT57M+x3FEj6hVC3pN9A9oYVYKpUiGAxicnKS8Q69vb0YHR2Fy+XCzMwMizDR/dlNu0D4zAgTn+bmZr5O9O/RaPSJki1hRbzbpknPMSkl7ieJK+xehEIhBvqWsq8WPofCLpRIJEJjYyMsFgtmZ2cxMzPDAOJXXnmFcQy7zf2F9263KNV1aWpqgsPhYO0St9uN69evM65Eo9FAo9HA6/XuuCYWi4VHYLSOCcGwhMNRKBRYWlqCVCplk7NgMMjJZCAQQDgcztP1CIVCCAQCCAaDvDY2NDTwKE6YMBDgW9gpzmazWF5ehs/n40JRo9FALBajpaWFC67e3l5873vfw5/92Z/B4/Hs0M65dOkS/viP/xjnzp3b8xr/vxqfieQAAM6dO4fKykoWzKBZfF1dHerq6tDU1MSodXoJqZo5d+4cstks7t+/z61Ul8vFm3t7eztu3ry5w8lOLBbDbrcjHo9jeXkZMpkMVVVVTEe8du0a9Ho9DAYDDAYD6xy4XC4W/NFoNFhfX0dNTQ23XyUSCZqbm6HRaDA5OQkAPA+mBOP48eNYXl7m7zh16hT8fj82NjYwOztbFCVO9rtkukNZdGHFQUhoWtCJUkkvJ7A9I6RFgarIhYUFJBIJFm6huTZtnruxDIStWOLLb25ucseCXn6SRn7++efz5qEUu4HKgO02+H41DmjhdLlc7C9w5MgR1NbWQiKRsOW20EWxVND1IbGhYrEb+K5Ye3w3jQr6/Pz8PObn53nc1d7ezha8woSw2EZCjpFUDafTaTYiop/LZrMIBAIYHBxkgOzS0hImJyfR19fHlW6p8cluiQxVdFQlA/mdsPHx8Y+VbO0VTqeT0fD7+d5ilEWFQoFAIMCaJcIRT7Fuj06n29EhLC8vh06nQ1dXF3f1yHJ5ZmYmz49DeB8pmd/LrKzYcQu7I2fPnkVVVRVEIhGrR9K50IZP32+1Wll7oaKigkGFKpUK58+fh9/vx9TUFD9XyWQSwWAQer0e586dQ3NzM9LpNG7duoWVlRVei6ijFYlEkEqlEAqF4PP5cPfu3byxDa01wv+ZTCbWiUmlUpx0rKys8JpHInUikQjBYBCVlZX43d/9XSwsLODtt99GNBotqZz7F3/xF6isrPyN7SB8ZpIDAGhsbMS3vvUtfPOb34TX68WPf/xj9hcnIQ56cYSI29raWvT19eW16K5cuYKDBw+irq6OnQLJgQ7Y3sBp5JDNZtHa2gqNRsOz/ubmZqhUKgSDQa7uAbBbnVwuRyKR4AWBWpEA8MYbb8DlckGn0+HLX/4yLl26xC6FmUwGoVAI165dY36uw+Fgu+i6ujq4XC7m+BP4i5IAIaWocMHI5XIMAqT/DzyuQnQ6HUKhEJtHUbeDgJwElhTaDCeTyTw6YKnNTzgSoN9FVrV0LlSFEWuh2Ia222ZDOgyFVXOxWFxcRF9fHy+clJzcuHGDqadNTU3weDz7ejYp+aEFjxbxwlb+buA7aq/29PRwoihcoIH8ithsNsPhcOD555/H5uYmS9ASUHS3IDCiXq/nhZ66LpTEUHVIgFfixPv9fty7d4+R5sLj2q92gVwuR0dHB3uSFCYwheDTYrFbslUqstks5ubmuOotpRtA31tbW1u0e0GW7isrK1heXkZ5eTlUKlXJbk+h+yeNM2KxGHc8NBoNDh8+jKGhIX52iLVEYGR6DoRdhWKJQS6XQ39/f9GuC2mJ3Lx5Ey+99BKsViucTicXOWq1mi3nCQxZX1/PyVBPTw8XFYlEAteuXcPv/u7vQiKR4Oc//zlu376N1dVVdk6Vy+WsINrQ0MAKq3QNuru7+djC4TCuXr2K48ePQ6PR5MlACxOAVCqFWCzG/18oIV3Y6RMWi5ubm3j//fcxMTGxq3ZOY2MjxsfHcfnyZXzrW9/a87n6fzE+U8kBBW1qxA0HkNdaIk0AtVoNrVaLt99+m/XghUDDra0tPHjwAEqlkhkL9CJKJBLMzc3BYDDAbDYzgGZ1dZVVBE+dOoXOzk7kcjmm6pCaINEN4/E4LBYLAxSJKnb06FEMDAxAo9HgC1/4An784x8jEAjA4XDwg062plqtFmNjY0ilUpicnOSRgpBbT7LN1dXVGBkZYWU1EhWh70wmkwgEAujq6spbTGOxGNMSZTIZfD4ftra23RiNRiM2NjZ4hqpWqxGJRJgaRAkVsRqKbX7FUNoKhYIVLYWshdbW1l0X+lJCOftVgoxEInj06BEymcwOhUGyIN5NhKlYFDMOKhb7wUPQpiyMUjgQwpLQbFWn0/E9p82PTHLIB4GSUOoYEegQ2H6P2trauAIjtgHhGYRVJrnyFR67sPK2WCzI5XJ7ahcIqZZAcdBfsXhSRUMC0gkZFLt97+zsbMnuBbW8XS4XjxhKPYeFTAtiiACP8R0ejwdXr17l48xms1z0kKaGTqeD2+0uOTYh2WmSI7bZbDs+U3iPSGqa/F1IZAx47OVAImzUYSJGEa1xb7/9NmKxGD744AMEAgGo1WqoVCq43W78zd/8DX7wgx/gy1/+MhobG9mDRiwWs/kSPd/pdJodb1UqFRdWwo4LFTNUABFzhrqvxajYwPY7RPTbW7du7amdYzKZcPXqVXzzm9/8jQQpfiaTA2A7ExfS14B8kBMAdj+8evUqI/sBMJ2loqIChw4dwtzcHJxOJ4DtakwoTnTq1Ck0NDTg4cOHePDgAerr65ljf+vWLdTW1qKtrQ1arZbBi21tbWwCQs5+9+/fZ9vlqakpeDweaLVaDA4OoqWlBefOncN7770Ht9uN1tZWVFRU4M6dO1AqlTh79iwUCgXefffdPKyBcGEmGmdzczPW1tbg8/lYEpda9TSzM5vNRVtldN2ENDqS1yVWQiwWg8lkQjabhU6nQyKR4G4AJVylNr9SIwHaxPx+Pyu17RYi0bb4UllZ2Y7NZj8gLbJEpplrYXycdjUlPzQ6oo6BcAMqnEOXCrVavYM2uRs9lIKAYVVVVXmKmvF4HCaTiYGVxE549tlnMTs7y+BWisnJSbYKBh4nqbSxzs7OssiUEMRKIRJtay44nU709PTkvaNCqmVhp0AYlGztxbd/UvDpfnQG6HulUimWl5d37V4olUoWD3r99dfz2vHA7kwLADuAoIUdH+G/EY16tyATpenp6X1TLbu7uxkzQM8QBb3T9J7Te0YdD+rWzs7O4uLFi6yESV0Oehbcbje+853v4Mtf/nIeWJQk2IVuprFYjKnOhclBYaJAPyMsEncL0nshjMduQeMRwiP9psVnNjkgJ0TKwoXtW7lcjs7OTng8Ht4gg8EgZ8O0Wc7OzqK8vByhUAhlZWWQyWTY3NyERCKB1WpFMpnEtWvXWNP90aNHmJiYQCQSwQsvvMCWq2tra+jo6EBlZSUnCcC2GBFpFzgcDhZYMplMWF5eht1uRyKRwODgILucEUKbZpYikQi3bt2CVCrFxMREyetRUVHBdMwzZ87go48+wvr6OovsbG1tIZlMssof6T3QiyrMtqmqp1acz+dDNpvlyj8YDPKckFqfwN6GR3uNBDQaDY4fP77nhkyVL1WMwip0r8Uhk8lgZGSE/TGENFAA3MWgze3s2bP7lnNtamrC3NwcvF7vDopaLpfbNx5irw2AgkYhwggEAhgZGdmxePp8vrzRRDqdxoMHD+B2u4t+t1ASW+h4SbgQkryl1nNh0HuZTCZLAvZ2C6LHPnjwIA/HUQhoLPW8lcJZ7EdngL6XFFNp4yqVeFISUyja9KTyyvsJ+h1UKRcLoqvu5SVB7142m0VDQwOGh4dhMBj43SCL52AwiEwmk3etqWsoFouh1+sxNDSEVCqF6upqVqalZ1AsFrPM9vLyMo4cOYJgMMjjX3rf6H6RTD1RW4WJhhAfRawLumfUnVlYWNjhQQFsJ90Gg4E7FaU6DBSJRII7IL+J8ZlNDjwezw7KF7Dd6vvDP/xDaLVazM3NYWJiAhcuXIDRaMQPf/hDRKNR6PV6aLVa6PV63Lx5E+n0tp99IpFAT08PmpubMTMzg4mJCYTDYfz85z/Hm2++iY6ODmQyGdy8eRODg4Po7e2Fw+HA+Pg4BgcHsbS0hM7OTrac1Wq1mJ2dhVqtxmuvvcaLbFdXFyKRCKRSKbq6uvDtb38b/f39PN6wWq2oqKhgY6aZmZmis29qNxoMBvYwf/vttyGTyfD1r38dQ0NDmJmZ4ZfN4XBAKpXiypUrnOGTL4AQUKVWq9HW1pZnbERyxSR9TN0D4fXfj8LcJx0JAIDb7X5isxsKIehxt8WBVCeJu70fypjJZEJvb29e8kMYj1AoBLVajd7eXpSXl++bAbFbtLa27tAYoHeiuroaEomE3fAoIaBkKpfL7QtoWUhtFfpp7Pbzn5ROqlKpcPbsWczNzSEYDOZ5ltAzudvztlvysV+lxKamJhYDomuxn3MViUTweDw7sArUadna2oLP5ys5uhLiDWgTFv4bUZMB5I0gCQNEzxwxq0oFHbdSqURraytmZ2fh8XhgsVig0WgQDofZ8bTwWlO1Tzih2dlZSKVS1n+h60+tfupUjIyM4Pjx48wmo+ShpqaGC5b5+XnodDq0trZyh4oSTXonSWmW7gmtnVRQjY6O5p0rXQ+St29oaMC9e/dQWVlZMkH0+/147bXXfiO7BsBnNDmg9hoB5dLpNNra2iCVSllxC9gGMGYyGUxNTaG5uRk2mw0qlQoGgwEejwcPHz5kd0GdToeXX34ZlZWVALYXV4fDgdu3b8Pr9eKHP/whTp48CZPJhPLycohEIty4cQOHDx/G0aNHUVNTg9HRUVy/fh2NjY1obm7G8PAwUqkUzp07B71ezw9hOp1GR0cHvv/97+PixYvY3NyERqPhBWZsbAyTk5Po6elBLpcrybHPZrO86a+srKCrqwsnT57E1NQU6uvr0dbWBqPRiIsXL2JtbQ0DAwNsCSyTyeDxeOByuSCXy3Hy5Em+XrFYDFNTUzz7JtaH2WzGqVOncOvWrT0pd7tJB+9HO79UfNJqjGhT1G0SbjbCEFYvBC7cq8UN5Cc/TqeTRVe6urqYRbCf79lPEDpcGLnctkIg6WtQ14CSsXR62y65rq4uL5kqVRUX/p1EIimpXSA8hielk1JQkhoOhxGPx/HSSy/hnXfeKfq8qVSqfXWaCkPosrnbc2yz2T6WH0NTUxOmpqZ2YBUkEgl0Oh3fA6HzYuF3lkpuhGqwFMLnWCqVcrI8PDzMm+Vux03X5POf/zwuXrzIRnFCsTjqngqPlcYQlGxSNU/HbzAYWE02m902V1Or1Thz5gwGBgYYFJpKpdDZ2cnaGRsbG4jFYuyzQOsfjSi0Wi0qKiqg0+k4IaANPJlMYm1tLa9zRF0HGku43W6cP3+exdyKaefMzc2hrKwMFy5c2ONp+n83PpPJgUQiwfHjx6FSqaBSqXD16lUcPnwYRqMR//iP/4i+vj6+qaTZPTY2hmg0CqPRyA99IpFANBpFdXU1vvCFL+zQ2m5ra0M6ncbk5CRWV1dx9+5dWCwWpFIpHD16FBsbG7h37x5LhT7zzDOYm5vDzMwMhoeHsb6+DqvVyjQtak+RytxPf/pTRCIRHD58GGq1mvUEHA4HNjY2cOvWLajVan4hC1XYqC2+tbWFtbU1vP322zxqWVlZQXl5OTMeBgYGsLW1hfLycgYDEXCtEF1OwB1hy44QwTabDefPn4fT6Sxa+edyOdy7d29fVX1hG7ZUK5hiPyJDAwMDuwIJyXJ2aGgIGo0mD/QkPF/yg6fZ535EkCjMZjMsFgt6e3uZiiqcy9MiXkypcbdrcPToUbjdbiwvLzN4q1TE43Fe/Ei0ioCJJGbkdDrR29uL6urqfYvpAJ+OR0GpICothclkwosvvsjJjdD7g8S3vF7vvrtOFPvtYH2cc52fn2dQMLGJCIBI0r6U3DwJ00IYtBbQ+05Jr16vh8fjeeLj3tragtFoxPnz5zEzM4P5+XnusBU6YgqTHbPZzGJNcrkc7e3tCIfDWFlZQSaTgcViQSgUQiaz7fRJMtAKhQJ+v58dRC9evMiJod/vBwDU1NTAarVyAkCYrcLIZDJwuVxwuVzY3NyE1+tl3I6QvUbdi+effx4HDhyAxWIpqp3j9/tRVlaGP/qjP/qNpTECn9HkQCQSoba2lv9sMpngdrtRXV2N5uZmTE9PIxAIwGg0QiQSoa2tDZubmyxSQ3+vUChgsVigUqlw+/ZtdHd3w2635/2uAwcOMJ2PZvhqtRojIyNQKBTQ6XSYmppCMBjE4cOH0dLSApVKhZ/85CeQSLbtdz0eDxobG7kSDYVC+O53v4twOIzKykpu25PzIW2oIyMjWFxc5JeysOLM5baNfiwWC/x+P3w+H78QJCEqFosxMzODSCQCh8PBGxJt+GKxGBaLBRsbGzuqGNqkSoGqnnvuOUbHSySST1zV7zWH/rgiQ8IgOezZ2VmmjwpDLpfD5/PBYDCgqalp19nubkEJRylQGHG1Se4beDzKKKQ/0vkB2wpyhw4dwvDw8J4bus/nQ39/P9Lp9A6DIJLSvnXrFl566aWS10uIKaHj2m/l/aQVfbFIpVKcbFksFvT19UEikeRVtvt5vorRSvfTwXpSgSpge1ZNyQbwmEJMMuQej4fb6UK9kf0EfY6eSWIPUYVPG+vHOW6VSoWDBw/iwIEDsFqt8Hq92NzchFKpZHo0nY9KpUJ5eTl3QOidAsDW4LFYDMFgkKW9fT4fWlpa8Itf/ILZM6ROKZFIcOzYMeh0OiwvL2N5eRlHjx4teR1yuRx3PomCTgJrJDuv1Wrhdrs5MVAoFDh79iwOHjwIYKd2TjKZ5BHwU4XE35IoKyuD0+lELpfDyZMnMTs7i76+Prz66qsAtqsoUswiJH53dzd6e3sxNjYGl8vF1XVdXR06OjryQEg9PT24ceMG0xvFYjHOnj2LpaUlnulOT0/D4/Hg+PHjuHr1KgwGA55//nncuXOHq4jGxkYolUoMDQ3hzp07qKmpgdFoRDAY5K4F/d5wOAyZTIaZmZkdtEMKGjkMDQ3xTE0ikcBgMLA0rpAvXmg8RO1yatUtLS3tqGL2u+F/HOngJ4lPk/duMBjw4osv4sMPP8yzsCVwlsViwVe/+tV9ocN3C0p2JBIJbDYbd4aAx6j0Qg0EGpMRoE/4XQ8ePNj3785ms5wU7uYc6Ha7sbq6WhIHUarF/WlgR54kPB4PBgYGkMlk8lQNJRIJ9Hr9rjP8YuchHKMUdrA+6bmKxWI2OxOCAgvZF7vhMkp1kAoT1VIuqk963NRNdDgcOHz4MOx2O27duoVwOFw0OU6lUmyFLBaLceHCBczNzeH+/ftwOByIxWJ5AHCq5g8fPozq6moGSldWVkKhULAXCZnVkXJjYccjFAphZWUFq6urDBi0Wq0su65Wq9HR0YHR0VGIxWJ4vV5ks1mo1Wo0NzfvUF0Vauc89Vb4LQxiBQQCAZhMJrS3t2NsbAwejwepVApDQ0P8ICsUClRUVKC9vR1KpRJHjx6F2WxmJoDT6YTH48GRI0d4HKBQKNDT04O+vj72Jrhz5w5efvlltLe3Y3l5GdPT01haWsJ3v/tdiMVifOUrX0FNTQ2y2Sz6+vowOTkJp9OJ1dVVRKNRbpPRXI68BkhcZXl5mcWNdqssqAVObUZyzqM5H1UxEomEN6TCRYc2wGQymfe7nmTD/zSq+t2ikPde+DuEgLn98N4dDgc+97nPYWxsLG/hbGpqQnd3N4sCUZAj3n67CLTA0HELnTMLx0PAdqVHQjn7lcbdLfZKpmhzVKlUmJycRHt7+67Xi+bawvGI2WyGzWZDd3c3L6y7AeCEQUqM+z3PUs8XXcf9Pl907Z9kjAI8GU5GIpHA4XBgdHQUer2ef1dhskcz/2I+EHtdF6qEizFphMm/3W6H3W7f13EHg0F4vV4sLS1hcHAQMzMzvFEXPkPC59dkMiGRSODUqVMYGhrC6uoqdDod0wWj0SgsFguOHDkCpVKJXC7HonOTk5M4evQoHjx4gNXVVVZnpM6mQqFALBbjsUE4HOY1XCaTYWNjA+vr6zAYDDhy5Ah7JQSDQdhsNqamm81mHD16tKRuxicBz/6/Gk+TA2w/nERDNJlMOHHiBB49eoRf/vKXrPSXSqVgMBhw6tQpllI+fvw4bDYbGhoaYDQa8eDBAxaVuXXrFnud0+Z28OBBXLlyBTabDfPz87h+/TqeeeYZNDQ0oL6+HlevXsXAwABkMhlu3brFOAij0YiOjg7cunULgUCAgTkkVEMmJLnctqQqcZVJSa7UQ0u0LKIOeb1eVFVVobq6GhMTE0xBKsbrFi4gQPEqZr8bPunrl9qI6O9KVfXFNksK4tgrFIq88xBSEIULqdBcZrdIJpNQqVQ4duxY0YUzm83CZDKx3TYpcdIYplRFRVHIFScaIVBcM9/v9z/xhrVbEEOhkHcvVPIEwDr4pZIpqnxJDEdIa/T5fCzf/KSskSfpyNjtdiwtLUGj0TCYtDD22zX6pGDQvboMFDTzJ1qrMApn/sXuO40byH+FMAtCGqcwMaDETWjDDTxOSPZz3CRb7HQ6+bsOHTq0a3ud2ASxWAxNTU341re+hWvXruGXv/wlPB4P5HI5fv/3fx/PPvssM8DIMEyj0XAnQCqVYmFhAW1tbayxMTc3h0AgwNbr5eXlaG1tRTwex8LCAos8nTx5EgaDAVNTUxgcHOS1IpfL4Ytf/CKmp6chk8lYzfOzEk+TA2wvDDabDZubm2htbWV3LRIwsdlsjBJWqVRobW3FvXv3cO/ePZ67mc1mnDt3Dg8fPoTX64VWq8XU1BQ2Nzdx+PBhaDQa1NbWsqhQfX09xsfHoVarcfz4caytrWFqagodHR1obm7G/fv30dfXB7PZDK/Xi3A4jKqqKrS2tmJwcBB2ux3Xr1+HwWBgWWbi+1MXIZ1O71rRERCJOMO5XA5ra2vMCyfRG2JOCBMCatnR3yWTSRw8eJCrmCdt4wuFTAo/Q/8tpWa324JNLdNS/HThYkmAr0OHDj0RwKvUwun3+xlv4XQ6uQPT2tqK2tpa7iwVi0KwoUwmY9W7YsyA/Yi3PEnyQGI/QtOtUm1qqVRaMplKpVIM1ALAbnzz8/MYGBhg45xPg8NfLNRqNTY2NpiiV+pZpGN7ErXEX2UIZ/6Fo6vdcBmBQAAzMzP8TjkcDrS0tEChUMBsNu/JKiHTtL3AvYWxuLiI/v5+xONxKBQKSCQSxONxXL16ldfJ6upq/rxEImEqYyAQQC63LcVdV1eHr33ta0yjPH78OHp6egBsU2/D4TBWV1eh1Wp57QqFQkgmk1hZWcHc3Bw2NjawsrKCVCqFmpoaHD58GCaTCSsrKxgZGUE6nYbD4UBPTw8MBgM2NjZw/fp1pFIpxkqo1Wo0NjaivLw8j0r6WYqnycH/jbKyMgwNDXH2SPrdarUaX/3qV3Hp0iWk02koFArGEdy9excDAwM4efIkjEYjFAoFent7MTU1hZmZGUYV37hxAx0dHYwRIMWsqqoq3L9/HzKZDIODg+yqJpfLUVFRgbt378LtdsPv9yMWi6GiogJ6vR4VFRXIZrO4du0a7t27B5vNxmjftbU1NiDp6OhAd3c3zyoLX/ZUKoW5uTle2BsaGnjEQSh7YHv2SN71hFwmAyRyftRqtXmo9SeRr6VxRjH0vfCYPwn3XSaTobGxcQcCO5FIsOQr2bQSxuSTzr1L4S3u3buHiYmJvA1wr82bpIuB3RMB4aJOVFJSoNxPgiCkkBIro1SCl8ttq9GRQl6xoAqVKHIAsLa2hr6+vjw1PIpPA18iDJL+JnfM3Rgae3XannTD/CQhEolYQ4SE0PbCKjidTgwNDXGyL5VKGUitVCpx8uRJNDQ0QCKRoKysjFkABGIVJsrC2O25oY4jsZna2tp4FKnVauH1euHxeHD79m28/PLLaGtrg8/nQyqVYiA1jRAkEgk+/PBDxONxJJNJZiQIj+O1117DD3/4Q3Z7BB77Tng8Hnz00UdoaWmByWTC0aNHYbfbmf0BbDMYGhoaoFarkUwmeRxhtVphMBjY5M5ms+VJQH8W42ly8H9Dr9djfX2dueVWqxVdXV2YnJzEwsICgMfOXgAYHdvf34/+/n6cOnWKtQja2tpgMpkwODgIqVQKk8mEkZERrmDa29uZRZBKpXDp0iWoVCr87u/+Ln+/yWRCR0cHrly5ArlcDrvdDpVKxS14tVqNV199FZcuXcLS0tIOtcDy8nL8p//0n1BfX4+f/exnSCQSeW1EmUyG5uZmLC4uIhqNsmY4tQOp1UfHIhTnIRc9v9/PoJ7jx4/DYrHkLaz7lZmVyWSora3F6OjoDj44jQw+Cfcd2O5smM3mPAR2LpfLU76UyWQwGAyYm5vD6uoqent7P3b1+qQAy086EiBBK2GCJVRx263qIdGdQkaJzWaDTCbjZIrsdUkGeb+UQ+pi0bMwOzvLLd1fBb5EKABEyoMfR2+g2Gd+XUEMBbvdjgMHDrCtdamZP23Q6XQatbW17DsAgDfZO3fucIERCoX4/SQao0gk2mHwRMdSKpRKJSsGOhwOpFIpTshIo8Nms8HtdmN2dpbfJ2J+kHuoRqNBd3c30uk0+vv7maGwvr7OnVwAMBqNOHToEB4+fMijUxK5kslkiMfjMJvN7PI4MTEBuVyO5uZm1NbW8thkeXkZ4+PjEIlEaG9vh8vlgt/vR3d3N2pqajA5OYmVlZVP4U7+5sZnMiUSImEBYHNzE5cvX2aVw6NHj+Ib3/gGnn32WajVas6KqQ1GIZVKceLECajVavT39+d5Ctjtdpw7d46pbdXV1fD5fGzv29PTwy8igbSEG+nKygqGh4fR2dmJjo4O+Hw+yGQyVlnM5XKsr9Dd3Q2ZTMYvWldXF06fPo1wOAyDwYCTJ0/yIklBqHbgMYCNjoH09IWLQl1dHV566SUcO3aMZ6Dk2/DSSy+hrq6OW/PCBXk30BgtyOQPT/S4wnl74Yy11EZHVdBuYwY6j6amJsZUkIFTbW0t7HY7LBYLkskk7ty5kwcEfJKYn59HOp1GfX19yQ0wGo1ibm5u39+52wZPC22pkEql0Gg0sFgsO9gHCwsLuHz5MoaHh/OYDnNzcyxUs7m5iXA4DL/fD7/fj83NTe6UPckGnslkuJLda9y0tLS0Z+epWBANVHg9Ghoaij5f9PlPoq3wcWO355WSG4VCwZLshfgPYTidTqb2UbIvBN/S8zY6OoqtrS1Eo1HEYjHodDqmGhZLDID85ECpVDIGiirw+fl5yOVyZLNZpiySMRXpf5jNZqysrDDug/QbEokEO3lqNBqWCFcqlchms1hbW2MsVyKRwNzcHON3PB4PbDYbj0wIpHrz5k3Mz88jEAigs7MTL7zwApqbmyGXyxGNRtHf34+hoSFOvGZnZ7G1tYXTp0+jpqYGwGNa8KclOPabGJ+5zkEqlcIHH3zAVeTY2Bhb7xqNRt7UaeE6cuQIPvroIwDbWWshmlomk6G3txd9fX24c+cOTp06xbRCtVqN06dPY2xsDEtLS7BarZDJZKxMZzKZMD4+joaGBqRSKVy8eBFf+tKXEAgEMD4+jpqaGnR1dWFjYwNerxdOpxN+vx9WqxUHDhzA8PAwYrFYSVDc4OAgpqenYTKZeOOmiMVimJuby2slCqloxUB+ZrOZdRsoWWlrawMATE9PA8COBXk/QiodHR3QaDTMfXe73TyHLjZjFVKUcrncDh0FhUKBpqYmVFdXF924yCXTaDTCYrEUNeD6JNUr4S0kEsmOBZfat/sFwAljr8q18N8VCgWOHj2Khw8fMpNEmMCKRCL4fD5OfktZ82q1WpSXl2N1dZWfsY9LOdzvuIlsv4uNmoRBoz+hFG6x+Di8/V9V7GamRL+fEmcyptotMpkM5ubmePxDm7Iw6Hmbn5/H4cOH2fRIo9EwXa9YEO6IgkYG8XgcBoMBXq83j2JJqqtkSkQeBTTC8/l8qKiogMlkYqosySyTzLter+eO2+rqKoaHhxkUaDAY4HA4cPToUSwuLgIAUz5JB4LEl0iYia7h/Pw8pqenoVAocOLECfh8PgwODqK8vByHDh3K63oSjosSqM9ifOaSg8nJSbjdbng8HjidTmxsbPCIoKOjA/39/QgGgwwWO3jwIPr6+hghW4xqRfLBt2/f5hEDqRlKJBJ0d3fDbDbj/v37yGaz7DEwNzfHYhtdXV24cuUKfvjDH6K8vBzt7e1oa2uDSCRieg5VdfF4HNPT04hGo7uiiSmTj0ajeRsHGUtNTU3t2CxINVGr1SIUCkGlUuVV/yQvTSj06enpkhWgxWLBmTNncOvWrV03fEqm6urqYLPZMDk5yVVrqY2Ijqdwrk/AyocPH2JychInTpzYMRoo1G4oDCE7Ynl5eYcz4F6x2wYovA+/agBcMplEf39/Sa2BXC7HLX5qCQPbG0A4HEY4HEY2m2UPhELRqo8Tha6GhAovTESJp17I1Ch2DrQB7Sa5Dfz6tRWKxZMIfZGd8F5R+LyVSiKFz5tSqYRarUYgEMijGgopvTU1NVhfX+eNHQCvQ4uLi7yZkikbjSeoyIrFYuytEIlEIBaL2dp9eXkZEomEdVoymQyGh4chk8nY+4G6VvF4HBUVFYwJ0uv1aG1tZcBvLBbDxsYG2tvb2TRMJpMhFArhxo0baG5uxsbGBsLhMBoaGlBbW4uRkRF4vV60t7cX7UbSmhSNRp8mB5+FCIfDmJiYQC63bRqTyWRQUVGB1157jUF+UqkUbrebkwOJRIKqqipMTEwgEAiU5GErFAqcPHmSOwinT5/OEzCprq5GOp3G5cuX4XK5GPBYUVHBEsv19fW4d+8ecrkcGhoacOfOHYTDYYRCIczNzXGVFI1GeWZeKMxSqPUv/C9VFVtbWxgfH2dAEPGChXQnYdLwpBWrMJqbm6HX61lSda8F2eFwQKvV4tChQ3vyqkvN9UlEppSwTanNmxbreDzO/55IJEo6A5aKvWx9qV1M/gu/Sn50obaAMChJksvlnBiEw2FsbGwwQIx05efm5pBKpXDq1KlPxCIonP8D2NG1Ebpz7gcMtp9KnMJsNhe16v51xG44lN2EmChBLxVPYiNNgN50Oo1AIMDGa9S2J5dDmUwGt9vNzyjweNRBWBRSFiRNBq1WC5PJxImeXC5nKnEsFkNXVxdLQQOPuyNyuZy7RKTUSBoatbW12NrawmuvvYZsNovZ2Vncu3ePW/7JZJKTnvPnz7PdNFFsXS4Xu9q+8MILyOVy6OvrQy6XQ29vL6xWa9FrRYyLTyJi9psev3XJQTqdLqpUlcvlMDQ0xGqGNONqbW1FeXk5gO2FlCiNzc3N/LNUuXs8nl0XK5VKxR0EGjEIkwmZTMbiHW63Gw6HA4lEAm63m6sfAg+RVrhKpeIXoKysDK2trQgEAiy2RG1XOpdcLoeJiYm8VmBhoiCVSlFRUYHm5mZ4PB7E43Fsbm7yyy+UOn0ST4DCkMvlEIvFaG9vZ+fHvRZkQk7vh1dNOgrl5eU7cArAtpJhsdFAqcW0UOTp47Ij9gOAi8fjCIVCuyL9P43YrS1fmCQlEglsbGzwwkz3gTZswmF8XBaBVCplue+5uTn4/X6m11EUc/DbLfZTidfX1/PnSTqZkp9PK/bDBNlN94P0Soo9r3tZAxO4eGhoaIcqIEUxwCUVFyRVrNVqkc1modVqkUwmmb1B74nJZEIqlWJp+YaGBojFYkQiEczOzsLtdjOGx+fzMa6AqN2En1pcXOTOEP2X2AsymYy7rjKZjO3eBwcH0d7ezvLRyWSSRwZE9x4aGmKbbJ1Oxx0Jwg/cvn2bFUyPHj26a8JP+4OwSPqsxW9NcjA7O4srV67g6tWrjG597rnnWON6YmICt2/fZgRtWVkZstksJicneZYObKsljo6O5lnTxmIxVFVVYW5uDuPj4+js7Cx6DFTxlJeXY2hoCP/0T//E1MVYLIZwOMzKeZSZU6udFuiqqipUVFRgeHgYlZWVaGhowNLSEqLRKO7cuYN33nmHlcgaGhrgcDjQ3t6OqqoqbG1tYWpqatcKQiqV4mtf+xpGRkYwNTWF06dPQ6VS4dKlS4hEIrDb7cz3B/I12KnrsF9KF83/aIPaz4a/32REOBqgKDyuUnP9vTQPhNVrW1vbx9pECG9BqpvCeNINsPC8P62KtzBJCofDrDEPPHZoJICZ2WyG2+3+2CyCra0tLC4uQiQSMftFyOEnMzOtVotTp07t+Ts+juT21tbWDnOmJ4lEIrHj2hNllBwEi92fvXQ/CLj3ccyUstksGhoaOOHar8ETqRlSV4g6Ls3NzQxc9Xq9vAaQWBpptQDAoUOHsLq6ilOnTmFgYABut5sLHKrstVotXn31VVRVVbH7ayAQwNLSEncrCbcg7F4ajUaYzWbMzc3h6tWruHXrFjQaDcRiMcxmM/R6PeRyOWuI3L17F93d3UgkEkyvrqiogM/ng8/nw8bGBhwOB5555pl9dQI1Gs3TzsFvely/fh3f/va34Xa72R0rFovh+9//Pi5duoTXX3+dDTR0Oh1sNhvPv+LxOFwuFycHZWVlyOVyXNlTdWWz2bC6uoo7d+5AIpEw9Y+QwcTNpchkMqw3UF5ejsrKSgQCASwsLKCqqgpvvvkmwuEw3n//faTTaVy4cAHLy8ucrJw4cQJ37tzB2toaTCYTvvOd72BpaQkNDQ1MVySpUaImUVuucOOWSCR5Hu7vv/8+NBoNgsEgVldXGUGcyWTg8XiKXuNCitxuIdykd1Mv/CQhrHpL8bOB0nP93cCSws1bWHU+SXxcEZtS8SSt8/2GMEkijEnhhkR4AIPBwOOaj+sEKIy6ujoYjUbMzs5icnISXq8XiUQCKpUKmUwGGxsb0Gq1u55bsUpcCPgk74f9JDPU2qZKUfgsCYWsyC658Nr7/X6MjIyUvD9PovvxcXAoBoMBPT09+wZcLi4ustsmKQJmMhmMj49jfn4en/vc5/A7v/M7+MUvfsHrBum8yGQyFokjIHJtbS2OHTuGhw8fYmxsjB0Um5ub0djYiJqaGsaHuFwumM1mlJeXIxgMor29HcePH8fU1BTu3LnDZksulwurq6us4aJUKlngDdguPiwWCz+7brcbH374IQKBAJaXl7G2tgatVotgMIiqqiocOHAAkUgEH330EU6ePMkd41Kh0Wiwurq673vw2xai3K+TvPsriNnZWfzH//gfEYlEivpqP3r0CKFQCF//+tfx4osvoqqqCn6/HxMTE/B6vSyD+y/+xb9AKpWC3+/H7du3IRaLodfr4fV6GYRHXG2VSgWlUgmFQgGVSsU+B3q9Hnq9HiaTiaVz79y5A6PRiCNHjuDv//7vkUgk8Id/+IeQSqXo7+9HNBqFUqlEPB5He3s7lpaWMDU1BbPZDI/Hg5WVFdy8eZM55kajEYFAAIlEAgqFAhsbG5DL5Thz5gzjJAhYKFTVo020pqYGiUQCm5ubAMAzR7VaDZ/Px+ZLsVgsr91b2GYjpTthy5EqT61Wy/NLAGzt/GnOeDOZDN566y2k02m2ai0WoVAIMpkMb7755o7fW6wlXbiYflKVPp/PlweAUyqVqKioQFNTE2w2276+g46z0DY5Ho8zy6OhoeFjaSV4vV5cvnyZrWbFYnEesI2cN6urq1mnPpPJ4Etf+tIT4TB2O7e+vj5EIhGo1Wr2thCeW7F7UOr+F+o9RCIRKJVKfPnLX953kkoIfZFIhKWlJdy6dYuNfajDIXxGAJR8jugcqqurn+h5/cpXvpK3lpWy6C6MwuetWCJD9zyVSu1IjElGXqFQ4LXXXsvzdqDnIJlMIhgMIpFI5BUBtbW1UCgU7D5La4kwaB158cUXUVFRgenpadTU1LB6YjQaxQ9+8APGQwjB0HRfqQNJdFVhAbK8vIw7d+5wQUfJLXWMz5w5g4aGBmi1Whw7dgwtLS0lwcZLS0sYGRnBq6+++pkUQvqN7xxcuXIFbrcbBw4cKMonb2tr48qopqYGd+/eZV1toWLa3/zN3/CDnEwm2UucwGNarZbnWMlkEv/yX/7LvJZ2YZDrWFdXF4aHh/GDH/wAsVgM7e3tEIlEuH37NnK5HJ555hmo1WpMTk5iYmIC5eXlqK6uxvT0NHQ6HdbW1uByudDd3Y1wOIz19XWeb2YyGZSXl2NmZgZOp5Mdw2iBpHke8Ljy93g87N4nl8sRj8cRCATYupSEQSKRCOrr69He3o7y8nKo1WqWVgW2F2eaSZMugE6n47k9Adk8Hg8WFhY+ln7+biGRSNDQ0IChoaGPLWyzF3rdarV+YnEiktauq6vDzMwMVlZWsLCwgOXl5T2vg0wmy2udOxyOPGS/sHVeWVnJAi9PEtTh6OvrQzqd5utIz5dUKoXdbmdw7SdRqSwMOrd0Oo3y8nJmyhSeWzGMQ6lKvBDhT1x6SsL3E9QB9Hg8rOQo7E6oVCo+vuvXr3O3Yq/Rxv/H3nsFR3pf2eGnc6MzOgDdjZwxCWkwmTPDIJJiEBVXXq/lXW9Z5bW8tbYlu7b8sn6x/WA/yC6vy7JV3tWupVXiiqREUuSQHE7CYAbAzCANMtDIjUbnnMP/AXsvv240wlDU/s1wq1gkgUb311/4/e4999xzDivE1NHRwTokdD4Oex+azWZYLBYmXMrlcuh0OkilUgSDQQA7iMteIlT5fB5GoxHb29uYnZ1l6WI6PhofLA2RSISNjQ1YrdYirRPh76ldF41G8eqrr/KaHAwGMTs7y2qlxAk7c+YMamtrcfPmTWxubhbpstD6Q60vYAe9GRoagkKhYGdHhULB69fS0hIryuZyOdy6dQuBQAD9/f1lER3hOKNGoznU+f8kxcc6OchkMrh27dqu7FcYRPT58Y9/jGg0ylbEpWEymXD8+HHo9Xrk83lMTk7iiSeewPb2NhwOBxQKBSwWCwwGA1577TWMj49z1VAutre3MTo6Cr1eD7lcDrfbDb1eD41Gg9u3b7M+AiUYR48eRWVlJe7fv8/+BmazGQsLC6ioqGB4i0Z56AHR6XRoaGjA1tYWP5B7VRhisRgdHR3QarXI5XKQy+VYXFzE8PAwbt68ycxkIiFNTExgY2MDL730EtRqNTOZhb7sYrGYZVhbWlrg9/vZVIgq3mg0euDY1oeJpqYmLCwslG0NADhUX38/t7xys+JCXsJhN+JHGV8TRj6fx8bGBkPnOp0OwWCQ5aaF0PnY2BhOnTp1qOMpDUqS3n//fda+oDEznU7HicFvqlJZGsK2gDAxAA7WmvgwDP0Pc3yRSGRf4zCHwwEAu1DLct+hnHw3hZAX0NzcvEvuXHgv7nfvldpIC8cQgQ+4D3uJUNGmS2O8p0+f5h5/S0sLlpaWGHWkoER9dXWV1yFaG4S+HHK5nKcIstksotEopqenIRLtyLFLJBIWU8pms5xUyWSyXfcHvacwiONDbrZWqxXZbBY+nw/hcBh2ux0OhwP5fB42m40FloLBIC5evMgiWQMDAzh37hwnBOSC+2mLj3VykEgkiqQ19wqpVIp4PI5AILDna8nOk27SYDDI/Xe62d1uNywWC6RSKe7cuYNCocCLPS1WtBBtbGxwxUKktGw2i4mJCXR1deHs2bO7xiItFguroKnVamxubiIej/MDQ6OHMpkMWq2Wpyu2t7cZ0TiIgbuxsYFMJoPKykrYbDa0t7fjr//6r1lemJILuVwOvV6PYDCIN998E//8n//zXX7yANjWGQAWFhb4OH0+X9mqC/jo9PPLCdvQmFYymYRarS7qs+5H5jsMWfLDdOA+DGmOIp1O4+HDhzyxMjc3h3A4zD11nU4HvV7/kfAAjEYjnnjiCaTTab4XaFEm8yXavDo6OhjWLXdOhFXiXlFK0NvrffZz4iytxEs3298kmcnlcixLvp/GRTab3fe+oPFj+g7C+5XIdcQhEt6v5VogtNlS26P0c8u1HoSVtUgkYoLpftwH2sjT6TS2t7extbXFU00kq93Y2Mj3Kyke2mw2uFwuPkadTodAIMDtNGqLSiQSmM1mPHz4kMWriIhI7p1yuZytystZUpeGMOkhS+1oNMq8lXg8Dq/Xy6OM/+Jf/AuMjY1hamoKc3NzCAaDeOyxx/CLX/yCfUxefPFFSCQSniT7tMXHOjmg3v9BjFLa9PerHkhhi/poJM8phPVCoRA2NjaQy+WQSCRw/fp13oyFixNl6+l0mjNxYv2KRCKMjY1haWkJYrEYwWCQM2fKqEkyld6D/A6I5EiQbyQSQSKRQCwWO9S8PJkkATu9WDLAcTgcqKmpYdER2nwkEgmroF2/fh0nT5488P0pDrJrNhqNByoQHobMSMQ2cqIrp6Pw2yDzHTZROKxtdbnzQNB5Op2Gx+NhkhptElQREdfkNxVTMplMOH/+PO7cuQOPx4OKigqGt6l6Onv2LCNXxG0pXbjLiS6Vvu6jIOiVkkpLj+E3kUQmYZ/9jo++DyVC+7mf0nf4sEJMJLVM/J29jnm/oOKC5LH3C5rWuXr1apHMst/vx/r6Oubm5hjxEk61kFARgCLlRRpVpH8Hg0HWEiB+VjAY5LWcpmPS6TQXRz6fb99jpvuJjp20G0ixUaPRIJFIwOVy4fbt2+jt7YXdbsfg4CC2trbwwx/+kFunc3NzOH/+POvKfBrjY50cyGQyPPHEE/jRj34Eu92+Zx8vFouxQxfNzZYGQWdGo5HneTc3N7mCdjqdTGRJp9MYHR1FKBRCe3s7j+xQv5PY1rTJCitu4ciWWq3mh16oBU83o1gsLqqOaLPc3t7m70qcga6urkNvDFRBpNNpLCwssKOksAoSVhwymQxjY2NoaWk51GdQ1aVSqfasunQ6HSKRSNmq8FHH9QwGw54S0h8W0v8o4qDxNWD/6pgqJtLXKMdxSaVS8Hg8sNlsHwkPoHTzohG37u7uXZuXVqstmsHfq7oTbmz0/T6KtoAwmfmoJZFpvHi/DZdIagShH/Y77NfKKo2DEttHteI+jAYHEQGTySTkcjna29uZ/6LRaHgCYHh4GEajkW2h7969C4PBALFYjN7eXly9epXfs1AoQK/Xc+FUX18Pk8kEl8sFr9cLm82G+vp6Tj6y2Sw8Hg8jCXudH+JXWa1WtltWq9Wsy0HXLx6PQyaTIRqNQq/XAwAf/6VLl/Dyyy8XyccnEgmMjIzAbDZ/lhx8XOPpp5/GlStX4HA4yk4rLC0tob6+Hv/m3/wbqFQqLC4uYnR0FNFodJeUrdvthsvl4k2d2LY2m43ndRsbG6FWq9HU1ISf/exnqKiowJNPPslEMRIJ+du//VuIxeIil0WyKiVVLplMBpVKtetYRCIR9Ho99Ho9YrEYFhcX4fV6mbRFbQ4iDup0OrS2tvKEArBTmZUSs0QiUVHFRw8ckRf3qtIfdbwqk8mUZSoLg8bmhO/7m1b4pYuIz+fD3bt3kU6nUV1dXfTaj9oauFzsVR2Xwuh7nV8y20mn03sy3OVyOcLh8L6mPPt9drmgBZ82L9K6Lw0i7FJlmUqlWK7bYrFgfHx83+u53yZFPeZybQFKuLPZLJqamlBbW4vZ2VnMzs4y8tbR0YHW1lZGVR41Ssc890ruDkI+9mttHNTKOiixPX/+PBoaGh75uwk1OAwGw641MxKJMO/EZDKxTgv9TCQSwWq1YnNzk9Grt956CxUVFTCZTHC73ZiZmeHX0nqVTqdZdwDYuY719fUQiURIJBJoa2tDV1cXRkdHUVVVBY/Hg5mZGZ50KhfU2jp79iy2trbwve99D36/n8czDQYDKioq+Dr4fD40NTXB6XTCYrEgEAhgcXGxKAEg5GtychJPPvnkZ8nBxzVaW1vxne98B9/97ncxNTXFOgc0mlVVVYXnn3+epZLr6upw8uRJvPXWW+zGZTQacfr0aSgUCsRiMbhcLoTDYWxvbyOTyWB7exvpdBrXrl1jQxgiGk5OTqKurg4GgwEGgwEqlYo9Cwh1OHbsGGZmZoqy2KqqKiwvLxdt9KTnbTQaUVFRAY/HA4vFgt/7vd/Dyy+/zJoEKpWKVc20Wi3Onz8Pg8HA6EMpmQn4wKmOgkYxiQtB8DHJ+goXYPo9Mb/3qnSo4qdxuEepCn8bFb7D4UA0GkVVVdWuHvlBkP5HEXtVx6XXZq/qmCpu6v+Sra7wfejnJCe732YjbEns19OmhJZaVaWJASFYy8vLMBqNSCQS0Gq1rJCXzWYxMDBw4PXcT2sil8vt2RagxVsqlUKj0SAajeLy5ct48sknWXuElPZ+E4W7wxiHCXUODis+dJg4iKsSDAYxODgIrVb7yPfuQSZUtA5pNBp+pqmgAHZY/KRC+/DhQxw5cgTAzjWLRqNQq9WIxWKorq7mkUeanHjuuecwMjLCjojAjpDSwMAAvF4vOjs7MTU1xc+OxWJBOBze0zFSJBJBLpfje9/7HmZnZxnBpcRka2sLSqUSR48ehdfrhdlsRnt7O7a3t+F2uyGXy/dsS8fjcczOzjJJnaSfyynwfhLjY69zQLG0tIR33nkH165dQyqVgkKhYIXEoaEhuFwuhr/q6upgNpsxPT2NGzduoKWlhRmyRqMRtbW10Gq1GBwcxMLCAmpqarC9vc2OgOT+tbGxgfv372NtbY3h4f7+ftjtdshkMlitVvT392NiYgKzs7O70AGJZMfWlPgORNRpa2vD6uoqNjY2IJFI8OUvfxlerxff+973MD4+DgBMRmtpaUF1dfWefUhgZzGnG1kikfDmL5fLMT4+jpGREeh0uj2rys3NTR7rK1cBlqv4xWIx/H4/ampqysKeRPDs7u5Gc3PznnPXtMDK5XI8++yzh14IS+fgqRdZeiz76SAIg1AZ2sj3O9/CGBkZwfj4eFnOQel5OHXqVNE1SCaTeOWVV5BKpRAMBov8DoSjhtQWKqc9QK2JQqHAJFaRSFTWipqEspRKJVKpFCd55b7rfgiE3+/HlStXDnU9w+HwgVoTTU1NDB8flHB+1HEYLQxgb52DD6uXUXrfCPk31MbY2tpCT0/PoadUSq9ZIBDg9pFQ3Km2thbXr1+HQqGAWq3mokEkEsFkMrEmilQqhdPpxJe//GU0NDSwLgQlbk8++ST8fj9mZmYYSTx69Cjkcjm0Wi2fu0KhgK2tLdy8eRMSiQQbGxtFipHxeHzfJI90G0gam4jcGo0GMpmMDcROnjyJP/uzP0N/fz+mp6cxMzOD7e3tfZEBsViMnp4e1NfXY3BwcE8F3k9ifOyRA4qWlhZ861vfwje/+c1dmR1pxpM4x9TUFEwmE1paWvBHf/RH/OC5XC6sr69jcnKS4XuxWIxjx45BJpPh5MmTLMU5NDSEX//61/B6vTxLnEgk8Otf/xpKpRKPPfYYVCoV3nzzzbI3NtmPCkU8ampqoNfrWaCpUCiwpWomk8Hzzz+Pjo4ORCIRKJVKztBJ1lTYKqCFRCwWQ6PR8KZWVVUFg8GAsbExAIDNZoNEIoHf74fRaCxaQOihjcfjCIVCUKlUTGaiCrCpqQnLy8u7KkShVHQpH6S0olpaWvrQpL29ohTS36t3LJPJuDraKzmgxRn4QOxlYWEBhUKhbGUtjObmZiwsLMDn8+0yeSlXWQoXb9oQZTIZ6urqEAqF+JwSWVSv1zNxrrSSEYvFsNls3L+Vy+V8X5X2qgn+BcAom8vlQjqdZlRJ+PrSxIDOkVgsfqTreerUqX0JeiRzXg4N2ytKhZB+kzgsgfCjdHsUclUoQSOydDgcZtg/l8thdHSU3UwPCrpG9fX1RRNL5TxPiHMh1BYwGAywWCxwuVxQKpXY3t7mzVMikbBaIpGzHQ4HJw3UQqGkhlQSyVkxFoshHA4zcdtoNOLEiROoqanB1atXGSUrlxw6HA4kEgm0tLRwwTQ9PQ2v14t8Ps+Fz8WLF3Hp0iUAQH9/P/r7+zE5OYlXXnml7PmiczU+Po7/+T//J8LhcFkF3u985zv8vp+k+MQkBxTl4FmbzQaTycTz93K5HKurq4jH46ipqYFGo4FEIkFNTQ1qamqQTCaxsbGBBw8eIJVKYXh4GEqlEkajEfX19VhcXMR/+2//DXK5HN3d3XC5XMyutdls7EFeXV2954ZDkwzt7e0Ih8NYW1vjNgMRA+mBSqVSUKvVOHHiBEQiEWZmZuD3+zExMYGlpSX2fW9sbERnZycTbsRiMRQKBYxGI1ZXV5m8aDAYIJVKWbjo7NmzGBoagtvtZq+HfD7PlqsGgwG1tbV8fqPRKLRaLdxuNwYGBlBZWVkW+nQ6nYhGo3A6ndBqtWUrKr1e/xuR9va7Dw7T2qBFcT+IsFAooLOzEy6XC3K5nCsbQn72CkJUUqkUvF4v3G43NBoNdDodk77KkeaESAzpRpjNZuj1elgsFoY4KZELBoNFPW2hX8fGxgbrVng8Hv4MvV6PcDjMbSRCxOjf1GcntGgvEq9cLmfrcJlMBpFIhJWVFd7Y6PwJo/R67kfQE27w+xHvhJW1UFK73O8fNYxGI0wm074EwtLvQKZjj6KHQSFMbNVqNcPjLperCD0CgGAwiKtXrx4KnaARw2w2y86bCoWC/V+E57qpqQkTExMsMZzL5bhdS+JMbrcb586dQy6XQ0VFBRO+tVotvF4v1tfXeUOne4vuR5fLhStXrsBkMqFQKHA7wGw2IxqN4sKFC+ju7gaw49S6sbGBmZkZjI6OFp1PSqS0Wi1zHiQSCXp6euByuVBZWQmdToetrS08fPiQrx/F0NDQnueLtFpee+01VFRU7BLas9vtWFpawne/+13U1NR84hCET1xyUC4qKythMBhY7crpdMJut+PChQtlxS2USiVaW1tZOyCbzSIWi+HatWswGAy4ceMGPB4Pb9a5XA5+v59JYw0NDZiamsLY2BiP/5VbJGKxGCYmJriKo9llsVgMtVoNhUKB7u5unD17lm/KfD6Pt99+G7dv32Y5XYLeJiYm4HA4cPnyZdTX1yOdTiORSGBtba1oYQ2FQqioqOCfNTU1obq6GvPz85ibm+M5Z6qqLRYLw8zEj6DvRGpy5SpEu90Op9NZ1JIorahIZnk/YpdEInlkUuRhWNmPMgf/8OHDXRU38TvKRSkcbbPZuOqLx+Mwm81lJwBK/06r1bJFdygUgtVqZavjcsgDjV7Nz89jdnaWF0O73c6fJRKJEA6H2QBMOIJGi7jT6SwSs6FkUhgej2dXO6m5uZmlvffbFMtdz8NoTZSG0KacEqJybRCheNeHCWGyvl8IX0N9b6ryhbFf0iBMbBOJBI/f5fP5IvEiQq6SyeSBxFr6PCoQKLEj2fUrV64gl8sx8ZAExnw+Hxc5oVAIoVCIR2tVKhWefPJJ9Pf3Q61W42c/+xlaWlpw6dIlDA4OYmRkBJubm0W8Kq/Xi4aGBr7vaKTRaDSyENyvfvUrzMzMQK1WQyaT4cGDB9jc3IREIuG1joISD41GA4vFUpQgq1QqJBIJ6PV6bpUlEomi5KD0ukgkOyJzjY2NOHbsGH7+858jlUrtKXLV0tKCqakpvPPOO/jWt761773xcYtPRXIgEolQW1sLj8fDCoBUhe0X8XgcVqsVTqcTLS0taGtrw/LyMt5++202KaKbMhgMIhwOM3s4GAxia2sLdrsdEsmOV0EqlWLJYpVKhf7+fhgMBiY/zs/PIxaLMREtmUxiamoKbrcbZrMZOp0OAwMDuH37NlKpFKqqqgB8YBpDBiQjIyOoqKhgBKH0ASgUCkW66FTJdXd34/jx49xOeeWVV5icBIC5FrTQRCIR7umVk2IViXYc3PL5PL70pS/xZlQ6rndQhU9oClX4h63GDkMoE26s+72vUO9C+P3KvX4vMhkRm4hNXZoY7PV3EokE29vbSCaT2Nzc5KmVcsjD0tISBgcHEYlEoFKpAOxoWlAb6OLFi0UMd6FDIV0DgvGpZULKmEJxo70IpGNjY4xO0eilcDOj+KhkmAnBofn9vbgg9HPyBDns+B/Z/Za+Xjj9A5S/F+g5IqSH3qO9vR2dnZ149913y9oxU2I7MTGBbDbLfBOVSrXrHJpMpkNphlDCT/4wmUyGWwR03oTJjJC0SC0A0g8g0uKXv/xltLW1YWFhAXNzcwgEApDJZPjhD3/Ifi6lU1C5XA4LCwv8/3Rv+Hw+rK+vs4YMya6T5sxeQetJIpHAysoKf1cALK7k9/sRCoUgk8nwV3/1V3wtaA0TXj8iwgYCAaysrOCtt95CZWXlnokltcmuXbuGb37zm58okuKnIjkAgOrqauYG9Pb2YmpqCiMjIzh9+vSe1UA8Hofdbsfa2hr3YdVqNQwGA29YbrebR86oKlSpVDAajQiHw+jv70cul8P09DQ2NzcZws1kMlhaWuIpB/JuILUxgnKJce3xeBCPx/Huu+/yqBhl4yKRiJXB9Ho9PB4P5ufn9yUqCRc74X8TqYd0+qmip4dHoVAwIQkAPwxE1isN4Xcpp974YSr8gxIDgpAPYmWXbqyHhX/pe5CgS2nsJ3wkFot53Kt0Md/r7+i+CIVC8Hq93GYo7Wn7fD426aJefaFQgEqlQmVlJbxeL27fvs33515B55vur9KRtIOY9LS4E1Gy9Nw+CmJDQZ9RWjkCHyQ15TgmwhYNJTxNTU1obm7eJZxULiipoOdLmECVnrNyQa+jDVkmk0GtVqOtrQ3vv//+np/b3NwMh8PBbSW67+k5TKVSkMlk3E8/TNuNrh8lJH6/H4FAAGtra0VJP0U5voVUKkVXVxdaWlogk8kwMDDAqKBYLMb29jafj3IE4NIgVIo2bEpoNRoNtre3D0R7JBIJ2tvbMTk5WYRqAh9wH7LZLOLxOMvVC5HPdDrNaIkwpFIpKioqkM1mmZS5V+yFSnzc41OVHJw4cQLNzc3Q6XRQq9UYGhrCgwcP0N/fv2sRz2QyzLamzBTYWZxUKhXi8ThsNhvS6TTbNlOPqra2FuFwGKlUCq+99lqRQIpEIuEE4HOf+xzi8TjW1tYwOTmJbDbLPb5EIoHq6mqcOnUK8/PzWFtbQzabxerq6i5oMZlMFj3YCoXiwIWCRhOF/unC765Wq5nvAHww5kZcCQrqW9KYXelDdJgK8VErfGD/Kl94fB9WkW6voHHOveLDCh8d9HcKhQJVVVWsKvelL31pl/w2eQHY7XZODGhjl0qlqKysxPb29oHETtJWoJHB0qRvL6tkQg+qq6vhcDiwtbW1aw7/w4730bWmUdm9JmCEx1oO3SABs/n5+UOPx5IXCfCBJshho9wkz+joKAYGBopQudIwmUw4c+YMBgYGuKqnJJuSHLofgIO1SFQqFfOEaBMlgR+9Xo94PF4ks0zISDk+CNknp9NpRvJo0kupVEIul3Mrd3p6GltbW3uSdonrVV1djc3NTUSjUSbQHqYNJBKJcOHCBaytrSGRSKCuro7veSKlzszMoKGhAd/5znfQ1tZWJHd//fp13Lp1CwB2JRckAEacrtLfUySTSahUqn2N+D6O8alJDqRSKXp6evj/TSYT+vv7MTw8jPHxcXR3dxddeKpOqPdPEwelqoxyuRxyuZyVwbxeL7a3t+F0OvHEE09Aq9UWZabCPvWvfvUrmEwmFrHp7u6G1WqFz+fD5OQkFhYWsLS0xA8jsPMwGAwGTjBIm5w2GKr2D+rP04NNPVvhw0tS0Q0NDZiYmOBRQOFrFAoFtFottre3YTabyxpaHbZCfNQKn64nwYAH9ZMfRZHuoDioEvqwssCH/Tvq1ZYeh1BbXrhBkugV/ewwFeZByc/a2hoT5YAPKjS6BhUVFTCbzQiFQtje3mar4w+jXFiaBJbTjKDRZaE5z37ohkajObQAVmdnJyKRCCKRCKqrq7G8vHzgMVPs13pZWFg4MDkhwTXS+yf+R6khFgD2Q1GpVGXvUWoj0vkkBEhIsBWeUyIgUsIvnDagRIVaW8AHRQ/ZbqdSKSY9Cten0iDPDolkx7xpfHz8QDl8YOe+0Gg0qKysRKFQwLe//W28/PLLTEJUKpWIxWIIBAIwm8148cUX0dvby4kl8WVo6gj4gL9CaEY0GkVHRwfu3bvHxnOlRQ4luy+88MInCjUAPkXJQbmoqqpCb28vRkdHIZPJcPToUV5E6AYV3uyxWIy9yEtVGUUiEWw2G9sqk1jRXjO01OebmZnhDY7kR2lkkKB6IgcSQY285qmnTwsHPfiHqdZpAaipqWG/BWHkcjmu6P1+PyorKxkBoV4e9TEJVjxMxb9XPGqFT+eMvvNheAj7Eco+DKu8XJDqpVATvly7pfQa/aZywvslF8Lv9ajEztKgxVX4t7TZlLYXZDIZ2trasLGxUfZ6luMi7HfsFBKJBG63e1/1xYM8LZqamrC6uor19fV9rbmJcV8qL35Q/CaGW8KwWCw4efIkxsfHmYlf+n2ESXipKir9P/EFyBkxmUwilUrtiYJQO6n0fhSJRFyYUNEjlUqh0+mgUqnQ0tICm82GQCAAr9eLmpoaXLlyhStrt9tdNFVCmjLr6+tYXl7edR2EPBcK4o20tbXxRFU6nca///f/HkNDQ6x1o1Kp8MILL+D8+fNwOBy4evUqj7XTGkotO0JjqHjLZrOwWCz44z/+Y/zZn/0Z1tbWUFVVVfTcFQo7CrxVVVV45pln9ryGH9f4VCcHAFBTU4NMJoPJyUlevICd5EBoI5rL5eDxeKBWq/dVZSTiy+OPP86qheWiqakJJ06cwN27d9mtzOl0wul07oL3CoUCuru70dDQgBdeeAE//elPi+brhYvzftV6KRyby+WKPq80hBW9x+OBXq9nvgSJjBw/fhzLy8sfWtteuCnr9XqcOHEC3d3dZcmLpX8nrFj3gvAP69NAydJ+r5XJZGVh9tLX0Gw0+caXvr7cNXoU7sWRI0dQXV3NmgX0uaXJRbmF9TclAlKrgvgwZLgjVJ+kz6moqMCZM2dw5syZsud1L5i2XAjvk6WlpX3VF8+cOXNgaycUCkEsFmN+fh79/f1lN0Jgx7SNqudSmfP94jCGWx6P51DaHZSk05y9MMol4cL7mBBH+m7UKqUEsVyIxWK0tLQU+cNQEkD35ksvvYSJiQmEQiEeCw+Hw5ifn+d1ZW1tjREdrVaL3/3d38Wrr76KxcVFPs5EIoFoNMpCRXR+lUolIxNCQieJMVFyolQqsbGxgXQ6jQsXLrDWTSgUgtvtxubmJsbHx7lNYbFYUFtbi4aGBjQ1NUGpVOLq1au4e/cut6yUSiWjDWazGf/23/5b/Lt/9+8wPT0Nm822S4H329/+9idujBH4LDkAsFO1ZjIZzM7OMmGJiIUkHUqMYIIBL126hJqaGrz55psYGBhgIZrf+73f40V5P+Utn8+Ha9euQafT4dy5c3A6nSxDKxzPCoVCLJU6PDwMv9/PREij0cgoQzweRzqd3rdap02ioqICp06dwvj4OLN194rm5mbo9XosLi5idXWVR8aEY3idnZ1wOBwsRy2sEGmOea8geFNIGqONcj9OALGh6b1LP2Mvn4bOzk4eBRS+dnl5GQ6Hgxehcp9/UOVYUVEBuVzOUy2bm5s8MSL8vntdo8NyLxobG4sSA6B8clFa0VP1eFgioJCRT0qLwM7zMjo6ygt1aeyV/JQG/UzY9hCGzWaDSCRCKBRivovb7S6qyCUSCSs7CivyTCZzYA9YKNi1n9V5OWRkvzgM74QIb4fR7jhs261QKGBkZGTXPX/kyBFYrVYeGw4EAvsefz6fh9PpRDwe5147ka5ra2uxsrKCN954A01NTTh37hwkEgk7xEajUayvr/NkFgD2NnC73Th+/DgTIAEwodtisaCqqgrz8/Pspgh8APULEdJYLIbZ2Vmsrq4y8tHa2gqtVst6EGSwJ5PJUF1djba2NmxtbaGrqwutra38Xbe2tuB0Ovk71tTUIJfLob+/n0XLLl++jD/+4z/G3Nwc5ubmilCJT7JC4idGPvk3jUKhgJmZGSwtLaG3txebm5sQi8Voa2vDrVu3UF9fj83NTTz77LP8IIfDYfzkJz9BZ2cnent7MTg4iGAwiOrqagwPD/MDUIoe0KIlrOKIt9DU1ISOjg7elJaXl3H79m0Eg0Fmwy4sLODatWuIRqOsBEm65kK5VkI8ys1YkzpjPB7f9XtqH9DYJxkp7VdZ0wJf+nvabOnhLg1hX1alUrE4D7VwDkMaK20J7Cd5W/qepa9VKBTMPD7s5wNgUmZdXR0ikQgGBwdx+/ZtvkZ7yQKXPn6Hkeutq6srex1IRnYv2eJgMAi5XI5nnnmmbNJF/eRCocDvXVFRgVAoxCJMS0tLCIVCePPNN5FMJtl8iRInSmIUCsWen3OYELaL6NhyuRzu3bvHqIxIJGI0h/g2tAlls1lotdo9DauAw0tnP2qQ7DVN/pT7XgD4upaTvaYQ9ur9fj+WlpawsrLCYkjNzc1obm4+UIb6scceQ2dn56G8JoTtHloLrFYrIpEIOjs7sba2Br/fjyNHjsBkMkEmk0Gr1WJxcRHJZBKLi4vceqL1Q6FQcOshEomw06hCoeAJDhJAEpIRaeKBOFIrKyu4e/cuIpEIEzpJz0Wj0eDxxx/HxYsXUVNTg+bmZthsNv4OExMT2NrawpNPPol4PI6bN29ibW0NFRUVaGxsxNraGttqP/nkk0X3xPDwMAqFAvr6+j413gqfIQd/FyKRCEeOHGHCELAD/dMGb7PZ+KGwWCxIp9O4ceMGb9oKhQLBYBCRSAShUIhhOIlEsovhT/PFdNMSnEUVl8vlgtvthsfj4flhgsO0Wi3+6T/9p7hy5QpeeeUVdi2TSCRlRXUocRAGbRTUtigNspIuFZXZr2dPmXfp70lUhBAYIfTt8/kwPDyMTCbD8CtVCWq1+tB9WeEG+yi93kKhUPa1RLZ8FNfGdDqNdDqNubk55PN51NXV4ZlnnsHKygqWlpZ4MxciKuViP+6FyWSCx+PB8PBw2T67yWTCY489htu3bxdVmIQYqFSqfds8MpmMRWXy+TwaGxvR3t6O4eFhJq2S4Mxjjz2Gmzdvwul0Fglm/aZWyRSliBAluQ6Ho2haRzhpIxx3FBqTHRbd+KhiP/6I8F5NJBJlZa+FIXx29yLWHsakaWBg4MARVgqC9OPxOEP69DOn08lS8SRJT8TrQCDALrG5XA6xWIy5W7Q+VFZWIp1OIxKJwOl0YmtrC4FAAPl8Hm1tbejs7ITVasWTTz6J1tZWDA8PY3BwEIXCjpT7wMAAMplM0fcgZcRUKoX79+/jd3/3d3Hx4sVd36u9vR2rq6t47bXXODnp7e3lcfb3338fPp8Pp06d2nVPqNVquN3uj0Sb4+MSnyUHghCJROjq6kI6nca9e/dQV1fHyQGN6bjdbphMJgwPD2N9fZ1FgLxeL9s6b29vQyaTcdJAfVlgZ7Pc2NiAUqlkYxCj0QiFQgGfz4eFhQVMTU3xg5TL5VBdXc2SrNlsFvfv30dfXx8ikQjOnDnDbF/yYSBofj/NfzqWcgxiqi6Ec+60cZBD4KOEyWTC2toagGI53OXlZUSjUeZ9CH9PfdlH9VQ4TK+X3hNAUfVb+lrymz/M5ws3MWDn3NJi3t3dXbSYUzW1F2hXbhPY2NjAnTt3ipCIUpfDlpYWruampqaK4OWenh4cOXJkX6hdSE5TKpWIRqMIBoOQyWTweDz8uXK5HE1NTVhcXMT09DSPx2m1WnR2duLEiRMH8kzsdju8Xm/Rs3FQCFENeh9KSInbQYQ5kn/eq0UTDAY/lFviYY9zL/4Izf+LRDtW193d3QcmJ0KuEJ1/4d/QPV9qSw58MN102OeI+BV2u52dPguFHcVMg8GASCSCZDKJyspK+Hw+pNNpXLlyhSefqDCiBAn4QMQsEolgc3MTGxsbGBwcZNEk4iUMDQ1hcnISn//85/G1r30NKysrmJmZKeKahMNh1NfXFwk30TTXsWPHMDw8jJ/+9Kfo7e0tUr/N5/OsIJtKpdDV1YVLly4VITtnzpxBIpEoa/NNPjaP0l76uMdnyUFJiEQiHD16FBMTE1hcXOSxFqlUiqqqKrjdbmQyGSwsLPCMbyqVYlZzLBZjVcBYLIZIJMK9WdrcgZ0H/vz581Cr1bh//z5cLhf3IdVqNYvJRCIRZLNZKJVKrK+vo76+Hn6/H/Pz8wgGg7zQLS4uMttXKpWioaHhwDn+vYh1wk2LCHYksSvU56cgglq5zS6Xy2F1dXXXZ1EVWFFRsWujFELKj+KpcFiNAZVKBYfDAQBl++bCxfhRPR2Ex0JRiqgcNrmiv/P5fBgcHNy3Mrx79y6MRiOkUilUKhVOnTqFvr4+rvwoMaEkjK4ZfV/h8YrFYr4u4+PjDNsfO3YMoVAIKysr+Ou//muEw2Ho9XquBhOJBGsbHIT0uN1uAB+QPPci7lLrQKFQIBwOM4JBsC5pcQiJcwRjnz59GsPDw/B6vVAoFGWh9t+GVTewwx/Z2Njgc1RqmpTNZlld9aAoTS4MBgPS6TSCwSDf8zRVReRQIUr3KM8RCRIJ0U+1Wo10Og2v18voHplxkXcCtQ2Io0JaKXq9Hl6vF8DOBu1wOHD9+nXE43FUVlayuiuJrvn9frz11lsoFApF5EtKUPR6Perr65FKpVgcinQIKOmcmprC0NAQHn/8cYhEIszOzmJ4eBixWAx1dXUQiUSor6/f1fLRaDRl5fSBneSA0KbSv/ukxmfJQZlIJpOwWCxQq9V4+PAhZ5JVVVV4+PAhVlZWmARFY2urq6uIRCKcAMRiMZ4HJoieIOLz589jenoaV65cgdlsRkNDA2pqaphBXVVVhUQigYmJCV4YgsEgE7KE89zLy8sYHBxELBaDUqmEUqlEPp/H5OQkV5SPahcrjGw2i7W1NdhsNuh0Omxubu56zV7TAkIthtIg+Jo2B+CDRZCgcErKDjt6d1itANokC4UCmxQJkxchpP2oo38f1UikMISVIS36hA7l83kmy87NzUGv1/MxCBMC2nxpeoFQLbPZzAmm8DqEQqGicyKVShGLxTA0NITXX3+d5buJfKtSqaDT6RAMBjE8PHxgK0aIFJXOmWs0GhbDoc2eFPwaGxu5Ii8UCizWJOyTJxIJtLW1oaGhAQaDARsbG5ibm0MymSw7HvvbuGZEIrx+/TrW1taY20PPLiWgd+7cAbDTTio32kmbLUU+n0c0GuVnS+hNQteLpgqkUikT8w5zH/v9frjdbkxPT7MAUGtrK7crSSk2Go2yA6PwGY1Go6wkSWJNxDPSarVQKBR48OABAoEAamtrYTQad41CE7K3uLhYpPBKY92E1JL8s1qt5qQRAG/cfr8ft27dwtbWFjvOPvnkk6ivr8fs7CyPoe9HRBUG8RuIG/VpiM+SgzIRj8chEolw/vx5/OpXv4LL5UIikYDZbObeMlklG41GNl6iqQZgp59IDzvd1BqNBkqlElNTU7Db7VCpVAgEAojH47h8+TInBJOTk0gkEgiHw5xoCKNQKMBisWBxcRGDg4NIpVJM0KJqU6VScS9Sp9MdODVAizxtzAQnEhlodXW1SHSlNIQbKQU98OU+l2BIErCh9wB2a/wf1JcVvuejaAXQZ6hUqiKPgdKRvEfpM37UmwypbqrVat5YCoUdK2+hxLFKpcLy8jJOnjxZpEdRKBRY0XMvo6Tm5mZurexVwWezWYyNjWF6ehrRaJQTA0ruqJKsq6uDw+E4dCtImJBQMk2mUKWvAcpPdFDVSdM6arWa2wUGgwF6vR6dnZ17kml/W5xsq9WK06dP48qVKygUCuzUqNPpoNPpIJfLD+S1lB5bobBjHke9fOE9L2xtBYPBor856D4mImwymWTDI+rhz83N4eLFi2hubkahUChqP9F9RG1MOoZSJDEUCgHYaQ3QvUzib1T10z+lKIdYLEZ/fz/effddnmRQqVQsxCWcCEomk+wU6nA4UFlZiSeeeAKdnZ38XLS0tGBlZQULCws4ceLEoa4luYySdP2nIT5LDsoEzc9WVFSwRfPdu3dRXV2N2dlZjI2N8az/yZMn0dzcDJlMhkuXLiGZTGJgYIAXbopMJgODwYCOjg4mi/X29uL+/fuYmZnB7Owsq3ARLCfcGAk6VSqV0Ov1UKlU2NjY4JuVHix6mJRKJaqrq7GxsXHonjlVNCqVime6hVXLQbKxpa0DcpqkxUP49xKJBK2trRgdHYVWq+U2ivDzaCE8TF+W3vOwWgFkBzs+Pr5nG+K3SVo7bFC/luDebDbL0Hgut2OVS46Z2WwW6XR6VzVEstuEMJWq9S0uLuKxxx5jW24KYXuHEkWyY5ZKpVAoFCy9azAYuAetVquxsbGxJ4RNJmE+nw/AB/wMgm6dTifD14RKicViGI1Gfs5u3ry571if2Wxm4R2fz8fPxoc5/7+JqiapEHZ0dPDzRc9qoVDYZZpEvxNeg71adnTuyKRJOMIqjIPuYyoiiBhMSahSqYRWq+UqnHxgaKJHeI2obUMoIVX6lOSRlotOp0M+n0dtbS0ikQhyuRwLZhExUYhy0H2WSCTw+OOP41e/+hW0Wm2RiBZFJpPB8vIyTpw4gVQqhZaWFh79FRKvZTIZWlpaMD8/j5aWlkMhAZSA7zee/kmLz5KDMkEaBwCYRTswMIArV64wWqDVaqFSqTA2Nob19XV861vfgt/vx927d/fs5R85coSnGebm5nDv3j2uvFKpFJLJJDQaTVH/kCxStVotmpqakMlkEIvFIBaLsb6+DpVKxQ8JZdEkkET9zrW1tUP3zMkrQSwWIxqNQq1W76ukdpioqqqC0+ks+plEIkFHRwcWFhb4OGkREI7EPSpp7FF8GgqFwq7X0jhfOp2Gz+crqkI/yjjMpkNcAVpoqY0gVF0kx0B6L2FlSBvF1tZW2cUfAJPMRkZGoNVquQqjzZSuhVwuRzgc5gWbFnBa4GOxGB8LkXCFOhTABzwHuk+TySS331544QW4XC5MTEzwZkgiPolEguHqQqGAI0eOsG7/2toamxAJ2wWUmNKkjVCJ8jAL/F46GaU8HmGLpzSZFvIB6PfCa0v/1mg0XCnTs6fRaFiAqauri71XSkOhUODYsWNM7iUiJl1Dkife7zkSknjp3FOSIpPJYDKZsL29jYWFBXzjG99AT08PBgYGEAgEWMtAqVRya4paQdQmIvRKp9NBqVQiHA4jGo0yadvpdBY9A6QKq9Pp0NnZCZFox1juqaeewpUrV4rcb4GdNZraakqlEi+++CK+9rWvQSKR4MaNGxgdHcX58+eL1oKmpiYsLy9jfn6+SFZ/vyBS4qclPksOyoQwOSAY69atW8jn8zh+/HjRTWa327G0tIT/8B/+A55//vl9mdfvvvsuV4DC9yAxF5/Ph2w2i8rKStjtdjidTn6oiNxotVphs9ngcDgQDodZSpQe6Hw+z+Qn+gxyhCP4bj8YValUIh6Ps3hId3c3tre3EYvFipjDjxKliQGFzWbD+fPnMTg4iKWlJYbuSqvAg1oiwnhUn4bS1+bzedbSF4vFMJvNPNnwUZDXDrvpAOCNlDwu9Hp9EZGQXlOuMhSJROygOTo6ing8DovFwhbhQkRAr9dje3sb6+vrnBwQFE2vIQSINkMhMU0qlUKj0XBrjWR6FQoF959lMhmsVisCgQAymQxWV1d50c/n8/jJT36C+vp6SKVSnD9/Hqurq8xvobG6aDQKvV6PL3/5y/jZz36GU6dO4cKFC9wGLE2yhO0lIoEeJkHeS2tifHwcCwsL6O/vR0tLC18L4XMl5A0Q+ie8JnSccrm8iC9AiY9I9IFeiEKhQDKZxNLSUtG6IkQXZDIZ9Ho9Tp8+jbt378Lj8RTxaIT3PE09CYMSGIPBwC1J8k0AwP9tMBgQjUYhFovx8OFDKBQKdHR0IBQKwel0Ip/PQ61WM8eAkCZ6bgOBAJRKJWw2G1ZXV3n80GKxIJPJIBgM8uuTySR6enrwD//hP0RjYyPC4TDee+89TE1N4fnnn8e9e/cwNTXFxEy3241IJIKqqir82Z/9GV544QX+fn19fRgcHMTc3Bw6Ozv558SnmJ6eRmtr655ERGHQOOOnJT5LDspELBZjdax0Os2M52PHjpUdeWtpacGDBw8QiUT2hahyuRysVivUajVDvyRRarFYYDQasba2hsXFRTgcDhiNRj4OIt4sLCxwy8BsNu+6WWnER9i/J2juMMQr6htSpTo7O4vu7m5WxNvPlOdRgshKdXV1ePrpp4s2TKVSWVQFPmpC8ig+DcLXTk1NwePx8Cy/TqeDWCwuGhf8TcidexnxHPT+7e3tWFtbY2Go0qCxPEoOcrkc1Go1k1yFExxEZhPeIySF7HA4iu5x2sjIhKdQKKCzsxNTU1Ooq6tjVU6yaCbeSaFQwPnz51mzIh6PQ6fTobm5GXK5HHfv3kU6neYWGpF7HQ4HWltbYbfbIZFIsL6+DgB83xUKO7Pyd+/e5c2SiHPCEPo/UCVL37UcOVYYPp+P0T8aDSQF0kQigY2NDWxubsJms6Gjo6NsUifcuMmwTNhSoO9Nx5VKpVBRUQGNRsPPFyWnlKwKg5I0IYLU3t4Og8GAhYWFPe95YbJH700kXjJNIlIpiZ7R+U+lUggGg7BYLHA6nQiFQlCr1fD7/TwxQCJtQll3CjoXjz32GDweD1wuFwwGA0KhUJGOitfrhU6nw5/8yZ9AIpFgcHCQ1UZzuRza2tpw6tQp3Lt3D2+88Qbi8TjUajV+7/d+D1/72td2oSNGoxEdHR2Ym5uD2Wzm9RQAGhoa4HA4MDc3h5MnT+57XwBg7s6nZZzxs+SgJHK5HFKpVNHoysjIyC6IWhhUpV25cgUvvfTSntWJSLTjH26xWPgBr6urw9bWFoLBIOx2O4/v0Ewtid9QdRKNRrG4uIhQKITu7m689dZbRcfl8Xh4kaYe4IkTJw6VGBDyIBKJUFVVhVQqBafTiUwmw4vAR8nspvehuf7e3t6yULtEIoFUKn2k1oZQK0DI1yh3bSgBWVhYgNlshtFoLOpRPqogUrn4MEY8Go0GhUIBGo0GZ86cwe3bt+F0OosqQxrrO3v2LJtjkfJlJBKByWSCTqdDKBQqYriXBt1bmUyGW1V0rZVKJY4fP44HDx6gr68Pm5ubcDgcPFVAQeJDdXV1uHjxIjweD8PjCoUC8/Pz0Gq1MBgMiMViPAoslUp5Fn9jY4PHXIUbOs3253I53ij2CiGyotPp0NDQgFAohLW1tQNdNR0OBxMuKYLBIDsM0vRHKBTaM6mj45ZIJLumK4SJCl2rZDKJvr4+6PV6Fpqi9yGVSpFIxElCTU0NV9mpVIrdA2tra9Hc3IxQKMTnl54d4i9JJBJWIaXJFtLdSCQSTOij5IPanmQLv7i4iHg8joqKCqyurjLRsJR8TPePcEoGAKsT/uAHP8Dk5CTLxdPaqFKp8Oyzz2J8fBwzMzPc3szlcmhpaUFraysGBgagVCrxzW9+E319fThx4sS+hOHW1lZ4vV48ePAAly9fZgK0RCJBe3s7xsfH0dbWtq+aJrBToAkFxT7p8VlyUBJCN8Z0Oo1UKoVMJrNLj7806MEm5nS5RYgWU3qwiWFMI4Kbm5vQ6XSorq5GOp3G5uYmfv3rX8Nut+/S6M/lcqisrORsm6xLKQqFAra3t9ko6jBBPVONRsOtAJlMxgJGvy1WN8VeCoykjidk4R+mZ/8oEL7D4UA8Hj+UeNKHSQ4eRZyJ9AqEBM3a2lpGWBwOB1d7fX19aGpqYnEjOk8WiwVNTU0IBAJMypNKpTAajdje3t41HkeVJm3ANA6XyWR4rhzYuc97enowODgIv9/PaoUqlQputxtKpRJHjhzBysoKtFotC+YcPXoUN2/exNbWFm9YDQ0NSCaTWF9fRzabRU9PD2+4pUH3u9frLYLq9wuqumdnZw+VWJbTySAXP0JX6Hpls1nU1dUdmDS2tLQwr4UmQmhDlkqlcDqdMJlM6Onp2eWXUVVVBaVSic3NTahUKsjlcohEIiZzVldX86iiSLQjdtTY2IiRkZGi8Wm6toFAAFtbW1hcXGSVwYaGBtTW1rJhkpB8SpwBo9EIj8eD5uZmbG1tMQFW+Fr6XoSKUluErlc2m8Xm5iZee+01AMAzzzwDh8OB9fV1Hh1va2vD0aNH0dDQwNoodD4oSbl79y5kMhkMBgPq6urQ2dl54CSRSCRCb28vbt68ibGxMZw+fZqvb21tLRYXFzE7O4vTp0/v+z6ftnHGz5KDkihNDuRyOSoqKg6E08ViMZqamtDe3o6FhQW2Mc3lctz/r6mpwerqKrxeL6vVFQoFbGxswGQyIZfLob29Hf39/VwpXLlyBX6/H7W1tfzzQqGAUCgEjUaDjY0NZm7TAkLWqCqVCp/73Odw/PhxbG1tHVg1UaTTaSYSEadBKJhD/cdHVUr8TSOfzx96w38UCP+w4km/iSDSo75/ubBYLKipqWGEpba2Fp/73Ofw/vvvc3uJIONsNos7d+5ApVKhpqYGc3Nz0Gg0zK0gYhj9Dbk90rhdNptFKBSCVqvF0tISw/rBYBDt7e04f/48pqamWLBGo9Fw9avX69niPBgMQiwW45133uFKOJfLQS6Xw+Px8FRMOp3GxMTELkSA+vrEXQCwi7OzV1CyWypBbLPZ4Ha7kUwmuQAAinUy6DkjETKhsiQ9GzKZjAmweyWNRqMR58+fx8jICD+TpIy6tbUFmUyGnp4eRiXo+RKKjRFCQCI9Pp8PwWAQer0eSqUS2WwWs7OzAHbQG+IMkaqr3+/H9PQ0bt++jVQqherqal4rKJEgsm5tbS3D5oQeTE9PQ6lUorGxscgvRth+IvJsb28vrFYr3nrrLfh8PiYZU4uH1lFqmZ4/f575KNQGu3DhAgYHBzEzM8OtD2BHu+DYsWM4d+4cUqkUhoeHMTAwgP7+/gMTdqVSiZ6eHgwNDcHhcHD7QSwWo6Ojg/UXSl0vhUGI2qdlnPGz5KAk4vE4E61isRikUikef/xxvPzyy7Db7XuOvAUCAVy6dAmhUAgNDQ3M0CcYsra2Fo8//jgGBgawvr7OI1tbW1tcOeZyOYyNjWFpaQl2ux0VFRVob2/H4uIiRkdH4XQ6ceLECSwsLHAFdvz4ce6Zz8/PMxT4zDPPoL6+nklIJpOJJx+EIYT/aEFIp9O8UNFkhBAKJVcyQj+A33zkq1yUthMOu+E/KoR/WPGkRxFEEprFfFTvLxaLWTKWRkNJZRL4ANmhJIp+Rpoafr8fNpsNCoWiSPOetAEaGhqYb0L/FoojUfWWyWQQDodhMpnwla98BTU1Naivr4dYLMby8jI8Hg/3tCnBpMo/mUwik8mgvb2dxWyAnTHZcsmrUOzJ6/VCpVJBoVAwnH1QCKFuqVQKs9nMEynCiSSqrkmUh3gZ4XCYrwXB7zRuR1LiByWNJMZEzqXxeBzZbBZHjhxBU1MTzGYzKxHq9XqEQiGIRCJuGRCCE41GYbPZkE6n4XK54HQ6uW1DCEEymYTVauUJEpJf/5u/+RsWDlIoFEwO1Ov1mJiY4ERAOAFF961Go8HJkyfZj4RaAeS9QOdZLBZjZmaGJyuIEEvnhHgUdF2FUx6VlZVoamrC2NgYFAoFGzIReVatVqO/v5/PsVwux8WLF3Hv3j3cuXMH3d3du0ZxS6OqqgotLS2YmZmByWRicTu73Y6FhQXMzs7i3Llz+95Ln6Zxxs+Sg5KgSQXqgQE7ENj169dZVat0PG5paYl5ATSWRQ52Y2NjyOVyMBqNqK6uxjPPPIMf/ehHmJubg9VqxcWLF9HW1sa9rOXlZUxPTzOMSdr/Pp8PS0tLWFpagkKhgNFoRE1NDWZnZ2G1WlFZWYmuri4AQHV1Nfr6+jA3Nwefz4eTJ0/Cbrfjvffeg9vtLlI0lMvl0Ov1CAaDPDMvZKoLF1eNRgOj0Qifz4d4PI5MJvNI0P1hgxITYnsDj9azf1QI/1HFk/aDMck5T3g+Ghoa9p1VP+z7lx5fJBLB2NgYrFYrV+TCEIvFkMvlMBqNeOKJJzA+Pg6n01m0uJM5EU1wCDdoobaCWCzmXjVV1EQGFIlEDAMHg0G+d4gsR9oLlCQYDAZOim02G5LJJLa2tvZEooioR7/v6OjAxsYGt7vKBSVlpBNClfny8jKPWgIfqHvSJkUcAZqiICSGrg/xBEwmE7cF6RztlzTq9Xr09vaiq6sLmUwGSqUSKpWK/47+TQJQ+XyeURdKNHO5HGZmZgCArwF9Hn1fIdqRSqUgkUhw9epVhMNhtLS0MEeEYH5KEpaWltDU1AS1Ws0+MSKRCO3t7Whra2P/EyKS0rhlZWUlpFIpVlZWmLRJLot2ux3xeJz1C6gIoeSMJqtIG4PWnrfffhvr6+s8FqvT6dDb2wuPx4ObN2+it7cXBoMBcrkcZ8+exeTkJEZHR9k1cj9UqbOzE36/H/fv38elS5eY99LZ2YmRkRF4vd4i0mJpqNVqTqw/6fFZclASpWOMItGOW+N3vvMdfPe738XU1BQqKyuhVCqRTCYRCARgNBrR1tYGhUKBxx9/nKGptrY2ZuRWVVWhUCjA4/FAKpUiEAjg4sWL6Ojo4M+Wy+Xo6emBwWDA5OQkM7/X1tZQKBRgtVp5Lry9vR0ymaxo7l0sFkOtVkOj0eD+/fvcb15YWEA2m4XBYMBbb72FlZUV3kwaGhpw7NgxWCyWIu194ANhJApKBmiBKa3kaYEiX4oPy+4vhYKBw/fsFxYWeFTqUVoEhxVP2k8QaS9kY3JykhnrH7VLIC3WtPFSVFZWQqvVstz2xYsXce7cObz++uts+SuTydDV1YWenh5UVFSUFbGin1HlXhoqlQpdXV3w+XxwOp3MhaC2BaFRNCPe2tqK/v5+/PKXv2TzMZPJhEgkwhoigUCgqI0XCoV4k8jn81hcXITf7y97Pmg8UtgqkEqlaGlpgVgsxsrKCpN9KflpbW1FbW0trl69iqamJiwsLDDELPSdIH8R4mNQbx3AoVU0qYA4evQoLl26hKtXr8LhcEChUODs2bN4+PAhqxsSAbjc+Cr9nkiKlJABKJpuiEQiuHfvHqqrq1FXV4fZ2Vl+7gkZoSkYn8+Hp556ip+lQqHANuZqtZo3ciooCFnM5XKoqqqC1+tlL4dIJIK5ubki7QdCIAndpKStUChgcnISk5OTCAaDkEgkqKqqglarRU1NDcxmM5qampBMJjE6OoqBgQG0tbWhra0NYrEYXV1d0Gq1rN7Z29u7J0onFovR19eHGzduYGJiAn19fRCJRKiurobBYMDs7CwuXLiw59pBydOnIT5LDkoiFouxnW4qlWIS0KVLl1BTU4N33nkH165dY2j9hRdegEqlwtraGpLJJFZXVyGXy2G327k9UV1dDYvFgjt37sDn86Gvrw8PHjzA7Ows2tvbd92IBF29/fbbkMvlaGxsRF9fH+rq6pBIJPDGG29gcnKSjUsoYRCLxWhoaGDeA8mMhsNh/PKXv8Tt27eZvEiiNjS7TRu5sI9YCvMKRWV8Ph+GhoaKKnk6BrFYDJfL9Rux+wGwWiMxow+74RPDXig3XBq0mVJF+SjiSbRQCjfjg5ANt9uNYDAIj8fDipZ7vf+jBmnHu1wu/q6UoMjlckQiESwvL0Or1eLSpUvo6enhthm9XniOqFrdj6NC59tisbABUFVVFTweDy5cuIDa2lr88Ic/hFgsxvHjx7G0tIREIgGfz4dXXnmFUaFEIoGVlRVUVVWhvr4eIyMjXNkLkxVyLF1aWuINmjg+RMalpEA4pgnskAq9Xi+0Wi0aGxvZHVAk2hH5cTqdTMgzm804d+4choaG4PV6WahHJBIxya+qqorFlKi909nZuW9SJzRFAoDp6Wm+XtSv7+rqQigUYr6BUqnkcUHhiCAVDY2Njdjc3GQRKCIo0vGKRCIWpjIajQzHk68GKSBSi4ZEqQjul8vlaG5uRkVFBba2thCNRiESidhq+vjx42hqakIul8PNmzc52TIYDMjn8/B4PLuIr3SOqAAgbYt0Oo2VlRWk02nY7XbU1dUhlUqhu7ubizUyy1pYWMD8/Dy2t7fR29sLrVaL5uZmqNVqPHjwALdv38bp06f3dCBVqVTo7u7G/fv3YbFYUF9fz+jB3bt34Xa7yzpcAjvJwerq6qdinPGz5EAQVL0RK5WyZIqWlhZ861vfwje/+U0kEglUVFRgbW0N77zzDrRaLbLZLKu2mUwmtLe3Q61WIxqN4t69e1CpVDh37hzMZjOSySQmJiawubnJJKDFxUWMj4+z5TPJfvb09KC+vh7Azo39ta99DdeuXcPQ0BA/yDqdjseQlpaWoFQqUVdXh66uLvz0pz/FtWvXEI/HYbVa2Yqa/s7j8ezayMttqMIxpe3tbcTjcf4ukUiECW7EqI7H4x+a3U89YZVKxZDzYXr2xNanClao905oD/ABhE/v+SjiSaU9R5FIdCCyQaOhJNpykDjTo4TBYMCJEycQDAZ5Y9BqtaiurmZDHIvFwkRT0ryg+XWaevD7/VhZWdmT2S90qwQ+WOBtNhuamprw6quvQq1Ww2AwYG5uDmKxmHvkCoUCjY2NWFxcRKFQQFtbG9bW1jA/P4+KigpEo1FMTk4ilUqx1gUhVGtra7h79y7i8TgUCgUjXGSCduHCBdTV1XEVWnrvikQinD59GrFYDKFQCK2trdDpdAgEAnA6nUWjv7lcjrUvHA4HZmdnecNsamri6Yx8Ps/oiEajQVtb277XSKg6SudQiH5EIhH8xV/8RZGeg0i0o6FCstTChF2tVqOqqgqrq6vcgqRxSZrFp2smk8ng8/lgs9kgl8sRj8cZnQiFQkV8IaGqpVqtRkdHB6anpxEOh3mtMZlMaGxsRCaT4Wo+Go2iu7sbTqeTBbeSyWSRxwPdM8RPoNbhysoKJiYmsLy8zGTT2tpanDt3DidOnGAnRbqW7e3tqKqqwtjYGG7evInOzk40NzejuroaFy5cwMjICG7duoVTp07tSTAky/CHDx8yymY2m2EymTA7O1v2OaZzQu2Q/ezPPwnxWXIgCIJohW0FYXJAQZBYIBDAtWvXoNfrUVdXh8nJSX6w3W43b/KRSAQdHR3o6urizYg4AYODg2hubsb09DQikQjUajVOnz6Nrq4uyOVyTE9Pc4uBCDdisRhnzpzB0NAQ9+WowgkEAigUCmhqasLMzAxqa2uxsbGBVCqFyspK5PP5otFEkUgEk8kEl8t16I08l8thdnYWCoUCkUikaAacYFg6jqmpqUdm9wMfjKGRxe2jcAIaGhowOTm5C2kQirOUg/AfRTyp9HNXV1fZCKZc0KgZbYzUoy8VfCoXtFGUwv5UqRUKBVZPBHaUJ41GI9uIi8VinmEnSNdoNMJut/M9ZDQauUe9V5SaIRHT+8SJE5idnUU4HEZzczMikQgmJiYgFotx8uRJvPfee7xBabVaaDQauFwu3iSkUikv0PPz8/D7/XytyK46n8/DZrMVjdlls1n4/X4MDg7ipZdeKnpWqXIGdp6X1dVV6HQ6ngQZGxvjyp+qW6pss9ksTCYTrFYrent74XA4+PX0zBDpU6PR4KmnnkJVVdUu63HhsQhRmr3OLRH2iJ+RSCRw7949KJXKor8nDgKNPgrlvkvbLRKJBHV1dZiZmUEsFuNniLgnhICRT4zVakU+n4ff70cwGMSVK1e4VWOxWNDe3o579+7xtZmZmYFEIoFMJuNJFhLJ0mg0GBoa2vW9qdWQz++4UpKCZ319PXQ6HY+frq6uYnt7G5cuXcKZM2fYlRTYSYgvXryIubk5zMzMYHt7Gz09PdDpdHjsscdw7949DA4OoqenBzU1NWXP+bFjx5h/cPHiRUgkEnR2duL27dvY2tqC3W7f9TfCccbPkoNPUQjHGIHdyYHb7cb8/Dy6u7uhUCjw9ttvAwA+//nPw+fzYX5+nmWQiQxGGX5vb++ujUoul2N+fh5OpxN2ux1nzpzZ1WY4evQoO+JJJBLYbDZEo1FcuXKFyV1KpRI+n48XGLPZjPHxccTjcbz77rt48OABk6qosqKFmUiI5Op30Eau1WoRDodZrIUUBYUz4LRhRaNReDweuN1u2Gy2R7oWpZVPqbkMBREmaUyqvb0dzc3NcDgcu1oERDArB+FTVSwUTzrs9AURtYQjcOWCKtPu7m6cPn2aR/r2g++JKEf9WYrjx48jkUhgfX0dbrcbb7zxBv+eKkedTsdtFhLDqq2txerqKpaXl7k3nclk8O677xZNnxwUhDqtrq5CqVTi4cOH0Ov1qK2txcjICN9TAwMDXNErFArYbDZsbGywFK/dbsfW1hbzYCKRCG/+ALC6usqjY7SJq9VqaLVaOJ1OVFZWIpFIYGlpCUePHuWkgM4XjempVCqcPHmSFfei0ShXweQLITQKUqlU7DvR2dmJuro6zM3NcVuDPA2am5thMBiQzWZ5hJOgd7oPKHkn22ZhaDSaIj0LGtssfU5LHU9TqRR7CWi1WgSDwT2lfbu7u7G8vIyRkREYjUZWpEwkEojFYggEAtDr9bh8+TJ0Oh0nXUQipAkR4ousr69jaWmJiZSUTEUiEeh0OlbbFEoSk5x2LBbjc+z1enmUsre3l0WITCYTGhoaMD8/j+HhYZjNZrhcLtTX1+PUqVNMGCTuRnV1NcbGxnDjxg0cPXoU9fX1OHfuHMbHx1m5tqOjY1fiLpFIcPLkSdy6dQtTU1Po6uqC0WhEVVUV5ubmYLPZdv0NFRxCFd1PanyWHAiiXHIgFLtwOp2Ynp5mxn8gEMAzzzzDCnu00JNISG9vL0wmE9bX13nT2NzcxIMHD1g3vqKiAkajEV/72teKVPkoRKId45VcLocHDx6gvb0d8/PzWFxcRD6fxwsvvACNRoO//Mu/5PEl0ikHPugj0gYn7MPThkoLdzqdPnBMLxqNwmAwQCaTwe/38wx46cgYjYOlUimsra0dmBzQ3xPcaLFYuHojgtry8nLRhk9mPNlstsiq12g0PpK/gpC9TrGXIFO5KGebWy6E0wgymYzPeWkI4XuqlElZMxQKobKykj0SCAbWaDRMlAoGgwiFQow4qNVqWCwWnDlzBjqdDltbW2yYVJo4HRQk5EUQc2dnJ2ZmZrC1tYXLly8jEAjA7XZDJNoR+vH7/Qyph0IhZLNZ1NTUsL7A9vb2LmMv4ejs8vIy9Ho9KisrEQqFWD8kFovxPSOVSrG5uYmjR48WoVdkQtTd3Y1MJoOf//znnMRRdU5EPOHn030bDAZZzfH8+fPsNZJMJouSRqHCH7HZCYEgrgAlPHQ9KYgALVSaLE3QSt1KKYTTJOWCEqWWlhZcuHABN2/ehMvl4gSAngedTodLly5Br9dzu0T4t2Q8t7GxwVbylLBQokQiW16vF62trbh79y42Nzc5SaNnlZKNI0eO4Kc//SkSiQQaGxsRCASQSCSg1Wp5PSEUghITEk1qbm5Gf38/jyKaTCZcvnwZU1NTmJiYgMvlQnd3N3p6eqDVajE7O4toNIqenp5drUmtVotjx45hYmICZrMZdrsdHR0duHXrFjY2NlBXV1f0euJBfRrGGT9LDgQRj8dZuQzYyc5JahMAE5Q2NzcRDodRXV3NUD/dqH6/H1arFXq9vmi86eHDh5iYmEAgEIBCocDx48fR19eH+fl53LlzB0tLS3v2LUUiEXp6ejA5OYkf/ehHWFtbQzAY5MVXaExU2i8uHdMTVmVEYopEIvzdD2JcFwo7Akx1dXVYXFzc9XohzEl2rKurq+jv799zs6UpBwqdTsfz5X6/H5FIBHK5HBcuXMDAwABv+NTDJ56IcMN/lBbBfup5VLkfVN0/yrQDnbO9qnQhG93tdsPhcGBzcxNVVVXcXiKBG9p8SNeg3LEbjUaEQiEMDAxAJBJhfn4eZrOZkzv6TJlMVmTXXS6OHTuG9fV1+Hw+rK+v80atVCqxtrYGp9PJlS8R3TKZDCoqKnjmfXV1tUgfY6/vT20QsjKnZIeSXRrxzefzvGEVCgXuz5NWwPDwMPNgqJrN5/OIx+NYW1tj/o1UKoXNZuPWG0n2ejweLCwsMNJCY4hCdIBkkOmYhWqeUqkUer0eVquVBYuELQJhYlA6kkptIQphEm42m7G1tQW/38/iVcIg5MHlcqGmpgZPP/00lpaWeExQJpPh+PHjaGtrg8lkgl6vh9frRTQahVQq5WeMiINVVVUYHR3ln9G5pKJKJNqRVz527BgymQw0Gg0MBgPW1taYxNjX14dnn30WExMTWFlZQUNDA5qamljum6a56FpVVlbi7t27+JM/+RP09PRgZGSEn+n29nacPHkSGo0GUqkU3d3dsFqtGB8fx40bN3DixAk2VXrw4AEGBwdx+vTpXZbm9fX18Hq9mJiYYFtqm82G+fl51NTU7DqvnxZ3RlHhMOXCpyTGx8cRDodx8eJFFAoF/PrXv8bRo0eZkfvKK68gEokUqdE1Njbii1/8ImZnZzE1NQWz2YwnnngC2WwW169fx+bmJm+8RBw7duwYb5SZTAY/+clPIJPJ8PWvf33XBkrw/P/9v/8X/+f//B9OCgjCJmLk6dOni2xMhTEyMoLx8XFUV1fDZDJBpVJx9ZNKpRAKhbC1tYWzZ8+ir6/vUOZKW1tb+NGPfsRVq7CCoQWaXA0lEgm+8pWv7Hoo94tSeJ7+n3QEyKr3MLoKjyrQtF9rYK/w+Xx45513kE6nGdmgpEIkEiEYDEKhUOCFF15AQ0MDZDIZtre3933PcDiMd999F8FgECqVCmazGblcDm63G1arFb//+7+PeDxeRASl0cHW1lYkk0m4XO2CNPsAAK/+SURBVC7o9XpGX2jctaamBtlsFsvLy7wZ0fkhNMNut2N7e5s3cup9h0IhPHz4EC6XCzKZDPX19Th//jxUKhUCgcCuc0nHRCJOhPoQ1L5X5ZvP5/Hee+8hmUzyBltRUQGXywWFQgG73Y719XUEAgFIpVL8q3/1r9jZlBI0SlbLaRYQ6kDoYDabRVVVFSMvdA2Fo3i08RMqQWgGJUSl35ush48dO4bp6Wlu9RBxlt77Ue45hUKBaDSKZDKJd999l89Pueeg3PuSkJlYLIbJZIJUKmX9CrlcjoaGBng8HjQ0NMDpdHIbB9gRdIrFYrh+/Tr0ej0Lw62vr3PLgFC/u3fvYnZ2FmtraxCJdmy6v/rVr6Kurg4ejwc/+tGPmARIQcJPtPlS+/WnP/0p9Ho9CoUC3G43hoeHGZk4evQoent7eX1Jp9OYnJyE0+lETU0Nt+BGRkZQKBRw6tQpLuYoMpkMbt68CYVCgfPnzyMWi+HGjRs4fvz4rnHsyclJ+Hw+PP7444e6Xh/X+Aw5EIRQM5sIM8Q5oHlgr9dbtNhsbGzgzTffhFarxRNPPIGamhr4fD7cu3cPKysrLEH74osv8siMMGQyGfr6+nDz5k3Mzc2hubkZPp8PW1tb2N7ehtfrxcLCAl599VVkMhnY7XaG8ux2O2KxGDY3NzE0NAStVlu0MNCm2NDQgMXFRahUKtTW1rKtq0KhgNvthsfjQXV1NZ599lnkcjm4XK4DpZarqqpgNpvh9XqLRimpZyqVSlFdXc0L8GFmwIVRutBSfBhOwKO0CEo/+7AhnHYgC9tEIsEjgUSG02q1e87oC8Pn8+HGjRsoFApMxCM9A6vVCr/fj//+3/87nn/+eR4dI9U+6iUnk0k0Njbi8uXL+Ku/+iv+btSiqa2tLapUSf2PHPpokoEmPxYXF3Hnzh2kUikYDAY2WhobG+Nx2NIElc5lJpNhKBrYuTcJqaDkpjSkUik6Oztx/fp1ZqzH43FoNBpuSaTTacTjcZaUpvuQpjZoVC4YDLJwU+nYJvFoEokE+0NQr78U2aB7MZvN8hggJQYEOQuvO7HazWZzkU8JtR3oGPZrD5TG6uoqBgcHEQ6Hi/QCJicn4XA4cOHCBTQ3N+/6rvRZ9P0KhQK3poRk3UgkwmPQ9HkNDQ147LHHUF9fj3fffZcFr1QqFSorK9k5lLQObt68iXfeeQfxeBwGg4ENv/78z/8cSqUSL774YllZelJHrKysRDQaxfLyMpLJJK5evYq6ujpGZGtqaiCTyeDxeDA2NsbusSdOnODpG6vVisnJSdy4cQPd3d24ePEiRkZGmKgoJBzSOnz79m3Mzc3hyJEjqKmpwcLCAurq6orWD7VazSq3n+Rxxs+SA0HE43HeXOlhoeTA7/fD7XazLCgAtqMNhUL43Oc+B7/fj1/84hfY3t6GVCpFR0cHgsEgZ8GlNxLxFjKZDDKZDN58803uB9KccaFQYLJWX18f1tbWGNakNseRI0cwODjI0wblVAuNRiOSySRu3rzJ/e5kMskOYydOnGA3t70SA+rV0gN9/Phx3L9/HzKZjEe0JBIJ6+srFApsb28fKOxTWVnJMr3Cfrter2fBqNJjetQN/+8jyHt+YGCAmee0YYhEIjx8+BBarRZNTU0A9k9CHA4HgsEgs8cJhaB7g6p6t9sNk8kEhUKBfD6PU6dO4fbt2/D7/Syl+9prrzFqQOctl8vxxIQwhHLFpLQnlUoRi8WYed7e3l4knUtjgXfv3t2VoEokElRWVjJKpdfrWZqYJixIblcYcrmcN3ytVsv3ViwWQ3V1NfL5PDY2NngC4qtf/Sq7LqrVat4wvV4vV8pUvdL3I/tqt9vNiZFQ5a+qqor5RcAH7Q4iiJLSIa0VarWaE7RQKFTUjhoaGsLW1hb33YVrwUGaEsLw+Xy4du0a0uk0u4eSemUsFoPL5cLAwABUKhVfB2GhQ54xRJ4kC2tqQRUKBfh8PhYzi0ajyGazcLvdGB8fx/r6OiMB+XyevxMlYACwsLCAa9euIZ/Ps9kUtW3MZjMrHT711FO4cuVKWVl6StrEYjHrthDhm4SZCoUCzp49C71ej+HhYdy9exeTk5Po6+vD0aNHUVNTA5PJhPHxcQwNDaGhoQGnTp3C1NQU7t+/j2g0ira2Nv7syspKHDlyBNPT0zCbzWhvb8fm5iZWVlaKyMtqtZrbSJ/kiYXPkoO/C8ryKVuOxWKIx+N849y/f59hR6EOfHV1NTY3N/G9730POp0OGo0G/f396O3thVwux/vvvw+tVouJiQkAYKjX4/Gwbzo9PKRi2Nvbi8rKSszNzcHv9yMcDqO+vp4ZxDU1NUgmkwxpEqlxZWUFJpMJQ0NDu1T6NjY22LiH3ken0+G5556DyWTivi2FEI4UiUS4ePEiVCoVhoeHuUdPwkHpdBqNjY28udPfBoPBQwn7BINBXmzpvNIMPlVhwqAEhT6H/l1OQni/+Kj9IHw+H6amphi2Lz0fh7V9JqMmhUJR9vvkcjletO/fv4/m5mY+dyMjI8x1KRQKmJiYKBq/y+c/MLKhBLSUSJnJZJhZLxKJ0NDQgDt37iCZTMJgMGB7e3vXYk5uj8Jx2J6eHmQyGWxubiKdTqO9vR0nTpyAyWTCL3/5SywtLRW5jQonakh9UKPR4Otf/zquXbuG5eVlGAwGrK6uIplMsu7B6dOn4fF4eNMVkizpGSYxLUqsiNBI97LwviM1xnA4vCcfJZPJsOUxIQdk897Q0IB79+4VJRPUbjGbzQgEAo90nwqjVE+DEhAi8+VyOWxtbcHpdEKv12NycpIVUknUqLm5mQ2RCOmjIKQom80yIZvuJ5fLBZfLxa6edE9tbGwA+ECdkngnZKRE2hQ0PVJVVYVYLIa1tTVIpdJ9Zemrq6vxrW99CzMzM8yrobFcEnKqq6tDfX09HA4HhoeHcfPmTYyPj+PUqVNoa2vD6dOnsba2hqmpKXg8nl1Exe7ubn7+m5ub4fV6MTo6isuXL6O+vh6Li4toaGhg1OvTMs74WXLwd0HkIpfLhTfffBNXr16Fx+PB3/7t3+LMmTOQSqXo6emB1+uFz+djRrPX6+WFtb+/H6dPn+ZKZXV1FSsrK5xVz8zMsGqdTqdDY2MjqqurYbfbodPp8Itf/ALJZJKJP+l0Gt3d3QA+IALSZAQRIgkKBXZu1jt37nASI3zYaNwpHo/jhRdegNVqhUajQSAQKGvGRJrj1JuUSqUwGAxQq9UIhUIQi8Vobm7GhQsXuFIVLgLEgn7ssccO1E4gjgIAZjXvtSgL5/3ps4RTEodZdH8bfhDAwRLP5TbQckEQs5BZXdo7FvashRuicAwOKBauosW89P2ECzclS8LPWlxcxI0bN3jzFr4XVZwikYj76X19fdBoNFhYWOB7gqDljY0NvPPOO+wLEAwGmY9AFX1zczNWVlaYw0NI1NzcHM/EkyGa2WyGVqtFNBplhIbuT6HOQaGwIwXc09MDp9PJ45QSiQQKhQJSqZSTJWDnHkkkEiykBew8Q+l0mhG3cDiM7u5u3L17tyi5pueRPr+urg6rq6vMwSnlZRw2RCJRWaVQIrsmk0nodDpotVrcv38fGxsbfI3ompJJ2ZkzZ1hYjXgxAJhITEHtE2rndHR04MqVK3yvlR7f7//+72NkZAS1tbW7PDboOKqqqrC2toalpSX86Z/+Kf7iL/6irCx9VVUVvv3tb+P06dNoamrCtWvXeAqH2he3b9/G9PQ0Ojo60NjYiH/wD/4B5ubmcP/+fbz33nsYHR3FmTNn0NjYCLPZjLGxMdy5cwfNzc3o6+vD+Pg4YrEYTp06xe2Wnp4e3LhxA6Ojo+jq6sL6+jocDgfa29sBFLszfpLHGT9LDv4u4vE4Hj58iO9///vw+/2orKyExWJBIpHAz372M2i1WvzLf/kvEQgEODGgCozgf7fbjbfffpv9B/L5PGKxGCorK9Hc3Mxqap/73OfK+oGfOnUKv/71r/H666+jpqYGjz32GM8HLywswGAwwGg0svVrZWUlqzTG43Ge1S63OYnFYlRWVmJ7exuzs7PMMi8XtFnTgxyJRHDjxg0oFApoNBreOBobG5m1TCRB+ruDhH32CtoUhZt+6fegxaYUit5v6oDiUaycHyWo2t9P4hnAng5+wjl24g9QC4FIXtQLpvNC1SC9DgBD3QQX06gj9dDp/aldEYlE4HK5MD09zUQ5mr6g60ebI50voR4CtayofUZja+Q0uL29zRLk8/Pz7HRKgjcPHz6ERCJBTU0Ntra2YLPZcO7cOSwtLTF5cn19HXK5HJ///Ofx5JNPYmVlhZ85QgaSySS3CShxkUqlPKZKsr4kj0sJME0jVFRU8EhjfX09J8f0PuRuKJVKuR0TDocxODhYJItMYmQqlYoTOJfLhXg8DrVajaWlpUO3EChoU21sbOTjKRdUQKTTaYTDYajVathsNt50Q6EQ5HI5vF4vbt++zUZqwr8XPnM0PkpI0uLiIlwu1y7vE7Vajfr6elRWVuLBgwfw+/2IRqOMyBGiQMhoNBqFQqGAVqvF5cuXcfTo0bKy9M888wyjjhaLBefPn8etW7eQSqVgNptx5MgRhMNhuFwu3Lp1Cw8ePEBTUxPa2trwu7/7u5iZmcGDBw/w61//GtXV1Th79izOnTsHh8OBubk5qNVqFvAaGBjAqVOnuB3a29uLoaEhOJ1ONDY2YmlpCY2NjTwVQtbYn+T4LDn4u5iensYvf/lLqNVqHDt2rGiBt9vtWFxcxH/6T/8Jzz//PM8DA2Ap10JhxzzEbrfDaDSitbUVVVVVmJiYwNmzZ2Gz2RCLxTAwMIDx8XGcOXNm14gM2SD7fD6cOHECDx8+REdHB5qamnD//n20t7fD6/VCKpWy6EgwGOSHl2bay21ONKEg3JxKN47SSoAQCtLBJxc/ivHxcQB7kwSpL/cosD1BmnttsB8WjgUezdnxUZOaD2vLTFW4UHNAo9Ggs7MT9+/fZ4Kh3+/n60SbFWnPC3UaSj0J6L+Fn1Eo7NiFNzQ0YHp6Grdu3WIiXkVFBQqFAubm5uD1evGlL32Jq04ingrPGwkXEQxN5mNOpxORSIRHLbe2tgDsIENEoBTqCIhEO3LOFy5c4BacyWSCx+Nh9IpEtWpqaqDVanmkWDhHX0rCI7g/Ho9jcnISwA6XRa1WIxKJYGNjg8XFiMRJngapVAparRYymQzLy8vY3Nzk80tog/DzzGYzDAYDNjY24HK5sLCwgOXlZa7em5ub0draCpPJxN/pMPczbcZHjhyBRCJhzk8pekD3ByEYPT09WFtbg0QigcVi4XZiqStpaVJAQUlUJpNhjpKw9SiXy6HRaNDQ0MByyYFAAOFwGMlkEi0tLZwwptNpaDQa1plQq9Xc6iknS1+OwFxbW4vTp09jcHAQOp0Op06dgkQiQSAQwMrKChYWFvDw4UPMzs7CbDbj2LFj+PrXv876B7/61a9gt9tx/vx5XLx4EaOjoxgfH0dTUxN8Ph9u376N3t5e2Gw2WCwWtLa2YnZ2FqdOnWKk48iRIwA+HeOMnyUHfxdXr15FJBJBV1dXWUi4paUFt2/f5jlcSg6EkJxKpcI/+Sf/hP+f5oUJqiRP8rt37+Lhw4c4ceIEv3Z1dRWTk5NobW3F4uIiBgcHEQwG8d577zHhaHZ2FrW1tbxoJhIJbm0QSYYyWzoueuhJNa90cwI+kDMtDYKaaQM7iMVPZLePArbf67NK9f0PE3T8j2rlfJggKJ427cNIPJfTkyACFhHwOjo6MDs7C7fbzZr51CdOp9Pw+/1Qq9U8FnkQ0114PpVKJXQ6Hex2O/7H//gfiEQibCZUU1MDnU6HUCiElZUVvPHGG7hw4QIaGxsxOTm5S5MiHo+zOyipMK6srGBzcxMajQa1tbXcr85ms9DpdJBIJKyBIJFIUF9fz8ZQSqWS2xEkjtTY2IjV1VU4HA60tbWhUCjA6/WyrTIhK0SkK9UeEN4zdM9TO8RsNsNsNqOvrw+Tk5OMQhB/KJFIIJFIFI0x0rUm9EIsFrPWxPnz57G9vY3r16+zCiShO6Ojo1haWsLp06dRV1d34BhjqefBlStXUF9fj4mJCeh0ul28IEoAI5EITCYTJ+ZSqZRZ//TavRAsCnqWSfuBkDH6+8bGRnzta1/D/fv3EYvFuM2SSqXQ0tKCxcVFlmema0kCS2azGTMzM/jCF75Q9BwcxtmypaWFrwMl4lScnDhxApubm5ibm4PT6cS7774LrVaLtrY2vPjii1haWsLDhw/xi1/8AvX19Th79iw8Hg8WFxeh0+lgMBhw7949dHZ2orW1FR0dHZifn8f777+PEydOYHl5mfkaZIj1SY7PkgPsVH2Dg4MwGAx7VqxisRiNjY1YX1/H0aNHEY1GdxG5kskkTypIJBKuaqjKI2j/+PHjLAXc2NiImZkZDA0N8d+l02lm7wM7cG5vby+Gh4fhdDoZPYhGo4hGo6irq8PTTz+NX/3qVwwdEiog3PSFlalOp9tT0c9utyOTyfDNTxtlIBDYcxMiYtvy8jLu3LmDeDz+kcL2FI+aGAAfJD8Hwf6HWTQpyiVAYrEYkUjkkWyZzWYzfD4fq1tms1kWFTp37hzu3r0Lj8cDnU7Hgk8EUZ87dw56vf5QuhSlx5BMJvHWW2/B7/fDbDYzA1yj0TDSY7PZ2APh2WefhdPphMfjYSIeRTqdZknqpqYmltS2WCyoq6uD1+uFxWKBQqHA6OgostksbDYbG0XRfLpUKsVrr73G0DLBt9FoFBqNBqFQCA6HAxaLBTqdjjkBuVwOGxsb0Gg0qKio4IqOKuJcLsdjc3K5HHK5nKF2qqTff/99RiC8Xi8qKiqQSCRYGphaB/SZNFUkbCnk83n8/Oc/x9tvv41UKgWr1crERRqxdDgcGBoaKpomKH0G6d5aWVnh1gSZC9HGK7SUFn5+IBBgcy0yMio3JlmuSBAWFXRuqqurkUwm4Xa7i1o0tGb6fD54vV42c4vFYnjuuefw6quvYnl5mS3ks9ks1Go1jEYjHA4Hqqqq8Mwzzxz6vhXGXmJx1HppbGxEKBTC0tIS5ubm8ODBA0xOTsJqteLy5ctwOp2Ym5vDyy+/jJaWFvT09GB+fh7RaBR6vR4zMzOIRqMIh8NwOBwAgJqaGohEIiwsLOD48eOfinHGz5IDgKuDcjwAYZD7oN/v54cd+GDzyWQyePvtt4s2+VAohJs3b3IvFACTpt566y1+4IjoRK2F0gWjoaGBrX9JF18ul+PrX/86Ll++DIfDwbKf9DCKRCKucHQ6Hc96NzQ07JkYyOVyWK1WeL1eqFQq9mdPpVLMd6AQ9smpmqVxN7vdzkzqQmFH59/v9x8Ktv8w6MBBQaZajwr7l4tS3gJV05FIBNFolHvnpbBvOU8HgnqBYsXEQqHA5jWLi4tsCS6VStHV1YUjR46wjDVpFwBg2+KDUB61Wo3NzU2uQO12O0vYktwxkfiuXr2K559/Ht3d3QdKUtN9RmTDSCTC7prr6+uoq6tDoVDA6uoqm4F5vV7k8ztGRvF4HJWVlUgmk6itrWVzKOADjwKS+SYUBdh5pkjIh66bcATRarVCLpdzayASiUCv18PhcCAcDnMyTi2F/v5+TE9PY2NjAwaDgfks4XCYvQaIVyEWi/k7r6yswOv1wmw2s0iXwWDgMT+aKtoLnSp3b2WzWdy7dw9zc3O4cOECzp8/z9eBZKCz2SxSqRQsFgsjGvTdyz1LQilvOn80UiyMQCCAiooK5hpRgrq9vY1oNMq6FqQr0dHRgUuXLqGpqQn/8T/+RzgcDlYdTCaTmJ6eZqLhh7EnP2zo9Xr09fWhu7sbm5ubmJ6exubmJtbW1qDX63l0e2lpiREpq9WKzc1NyOVy3Lp1i8W11Go1lpeX0draitXVVbZtp6LvUcTdPk7xWXIA8IjTQdAsLcAEuQlhdwAMy5Ksr5BgRvAmWcMaDAYEAgH4/X6+2RYWFphBXS4IPjt69CiUSiWPNC4sLPD8d0VFBVcVwAfuecFgEC6XC2q1Gr29vdDr9UXoBAVNNWSzWTQ1NcHr9cLpdJY9HpqdpgWavOXr6+t5oxP2ZGkjcDgc+yYHH3ViAOyWkd4rShfN0ijHWyB4l8yASGaXZF1LN1Ch3PV+PWfatK1WK55++mkoFAq8/vrrkEh27KwJ2SHCmkwmg0ajQSwW41l7kskVeieIRCJEIhHmEKhUKqjVambh6/V6rgKpx57JZA4lSU0Qei6Xw+bmJp+fxcVFHj0jImEul8P29vaue5DkgGmyg3QFqN0Rj8eZwyC8bvTdNBoNVCoVtxlIMMlut0MqlSIej8Pv93OiQBMLBoMBjz/+OJMkySuFoH2LxcIoCKnokZkQiTmRRj+RNnO5HEKhEE9QEDqxurqKvr4+ts8Wi8VsnU73lpBfQknXrVu38PnPfx4vvvgiFhYWsLi4yMjIkSNH0NXVhYWFBdy5c4dVHEtDiGDRfS6TyVgdcXFxERKJBEajEWfOnIHT6WSXTZoCkclksFqtkEqlsFgsAHb0Ls6cOQOJRIKLFy/iH//jf4w333yThZZI/EhINPxtB7Wt6uvrEYlEsLCwgNnZWYyPj0MqlbKo3OzsLDu6+nw+niihez+dTrNmxvz8PJqbmwGAUb5PYnyWHPxdHDt2DPfu3dsTJhKOK5LZD1BMCqqsrMTTTz8NYGeDm5ub42yf+qfpdJpvUoJyPR5PkSvcYarbCxcuYGNjgxELgmpfeuklvP766/D5fLwYZzIZrlq//vWv46tf/Sqi0Shu3769q1Lw+XwIBoMM21J/r9yGnc/nOTHI5XKYm5tjq1napISjc8BO9edwONDb2/uRihgdxIl4VP+Dcse2F29BuOmSyyBpR5TbQPc7TjrXxDMAdpLSqakpRmNoUoZaOQQ9k90tTSpQKJVKdqtLJpPsBEq98lQqxQY3hGIJ1RLVajUqKytZJKyqqgonT57kyRQa8cvnd+zDa2tr4XA4eNqF+AWkmS+sbInMSN+dSH70vWgT8ng88Hq9BxL4CoUCG0MJ0bFgMMjVPck4E0ROLbBoNIqRkRFEIhG8//77bL5EEyLJZBKpVArr6+t49913d40A0zijTCZDRUUFV+1E7FOpVJww+v1+FAoFVFZWora2Fmtra7hz5w4SiQRX/0QQJRKw3W7Hw4cPsbKygp6eHvT19bFQFLVELRYLKioqMDU1hWg0Cp1Ot4ugSWvBkSNHYLFY8LnPfQ6vvvoqrly5goWFBdYi+MpXvoJIJIK5uTkufKjVtLKyAplMhscffxz37t3DzMwMLl26BJVKhXw+jwcPHkAkEuF3fud38NJLL+1LNPz7Cq1Wi76+PvT09GBzcxNTU1NYX19HJpOBWq1GPp/H/Pz8Lp+SRCLBXh75fB6rq6usyxCLxYrknz9J8VlygB1SFTF79xPkMJvN+Pa3vw2n04k7d+4w5E4bYCwWwy9/+Us0NTWxgYtWq+XMGtiBJYeGhmC1WnH69GmIRCL88pe/5FnbdDqN0dHRfY83nU7j/fff52OTyWRQKpWorq6GXq/Hs88+i4WFBaysrDDsdezYMXR2duIP/uAPAIAFRiKRCAqFAqunETSbTCaxvr7OUHw590Bh0OZMbRGqOoW/Bw4H2z9qCFn4+70niTaVWjkDe8P+wiAvgoN4C1SxffnLX+YN7lG+KyFT1dXVsNlsuHXrFra2trC2tlakXyCc6sjn80WaGyKRqIhwurW1hc3NTd7gTCYTurq6cPv2bRgMBk4SgJ2RUELGfD4fTp48ycdEKATB6VTRe71emEwmhMNhJq6l02nmxCiVSp6uoaSW3oMqdHqW6DsZjUZ86UtfwsOHD+H3+/dMDEgSOJ/Ps6wzbb6lQeqK5GBJ54cSw83NTVYspbYYIYbhcJg3fKEvBt17VFkTt0GIKpEiYyKRYG0HOpdra2vw+XxYXl5momg0GmUvCzI6InLf4uIiywQD4NZCPB7H9vY2bDYbnnnmGQwODmJzc7Oo9VCKYH3xi1/Er371K/zN3/wNjz+SBfX/+l//C1qtFr//+7+Pp59+Gi6XC8FgEHV1dchmswiFQggEAggEApxwZ7NZjIyMIBAIoLm5GalU6lBEw7/PEIvFqKurQ11dHeLxOGZmZjA7O8tjoKVRKOxISodCIVgsFoTDYS7uQqEQwuHw/++Jz28jPksOsJMc2O12fOc738Gf//mflxXksFgsPLHQ09ODrq4uTE1NMd+A2OTLy8tYWVlh/oJarcba2hrrBdy7dw9qtRqnT59GPp/H/fv3eXwsn8/j2LFjePDgwYHHnMvlYLPZ0NXVhcrKSty8eZNnzQ0GA06dOoW+vj7e3Gmj+Mu//EsoFAqu6IS8gIqKCpw6dQr379/nloOwbbJf1NXVwWKxIBgMMmFJGMRUDofDnIgQaZJ01w/qk9fW1qKvrw/Xr1/nhZCIW5lM5sCpCKH/QWnfnEhwQmfH0njUcUVhhUyb9UGtKxqNpWuytbUFkWjHwIdaPsI5cyFiIoR8afJBiPgkEgkmyNntdjQ1NWFychKBQIBbQQT3Z7M7NthKpRKNjY1sG0wJIG1cJ0+exOzsLCdFwWCQYfJ8Pg+z2YwLFy4gGo2ymyhtpHshcJTkRSIR/OAHP9iXBEt8GNqQqY2yVyLhdDq5jSg85x0dHXA6nejo6IBKpcLMzAzEYjH8fj9UKhX0ej1UKhXGxsaKro+QHyREp4jLQXoJhKxks1kkk0n09vZCJpOxNDihJeS0SloFwqBrSQikULeC2ndkZlVbW4uXXnoJt2/f3rMFlEql8F/+y3/Bu+++CwA4efIkstksJ2JE7PvZz34GqVSKI0eO4Ny5czCbzaitrcXrr7+Od955B8eOHUM8Hsf6+jrm5uYQj8dx5swZbG5u/kajx38foVKpcPLkSfT19WFzcxM/+clP9nyt0+lET08PYrEYxsfH4fV6WXROqVTiiSee+Httmfy247PkAGDFtSeffBKNjY17CnLMzMzwXLher+fZ+EKhgK6uLpw/fx7Ly8tYXFzkjDIUCuGdd97hDdNms+HIkSMIhUIYGxuDy+WC1+vF9evX4XQ6IZVK0dDQgNOnTwNA2VlaYtX/o3/0j1ixsLq6GqlUisVjqPdLQjBU/VAvlHgEtOBQZXL79m2uVKjFshdkL5QrDgaDaG1txTvvvFMk7UrHC4Alb4ltTJWiRqNhp7n9Nk+Px4OhoSEed7t9+zZvYPtNRQjbIqV983w+z/3axsbGIj36UmllIW9hvzYGLcRCcSLyWNjLZIiivr4eKysrrJNfVVUFjUaDXC6HtrY2RpWE0rx0Luvq6liS9tixYxgcHGRjIplMBrVaDblczvobVqsVX/7yl/HKK69gcXGxiFxJBN0zZ86wZTIlPXRPKhQKbmNIpVLW3CcyI21+oVAILpcLbrebkSwidBG7Xkigo/N/0MZC14H+LpvNQqVSFbVkygXxYqxWK8bGxmCxWCASiVifxGKxwOPxwOVy8XcmvYVSBUE6D8RZuHjxIpaWlhCPx1FXV8fcIjoflJw0NTVxG1Gr1aKiogImk4nleCm5FqIS9D1JGK00aSdyKsmqy+VyLhL2kglfWFhAKBSC1WplUyi6Hh6Ph8dGb9y4wSRWqXTHETYejyMYDMJsNiORSGBsbAwmkwmtra3Y3Nxka+i1tTVGD2hapJzF9P+fIRKJYLPZ9p38UalU6OrqwtraGn784x/D6/VyERmPx/GjH/0IV65cwXe+8x1cunTp7/HofzvxWXKAnQ2YxIP2E+SQSCRFsKNGo+GRRvJEN5lM6O3thdvtZrlPGj8jfsFrr72GTCYDr9eLgYEBfpglEglSqRQWFxfhdrvR19e3S3ueqm2ya/3Sl77EGxktHEQiI76AEHYHdusakFkSKd3JZDJ+SAhqLsc7EL4HsatJaY5ge2HF7Pf7GbYXavzvNyIp/O60SEejUXYHrKqqKnpdqZiRkPxHIRRtUqvVzLQGDpZWpmqbzkfpe+/FW8jlcgcmBsAOGc9kMnEFT8TWbDaLmZkZrpDp3gM+mHH3eDx83YVcEoLCSXSI1Dtra2thMBi4DbW1tcWbSHt7O5qbm4vG5ega0XdOpVJwOBxFxFzhBE82m0U0GsWVK1eKfAhIyIeEu6i9cBiFy9KwWq1wu91so0wTHFSxC68PSTRnMhmsr6+jsbGRj9ftdnNbSSQSYWlpiUcyhee49Bmw2+3o6OjA+Pg4crkc6urqcO7cOQwNDWFubo7RKRIRq6ioYLMgei86D8ePH8c777wDi8XCibnwmaUNuaenh4+b1gTiM5DHhNFoLNKSKNfWMhqNTFKm71hZWcmtFLpvdDodyzYDO/eyz+fjczI3N8foBbVPADD3hZKO0qC1odw/tB4SgVv4D11f4T+kHfKbJCAkAU9JJ42Ep9NpJokODAzgBz/4AWKxWFmxvKWlJXz3u99FTU3Nxx5BEBUOwnI/BXH37l1IpVL09/fv+7pUKoXXXnuNlQJFIhG0Wi2OHj2KkydP7nr9tWvXWIuAlO58Ph8zwV9//XUmedHsNVVmGxsbkMvl+OIXv8g2paQml0wmkcvlYDAYcPbsWWxtbWF+fp5f5/P5ivrv1Mcl8abSjZgc/UiuVrjxAB+MKUokEjQ0NCAejyMSiZRl/peTJ87n81wxnj17Fo2NjYcSVSoNhUKBuro6vPXWW7h16xbMZvOexEK3243u7m6cOnWq6HeliABB8fl8njUahMdOfVrSFaisrOQ59qqqql3jh4FAAAqFAs888wyMRiMnlgdNSVBQr/nq1asM5dfX1+PEiRPQ6XTI5XI84jc3N8cERalUWpR8GI1GNmiiJE6n06GqqgobGxvsdhcIBLC6ugpgB6Yn2VuC6KntdNjx0r3aJ1SNEt/kozK7Iv0Cak/tNboHgCczaJpEeGzA/lMy+92vhKARhyCXy8Hv97OkuDDJbGxsLJuwajQa+Hw+vPbaa+y4WDrSTIn7M888wyQ4SgwsFgtzAISk5nIjyxKJBGq1GhUVFfjrv/5rdk50u93cliGlV0Ij8/k8Xn75ZdTU1GB9fR1jY2Po7u5mMiIZNHV2duK5555DOp3G4OAgZDIZWltbuaCi9gm16Ojfpf9Qy4kQJKGmxKO0Kuh+pCRqvwSkUCgwqZqQXrlcDrvdjs7OTuRyObz11lt49dVXdyUGFIVCAVNTU/jGN76Bb33rW4c+zv8X4zPkADuZu9VqPfB1tDnNzs4yGaWhoQF9fX27XpvNZrG+vg6JRIJLly5BrVZzElJRUYFXX32VzUWIyEQjhGRtG4lEEA6H0dHRgZWVFa4KgA+gerfbja2tLchkMhw/fhyzs7O8OAvtlYlpW870hSo2YpevrKwAAKsdDg8PM5zY2dmJhoaGIkRDGOXG3eRyOc6ePYuqqiquUsgzgB72w2wY6XQa8/PzGB0dLQurUpQTM9oPETCZTNw/PEha+fOf/zzOnj2LO3fuYGNjY895f2pPHDYpAD5IrIQCUtlsFhMTE1haWsL58+fR3NzM0y7JZJIX11IyVDn1tmg0ylbLpPMvTAIJlqfrIdwQDzteSgmAMAjVoPNf6t9gNpsfaXyVjksul+PYsWOIxWJYXV1lxIXIcsLXCo+tNInQarVFmgm0eQg3VrJpp+kGYdAo4YkTJ7C2tsajpL29vXjiiSfw61//GgBgMBjgcDh4AxYiKTRW96UvfQnvvPMO0uk0I4lEFjWbzTh16hQsFgurD3Z0dOCpp55COp3GG2+8wQRGEm9KpVKcDCmVSphMJhiNRjQ0NKCurg5Xr15l0SfSl0gkEtjY2EAsFkNtbS1/1oMHD5BMJjE3N4eqqipcv369aBRVqVQiEAhwEiaXy2EwGFBTU3Poa3vYoKka+ocSDuE/hLrtl4BQoUUoHU2VUcEQjUYRCASwvr6O2tpaDAwM7CIzC4PQl2vXruGb3/zmx5qk+KlPDggGPkgAiaK2tpazy7Nnz8Ln8+H+/fvo6+vjCiSVSrFt8tmzZ1lNrLKyEk888QTW1ta40ielNbqhCZqlRe3999+HwWAoYp5TRKNRJkUWCgW21aXjIMlkem3piFtpZDIZJpeRL3w4HIZSqeSxt6GhITx8+HBfpcNyXguUmVMQwvEoMsskwiIkBRKDXij8QygJndf19fUDzZY8Hs+hpJVXV1fR29sLg8GA+fn5PclewiCpXtIhoAWUiGok4DM0NIRMJsOCPXSe9Ho9QqEQ7t69i8rKSjz11FOwWCxYWVnB6Ogocrkca/0LWyR0XoAPzHFo2sJoNLIOAZ03jUaDuro6LC4uIpPJQKVSIRqN7okGCDknpUEQfqFQwObmJm7duoVQKFR0/icmJuBwOHDu3Dk0NDQwd4RGaKkCJuEjQsAI6crn87h16xZWV1cxMzPDbTWyPCcJZKvVilgsxgJGNIJGSEsoFCpKuum9CcqXyWSor69HKBRi6V+6xyj5y2azmJycRENDA4xGI5xOJ7cWSdhJr9fzs2kwGACAOThLS0usVfLlL38ZHo8Ha2trPPlBGgZkDGS1WhEKhfDUU09Bq9Xi7t278Pl8SCaTfK1ISZVQSavVira2NjQ1NUGpVGJ9fR02mw0PHz7E0aNHUVlZCYlEgkQigbW1Nfj9fiY5/7N/9s9gsVjw3nvvwWQywel0YmtrC1KpFFarFT6fj69TMBhkFPQg8u6HDar2D7tuHyZCoRBef/11JrmKRCKYTCbWSUilUvjBD35woK4BCZElEonPkoOPc1Bv7bA3mdVqRXV1NZqbm9HR0YHt7W3cv38fDx48QF9fH+LxOIaGhpDL5Vgad2NjAy0tLaivr8fo6Ci7zNEmQGNXtNhQVUTSsPl8vmxFTT+XSqU8+04PjXDMjRbkcmQq4aw+jUQajUa88cYbyGQysNvtXN3IZDLEYjFWOqyqqoLNZuNqlI4DAJusCMl8tJAWCgWsrKxgaGgIkUiEeR1WqxXz8/P7yiyXkgKBD+yLaZSKKkS5XI5IJHIgIjA4OMjn6SA0gtTvdDodKisr9yV7UdAmQ1MparWaZ9hJ42JhYQHZbBZ1dXWQy+WIx+OMrkgkElitVjidTszPz2NoaIgXHdoMSK2NHENJxIcqpHg8zp9BI4ZCC2adToeKigro9XrU1NTwa0h1j5AtAAzT7gfv0gYbDodx48YNJJNJJv7R/SGTyeD1ejE+Po7Lly+zTC/pJZAcMvXapVIpq9bJ5XJMTU3h5s2bfA+R7sP169ehVqvxO7/zOywURhV1JBLhBFxoniPUNxE+d5R4E3eIRn2Jt0MJUDab5U17ZmaGkQilUomqqiqcPn0ad+7cYT0KQkuIj6TRaFBZWQmPxwOJRIK2tjb88R//Maanp+F2u5HL5aBSqZBOp3Hy5Em+T7RaLUKhEFsP07EIEY/Ozk4cOXIE9fX1kEgkcLlcmJ2dRTQaxRNPPIHR0VHW5qDnoKOjA36/HxMTE5BKdyznA4EA8w8o0aaEXSwW88+2trZ+68nBbyOE3KzGxka0t7fDbrfzc0KOpwe5MZLSLXE0Pq7x8blyv6WgC33Y5EAul+O5557jhcRqtaK/vx/37t3DzZs32dWtra0Nb731FiQSCc6ePYtUKoWbN29CoVDgzJkz+P73vw+n0wmDwcCmH8lkEltbW1AoFLzhSaVSNDY2QiaTYWtrizNa2szb29vh8XgQDofR1taGoaEh3mDJEKi5uRltbW0wm81lnRcpCGZ77bXX4Ha7YbVamSlNjHnqwa2trWFhYQGXLl3CzMwM4vF4EcM6nU7DYDCwGYtwfjgQCODu3btFGzZtcPX19XA4HHvKLEskO+52ExMTnMELx7qo8iNSIDH/90MEyIaWFsdScyEK8rPo7+/HtWvXkEwmodfrD0RkhDoYRJgjJMZisSAejzOjmwRtCGGgXj1tmEtLSzh58iQnQwSJUnuGRGjovykxEML9tHETj4AqMJlMhtXVVdTW1uLBgwf4yU9+wup8Tz31FP833RPlSKRyuRwWiwUqlQrLy8uYm5tDOBwuus70eRKJhAWTrl27hvb2dk6GqIKl0T+NRsNsfvqMn/3sZxCLxbDZbHx9KFELBAL48Y9/jBdeeAE6nY7fl0SdZDIZXnzxRbz88stFXA2FQgGdTgepVIpQKMRcGZ1OxxoR9MwIxZvovhkZGUE2m0VlZSWPiPp8PiwuLmJ7exvHjx+HwWBAVVUVhoeHebxXaGlMG/Gbb77J7oUmkwnj4+N4//338eqrr0KtVvPonMPhKJLhpnNBif6lS5eg1Wrh9XoxMzODYDCIqqoq9PX1wel04oUXXsCtW7fKjnB3dnbiySefRDKZ5LFrSqjofiDRJ3KIdblcOHLkyMcuOdDpdOjq6oLVai3LZ5LJZHjiiSfwox/9CHa7fU/OQSAQwAsvvPCxRg2Az5IDJhY+SpZXelNUV1ejoaEBN2/ehMlkQltbGyuE9fT0YGVlBT6fD/X19QCA69evo6qqCpOTk+js7IRCoeDqRKvVMtHN4/Hg5MmTSCaTUKvVaGtrw9zcHCu7WSwWRCIRrqref/99vPfee0in02wfGwwGsbi4iEQiga985SvsoLaX4iEAOBwOrtioOorFYgyB00z74uIiG0YJyVPU0yUY12AwwOVy8WZEvW7hhkGEzVwud6A7YnNzM7PJabMS6jUQ67yxsRHXrl07lGgR6fsD5XkCVMXH43H81//6X/Hw4UPuNdfV1aG1tRVms5lZ9+XOLxGr1Go17HY7NBoNy7hKJBLWrw8Gg4z2kLMeHQOhPxqNhkdOxWIxDAYDQqEQdDodVCoVtre3i4R6yn0XOsZ8Pg+/3w+pVIrt7W28/PLLWFpagkwmQ11dHQDgvffeQ6FQQF9fH4vglBLdRCIRGhoaEIvFWICrVDSKxI/S6TTkcjm8Xi8ikQhGRkbQ2NgIhUIBrVaLrq4uNDQ0sAlOTU0NvF4vEokEtra28MYbb8Dn88FisbDlMwlrUYuFDHYuXbrEULHJZIJWq4XP58Mrr7yCSCTCCRihATS9RDoVVAUqFApOXITnnci56XSaEzLiFAwNDUEsFvPkEyUHU1NT0Gg0yGQyqKmpQXd3N3u8JBIJPHz4EOvr63yNX375ZXg8nl2jc2+//Taeeuopvmcp8TQajfwdNjY2EAqF4PF4YDAYWKvA5XJhcXERX//61/E7v/M7e45w63Q6DAwMsE4FfU4mk0E0GoXJZEJPTw/u3r2LSCTCXCm61h+XkEqlOHHixL6vefrpp3HlypV9xfJ+E1Op/5fi43PlfktB2tgfljldKBS4b37kyBGsra3hxo0b7GU+NTUFlUqFlpYWPHz4EF6vF0ajEd/61rfw3e9+FxsbG2hubuaRSLPZDGBn/KehoQF/+qd/iu3tbSwvLzMUTbKoJGpDfd33338fmUwGDQ0NPIYj7L//9Kc/xWOPPcb97NKQSqV45plncPfuXV7QSTWNFOWEdrXUyig9d/QzqrSEs+i5XK4o+aBzSD1l4GB3RJPJhCeffBKjo6NwOp28aBO0TuNiWq32UNULtUzIJKhcIpHNZnlhvH37dpED4OjoKBYXF/FHf/RH0Ov13CcujXw+j9OnT8PhcGBtbQ1KpRKhUIjhzGw2y1AtKQoK1SRJrpigbKVSyagBTZNks9kDYU8ihQrvHxJAunXrFiKRCLdOGhsbGc2Ynp7GzZs38fTTT+/JCVlYWAAAZnyXO//U/pBIJCyaVSgUYLPZGCkzGo2Yn5/HysoKw+3AjkS5SqXCj3/8Y5a8FWr+E0fAarXCaDQim82io6MDS0tLSKfT2NragsfjQW1tLUKhUFHiRckpIRaUqJMdtM/nYx2FUCgEtVrNbTyFQoGTJ0+yXgBxJZxOJ8PRer0eExMTSCQS8Hg83HaMx+Ow2WwwmUwwGAxYX19nIt/IyAh+8YtfoFAolB2dm5qawl/8xV/gueeew/nz51kY6ty5czxquri4CI1Gg/7+flitVuZcjI2NwWazoampCSKRqOwIdzwex40bN5BOp5ngSM+9SCRCIpGA2+1m6XaSgN7Y2CjiP31SorW1Fd/5znfw3e9+tyzS8vdhKvX3FZ/65CAej39oUguNrSwvL6Ourg6hUIgrOtLgb21tRSAQwI0bN6BQKHD+/HmcOHGCN7zvfve7XIXSnHIgEEAmk8GLL74Iu92O5uZmrriNRiM7AJKwTTKZxMrKCsRiMVpaWmC1WnmOnBi4SqUSKysr0Gq1OHXqFFePwu+Sz+fhcDgQj8fhdrsZEaANjF4H7ED55JJXLoQ6AMIKs5zKYLkqmxIaqsKErysUCrBYLOjv78fS0hI2NjaQyWRQUVGBz33uc5DL5dDr9Vy5lCIBIpEI7e3tKBQKWFtbQzgchlarhVgs3lNa2e12c1ugtHdOhkD/+3//bzz99NNMNiPSoVKp5KkAEpORy+UwGo2IxWIIBoNoa2vDyMgIV6tklUxBLR+6d4iTQP1zOjckAUutp9IRRIlEgpqaGmxubu4aUZyZmYHH42GOgVKphNPpZPi8pqaGfRn2M84CPoDcy51/AOxgSd+N4PNQKMQMeJfLherqavT09ECr1XLPnYS+qJ0jl8ths9nYbCqRSDDMXlFRAavVysQ6asO43W5WFZRKpUwMpvNJ7QylUomf//znmJiY4P8/fvw47HY7qqqqUFFRwQhYJBLhaSTSkSAPgvb2dpw+fRqVlZW4fv06NBoNamtrsbq6ikAggKtXr3JrAdhBI0nsKxKJoKurq2xb7OjRo1yxX7x4EQMDAzh27BhWVlY4Ae3u7kZdXV0RenPv3j3I5XL09PQUva9Q6jiXy2FoaAgulwsWiwXJZJLbCHT9aLJlfn4en//859l34uc//zmSySRefvnlT5xy4KVLl1BTU7Mn0vJJ+Z6fJQd/RwZ61MjlchgdHYXL5UJNTQ1cLhdkMhk6OzsxNzfHJjETExPI5XLo6OjA2bNnixIRusl++MMf4urVq6ioqOCbjKqXV199FY2Njdje3obP54NSqWSDHJvNxhD26uoq9+CpkhIKK9H8/MrKCi5cuMDVKiUpKpWKiVtnzpzBa6+9BoPBUJT5Cxnd2WwWly5d4tnuciFEBigooSmn/CgMmgCgyoz4DkLugnAqguSZ6doAe5stUcKj0WhgsViwtraGrq4uWCyWPS2JKfko5S7QJqzT6bC9vY2FhQWcOXOGURKxWFw0LkiGPzqdDidOnIBarcb8/DzOnTuHpaUleL1e6HS6okpYJBKxgFRvby+OHDnClbBw3I54KFQFlyMNyuVynD59Gjdv3mTlRDrX8/PzTGKkUT46D4QA2e12eDwebjftFVQ572d2RccrEonw0ksv4YknnsDw8DDOnDnD7a/Lly8jlUrB5XLB5XIxKiKTybhXb7VamS+iVqsRDAbh8/ngdruhUCgwPz8PkWhHQdLn86Gurg6BQICf0VQqBZ/Px9MOJKhDbTOfz4eKigoolUrIZDLcvXsXSqUSX/jCF3D27FnU19dja2sLGo0G6+vraG5uhsfjwerqKiMoREzc3NxEOp3GY489BoPBgFu3brG2BCFTNDqYTCYxMTFRlIyWhki0Y+i0uLiI2dlZ9goguePGxsZd1+nhw4eIxWJ47LHH9kXVHjx4gIWFBdhsNvT09ODOnTs8qkwqmtQyLRQK+P73v4+3336b2x8qleoTqRwIYF+xvE9KfJYcxOO7VPYOinQ6jeHhYYTDYR4JM5lMyOVyWFpagsFgwNbWFvfcv/jFLzJpqjTsdjtOnz6Nr371q2hoaODF+MaNGxgaGsLGxgbW19chEolQU1PDY0I0u//cc89hdXWVe8ihUAixWIw3Cdo8SAKXNvXp6WmEQiHWQVAoFFCr1TCZTOjs7GTzFXJ1JP4B9fQrKiqY6FUuaFpAqJ5HG31DQwPu3bu3y1KWXkNVckdHByoqKopsnysqKvg7EdQuVIAjZThKIvYyWyIORCAQgFqt5hHEcpbEra2tWFhY4I269HiJ6a7RaLC2tobLly8jkUigUChAo9FwX5s2ahLJ+fGPf8z/LxaLcfz4cdy5cwcej4cldWmT1Ol0uHDhApRKJbxeL3MPSCqbnONIKXO/hG1iYoLVFKlFRPPiCoWCxxDj8TjbOtOYGvXX9zPOksvlaGxsxMLCwoFmV7lcDp2dnfjGN77BRMBsNouxsTFUVFTg9u3bDMvTpBCZ/7hcLigUCk6k6ZhTqRRzP7q6uhhhMJlMLLdts9lYsEo4Oknnwev14tq1awCA7u5u5vbodDpYrVYsLS3hjTfeQF9fH3s1tLe3Y2pqCm63G7Ozs8xJ8Hq92NzcxJtvvom1tTWIxWL88pe/RDqdRiAQ4Bl7SsT9fj+i0SgTiPfjQ9F1TyQSuHPnDux2O1paWtDS0lJ2s1pbW8Pa2hp6e3uh0+n2fN/Z2Vncu3cPVqsVTz31FILBIAu6ZbNZHDlyBA0NDcyLefnll/H9738fCoXiE68cKIz/10ylPsr4VCcHJDj0KG2FWCyGoaEhdkgjuVsylEkmk9jY2IBIJGL52ZWVFVgslrJZ+uzsLIsLxWIxlrHd2tpiyJcUzba3t5lrAHyAXtBYGvVJZTIZQqEQTyuQjGgikYBSqYTf7+eNMJPJ8IMPgAlxfX19nJxQT5/G4CwWC1566SVWSxMGbaCkikghHLGqq6vDzMwMbxjCnnE+n4fP54NOp0NHRwf32Y8fP45oNAqXy8XS1TTGJ6ycqTdNUWq2ROJN6XS6rGhROY2GTCaDpaWlXZsh9eqF353aOPR3lEAQ2ZD63ELGO7VempqaYDAYsLi4CIfDwd/vxIkTOHbsGCorK5kYSokAsINGEE+DXEDn5+f3RGf8fj9X4JRE0d/H43Ee5aNjFJpiCV32iNMiPAdisRhnz57lkbf9zK4SiQRMJhO+/e1vo6amBnNzc3C73XjvvfeQSqXQ0dEBu90Oq9XK121mZgaDg4M4deoUNjc3EYvFuGInIizNmR87dgx/+Id/iOXlZcRiMZYwp+eFtAKEJFi5XI5kMomlpSUkEgm0tbXxqC5xY4CddtLW1hZeeeUVRjTm5uYQDAa5LaJWq1mx0Ov1cq++pqYGarW6aERSr9fzKHF7eztOnDiB+fl5aLVaxONxblWVhtfrZVTQYDDgmWeeYVJkaSswHA5jbGyM1Q/LcVMKhQLW19dZX+Xxxx9nIm4ul4NWq8X29jZcLheMRiPa2tpw5MgRluQuJenRvdXS0oKpqSm88847H3vlwE9LfKqTA9pkD5scBINBDA8P82JI5DePx8NeCSKRCL29vdxr7ejowPDwMIaHh3H69OmiBCEQCMDhcMBisTDMS7PSNpuNCYaZTIZtQelzgR3YPBAIoKmpCY8//jjeeustADuLAE0zADt+AeFwGIlEAufOnYPL5WLP8qqqKmY/p1IpXjBsNhsuX76MlZUVLCwssJToF77wBXzjG9/gxUuYHFCFWU5FDvhgkaINY3h4mNXZaLOjsbVnn30WtbW1KBQKqKmpgdvtZsIYsLOp2e12eL1eVvYr5UdQEBS6srKC1dVVTjj2Ei2i7yJMBvbqnQuDkgmhvgMp9dHiKdxghGEwGHiDrq+vx+XLlwHsLKwkREStFeF8vTDI7IsMvIQCRxRU/VHC2dTUhIWFBUilUtTV1eHBgwdQq9V7ekekUil0dnZCrVbj+eefRzwex/3797G0tIStrS2EQiFcu3aNx0ebm5vLml3J5XJ0dHSwTfm7777L6oZqtRoXL15kgy5gJ4kimFulUuELX/gCYrEY3nrrLSwvL7MTpU6ng9PphEqlwr/+1/8aFy5cYH6Oz+dDKpVCLBZDU1MTTCYTqym6XC5uBRUKBSwvL0Mul7NgFZ1vek6IzzA1NYXe3l5uHdDGqFAoYLPZGKEilKSyshIKhQKBQKDI/4IEczQaDfx+P27cuAGv14va2lrcv3+f0Tfh+SByYDQaxZEjRyCXy3H79u2y92Y+n+eCAwC2trbKvi4ajWJ9fR0ymQwqlQoDAwMAdtYQj8eDUCjE97bP58Pq6io8Hg+uXbv2qVEO/LTEpzo5oMrqMMmBy+XCgwcPeIMg+Nvr9SIcDiOTyaC+vh6XLl2CTqfD0NAQ5HI5TCYTzpw5g6GhIQwPD+PUqVOIx+NwOp0YGRnhMUW73Q673c6664ODgzyfTpuNVCqFXq/HE088gWAwiIWFBfh8PkQiERw7dgxvv/02VlZW0NzczOIdyWQSfr+fe9Y1NTUIBAJMWtva2toFQxPpam5uDrW1tejv72fC4vnz51FTUwORSMSa/PQ3UqmUj7ncxiSMkydPFjHSCcLv6OjA888/z6NWzc3N2NzcZLKXWq2G1Wplb3nqhwcCAa7SCYUQbsIWi4VHxijROSyTei/ugjBIaZMMl4TfX2hGJAyq8GhSg0bbaNMQkgUJVSGUZS9nSEIhShMQUqOkc03faX19nX0YmpqaMD8/zwZNpd8zFArBYDCgtbUVBoMBSqUSra2tuHXrFieydF5TqRQmJyexuLjIfhr19fX4wz/8Q/YWoVFUnU7HyNmtW7fQ0NCA1tZW/tx4PI6RkRH4/X6IxWJUV1fj1q1b0Gg0+PrXv46lpSWMjo4iEokgmUyirq4Ozc3NuHfvHsbGxpg1T+hVLpfD5ORk0UQPhU6nYzIj8Q9UKhXUajWPX5L+RFVVFSMU5G9B44L5/I79utfrRUNDA490nj17FisrK4jH4+ju7kYoFMLk5CTa29tx6tSpontyfHwczz33HLxeL2KxGBoaGri1A4CTjLq6Oly8eBGXL18umkQScmympqaQz+fR19e3a72j121ubuLu3bswmUyMQFCMjY0xOZXuLdI32NrawsbGxoHt2U+KcuCnJT7VyQExvkk3nWJlZQV+v5/dz1ZWVjAxMcF9QZr7D4fDSCaTMBqNuHjxIs+EAzuVLfX0KisrcezYMQwMDGBxcZH7+fl8HpcvX0ZraytisRi8Xi+WlpZY1IQWf7vdzp/zla98hUmA1BtdXFyERCLBxYsXMTo6io2NDVZao41TrVbjmWeeQUdHB0KhEGslCDdy2mho3FCv17MlKynnka1zLpdjLkRtbS3C4TBrRpROKJSLUCgEo9GI/v5+nD17ljUASOZ1YWEBer2e1dY+//nP4969e8zl0Ov1nORQ750+t6amhmetNRoNownUny3dvA8TpK0g7J0LRzRJW4H6qcL3FiZfQvEi4nOQC55MJmPDHer1AzuLN02lUO+dRusOE+XMsMrZW1dWVrJvBCE6pElASeypU6d4hv7Bgwe4fv063n//feRyOT52sgjX6XRwuVwYGhqCyWRCc3Mz5HI5dDodjh07hqmpKZZ7Jg8J2uDfe+89JJNJRKNRuN1u3pTy+R0LYJJS1mg06OzsRGdnJ1f1wgSJ1E+lUimqqqoQjUa5alar1SxuRAgK8WwoKaBrQH4FNIJLyTJZYC8tLWF9fR16vZ7Poc/ng1QqRV9fH1ZXV1EoFLC6ugqRSIQnn3wSVVVV3EK0Wq2ora0tum4zMzOsK/Gf//N/xsTEBHOD5HI5Njc3UVVVhRdffBGXLl0qWn+Esbi4iFgshvPnz6O6unrX7wuFAhYXFzE5OYmKigo8++yzu15Hoj9CVC6ZTHLhotfrD0TWPinKgZ+W+NQnB6Vz7fl8HpOTk9ja2sLMzAw6OjqwurrKlRrNlBND9bHHHkNXV9euKpQ2rbm5OTidTkSjUajVaoTDYZ4iqK6uRjQaZeEigi5zuRyam5sRDAa5Irfb7dja2sLU1BTsdjsCgQCLmxD829zcDJvNhsXFRbZR1Wq1aGhoQFtbG/7gD/4AVqsVN2/eRGVlJZqamjAxMcF+8xTEOyD1PJr/r6qqwnvvvYd33323SJWRyIe0YB4m8vk8PB4PlpeXsba2Bo1Gg1gshrq6OrS3t6OjowNGoxF2ux0nT57E5OQkG8EolUquCMn3QTh94fP5oNVq8Yd/+If/X3tvGtwGemVnHxAEQewAsZAgwX1fRFEUtW8tqdXq1R1v7VmczMTlScVVqUllMkmqklTyI5UfqUrSn2uSzHhmHI+dtt1eemz3akndrZUSKXGTKO4EQRIASezERgAECHw/WPcaoKhu9WK7PXqfKpXslsQFAPHe995zz0EoFMKbb75ZMDen7/GjYDQaceLECVy/fp1n57RTHo/HIZfLC7QLO8nXHdB4hMY/dJMPBAJYX19HWVkZdwmolZ3JZNhbQS6Xo6mpCYlEgrtf+cVO/ppq/ijsgwKlyI1y5wggP8KZRjCZTAZLS0swmUwYGhrC+vo6Ojo6eLyWL8CkWf7MzAyqq6u5UHI4HIjFYkgmk/D5fLzuWVRUxAZMFHxD3xttP5CLZlVVFW98kDD0xz/+Mebn5ws0HVRoVVRU4Mknn8TAwAAWFxeRTqc5iIxWgaloaWpq4t/X19eh1Wo5nZQyJ3w+H5544gmMjIywnoUEoxLJdpRxaWkpPB4P5HI5/H4/rzTShYS+9p1JkaRfIhOmF198EVNTU7Db7fx8nzp1Cs8//zyy2exDRX6BQADT09Nobm5+aGEwMTGByclJSCQSHDp0iP9eOByG3W6H2+3mrgGNvqRSKUpLS3HgwAH09vYik8nglVde4a7ibp/nH4pz4OOCKA52tNhWV1dZLby6ugqHw4Ha2lpu0cfjcRQXF6Ojo4PV4/lEo1Gsrq5iYWGBbU8rKiq4Tep0OjEyMoJEIoGGhgYkEgnU1tbCZDIhFothfHycXd8oOEer1fLMb2ZmhjMOyFKXbkt6vR4vvvgit3xzuRyuXbuG+/fv8xx5enqab0YHDhyARqPBm2++WXC40JsAdT9IPf5//s//QTwe58dMJpNhcnISfr8fbW1tqKysfOTH3uFwcDgVmVBJpVJOINTr9Th27Bja29uxtraGiYkJ9m93uVwwGo3cCaAOgdlsht1uRyaTwRe+8AVYrVY+VGgrYzfoZp6/crgTclxUKBQFB6dcLseRI0dgsVgeKhoDAJ1Ox7v6qVQKS0tLrESneXV9fT1cLhd3BzweT8FsmebLNB/fWeDk6xGKiopw8uRJ/M3f/A0SiQTKy8sfuNkVFRXBZDLB4/FgYWEBe/fu5ZTQ1dVVeL1eRCKRXXMjMpkMPB4Pbt++jWw2C5fLxS174FfrpOTzQCMovV4PuVzOPzeLi4tQKBQslu3q6sLBgwcxMDCAqakpDixKJBI4efIkbDYb1tfX2aI3Px1UIpFwuBGNzehxIe+BpaUlbms3NTXB5/OxyNVoNKK1tRVOpxOdnZ1YWlqC0+mExWJBJBJBSUkJFxqBQICNiigPQiqV8sWBcg6kUinGx8f5Zk3FHUFdjZ2vvWg0yuOEsrIyPPPMM/iTP/kTFnKSZXk2m4VOp2Njq3zI8pi+r51ks1mMjY1heXkZEomEw4Xefvtt9vUAtl/7tbW1MJvN8Pv9KCkpgVwux4EDB9DY2AiJRPJYOQc+Ljz2xQE5EhKkbM43aKG8A2DbCObUqVMs9gO2RTwrKytYWVnh2Tj5xhsMBgSDQRbuqVQqXlMzGo04ePAgMpkM7HY7xsbG+I2F3lzlcjnC4XDBfDQajUKn0+HgwYPo6urCz3/+czgcDiSTSbS0tBR8XYuLi2wws7CwgKKiIlRXV8PtdmN8fBz37t2DTqdDPB7nECpK7QsEAnwAT01NYWtrCzqdjkcSZWVlaGhowPj4ODweD86fP8/Z8NT23e2Gvr6+joGBAQ71USqVKC0thUajQV1dHe7du4e33noLf/AHf4BMJoP3338ffr+fRXQHDx5Eb28v3nzzTczMzPABRKE8xcXF+OUvf4m2tjY4nU4WR1JnZmd3I5fLIZVK8c2cNibyodfDbtsM+Za6O6E3yVAoxBkT+Spy6sokEgksLS3BarWyyCs/AIj+Po0lCNIlqFQqjhGnLtfY2BhGR0dZH7Pza6LHjfwvotEoi/boc+2WQEcuhGQYpNFoYDKZeCNAoVAU5GnIZDIuWpqamlhnkH+gTU1NQSqVIhwO4wc/+AFisRjq6uoKbvLUdvd4PDyCAba7dCsrK3A6nSwkzA/5IvEqFYktLS0YGBjA0tISDh06hIqKCiwsLPD6YiaTwdGjR6HT6fCDH/wATqeT804oO0Cr1eKf//N/zpod+rmmgoB+BQIBVFRU4Pnnn8c777yD+fl59PX18fdNGQi0TknvBTMzM9jY2EBPTw+6uroKAsxyuRz8fj8sFgvW1tawf//+B56jbDaL4eFhSCQS9Pb2PnCbz2QyGBgY4Pe7ZDIJj8fDnQGLxYJ9+/ahvr6ex6Pz8/Ns4kXaI+Jxcg58XHhsiwNq1+Z3DqLRKBwOB6ckEhTpfO7cObS0tHArmQoCag/TmyT5o9PNz2Qyobm5mS1oKbxoamoK4+PjfCOmA5V89ltaWlBVVQW1Wo2VlRWMjY3xyhIJmCSS7VhRn8+HaDSK8fFx9gefnJzExsYGDhw4gOXlZTidTpw8eZLFjaOjo1hfX0d5eTkf5KSWP3r0KK5evYpoNIqJiQl4PB4YjUYWnZG1KhUfPp8Pq6ur+LM/+zO8+eabiEQi3C7PX4ujtjHF0wLbNxO9Xo9AIACj0YimpibMzs7i1VdfRUVFBRvM9PT04PDhwygpKcHg4CDcbjeby7hcLh7NUBdgaGiIg3Ro3rmxsbHrJsXa2hpWV1d5Nry5ucmZCUaj8YGCYuc2Ax3w5L2Qy+Wg0Whw4sQJvP/++zw/J/JjuWn7JJVKIRwOw2azweFwIBKJFCQzAttBX1tbW/B4PAWFA20h5L++3W43C+V2uiTmrynS/6evn26zW1tbvGWRL26z2WyorKyE1+uFRCIpEFCaTCakUikeP1CiIN26JyYmOEtDIpEgmUyyOp5WasvLy/Hss8+ipqYG169fh0qlQkdHB3/9Ho8HZrMZXq8XTqeTVwctFkvBoUQdMDpQa2tr2e6XxkLt7e2cbbK6uspfg8ViwTe+8Q1YrVa88847uH//PpLJJIqLi9HT04PGxkZe+6QREGluaBxAep6uri4YDAY0Nzfj9u3brFshyAtjamoKTqeTdUZFRUVobm5+oGvjcrn4OSfL5Z1MT08jFArh6NGjfLHZ3NzE8vIyFhYWMDMzw3oPiWQ7E6O+vh4NDQ0PHY1ZrVY0Nzejs7OTTafyeVycAx8XHtviIB6P84oTQT+cu90AY7EYbDYb5ufn+U2ERGV0UwmHwywY0ul0aG5uRjqdhtvtxvT0NCKRCEKhENuP0thgc3MTBoOBbxF1dXXo6+vjSNvLly/D6/XCYrHg9OnTAICBgQHMz8+jubkZ2WwWlZWVcDgcuHnzJvvKj42Ncdt7fn4emUyG9409Hg9rEnw+H7u0lZWVIRKJ4MKFC7x5QKtU1BalGxG1btVqNTKZDBYWFnDp0iUEg0EA4FhqesPTarUwm8148803uZ1OqYFVVVVIpVLsG1FaWopXX30VX/ziF2Gz2fDSSy+xL8O7776L6elpaDQapNNpzM/Po6ioCK2trZy1UF1dDZfLxW/EZACVfygD2wpqt9uN/v5+nieTOdP8/DwcDgfOnj0Lq9W66woiQWuoJOJMJpOIRqO4cOHCrq+n/MOa/jyTyWBlZaVAJEp2uvR3XC4XaxE+DFLbk8qenCm1Wi2vr0ajUT68yXOBVlLp71HKJXWWVldX2Rr83Llz+MUvfsHfD7nlUYwydR6eeeYZ1ubQxyH9DhXp5FYol8tZ8xONRnHs2DH+fr1eLxYXF7lg1mq1aG9vR1VVFYcMpdNp1gUUFRWhvr4e8Xgcdrudu3VutxvDw8Pw+XzcFbBYLFCpVLhz5w4cDgcuXLiAp59+Gul0GvX19dwpor8fCoVw4MABzM/P84okPY/5vhPBYBDpdBp79uzB0NAQxsfH2SmQugXBYBAzMzNoaWlBc3MzvF4vaxXyyeVyrNGJRCLo7Ox84HlfXV2F3W5He3s7IpEIa6hCoRCPqSiWOZVK4eDBg7vGo+9EpVJ9qMPh4+Ac+Ljw2BUH8/PzuHTpEi5fvgy/34+f/OQnOHv2LAuVHqa4TaVS+MlPfgK5XM7rQnQjIVMYEmORXzplJGQyGZSVlUEmk6GyshLHjh2D0WjE5uYmrl+/juXlZZ4Lt7e3o6urC9lsFleuXMHU1BRkMhlOnTqFjo4OFj42NTVhcnKS3+Sz2SxHJL/zzjuwWCzc0qQwnVwuh4sXL2JxcZELG3K8o1HA0tISFAoFq7Zp20Eul0OpVGJ9fZ2tdDUaDXu2z87O8jy8qKgIcrkcEsl2cFMul0NZWRkaGxvR09ODb3/729xVyG/jU2FC4490Og2NRoMvf/nLCIVCmJqawtjYGNbX1zkAh9whKyoqeI1OLpfD5XLx4RCLxZBKpdhohm7YVqsVUqkU/f39MBgM6Onpgd/v5+LGZDIhGAzi3XfffWjYEEHbG9euXcPi4iIflvX19Q/1UtgJ+S9Quz7f7ZAKAsqzoI5DSUkJF3H5SKVSHDx4ENFoFD/72c+4g0LeHnQokbfEiRMn0NnZyd0uKlxJbEmjBjocNzY2EAqF0NzczKOvuro6NkWKxWJYX19HOBxmY5/Ozk7untntdnYdpOdNp9NxsmUikYDT6YRWq8Xw8DBvIiQSCaRSKdTW1qK1tZW7XkR3dzdcLheLeckLhPw3jh07xl2L27dvY2hoCJubm3A6nVzol5SUwGazYXV1FT/84Q8LvA6AX+VGmM1mtqmmZE8a1VDB3NnZyX4mra2tPMI4duwYPB4PpqeneUWzp6cHDQ0NALY7OhROlc/6+joXXmR4RVA2yrVr15DJZOByubjrZDQa0dLSwsmdnZ2dGB0dRV1d3SMVBh+Vf8jOgY8Lj1VxcPXqVbz88svs/V1WVoZkMolXXnkFP/rRj3Dw4MFdhT1EMBjk3WaKJKZIVQBsYkKZBMePH4fL5cLs7Cyy2Sy8Xi8MBgP0ej1yuRwGBgbY3IhakWq1Gv39/RgfH0cymUR5eTkaGhoQjUZx48YNNkWiSOc333yT28uUUufxePgGarPZ4PF4YDAYeKWPHBk9Hg8LrejNOZ1Oc2wtubwplUpEo1F4vV5WT9tsNm4pUxeGtBYmk4nb0nSTjMfjPBOOxWL8d0tLS1nRTpa+dIMsKSlBLBbDq6++CgBcyGi1WlitVl5pI8U3CTlPnz6N0tJS/OxnP+MZPFkRkzDx6NGjOHHiBP7dv/t3WFhYwOHDh9k4SqFQwO12I5FIoKSkBIFA4KHx0cRu64KZTOaBdUEif+4PgNfitFot9Ho9t+OBX4Vi0QgpkUhwiudu0ck04iovL0dzczMbA9EeOqVBxuNxhEIh6PV6HDx4EE899RSGhoYwOzuLzc1NLqbKy8tx9+5d3qQBwDfz0tJS/NEf/REuXLgAt9vNq34bGxvsl3Ds2DFEIhH8+Mc/5tdUQ0MDWlpaMDk5iUQigY2NDc4DWV9fRzAY5Hm32+1mjQvZH0ciEdy5cwfFxcXQaDTQaDQ8yst3eSwqKuKfuXQ6jenpaS5Gg8EgH+jkN0Gdk8XFRQDgn4f8sQqh0+lgs9lgt9t5NJF/eaDQJ51Oh4WFBdTX16OtrQ0XL17EO++8g1wuh/Lycuzfvx9Xr14t6CZRB2Uny8vLbBPd09PDGz9ut5s3iIBtbVRlZSXq6uo4gfLOnTswmUzsfqrRaNDV1fXQ17Tg8eaxKQ7m5+fx8ssvIxaL7er9PTU1heHhYTz77LNsc7oTesOjuXZZWRn0ej2/+VDcrtPpxMzMDIDtgoJa58lkEisrK/iLv/gL3gKgOT/Ft/70pz9lUWBTUxPbC1PhQRV5NpuF0WjEzMwM4vE4NBoNWltbsb6+DrvdjkgkAr1eD6vVinQ6jZaWFrz99tscx0u6CQDsDUD+Daurq3xA0xaAy+WCVqtFVVUVioqKCrwSgG1Xxu7ubqjVahw/fhyzs7OsAwDALo+kyh8eHkZtbS2SySQcDgfrEmjUkEgkWGFNUbkSiQQ9PT3Yt28f3nvvPcjlcnzuc5/D+Pg4rwCur6/DbDbj9u3biMfjaGxsRDgcxsLCAr/50k33zp07uHv3Lusg6M2Ynpd8b4GHxUfT10ddJ1L7A9sHv16vRzAYxMDAAK8L0uFNRebJkyfZK8BqtbI4MP8gIuEh7ejT90I3+WQyyZHfnZ2dGBwcxOXLl6FUKvHMM8/gl7/8JWZnZzkwh8ZgBoMBJ0+eZDOpEydOwGKxYHBwEMFgEHq9HuXl5Xz4tbW1Qa1W80psOBxGTU0NXnrpJUxPT3PCqFQqRU9PD2pqatgqmKy90+k0ZmZmEIvFUFJSwm1/iUSCuro63Lp1i1P/yGWxs7MTSqUSFy5cQEtLC3trRKNR1uPQaCwSibDVr1ar5ZVhiUSC/v5+1nJQJgWt4dL8ncYGudyv7LGps5aP3W7HyZMn2efi6NGjWFlZgdvthtVqZeFxVVUVlpaWcPfuXbbX9nq9ePHFF1kvRFs3BL3u8qHRHXmKeL1e1qtotVoukkgYTJCBm8FgQF9fH0ZHR5HJZHDkyJGPHVUv+IfPY1Mc0G7+zsIA2P7Bb2trw61btzA8PLzr2g+w3aptbm5mgRcdeJFIpMAtMP+/RSIRbG5ucisS+FUqoE6nQ3V1NXp7e1kIWVRUBJvNhs9//vMfaBZy/fp1jIyMcCxzMBjkUBe6ZZJRzZEjRwCAZ8/xeJyV6JFIBDabDd3d3RgYGEAwGOSvlbwIurq6WG1PY4J8x7mVlRXodDq0tLQgkUjgrbfe4pY1sH2w1dbWcnJhTU0N7t27B4fDwcIsEsIlEgmEw2FYrVY8+eST0Ol0WF5e5g2NSCSC1157DZubm7xKSqOD0dFRpFIpfP/730cgEIBEIsHy8jJ3QQiTyYRIJILV1VUkEgmUlZWxcE2v1/O6mlqt5k5INBot6M6QiRUAjuc2m8285pWfllhdXY2FhQUsLCxw94Fm+jQLpwCgxcVFdiwkBTs9F/m/0+v25MmTqKmpwY9+9CMA24WPxWJh8WUul0NXVxckEgncbjfu3bvHFsXkJ0F5G4ODgzh//jza29thsVhw5coVxGIxXidUKBQwm818s29paYFCoYDf70d3dze6u7vxxBNPwOfzwefzcdppPB5HTU0NGhoaEAgEEI/HsbCwwEU2+YCQ46hEIkF9fT0L8/x+P65evQqZTIZQKMR+ArlcjkcIJOCjUCqZTMYx6tPT09DpdHC73fy8UHFNFwEqSsnkTCKR8Chl5+NOP//ZbBbf+c53MD09jYmJCbz55pusOzlz5gyLI8mM6c6dO2hpaUFTUxP8fj+/9qnztbM4IF2Bw+GAy+XC8vIy23EbDAZUV1ezG6TH48G9e/ewb9++gsJgeXkZ9+7dQ0VFBfbt24eFhQV4vV4cPHjwY0fVCx4PHoviIJ1Of6j3d1FREerq6tgUZTdIEU23d5lMxsp9SrejqFePx4OzZ8/irbfe4hbwzvZvPB5Hc3MzawIaGhpw4MABjI2NYWBgAEeOHNl1lQz41byc7HR3Hh607kRhOi6XCwqFgtvVx44d4yjb8+fP47333oPX6911F/7cuXNQqVS8MpnfNg+Hw1AqlThy5Ah0Oh3fvuj7pceloqKCRYGUrUDFiEajYbOajY0NqFQqfOUrX+GOBX2Pcrkc8/PzrJcYGBiAUqnkMYvL5YJMJoPRaGQVOfCrVDhguzDIZrOw2WzQarWcO2+z2RCLxbC5ucldHmpZ0/dSUVHBN/T8m/vS0hJ0Oh3fQDc3Nzk9kqx7rVYrXC4Xjh8/DgDsra/X67G5ucn6jkgkglgs9lCXyXwxJekTaEtj3759CAaDuHXrFgDwrJkeR71ej8OHD7OHxv79+zE9PY21tTUkk0lMTk4il8vhiSeegNFoxIsvvojx8XGMjo4iHA6jra0NsVgMoVAIkUgEzz33HHQ6HUZHR7GysoLa2loYjUZ4vV6UlpaipqYGUqkU09PTWF5ehsFggFqthsfj4Z+3VCpVYJpEs3Yy5iKzn62tLQwPDyMej+PWrVv8dxUKBdRqNScm2mw21t+cO3cOqVQKb731Fm9tUGFAgkIAD2RV0HhvN28MKhyKi4uxtLSEgYEBbG5uoqysDMXFxYjH43C73XC73Xj22Wc5X4GcFMvLy9Ha2orXX38dMzMzaG9vZ20EuUMuLCxgamoK6XSasxKUSiWPeEwmE5555hnOaVlfX8f9+/dRW1vL657kejg9PY3a2lrs2bMHfr+fRY8fNYlW8PjxWBQHpLR+2EFLkJ3tV7/6VQSDQczOznKaGq3C7du370M/H6m/AbByfTfFeiaTweuvv47a2lq88MILqKmpAbA9D7916xZu3ryJo0eP7vp119bWwmKxwOFwFFgH5xOPx5FKpXDlyhVoNBrcvHkTExMT0Gq1GBgYgMViwQsvvIDp6Wk+dHdCNx6FQoEzZ85gbm4OdrudD729e/eit7eXVzife+45SKVS/PSnP+XOgkQiYRU5rYl2dHSgu7sbc3NzGBkZQTgc5rWvjo4OHs9ks1m2vY3FYqx3oDduMrwhFbZOp+N9ebPZjIMHD+L69ev8hv/kk09ifn4efr8fyWQSBw8exIULF1ibEI1GC/b4w+EwXC4Xuru7WZhHiXaktchms5DJZKiqqsLW1hZ8Ph+bZZGwjxT69PvU1BSvGmazWVRXV6Ouro7dEckbYGcrm4KdgO1O0J07d1i38cQTT+BnP/sZjw2USiXi8TiCwSCbIFGwj0QiQXNzM7e46XU7MTGBSCTCBjf79u1jLQjN6lOpFFtqb21tQa/XY3Z2FtevX0d1dTU0Gg36+vp4pVav12N4eBh+vx+hUAjhcJjjsg0GA2pqahAOhzE1NQWtVsuGYPF4HIuLi1hZWeFuisVi4YM9nU4jEAiw4LGjowN37twBsN2tIc+LZDIJv98Ps9nM4xQaAdHWDv3skL6AVnHzUalUrF8JBoMYHh5mnYharUZlZSVWVla4uPn7v/97VFZW4vz586irq+MVwvr6eqhUKkxPT6OxsRFLS0uIxWLw+/1YXl5md8TKykq0tbWhoaEBUqmU8yuoe0mvgeHhYWi1WtYP5HI5TE5OsgiyubkZiUQCIyMjMJvNBYFWAsHDeCyKA1qp2m2/PR8qAGpqatDY2Iju7m4sLy9jbm4OHo/nkVW9GxsbfJuNxWIsMNsNiUSCF154oWBXWaVSccztzZs3ceTIkQdGDDKZDB0dHVheXv7AFTtge0VzaGiIVy2pFTwzM4OhoSHs2bPnob7sAHhfub29HR0dHTzGUCgUaGxshFwu52CXy5cvcxBVfot2ZWWFldN0q1YqlfjTP/1TTE5O8q09lUrBarViZmYGmUwGVquVb2TkjeDz+TiXgZ4benP3+XzcAfF4PBgaGmJXt66uLmQyGZw6dQo3b95EIpHg2+3i4mJBZ4mKu9XVVV4vzeVyMBgMSCQS0Gq1qKurY9vZRCLBITsajYYNsehw39zcRHFxMZxOJ8bGxuD3+1FaWgqZTIZMJoP79+9jYWEBfX19qKure+jWzM7nmjwGDAYDhoaGEI1GuTvj8XigVCq5nZ9MJmG1WmG326FWq3Hnzh0W4NEBmcvl4PV6EQwGeS89EomgsrKSxZlk9nPjxg027GppaUE6neZNmPyfFa1WyxklZHbV1tYGg8HAOh5y6SPtDG1jUBeOhK9er5dXfimwidZxqftFhkSUw7B//34MDg5y10UqlXJxWV1djcXFxYJR0OHDhx9INyQvEmBbiEji2AMHDmBpaYm3N6io0+l08Hg8mJycxB//8R9zp8Rut2NgYAASiQTT09Nwu938+gGAvr4+TmI8cOAArFYrAGBiYoLzLerr6wFsFwFjY2NIp9M4cuQIdxApJGnPnj2oq6vjrktxcTH27dv30O6pQJDPY1EcyGQynD59Gq+88goHiOxkN+9vuVyO5uZmNDU1wePxFCSe7QatSf7sZz9j86P9+/fzrvjOr4kU1Hfu3MG5c+cK/pxcyPI7CDsLhIaGBmg0Gp6R72ap6/V6cePGDaRSKVRUVPAtmzwNaMf/+eef5zd9ANzKpzdTMkyh1TkKpnG73Xyok7kTrTpS6BGlSdLogGa5tG4pl8vZhpbyKEwmE+rq6uB0OtnKVSLZTpGkuf7y8jIXEDRrpm0MYLszQ86ULS0t7Om/ubmJRCLBVsunTp3ClStX2Odga2sL4XCYOxHnz59HT08PTp8+DZ1Oh3feeQfBYBBNTU0Ih8Nob2/HnTt3EIvFMD09zWl1ZWVlPCrZ2NhAU1MTbty4gc3NTXaSpOe6trYW4+PjBcLFj0IoFMLVq1cBgLcaqqursb6+jpaWFty9exdra2uYnZ3lRMaenh4MDQ0BAL92iouLWcRHj6Hf70dDQwMymQybUkUiEYTDYRw/fhy1tbWsAfB6vfB6vXC73VCr1XA6nRgfH0ckEuFtkv379+PQoUP8tVO+RnV1NZLJJBcKpL9JpVL8OiHfBvpvNJqprq6GXC5ng6979+7h3r17WFlZgV6vh8ViYTfOyclJOJ1O+P1+nD59GolEAkajkZ1QW1pa0N/fz8UEJX0WFxdDLpejvb0dr732GtRqdYGLJF0AKLpZq9VibGwMFy5cQFlZGdbW1rC2tsb7/8D2OuSJEycwNzeH2dlZ7N27l/1D6ONms1nuotXU1LBwlgqnQ4cOQalUIpPJcIdm//79BYVFJBLB8ePHP/Q9TCAgHoviAMAn8v6WSCSoqKj4wI+/c01Sq9ViY2MDr7/+OlQqFa8UUYIZhTDFYjGMjIzg7NmzD4Q30Sz/1q1b6O/vR29vLwDw6hf50QPgmS1BZj92ux2xWAwmkwnJZJId3Oj7N5vNWFlZwdzcHI9M8mOPSbVfUlKCqqoquFwuSKVSVFdXw2q1oqysDHa7nUN86N9QsFAul8OBAwewb98+/OhHP+LbGQnkpFIpOjo6MDExAYVCgfn5eahUKpjNZuzfvx9Op5NHGPm3cI/Hg+LiYlitVt7N12q1kMvliEajrOIm7t+/z/vtDoeDH990Oo3Ozk40Nzfj1q1bmJycZBfI7u5u/PEf/zFbXVdUVCCXy7EIcmRkhA9au93OSZPZbBbxeJz31MPhcIE4jwKQ8lMxqZPi8Xg+dG0y/zneaaZE4xCPxwO9Xo9UKoXBwUHs27cPdrsdXq+XVwItFguOHTvGbozU6dnc3MTExATKy8u5M0V5DgaDAUajkXUZAPiwoo6ZwWDA+++/z0I70gVQp4W6DTRnn5qagl6vR3d3N5xOJ2pra2G1WjE7O8tOftSJKisr40KAbMuj0SiLUWkTxGg0so9CNBqFVCrF2toannzySTz//PO8WTE0NISlpSV8//vfZzMm2tJJJBJsaGa1WnHs2DHcv38fAPg1QumsEokEBoOBO2AkWgwGgxz1XVlZie7ubgSDQdTU1GB+fp4NzCh5kpIOAfDP9traGq9wkg8Cdf6am5thsViwubmJwcFBxGIxHDp0iG3hnU4nlpaWsHfv3oIcCoHgw3hsioNfp/f3h61JjoyMIBQK8e0zEolwjgLZJdPuPx36VADEYjFsbGzA6XSy6po+PrXsZTIZdDod/H5/wdcll8uxtLTEtwVqG5MmIn+rYXV1FUeOHEFJSQnfGinngcRaFHh09OhRVoeTs1tDQwOuX7/OaXdUUBUVFaGrqwsXL15EMBiEXC7nGOBoNIrNzU1OWKRM+HPnzmF4eBg/+tGP+HGhw4G+B1ofI+EadSfoVrkbJNxLJpN8CzUYDPzG+9JLL2Frawt2u53FhxTKc/z4cUQiEczNzWFlZYVn1zqdDj09PdBqtbhw4QKcTidH/VLUscFgwPnz53H9+vWCFNB8UePy8jKA7RHY4uIi9u/f/0CxuJPdEjDJeIf25IPBIBYXF/nwIZ8K6mZoNBrYbDbuZty7dw/BYJA3W2iToKSkBPv27UNLSwvi8TiGh4cRCoVw+/ZtHvNMTEzA5/OxtwLFbp85cwYDAwNwuVw4dOgQlpeXMTk5iY6ODoyMjPAKsEKhgNVqhcPh4KAxlUrFXQm5XM63Ycq+qKqqglwuZy8K6l7QOi4AFrwGAgFcvnwZFosFJpMJcrkcf/d3f8edA/I9+X//7/8hl8vh2WefRUtLC+rr69He3s7rj7TCGwwGCwzRSFuSTqdZS6JQKNivoaurC01NTVhaWsK9e/dgs9lw9+5dTE9Pw+fzIRQK4fLly8jlclhZWcHNmzfR0dHBqbDNzc0slBwZGYHJZEJrays2NjYwODiIdDrNmRDAdqri+Pg4ampqWM8kEDwqj01xAPz6vL8/bE2ys7MTMzMz2NzcZHc4OqiA7UP41VdfZeMWEkVR4SCVSqHRaBAOhxGNRlFTU8O3ZFrDpNseHZwknMtvsxMUsSyXy/mNLhqNIhKJ8E67UqlEY2MjJzwODg4iFArh7NmzBatSS0tLKC0txcLCAt+EyICHdsPpjZTMZoDtwsZsNqO0tJT1CnV1dXj++efZXppu4mRKlB+7TGtn+YUGOSLuJqwsKiriffumpiZUVlYiGAzC7XYjk8lgY2ODzaFyuRyam5sxOTnJhwwFzlDngNYfSZBH1rJTU1NYWFgAsH1w9fT0wGg0shEU7efnj39o3gyACyFKfKTXEP39h4VZEblcjou1vr4+1NbW4v79+yyMBbZvnSQIpDXWmZkZnDx5EqlUCjMzM4hGo7h9+zYnR37+85/nolGn02FiYoIdMykfRCaTYe/evWhubsbIyAiqqqrYlCsUCrEHg0ajwfj4OMLhMGKxGI4cOYL+/n5eSV1YWIDBYOC1QFpdrK2thdPpxIEDB1gUGAwGEQgEODSoqqoKFosFGxsbrPgnXQb5RBiNRjgcDvx//9//h0Qigbq6OiiVSk5RraysxMzMDC5cuIBz584VGAVlMhnMzc2hvLwcS0tL0Gg0XJCSton8McLhML785S/DYrHwNgi5ipIPSCgUwo9//GNIpVLWntDPzc2bN3Hr1i0e9dTV1XGgUlFREfbt24dYLIaBgQF2fyQTt3Q6jaGhIWF0JPjYPFbFAfDpe38/yppkaWkpTCYTXnnlFTz33HM8z88/xGher1KpoFarUVpaCrlczjdcMqG5c+cOstksTCYTrl69ivfff58DX7q6umA2m3nePDIywi3rndCtlFbvyDaWzJHq6uqwf/9+Xh0rKyuDUqnkN1dgW6g4Pj7O/vyUn0B5D5Qcp1Kp+IAkIRfdoJeWliCVSlFeXo7S0lLcunULoVAIKysrOHz4MM+26faX/73Q15lIJApCnnaGDNXX1+P06dOwWCx49dVXuSighMr29nakUincuXMHQ0NDHItLfgabm5t806RwKMoXIGMag8EAg8GAL3zhC1heXkZ5eTm8Xi8qKirQ0dGBy5cv4yc/+QnW1tZ4fTF/dY6gwo1uywAK7IupONg5UiDNCb0mXS4XhoeHcfToUayurkKr1WJ2dpYdKBOJBH7605/iyJEjrH2hGGkqSum1oVar4XA42LbZ6XQiEAiwDqCvrw+hUAhzc3OIRCIYHBzksRBpXigHgDwvFhYWMD4+jtOnT7Ol9ejoKD8u2WwW3d3daGhowOjoKIxGI7q6uhAOhzEyMoKTJ0/CarXCarVifX2dD+o9e/YgGo0iGAw+YHlMRdf4+DgmJye5y5JIJLC+vo5QKMRamoaGBszMzGB0dBTd3d2YnJzE/fv3eYRFIxLygTAYDDCZTKyb8Xq9KC8vh9VqRXl5OVZXVxGLxTA8PIyKigrcuXPngZ9LGjXRY08juFQqBb/fj+9973uora2FXC7HsWPHEI/Hcfv2bSgUChw+fJiLyVwuJ4yOBJ+Yx644ID4t7+9HWZOkNzutVova2lrEYjE+fOhA6+zsxIEDBz708x09ehTf+9738M1vfpPfACm8aXZ2FnK5vCBSur6+nmee+cULOS6S2KmlpYX3rWmeGo1GcevWLchkMhw5cgROpxOzs7NoamqC2+3G+++/z/NTEi2SKyMZzhiNRhZhkXiru7sbyWQSY2NjkEgkOHjwIE6cOIFAIIA33niDU/fyjaQoDIjWI4FfdR8oPdBkMvFePbCtKaiqqoJWq+VUPfoaz549y3kIw8PDPLagQ5gyH9RqNVKpFHw+HwDwTZQ6EfX19chkMjh79iz79OfbZ4+MjOD27ds4duwYjh49ym1jeg52RjInEgm0tLTwGuTGxgYL30ilv7a2BuBXmgPSgHR0dPCaZiwWw9TUFI+oQqEQOjs72XyIcgpu3rzJBUM0GmUDpOHhYX59NTY2wu12Y2xsDDKZDFarFXv37sX8/DwAsK+AUqmEw+GAyWRCe3s77+WTUHBlZYUDvMjkh1ICSQuh1WrR1NTE3Rsy4mptbUVRURF6e3tx7do1jI+Po6enh42uNjc30dvby7fk6elp1iDQz1h+gqTD4YBGo+GMDgqXou0Jr9eLWCyGv/mbv2HjoZKSEvbQaG9vh9VqxZUrVzA3N4dUKsX/NhaLQaVS4d//+3+PxsZGzMzMQK/XY2trCw6HA0NDQ/wayC9o8y2ayUky/xIRjUZx//59HD16lFcY9Xo9Dhw4UPBeNjc3J4yOBJ+Yx7Y4+LR4lDVJcn6jGXdNTQ2SySS8Xi+/8eS3lj8Il8uFt99+G4lEAp2dndjY2IDb7WY7Z4/Hg/fffx9PPfUUDAYDGhoaMD8/zzvl9AZEls+0W97a2sorhlqtFn6/H+Pj40in0/jiF7/I63zj4+P4/ve/j0Qiga2tLezZswe9vb147bXXWCBIbVGy811ZWWHVfktLC/r6+vDqq68il8uhp6cHtbW1uHv3LqfklZaWIhQKwev18qG4tbUFlUqF6upqTvbL5XJ44403sLS0xDe2qqoq1NTUoKenB3v27MHW1hbm5+d5bk4HcjgcZk1F/mYGCdLS6TQqKyt51Sw/1VEmk7GwtKWlBU6nE/fv3+c9+/r6ejgcDjQ1NeHEiRMYGhrC4OAgjhw5wi14KsLyC4NQKAS1Wo3Gxkak02lUV1cjEolgeXkZS0tLvDYJAK2trWhtbYXNZkNLSwunhlJQEa33keHQ5uYmNjc3IZfLudgiHwDKsAgEAhgdHYXVai3wzZicnERtbS3a2tqwsbGBTCaDWCwGs9mMtbU1uN1uBAIBqNVqHDp0CD6fDzdu3OBxF62RLi4uYnBwkA/q6upq3Lt3j8WvjY2N2LNnD7LZLK5du8YFGfkbANubHd3d3Txzr6ysxPz8PNswE62trWhoaCjQ21DBNDw8jGw2i83NTbhcLjZHou4CORqS30A2m2UjIYlEgsXFRW7Xv/DCC/jmN7+J0dFRDqk6duwYWlpacO7cORQXF0OpVOLu3buIRCJYX18v6BTtdLzM/zP6Ocov6ouKijA6OgqXy4Wurq4HLL29Xi9mZ2eF0ZHgEyOKg0/Io6xJ0hvxl770JfT19SEcDmN9fZ3X/chMZ2RkBHq9nuesO7UCwIP6BqVSyS6IpaWlLOiSyWSoqamBRqPB0aNHcfPmTc6xLy4uxvLyMtxuN/R6Pbq6umAymVBeXo7Dhw8jkUjg+vXrCIVCKC4uxvDwMLq7u3Hz5k1uPff19SESiaCvr49vn2RgQzNYsscdGBhANBrluen3vvc9BINB6HQ6+Hw+rKysIBQKsUCO5u4U4kPtYYVCgWPHjqGiogJ//dd/jddee41X5kpLS1FcXAy73Y5gMMimTI2Njejr64NGo4Hb7cbExASWl5fh9/t5/tvd3c3WzlevXkUikYDD4YDdbodMJkNjYyNqamp4tkuis2g0iuvXr3Msb2VlJRvraLVaTE9Pc8fg/v37iMfjOHnyJMbGxrC0tASVSsWPFSnjDx8+zJsKJpMJqVQKFy9eZNEkiffm5+fh9Xpx/vx5lJWVsVV2X18fGhoaMD09DbPZjEAggGg0CrVajdbWVkSjUY7bps8hl8tRUVGBzs5OjI2N4e7du2x6ROMnvV7Pcb0rKyuYnZ3leT9pPZ5//nlYrVZks1lMT0+zuPHgwYOQyWRsD03Pj9/vZ8tsk8mEI0eO8AGpVqt5m4VGbURVVRV8Ph+Hk4VCIdTV1RV4hdDabf7/12g06O3thcfjgUKh4ITHcDjMxVD+2iJ1Sf7xP/7HCIfDWFtb48AmKrhIJ3PmzBnodDr2NSEhLQDYbDasra3h7t27vKWx29pxvvW5TCbjwoTGDQDYZtvv9/P2E7GxsYHR0VFhdCT4VBDFwafAo6xJlpeX44UXXmA/dPozEt5RvO3a2hrfrFQqVUGxoFQqH9A3ULgP3eQpTW9gYIBb7g0NDdDpdJibm4PD4eCVqcOHD/OBIZPJ2LWN3Azplt3f34/+/n6UlJSgubmZld8qlQqxWAxOpxMqlQqVlZU8p6b1w8nJSd5bTyQSeOONN5BOp9nERqFQcFu1uroaKpWKDY8oqZAOBypaGhsb8cYbbyAcDqOyspIjm4uKihCJROByufDOO+/gc5/7HIqKirCwsMACv4aGBpSWlqKvr48T7WgWT1HBWq0WFRUVWFxcZA2Aw+GAVqtFLBbjooJiiX0+HzsNHjp0CNFoFNXV1VhZWeHZM62SBYNBXgm9desWysvLUVxcjJqaGs4voDb3zZs38frrryOZTKK2tpY3K1KpFAwGAyKRCKvv6+vrodFoMDw8jN7e3oK8D0pJvHbtGkwmE2ckuN1uLkzp942NDZhMJpSWlmJpaYlzQIaGhiCXy3Hw4EFO/JuamsKFCxewsbHBXzuwfch1dHTA4/EgEAjA7XbDbDYjHA4jFAohkUjA6/WiqakJe/bs4d186myQsHB+fp5jzndCeR+3bt1CNpt9aB4KABZFLi4uwu12w+VyQafTYWlpCfX19TCbzTxiI+dFqVQKn8+HpqYm3L9/H2VlZaipqYHFYsHdu3e503Lx4kX4fD7WDMViMd5SIFKpFGZnZ9mxcmd3gN4LqGCRy+Wc/wGAg9YA8KooFe1nzpxhbw5hdCT4NBHFwafAx12TJKMUrVb7gQUDKeYTiQTH4kYiEcjlctYOlJaWsr2wVqtl979gMIhEIoGKigoWiWWzWb4tkqGRSqWC0+nkNzdae6N5J91epqenWSylVCpZ+LSxsQG/3883ItIFrK6uFuzyk7lLdXU1O0eurq5ybDXNiQkqeKRSKaxWK+bm5vDf/tt/g91uR0dHB9RqNX8MpVIJlUqFnp4ejI+PY3x8HFVVVThw4ADKy8uhVquxurqKhYUFjIyMsOUy3RZJc2A0GtHR0QFg24FQoVCwdwJlLzQ1NeH06dOw2+3sceD1ermTQME6d+/exZNPPskOeb29vbh79y4OHDiAvXv34uTJkzCbzSzK++EPf4hkMolMJoOpqSl2J6QukVwuh8vlwtbWFtRqNVwuFxwOB+rr63nffmRkBJ2dnSyaJFFrOBxGQ0MD9Ho9F4P5BxXdqK1WKyKRCHsKUKzylStXMDExgdbWVlb8k8dDLpfDxYsXUV9fj5aWFqRSKcRiMZw7dw4ul4u3XZRKJerr67G1tQW5XA6z2QybzYZQKISxsTEcPHiQi4O7d++y+ZXdbsfp06eh0WjgcDiwuLjIuQ7kQ5CP3+/nwCKfz8evPb1ej/b2dk5KpfRGShmlJMelpSW0trbia1/7Ghd1drsdiUQCkUgEFRUVbHTlcrl4TEU/O/kt/eXlZXanLC0thd1u5yKBtEjJZBJGoxGbm5toamriSHIKGwPAWR+kDUomk/wzL4yOBJ82ojj4lPi01iR3Kxiy2SxisRgn3UUiERbnAds3C2qFGgwGRKNRlJWV4Ytf/CK2trYwPT2NyclJrKysIBAIYHFxEWtrazAajYjH4zh9+jR6e3s5qMnhcLDbG8XXSiQSnDlzBul0GlNTUzzLJkEcgF39BfIPHwqooj170iLQSuDGxgaKiop4vk+HdiKR4PlzcXExz5gjkQhnGBQXF0OtVvMmRUVFBdsqUyudWuDr6+tIJBIwm82oqalBZWUlR1u//fbbvLPvdDo5OCeRSMBisbCgbXp6mpMJ9+3bh+XlZchkMvh8PjaaCoVC/G+bm5tRUVGBlpYWdnlcW1uDw+Hgg43isVOpFEKhEOx2O99A0+k0fD4f5HI5VCoVioqKuGN09epVHDhwgA2gwuEwi/SoqDtz5gxu3ryJqakpZDIZXi2lqN+1tTVIJBLU1taitbUV77zzDnth6PV6hMNh7iTduXOHfREsFgt0Oh3UajXbCl+7do3XYmOxGFwuF3eC9Ho9jh8/Do1Gw+ZeJSUlqKurg9frZWtnt9uNlZUVJBIJbG5uFhQysVgMs7OzHL5UWlrK5lVutxter5fXNrVaLerr61FTU4P6+no+OLVaLbLZLH7xi19gZGQERqORjcJWV1e5oO/r6yt4LVO3gESdHo+Hi1eKiyYHSfL6cDgc/DOs1+vxla98BcPDwyyabG1thUQiwc9//nNMTk7y5eLUqVMwmUxcxBqNRpSXl6OqqooDmGQymTA6EvxakOQ+aGla8LFIp9OfyprkbvzlX/4lXnnlFXR0dPCaHd1o6XBeXl7G008/jT/6oz+CTqeDXq+HRCLBd77zHXz3u9/ljIKKigpWsgPAV77yFZSUlCAYDKK4uJhFczQHptb3/Pw83/KBbVGmxWKB1+vlWfZOrwFqldbX1+OJJ57AjRs3cPv2bcjlcn5jViqV8Pv9yOVyWFtbg1ar5TZ0UVERu/P91//6Xzl2mA5LmUzG3xdlJQQCAXzhC18oeB7ocFAqlejs7IRareaV0UQigXv37uGJJ55APB7HzZs3YbPZMD09Db/fj+LiYpjNZjz33HOw2+2Yn5+HTqdjF0mFQoGZmRm+zeXHQZeVlbHF9Pr6OhcagUAA+/fvR1tbG6anpzE0NASDwYCjR4/in/2zf8bGVuSvQGuMarWab99bW1v4t//232JpaYkjtyWS7chhs9mMYDDIGw9k3pTL5aDRaPhjkPdBSUkJ1Go10uk0jh07BqPRyJHE9PWXlZXBZDJhfX2dnSplMhnMZjNefPFF3Lt3j3MbyLyIhI+UitnS0oKqqioMDg5icXERe/bsgUqlws2bNxGPx1FaWspOijabDRKJBF/84hchk8kwPT2N69evF3g30OvQbDajvLwc1dXVqK+v31WtHwwGcefOHczPz0Or1cLr9WJwcJCNo06fPv3Qgj6Xy+Gtt95iseqJEyfwy1/+kjs0+Y8tGRaR9Tp1CGpqanDixAm4XC6MjY0hGo3izTffxOrqKo99qLik11tfXx+ampqgVqsLRgbhcBj9/f2oqqrC3r17P96bikCwC6Jz8Gvg01qT3A3SNzgcDlZjk1grm81idnYWNTU1ePLJJxGNRuF2u9n8hTYK2trauLNhNBpRVVWFmZkZ/PCHP8Tv//7vo62tDT6fjy11abzg8XgQi8UglUp5V12tVqOvrw/BYJDn4TvrTdrb9ng8qKiowNtvv42JiQnI5XJUVlaiurqabWi7u7uxtbWF1dVVnuW2tbWx0C8QCPDhqFarWfQVDoexubkJh8OB0tJS+Hw+FrMVFRWhra0NRqOR1+f8fj/S6TTW1taQSqU49yEQCKC/vx+hUIiLL2BbJR+NRuH1evHuu+/CYrFAo9EAAPbu3Qu/388eBvn5EcFgEDKZDN3d3bBarbzvPjk5ySZVY2NjvP9eX1/Ph5xSqeSRDx2U5OdAoweySSZPiYaGBkQiEUxOTmJzcxPr6+uQSqUsmCwrK0MsFkMqleIuSCwW4wKQCk2JRMJajYMHD0KhUHA8Mflq6PV6ZDIZGAwG2O12OBwO/N//+395Zl9SUsICTtpiofXE2dlZ+Hw+9PT0wOFwYG5ujtdEqRAiYV48HofBYMD8/DycTiccDgd8Ph+y2SwXHblcDnV1dfjiF7/40Hl7NBrliGrSjdBmy6MW9PQ1UfFLz09xcTFsNhu7Z9L3S/kfuVyOu0rj4+Pw+/147rnnUF1djf/4H/8jJ5zudFe12+146623cObMGX69EcLoSPDrRBQHv2M8qr6BlOXZbBbRaBR/8Rd/gVgshurqat4zX1paYqfFyspK3L9/n3fj6RAihTwJG8vLyxEKheB2uzm8af/+/bz2NTk5+cDXrFKpOAdibGyM57xdXV1sKKRWq3HkyBGsr69jcnKS32w1Gg2n28lkMlRUVODpp5/GxYsXoVQquVgAwDv09OvkyZNoamqCy+VCJBJBVVUVKioqoNVqMTo6yip6+rdTU1Ow2+04ePAgBgYG2KiJVPtUaAQCAUQiEQ5wmp+fZ9dKYHs8QMUJ+ey///77OHr0KPbs2YP6+nq88847UKvVWFtb4zXYoqIiVFZWskD09OnT+Na3vgWVSgWlUsmufJubm9ymDwQCaGtrQ3d3N+rr61lkSV4VpKmgkQd5DeRDq4S0kkv/PxAI8IFJIVRkp02hXXQ4U+FDdtbkCUAeB+SBAACnT5+G2WzG6OgoBgYGIJfLeYRAGyq0agiAY6fX1ta4GA6Hw9ja2oLRaIROp0N7ezuWl5c58fDgwYP8utjY2GBHQoVCgd7eXl6BnJubQ2dn50cq6MnJFABra0hUS+OFjo4OmEwmXLt2jTNHqNjMZrNwuVy4dOkSeyQ8zF21sbERExMTuHjxIr7xjW/wn+VyOdbNCKMjwa8DURz8DvJR9A1FRUVQKpXs5U4bBZFIBD6fj1ey4vE4ZDIZxsbG2J6WZv8kKKQIYrlcDp/PB5vNBr1eD7vdjvb2digUigec+wDwDS+dTvObKgUEraysoK6uDiUlJRgaGuJY2oqKCqyvr8Pv90OlUqG9vR0VFRUcanThwgXMzc0VtOu1Wi3vrut0Orzwwgs4c+YM7ty5w5sD5Mi4vr6O1dVV9pyn9TLyf5BKpejq6oLD4eBo4aamJrS1teHWrVu8lrm4uIjx8XGsrKzwKiY9xuFwmLc0NjY2cOnSJQwODqKiogI+nw/Ly8soLi6GxWLhKOXJyUk+XJubm6HX67G6uory8nJ+7MiPgm7ANpsNFy5cYBvnaDSKkpISfOlLX0IqlcJbb73F7W4A7BsBgLtCUqkURUVF7MZI6ZuUwqjVavHMM8/g0qVLnDGh1Wrx1FNPYXV1FS6Xi7slNCZaW1vjbAmtVguLxYJwOIyrV6/CarWit7cXs7OzLGqlrQqpVMq/0+unpqaGi4rV1VW88sorkEqlMJlMOH78OAsAr169itLSUpSXl3MBsLi4CJlMhq6uLtTU1HDRUFNTg9nZWTidTg40ehTyiwNyBiVxIX3s/M2NxsZGGAwGaDQatjemYv5v//ZvP9BdlQKdLl++jK9//etcwMzNzcHn8wmjI8GvDVEc/I7yUWygd7o4khAtkUggl8sVJE7G43E0NDRAKpUiEokgmUwimUyiuLiY17zIRIec2shkiAqMfGFiaWkpt+3zXeGCwSCGh4fx5JNPwu12I5FIoLi4GLFYjOfYZHIjk8kQCoVw//59ZDIZyOVyvPDCC3j99dfh9XqhUqm400HCwXPnzmFrawvvv/8+LBYL5HI5uru7IZVK4XK5sLS0hBs3bsBms3HRRI8jhfqUlpbC6/UikUhAJpOhpaUFRqMRR44cweDgIFZXV3Hs2DG0t7fj+vXrUKlU/DVUVFTwnvza2hr8fj+PTiKRCN+4y8vLeZXQZDJha2sLPp8P9+7dg0wmQ2dnJ65cuYKZmRmsrKzwAU5R1UeOHIFWq0UgEMDGxgZsNhvW19dRV1eH6upq7hzstGgmiouL2SGRVkfpz0tKSrC6uoo9e/bgwIEDeO2113ibxOfzIZlMYnh4GG63m0dUyWQSNpuNtz/MZjMkEgmPOSg8yefzsVcDfb783AyJZDt2ev/+/bh58ybbEAPgrRgan2m1WjaRIqfH69evw2g0oqioiMOTdvqG0NeyuLiI+vr6R17/o8KJHksqnqnAobEIABw/fvyhHycSiaC0tPRDtwvoZ4heh8LoSPCbQBQHv+M8Sjt0NxdHmhl7PB4kEgneIMjlclhfX4dWq0VVVRUUCgV8Ph/m5ua4jR2NRnlPXKVSYWVlBaurq7xBQaZFdNjs3O2mW1cymWTtQTweZ1V6TU0NVCoVbzSQOQ2J8UpKSvDcc8/hySefxPDwMK5cuQKPx4NUKoUvfelLePLJJ+F0OtkkxuFwwO/3Y2xsDOfOnYPRaEQoFOKuytTUFCYnJ7G+vo7q6mreCqHCIJ1Oo66ujmNwjUYjDh48iNu3b2NoaAh9fX3Yv38/7t27h87OTuj1erjdbnbkyze1SiaTfNuk1beysjIcOXIEGo0GkUgEb7/9NrLZLLa2ttDW1galUom5uTksLS2xuVRjYyM6OjpQW1vLlso04shms5DJZOjv70csFuPI4t3GCfnukHTw53I5mM1mtm6OxWK4ceMGnE4ncrkcDAYDq/QpA6GiogKjo6MsVFWpVNi7dy/Ky8vh8Xjg9/t5vHP79u2C9dbdoBZ9PB7H2bNnUVVVxboA8op48cUXWW8zMzPDXhQ0PrFarTh16tQHHr51dXXo7++Hz+d75IOWNmUAsFkUva5JgPkobf5HcVcFtn9O8s3OhNGR4DeBKA4eAx7m4kh6gvX1dZSWliKTyeD3f//3cfjwYQQCAX5DX1tbYz9/ciw8evQopFIp5ufnEQ6H2fRIJpMVzK7pAMmPW86HYqBVKhUsFgubKFGrm25iUqkUVVVVsFqtMJlM3L49dOgQ/uRP/gSxWAx3797lPXGVSoWpqSkcPXoU9fX16O/vx9zcHCQSCfbs2QOtVouNjQ309fUhnU5jZWUF7733HlwuF2ZnZ3mbIJlMQiaT8boZYTKZcODAAQ5rOnDgAAsNDx48iD179qCzsxPvvvsulpeXEQqFOKuhq6sLXq8Xy8vL7Ga5tbWFQ4cO8fNAmyJSqRQdHR3o7u5GJpPB6uoqzGYzG0MZjUbo9Xrs27cPw8PDbDgVDAZx/fp1/li07pp/GJMnBRVfSqUS4XCYUwDJKyEUCsHpdAIAhwpRoaZUKtHT04OBgQE0NjYiFAphamoKFRUV6Ovrg9vt5vEQhSpRwNfDCgMqHCivwOVy4fr167h8+TLv9p8/fx4ejwdqtRqBQAADAwP8tZeVlSESiWBtbe0DEywB8MhjcXHxIxUH1O3I7xxQcZBvgPRBPIq7KnVEKLBNGB0JflOI4uAx4WEujjqdDqurq5icnITFYsEzzzzDaXfAtnfBpUuXsLa2VnBDevvtt7F3716kUikW4G1sbGBsbIxXI+vr69HR0QGDwbDrFgOwrbjOZDKQyWSsbqcxRHFxMWpra2G1WmE0Gh/6ZiiTyWAwGDj6d3BwkNMI7969i5MnT+LMmTPY2NjAxsYGr9nRmzm58NFtbHh4GKlUipXnVVVV3LnI/xrMZjMOHDjAHQRKsRweHsbx48fZ8nlzcxM2m4338l0uF9RqNcrLy/kAW1hYwMrKCusBamtr0dvbi+vXr8Pj8UClUqG5uRmVlZV46qmn2E1zbW2Nw5Qo5vvYsWOQSqXo7+/n71GpVLJfQSqV4udSIpHAbDajuLiY2/VbW1ssOI3H4+wUmQ+JHP1+P958803OvXA4HIjFYlhaWsJPfvITti2ura1l/cSJEycQj8fxxhtv8KrmTkpKSvD8889jbGwMf/VXf4VoNMriW6VSiddffx23bt3Cv/pX/wqLi4vsAVFSUgKpVMrrmTMzM+ju7n7oz4VEIuHMkI2NjUea3+cXB5ScSGOF/JHCo/Ao7qoWiwVPPfWUMDoS/EYRxcFjwgdtOZCw7V/+y3/5wG43eQAAhcEwW1tbGBkZQXFxMZxOJ0ZGRhCNRnmWXlpaCqfTibW1NZw8eZKV/ES+/TOwPUcOhUIwGo1oaWmBzWZjj4BHRS6X49ChQ7hx4waGh4fR1dWF/v5+zMzMoKOjA42NjVhdXeXgHqfTiZs3b6K7u7ugcNFqtewPQAf8zZs3oVQqYbPZUFVVxe1sKhDu3LmDkZER9PT04ObNm7hw4QLkcjkUCgUOHjyI1dVVlJaWsrNlR0dHgWEPzdnlcjknbK6trRXcQsPhMGpqangkpNfr0dbWhng8jpWVFbz99tsoLi7G/fv30dTUxJkelFoZi8WgUCjQ3t7Owky32427d+8iGAwiGAwim82ivb0dVVVVHBS2cxxBz79SqUQ0GmWbY4pBplu0xWJBY2Mjb8QA250i0kbkexTspKioCPPz8/i7v/s7jlbebc3v5Zdfxj/5J/8EHR0d0Gg0XCQB24FRFLG8W04JUVVVhampKSwtLaG9vf1DX2ckSMzvFgBg7cajdg6AR98+KikpweTkpDA6EvzGEMXBY8TDthz+6T/9p1CpVKitrd3139F62m43f4/Hg/HxcQ5Wolhh0gaQb8CpU6fYiIfeVKmtTcE7xcXFSCQSmJmZ4TS/nbvdH4ZKpcKBAwdw69YtLCwsoKWlBTMzM7BarbxdkM1mcezYMaytrWFmZgYzMzMAtg+8eDzODn3ZbBaNjY14+umnEQwG4Xa7sbCwgNnZWej1elRVVaGqqgoWi4ULhFu3biGdTrPvwFNPPYWSkhLcuHGDPSLW19cxMTHBt3YSc9K/Ix+Hzs5O2O12JJNJ6HQ6BAIBZLNZdHR0FBwQKpWKRaPnz5/nFb1EIsFjILrpJhIJzM7Oory8HDMzM3jnnXcQj8fZdpu2TxwOB2dX7AZZaNP/lslkrK3QaDSYnZ1ld8r8kcLa2hpu3LgBtVr9gAaG3BwlEgl6e3tx6dIleL1edHV1feCan8fjwRe+8IUHvsaKigpcu3YNExMTH2gQVFxcjOrqaiwvL3M09AdBYxGySqZwJNru+SjFAfDh20cmkwn9/f2oqanh7RqB4NeNcEh8TNlp+jI2Ngav14szZ84U3LJyuRz++q//mjUHO7lz5w7u3buH2tpavunHYrECzYDD4cDJkyfxuc99jt9IS0tLYTQaud1NBjiBQABra2uIRqMsfqurq0NlZSWvgz1KN2F1dRXDw8NobGyE3+9HJpPByZMnceXKFbYOdjqd7AVAvgGEVCqFWq3G5z//+YKiiWbuLpeLZ+/kyud0OjE+Pg6DwYDDhw9jcnISlZWV6OnpQTgcxoULF3gzgcydkskkFhYW2HlQLpdjbm6Ow4wMBgNisRhUKhXW19dRVFQErVaLAwcOcNhQNpvFK6+8gpKSEvze7/0ekskkfvCDH7CwMhqNcnFAh3AoFMLVq1cRCoVQVlbGSZBSqRRGoxEulwtFRUWcWJkfEARsj3IaGho4enxrawtWqxUvvfQScrkcXn/9dUgkEnz+85+HXC5HNptFKpXCu+++i7KyMlgsFrzxxhuc6Egfm/QPX//61/Ev/sW/wMbGBqqqqh76PNOmxPe///1dhblOpxNjY2Po7e39wI8Ti8Vw+fJl7Nu3Dzab7QNfW6FQCDdu3ODicWJigh+TTCaD48ePP7So+jB2/lym02lcu3YNJSUlrPMRCH4TiM7BY8rOLYeWlha43W44HI4CFTQ5HwK/ipQltra22JGQDlmpVMqCuWQyyR2F+/fv49ChQ1AqldBoNHzwkaAu/7aWyWQQCoV4R318fBz379+HRqPhf0u20HRT3VkwWK1WtLe3Y3JykpP1/v7v/55zFiwWCxsbkQcDiSfpeyNlfX4yIAVAWa1WbG5uYnV1FdPT0xgdHUUul4PVakUmk4Hf78fevXtx584drK+v88ff3NzkOF6n04muri6eWedyOZw/fx4tLS147733kM1muYNB442amhp4PB68++67GB8fR29vL28knD9/HgDYZjmbzSKRSLBJEZk4lZWV4Tvf+Q4CgQDMZjOKior4sfX7/fB4PDCZTJicnER5eTl3Kej5J3Hp2toampqakMvl4HQ64fV6MTw8zDP3lZUVvPnmm9DpdHyrzo89zhdE0qG3tbUFlUqFbDZbsH77MHau+e3EZrPxaqjBYHiopoByLRYXFz+0OKB5f77OgB5vMg77uOT/XAqjI8FvE1EcCABsZw3U1tbCbrejrq4OwK9a0KRKTyQSBf+GxIQ0DsgfDZANbklJCQvefu/3fg8AeBNifn4e09PTrDAn8xydTgez2Qyz2YzDhw/zTjy56JF9MEUKS6VSbolT0aBWq9HQ0ICNjQ3Y7XYO5TGZTBziQ8I14Fc36p2Qze8f/uEfPjDrpS7C5uYmurq62MbY4/FgcHCQHRZdLhcfsuQtodVqoVKp0NLSAp1Oh3v37rH7otVqhc1mQ21tLe7cuQOv18tK/Gg0CovFwuK+9957D9FoFKWlpVCr1VxoyOVyti4uLy9Hd3c3qqurYTQa4XQ6cf/+fZSWlvLKKMVAl5eXIxwO8+ez2+147rnn2IuCDq7NzU2Ew2G4XC42xtrc3MT9+/exb98+WK1W9l4gB0IqcLa2ttDb2wuPx4NkMlmQbyGVSvH5z3/+Y6357YZEIkF3dzeuXr2K4eFhHDt27KFjg9raWgwNDSEcDn/gXJ+KAxK1Ujdsa2sLJSUlH3ms8DCE0ZHgt4koDgRMc3Mzbt++jZdffpndCn0+H+rr6/Hss8/CbrcX/H265ZDzIXkHlJSUQKfTQalUQiaTceuX/r9Op0NDQwO7CPr9fgQCAczNzWFqagrFxcVcKBiNRpjNZlgsFkSjUSwsLPCBZLPZYDQaOUzI5/NhcXGRD36dTgetVsvrlQaDAaFQiG2AKfVRp9PB4/EUdEXy599yuRy//OUvcfToUVRXVyOXy2FxcRHT09OQSqXYv38/rFYr3/Tp4PR6vez5sLa2hr6+PvT19WF4eBjJZBLxeBwzMzPo7OxkMZ/X62VRXFlZGfbu3YvBwUG23qVQH0repILJZDLhzp07UCgUsNls0Gq1HGO9vr6OGzdusP6AwqLUajXfRsnjgsSOpaWliEaj2NzcRH19PY4cOYJf/OIXyGaz6Orqgt1u5wRIrVaLY8eOYXBwENFoFGq1GocOHUIikeAwIfKI2NjYwNraGkwmEzo6OhAIBKDRaNDZ2cmjDxKvfpQ1vw/y+iguLsb+/ftx48YNTE9Pcxz3TiiGeXFx8UM1CvT17Fxl/KSdA0IYHQl+24jiQMAMDAzgF7/4Bfx+P6umc7kcBgYGMD09jSNHjhS8Uel0OvT09GBwcBAGg4Hbtjs1Cw97A89X3Tc1NSGbzbLuwO/3Y3p6mm9jRqMRRqMRDQ0NaG1txfLyMhYXF+F0OlFeXo6Ghgb09PRga2uLb74LCwtYXV1FcXExAoEAC+jyw32KiopQUVHBokSCUiAPHTqEqakpXpc7fvw4otEo1tfXUVtbi/b2dmQyGUxPT2NxcZHNcciGORwOQ6PRsA9DKpWCRqNhHwi73Y6mpiaYzWa43W54PB50dnayMRRFUZeVlWFtbQ2hUAjRaBRdXV3o7OzEz3/+c0gkEhb9lZSUYG5ujn0VlEolCy1LSkogk8lgs9k4C4EONvKWoOdOLpdzauPq6irW19fR2NgIqVSKe/fuQa1Wo76+nq2J/X4/dDod1tbWcPnyZX5snE4n5ubmuDhQKBTcPaHXzPHjx9Hc3IwLFy6gqamJn4OPsub3Yej1eh4zmUymXQ9ciqyem5tDR0fHQwsOiUTCLon52wrZbJazIT4JwuhI8FlAFAcCAMD8/DxefvllxOPxgrUxuVyO0tJS+P1+XL58GU8//TTf6Lu6urB//36EQiEEg0F2ASQ+6hs4zcPLysrQ3NyMra0tNtAJBAKYnJzkFrbRaERzczPP/SnvoKGhAVVVVdDpdBgfH0cikcDhw4ehVqvR39+P9fV1RKNRJJNJDvahGXr+qmZVVRWef/55JBIJTExMQKfTwefz4a233kJ9fT1OnjwJhUKBu3fvYnFxkTcDlEolKioqUF1dzTbBw8PDqKurw9raGlZXV6FSqfjwLioqwv3791FbW4vl5WVEIhEWIOZb9JJdslqtxszMDK5evQpgu71P7oH5TohkpkQOiPTfTp48idbWVjz77LP43//7f7NJEnUm6PmLx+NYWlrCl7/8ZfT09ODSpUvQarU4fPgwOx2mUik0NjaywLOvrw+XL19GKBTCj3/8Y7zwwgvQarWYn59Hb28vr3ZSqFJ5eTmsVisqKysRCASQyWTYIhl49DW/3aKVd6OhoYGdMk+dOsUjpXweNW+hpKSEhbekNQDwidv/W1tbwuhI8JlAFAcCAMClS5fg8/ke2CdXqVRQKBQwGo1YXl7G8vIyjhw5gvPnz2NjYwOLi4vo6+vD66+/jvv376O+vv4TvYHnQ8p5o9EI4FdCReosTExMsF2tTqfDxsYGhoaGMDU1xRkJEokEIyMjOHPmDM6fP4/+/n7OTlhfX2dhol6vZ5GcSqVCQ0MDVlZWMDk5iWg0yrHGdMt+66232B5aoVCgoqICtbW1sNlsBQcEBQyNjIxw8JBer0dtbS0GBgYQi8Vw+/ZtpFIpPuCHhoawvr6OWCzGnRcKpFIoFOjs7ITf78fU1BSy2SwsFgtOnDiBYDCIS5cuccEwOzuLZDLJz2c4HMalS5dw8eJFdHZ2oqKigsWH6XQawWAQ6+vrHLJFuod79+5BpVLBYDDg0qVLKCsr49yJeDyO2tpaLC4uctjTD3/4Q6yuruLSpUuQy+Xwer1YXFxEa2srz+MTiQRncMjlciwtLbFYNZ+PEjL2YUgkEvT09ODq1asYHR3FoUOHHjh8HzVvgWKi8zNDAHzikYIwOhJ8VhCrjAKk02n84R/+4UPXxsiNLxQKQaVS4b/8l/+CUCiEcDjMrWun0wmfzwen04lUKgW5XI7Tp09/5Dfwj0Imk0EwGITf74ff7+cY5WQyCY/Hg3Q6zWFGFosFZ8+eRSqVwvXr1xEOh2GxWHDjxg3cvn0bCoUCoVAIhw4dwjPPPAO9Xo+pqSksLy/zLJy2GshemNz/Ojs7sXfv3g+ce7tcLlbyk9kTFVf5Qj+KRrZYLNjc3ITJZILdbmf9AekRlpeX8fOf/5xFjkqlEhaLBRsbGygpKUE2m8Xc3FxBd4S2MRQKBVpaWjA7O4vvfve7iEQiUCgUHMKUSqXQ1taG//Af/gP6+vrw9ttvIxgMwmazcaZCaWkp9u3bh1u3bqGkpAQmkwmrq6tobGyEQqHA5cuXoVarsWfPHoyOjqKkpASdnZ2Ix+OYm5tjc6V4PI6nnnoK09PTqKmpwf79+x/6GO5c8/u4+Hw+DAwMoL29vWCMQQSDQfT39+Pw4cMwm827foyhoSFO7HS5XGyMtH///odqGj4MWrvcu3ev8DMQ/NYRnQPBA6mNO9FoNAgGg9wWHhkZYeObkpISbkfv2bMHTz31FIvmlEolkskk5ubmUFJSwjNv+t9kl/xxobhjmh+n02kEAgHMz8/D5/NBKpXC5/MB2O4SxONxvPDCCzhw4AC+9a1v4W//9m+xtbUFg8HAro43b97E/Pw8vva1ryEQCDyQZkjmN7QVsbW1henpaSwvL6OtrQ319fUsNtz5i6yTyQiJXCDX19dRUlKCPXv24M6dOwiHw4jFYtjc3MTy8jKvJFI4UldXFwYHB6HRaPDVr34VCwsLuHLlCu7evYvq6mocPXqUTZakUinKy8v54yWTScjlcrhcLiQSCTz55JNsekQ21nv27MF/+k//ie2xS0tL0dPTg7t372Jra4s7NZRKSQmVZWVlsNvtaGtrg81mg8vlQjAYRHFxMYLBIG7cuMGPJY1MioqKcP36dcRisQ8V3j1KyNijYDab0dTUhOnpaRiNRhgMhoI/z89beFhxQAUYjRXo18fdVAiHwxgfHxdGR4LPDKI4EHzo2hhF72YyGRiNRnzta1/DxMQEFhYWkE6nOaq4qqoKNpsNm5ubfMsLh8O8379bk4rslh/2a2cx8UEFhUwmQ0VFBRYWFiCXy6FWq5FOpzl2enFxEa+88gq0Wi2uXbuGXC6H9vZ2nrMbjUbWSfzVX/0Vz8kpUIoep2w2i+rqaiiVSvj9fsRiMRbekXeCWq1mIaFer2efgUgkwlsOAHDw4EEMDw/D6/Xixo0bvC5K4km6+W9sbGBpaQnr6+uYmprC2toa5zdQp8FkMsHv9+O1115jT4SlpSWsrKzAbDZDoVCgvr4ewWAQKysrAMAaj97eXqTTaX4M29raAGx3PGhjw2g0IhqN8mprcXExHA4Hurq6MD09Da/XC61Wi6mpKbS3t2N5eZkNgvKfb/I3II0GFZp79uz5SK/bT0JraysCgQBGRkZw8uTJgqIjP2+BOhU7yS8OyONAIpF8rOIgnU5jaGgIGo0GXV1dn+j7Egg+LURxIHikdDiVSoVUKoXTp0/DaDTixIkTaGpqwtjYGNbW1iCVSmGz2R7qTU/zWSoUdvuVTqexsbHxsQsKKiSKi4vR3t7Ou/NyuRwymQyRSASlpaXsHmiz2eB2u7lrUFpaCrlczimOJKRUq9V8e08kEtjc3ITb7YZOp4NcLkdDQwPa29t5dS8cDmNrawtbW1ssftTpdNjc3IRer0dHRwemp6eRTqdht9t5uyKf/DRKEi4C20UCbVssLi5yIqbVakVfXx8GBwcxNDSEYDCIWCwGvV7PIkyVSsWmSsXFxZBKpVx80MolANZU1NTUYG1tDQaDAUtLS8hms2hoaEB3dzcmJibg9/shl8vh8XhQVVWFtbU1rK+vQyaT4erVqwWrofQakEgkUKvV7EiZSqWwubmJxsbGj2yV/UkoKipCb28vrl69inv37qG3t7fgdV9VVYXJyUksLS1xoZQPjRGoOEin0/wa+igIoyPBZxVRHAgAfPS1MYlEgsrKSlgsFszOzmJ6evoDldoSiYTbwiqV6pG+pg8rKMh18KN0KIqKinDv3j3U19ejvLycuwobGxu8hkgiw5mZGXzuc5+DXC6HSqXa9ddube5AIICpqSkEAgEolUoYjUZkMhmsrKywV0QymUQgEIDP53vgEKXvPf93EspRjDStLG5tbaG8vBxnzpzBnTt34Pf70dXVBafTyUJGi8XCugw6xMxmM6LRKOcD5FNZWYlEIoGRkRHEYjEolUpe+dy/fz+USiWOHDkCt9uNyclJzlDQ6/WQSCSYn59/6HNKmxO0RSGTybhIuHHjBhobG2G1Wn8jKn2lUom9e/dieHgYZrO5oJ2fn7fQ0tLyQLcqX5BIz19RUdFH7hwIoyPBZxVRHAgAfPy1seLiYnR0dKC5ufkDk+8+Dp9mQUGFRDAYRDqdhlqtZg8BchbMZDJIJpM8Z0+n00ilUigvL2dTJoPB8KG3O6PRyMFO09PTcDqdsNls7I0fDoexvr6Od955Z9fCYOf3I5FI2NBpbW0NMpkMarWaNwvC4TC+853vQK1W89bG0aNHUVlZicHBQUxPT/M2BLAteqQETeqsxONxANsdhH/0j/4RIpEI+vv7kUqlEIlEuItx+/ZtPsBtNhvKy8vZ44EMjj7s+1EoFFyQyOVylJeX4/Dhw3A6nRgeHoZSqURDQwOqq6s/9dfUTiorK+H3+3H//n3O7iDq6urgcDiwurr6gFCXwpfS6TSPFKgAfVSE0ZHgs4woDgTMJ1kb+zSEYp8GH1ZQpNNpaLXaB/QV+f9Oo9GwcK+vrw/hcBhLS0usKTAYDOz1YDAYdtVASCQSWK1WDmSamZnBysoK6urq0NzczKmJdHPeLRYZ+FXngJwOyS5YKpVCJpOhqqqKdQ+0aVBbW8v/7vTp06irq8Mrr7zCXxewPZ4wm83Y2NjgAzEej0Or1bLDpVQqhclkQiQSQXl5OTY3N2G32zE3NweNRoPGxkY0NDSgq6sL1dXV6O/vRywW+8Dnh7wM0uk0u1NWVFTAZrPBZrOxedXExARmZmZQV1eHurq6T8V18GF0dnYiGAxiZGSEdRzAdt6CyWTC4uLiQ4uD/FRGlUr1yB0PYXQk+KwjVhkFu/JprY19FvnLv/xLvPLKKw94OhC5XA4TExP46le/im984xv83yh+OBAIsOOiVCotyIWg1vpOMpkMHA4H5ufnsbm5yb8DvwoPor1/YLtFLZVKOdSnrq4OLpcL6XQaBoOB/y6ZHuVyOZSVleH48eOIx+NYXV3F1tYWysrKMDExgdXV1QKTJ+pG1NTUYGVlBX/wB3/AcduJRAJerxcDAwPY2NhAbW0tzp49C2D7tutwOLC4uIhYLMa5GG1tbejv74fb7f7Ax16hUODYsWOoqqpCKpViO+OdB2QikYDD4WCtg81mQ0NDw69NlxCJRHDjxg1UV1cXCCNXV1cxNDSEkydPFuQtbGxs4Oc//znS6TQikQikUik6OjrwxBNPfOjn2traws2bN7G5uYkTJ04IPwPBZxJRHAgeO+bn5/Hnf/7niMViD9VXaLVa/Pf//t8f2i2hXAgyZAoGgxxCVVZWxnkC+XHHwHZL/0c/+hGWl5dRWlqK4uJitj0m06NsNguNRoO6ujpUVVXh2rVreOqpp9Df3w+lUolsNsv6gVwux7N7pVKJ5uZm7NmzByqVCuFwGCsrK7hw4cKuOgyJRIKamhqcPn0a6XQaly5dwuXLl5FMJnlDpaOjA1/72tceCCJKp9NYWVnB/Pw8nE4n4vE4/H7/Bz7uCoUCGxsbCAaDWFtbY53HF77wBbzwwgu7PtbpdBrLy8tYWFhg/URjYyOMRuOnrkugBNC+vj5YrVYA28/zu+++y+FVRCaTwU9+8hMkEgl2pjx8+DD6+vo+9PPcu3cPTqcTx48f/8CAJ4Hgt4koDgSPJdeuXcP//J//Ez6f76H6ipMnTz7yx8tmswUhUsFgEFtbW5DJZAUhUiUlJfjWt76FeDwOqVTKt0aFQgGdTgeXy4Xa2loYjUa8/vrrWFpawurqKvR6PRobG9Hb2wupVAqPxwOpVAq9Xo+amhrI5XLkcjnWWADbrW+lUonr16/z2IJa4NQ6r66uhtvtxsDAQEGmRjKZRDAYhNFoxL/5N//mAx+LVCqF4eFhvPvuu7sWIQBgMpkQDofZWdJoNHKXYn19HWazGX/2Z3/20M+TzWZZ0BmJRKDT6dDY2PjQ7ZqPQy6Xw/DwMPx+P06dOsXiwtnZWczPz+PcuXMFcco//vGPEYlE+Lk8d+7crpsN+QijI8HvCqI4EDy22O32An3Fp+nqmM1mC6yeKUshHA5jeXmZdQq5XI5FdxUVFXjppZfw7W9/G6+//joikQhbFScSCXg8HpSWluLJJ59EU1MTDh06hKampgcOx2QyyaLHqakp3L9/H8Cv1iOp22A2m3H69Gn863/9r7GxsfHQLopGo8H/+B//4wMfk/fffx+Dg4Psspiv4jeZTDh58iT+/M//HJlMBo2NjR/78+RyOfj9ftjtdvh8PigUCjQ0NKCmpuZTES+m02lcvXoVCoUCR48ehUQiQSqVwqVLl9DR0VGQt/Czn/2MLaRlMhk+97nPoba29qEfOxwOo7+/H1VVVR+Y+igQfBYQgkTBY0tjYyO+8Y1v4Otf//qnrq8oKiriXIiWlhaOtB4dHcXa2hrHQW9tbRXM/51OJy5evIh0Oo2urq4Hdu8nJiZw5coVvPTSSw8VstG+fXl5OeLxOBwOB28I0CiCEgjfffddBAKBXfUXEokEjY2NmJiYwMWLF1l/sRvUySATKNqCyGQyaG9vx40bNxCLxT7x55FIJDCbzTCbzYhEIrDb7ZicnMTs7Cxqa2s52+PjIpPJ0Nvbi5s3b2J2dhatra28Rrq0tFSQtyCXy1nv8WFrjMLoSPC7higOBI89n5Yt7wdByn+VSgWdTgeVSoV4PI5UKoVMJoN4PA6LxVIQgLUTiUSCzs5OTExM4OrVq4/k4V9cXAydTsfbG+RNYTabIZfL8e1vfxsGg+GhrXmJRAKDwYDLly/j61//+kMfp6eeegrxeBxqtRpKpRJyuZw/Zjqdxje/+c1P5fPko9VqsW/fPrS1tbFIcmFhAVVVVZ/IVKmsrAytra2YmZnhkVBdXR1u3rwJv98Ps9nMotSNjQ2k02nI5XIWkO78HoXRkeB3EVEcCAS/QYLBIAsRGxoaYDab2ctfqVTiP//n/8yHKI0A8g+bj3qIVlZW4ujRo/x58tcuI5HIB2ZqELRNkR8QtZP89MydfFh2x0f5PLuhUCh442F5eRkOhwNOp/MTiRebmprg8/kwOjqKU6dOoaysDHK5HFNTUygtLcV3v/tdRKNR/vuBQAD/63/9LygUCjz99NNobm7mToIwOhL8LiKKA4HgN8jhw4d5jLBzRr7zsM5fPcznoxyitDWxGx+WqUGQt8LHDRX6TX0emUyGxsZG1NfXs3jx1q1bLF60Wq2PHPQlkUjYXnl0dBQWiwWrq6vY2NjA/v37YTAYCooDIp1OsydGb28vlEqlMDoS/E7y8SPxBALBR4a2FnYTz9EhmkwmC/77zgKBDJo+7iFKUKZGKBR66JZBLpdDKBTC6dOnP/bo5Tf1eYiioiLYbDacPHkShw8fhlwux8jICN5//30sLCw8YBf9MEpLS3mMc/HiRXaZXFxcxKFDh3bVTlRXV0OtVsPn8+Hq1au4cOECjEajMDoS/M4higOB4DPCboeoRCJ5QNn/aR2iwHamhtlsxsLCwgMH926ZGp/1z5MPiRcPHTqEU6dOwWQyYWpqCpcuXcLk5OQDRdhOgsEgxsfHOW5bo9GgpKQECwsLaG5ufkDTIJfLcfbsWYRCIQ6X8vv9iEajbE8tEPyuIIoDgeAzxG/6EKVMDbVajYmJCbjdbgQCAbjdbkxMTECr1e6aqfFZ/TwPQ6vVoqenB2fPnkVdXR2Wlpbw7rvvYnR0lAO38snlchgYGMDS0hJMJhMUCgXC4TCkUilisRi8Xu8DotH9+/dDq9WyxgIArFYrHA4H3nvvvQIHTIHgs47wORAIPmN82gZNj8Kv0/Pht/F5PoxMJsPOi4lEAmazGY2NjTCZTNypCQQCmJiYwNLSEpLJJBKJBI8OzGYzamtr8e1vfxvAdvbFn/7pn8Ln8+HNN9/k9MuioiJoNBq0tLSgu7v7kTUPAsFvG1EcCASfQX5bh+hvKlPjs5Ldkc1msbq6CrvdjnA4DK1Wy86LRUVFyOVy8Hq9mJiYgN1uRzAYRFNTE0pKStDT04NXXnkFm5ubeOGFF9Db24vbt2/j6tWrKC0thdVqRWtrKxobG8WWguB3DlEcCASfYT4rh+g/dHK5HAKBAOx2O7xeLxQKBerr61FTUwOZTIZcLoe1tTVcuXIFEokERqMRZWVluHXrFnp6enDo0CHIZDJ2TTx+/Diampogl8t/29+aQPCxEMWBQCAQ5BGNRmG32+F2u1FUVMTOiwqFgnUgN2/exOXLl3Hr1i1IJBIolUqcPn0ap06d4s6CQPC7jCgOBAKBYBeSySTHRmcyGXZeHB0dxcsvv7yrJuTDAqQEgt8VRHEgEAgEH0C+eHFhYQFvvfUW4vH4JwqqEgg+6wjprEAgEHwAZHV99uxZ9i7YWRgAvwqQ8vl8uHjx4m/pqxUIPh1EcSAQCASPQCaTwa1btx45QCqdTv+Gv0KB4NNDFAcCgUDwCHycACmB4HcVURwIBALBI/Cw7IudfFrZFwLBbxNRHAgEAsEj8JsOkBIIfpuI4kAgEAgekd9GgJRA8NtArDIKBALBR+C3kX0hEPymEcWBQCAQfEQ+KwFSAsGvC1EcCAQCwcdEZF8I/qEiigOBQCAQCAQFCEGiQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAkRxIBAIBAKBoABRHAgEAoFAIChAFAcCgUAgEAgKEMWBQCAQCASCAv5/2fpEJehlR9AAAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 3 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Performing the Cross-Validation", + "id": "f794ae84e5bd6b81" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As we can see from the plot, there's no clear clustering. However, we can use the \n", + "`AnomalyCommunityDetection` algorithm to infer the communities, and also to get some \n", + "information about the anomalies. To do this, we need to specify a set of parameters related to the number of communities, their interrelations, and other structural aspects. Selecting the appropriate hyperparameters can be challenging, so we will utilize the `model_selection` module, which is designed for model selection and cross-validation to optimize the algorithm's performance. \n", + "\n", + "The `model_selection` module not only provides a comprehensive set of tools for model selection and cross-validation but also enables us to build specific modules for each model that carry out the cross-validation process. This module includes several submodules, each tailored for specific tasks:\n", + "\n", + "- `parameter_search`: Functions for searching optimal model parameters.\n", + "- `cross_validation`: Functions for general cross-validation.\n", + "- `masking`: Functions for masking data during cross-validation.\n", + "- `main`: Entry point for the cross-validation process. Although each algorithm has its own cross-validation submodule, the `main` submodule provides a unified interface for running cross-validation for all algorithms.\n", + "\n", + "Additionally, the module provides specialized cross-validation submodules for different algorithms:\n", + "- `mtcov_cross_validation`: Cross-validation specific to the MTCOV algorithm.\n", + "- `dyncrep_cross_validation`: Cross-validation specific to the DynCRep algorithm.\n", + "- `acd_cross_validation`: Cross-validation specific to the ACD algorithm.\n", + "- `crep_cross_validation`: Cross-validation specific to the CRep algorithm.\n", + "- `jointcrep_cross_validation`: Cross-validation specific to the JointCRep algorithm.\n", + "\n", + "By leveraging these tools, we can systematically assess and fine-tune our model to achieve the best possible results.\n", + "\n", + "Let's look now at how to use it. As mentioned, we will use the `main` submodule to perform \n", + "cross-validation for the ACD method. To do that, we need to define the model parameters \n", + "(`model_parameters`) and cross-validation parameters (`cv_params`). The `model_parameters` \n", + "include the lists of hyperparameters of the ACD method we would like to test. The `cv_params` \n", + "include the parameters for the cross-validation process, such as the number of folds, the input \n", + "folder, and the output results. Optionally, we can also specify another dictionary \n", + "(`numerical_parameters`) with the \n", + "numerical parameters to run the inference algorithm, like the number of iterations or the \n", + "convergence threshold. We will set the number of iterations to 1000 using this input dictionary." + ], + "id": "d299187ec3c4110e" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:45:52.070638Z", + "start_time": "2024-10-30T09:45:52.065119Z" + } + }, + "cell_type": "code", + "source": [ + "# Step 2: Perform Cross-Validation\n", + "fold_number = 3\n", + "# Define the cross-validation parameters\n", + "model_parameters = {\n", + " \"K\": [2, 3],\n", + " \"flag_anomaly\": True,\n", + " \"rseed\": 10,\n", + " \"initialization\": 0,\n", + " \"out_inference\": False,\n", + " \"out_folder\": \"outputs/\" + str(fold_number) + \"-fold_cv/\",\n", + " \"end_file\": \"_ACD\",\n", + " \"assortative\": True,\n", + " \"undirected\": False,\n", + " \"files\": \"../data/input/theta.npz\",\n", + "}\n", + "cv_params = {\n", + " \"in_folder\": \"../../../probinet/data/input/\",\n", + " \"adj\": adj_file,\n", + " \"ego\": \"source\",\n", + " \"alter\": \"target\",\n", + " \"NFold\": fold_number,\n", + " \"out_results\": True,\n", + " \"out_mask\": False,\n", + " \"sep\": \" \",\n", + "}\n", + "numerical_parameters = {\n", + " \"max_iter\": 1000,\n", + " \"num_realizations\": 1,\n", + "}" + ], + "id": "ec60dc91dbc0c3be", + "outputs": [], + "execution_count": 4 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As we can see, the `model_parameters` dictionary contains the hyperparameters we want to test. In\n", + " this case, we will only focus on the number of communities `K`. To avoid making the tutorial too long, we will only test two values for `K`, but in practice, we should test a broader range of values. \n", + " \n", + "We are now ready to run the cross-validation process. We will use the `cross_validation` function from the `main` submodule, passing the method name (`ACD`), the model parameters, and the cross-validation parameters as arguments. The function will then perform the cross-validation and store the results in a CSV file." + ], + "id": "c04cd7bff510c8f4" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:46:33.098241Z", + "start_time": "2024-10-30T09:45:52.124199Z" + } + }, + "cell_type": "code", + "source": [ + "from pathlib import Path\n", + "\n", + "# Define the output file name\n", + "adj_file_stem = Path(adj_file).stem\n", + "cv_results_file = Path(f\"outputs/{fold_number}-fold_cv/{adj_file_stem}_cv.csv\")\n", + "\n", + "# Delete the file if it already exists\n", + "if cv_results_file.exists():\n", + " cv_results_file.unlink()\n", + "\n", + "# Run the cross-validation\n", + "from probinet.model_selection.main import cross_validation\n", + "\n", + "results = cross_validation(\"ACD\", model_parameters, cv_params, numerical_parameters)" + ], + "id": "e61a89c34bbbb0dc", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Starting cross-validation for algorithm: ACD\n", + "DEBUG:root:Converting parameter flag_anomaly to list. The value used is True\n", + "DEBUG:root:Converting parameter rseed to list. The value used is 10\n", + "DEBUG:root:Converting parameter initialization to list. The value used is 0\n", + "DEBUG:root:Converting parameter out_inference to list. The value used is False\n", + "DEBUG:root:Converting parameter out_folder to list. The value used is outputs/3-fold_cv/\n", + "DEBUG:root:Converting parameter end_file to list. The value used is _ACD\n", + "DEBUG:root:Converting parameter assortative to list. The value used is True\n", + "DEBUG:root:Converting parameter undirected to list. The value used is False\n", + "DEBUG:root:Converting parameter files to list. The value used is ../data/input/theta.npz\n", + "INFO:root:Parameter grid created with 2 combinations\n", + "INFO:root:Running cross-validation for parameters: {'K': 2, 'flag_anomaly': True, 'rseed': 10, 'initialization': 0, 'out_inference': False, 'out_folder': 'outputs/3-fold_cv/', 'end_file': '_ACD', 'assortative': True, 'undirected': False, 'files': '../data/input/theta.npz'}\n", + "INFO:root:Results will be saved in: outputs/3-fold_cv/network_with_anomalies_cv.csv\n", + "DEBUG:root:Read adjacency file from ../../../probinet/data/input/network_with_anomalies.csv. The shape of the data is (2698, 3).\n", + "DEBUG:root:Creating the network ...\n", + "DEBUG:root:Removing self loops\n", + "INFO:root:Number of nodes = 300\n", + "INFO:root:Number of layers = 1\n", + "INFO:root:Number of edges and average degree in each layer:\n", + "INFO:root:E[0] = 2698 / = 17.99\n", + "INFO:root:Sparsity [0] = 0.030\n", + "INFO:root:Reciprocity (networkX) = 0.201\n", + "INFO:root:Reciprocity (considering the weights of the edges) = 0.201\n", + "INFO:root:Starting the cross-validation procedure.\n", + "INFO:root:\n", + "FOLD 0\n", + "DEBUG:root:Fixing random seed to: 10\n", + "DEBUG:root:Preprocessing the data for fitting the models.\n", + "DEBUG:root:Data looks like: [[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]]\n", + "DEBUG:root:Random number generator seed: 10\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 3.28 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 200 - time = 5.62 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 300 - time = 7.71 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 400 - time = 9.90 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 500 - time = 12.20 seconds\n", + "DEBUG:root:num. realizations = 0 - ELBO = -10952.354485615175 - ELBOmax = -10952.354485615175 - iterations = 551 - time = 13.26 seconds - convergence = True\n", + "DEBUG:root:Best realization = 0 - maxL = -10952.354485615175 - best iterations = 551\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n", + "INFO:root:Time elapsed: 13.32 seconds.\n", + "INFO:root:\n", + "Time elapsed: 13.32 seconds.\n", + "INFO:root:\n", + "FOLD 1\n", + "DEBUG:root:Fixing random seed to: 10\n", + "DEBUG:root:Preprocessing the data for fitting the models.\n", + "DEBUG:root:Data looks like: [[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]]\n", + "DEBUG:root:Random number generator seed: 10\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 2.21 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 200 - time = 4.54 seconds\n", + "DEBUG:root:num. realizations = 0 - ELBO = -11116.213476130495 - ELBOmax = -11116.213476130495 - iterations = 291 - time = 6.37 seconds - convergence = True\n", + "DEBUG:root:Best realization = 0 - maxL = -11116.213476130495 - best iterations = 291\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n", + "INFO:root:Time elapsed: 6.42 seconds.\n", + "INFO:root:\n", + "Time elapsed: 19.74 seconds.\n", + "INFO:root:\n", + "FOLD 2\n", + "DEBUG:root:Fixing random seed to: 10\n", + "DEBUG:root:Preprocessing the data for fitting the models.\n", + "DEBUG:root:Data looks like: [[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]]\n", + "DEBUG:root:Random number generator seed: 10\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 2.08 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 200 - time = 4.31 seconds\n", + "DEBUG:root:num. realizations = 0 - ELBO = -11186.622153136053 - ELBOmax = -11186.622153136053 - iterations = 241 - time = 5.5 seconds - convergence = True\n", + "DEBUG:root:Best realization = 0 - maxL = -11186.622153136053 - best iterations = 241\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n", + "INFO:root:Time elapsed: 5.56 seconds.\n", + "INFO:root:\n", + "Time elapsed: 25.3 seconds.\n", + "INFO:root:Completed cross-validation for parameters: {'K': 2, 'flag_anomaly': True, 'rseed': 10, 'initialization': 0, 'out_inference': False, 'out_folder': 'outputs/3-fold_cv/', 'end_file': '_ACD_2K2', 'assortative': True, 'undirected': False, 'files': '../data/input/theta.npz'}\n", + "INFO:root:Running cross-validation for parameters: {'K': 3, 'flag_anomaly': True, 'rseed': 10, 'initialization': 0, 'out_inference': False, 'out_folder': 'outputs/3-fold_cv/', 'end_file': '_ACD', 'assortative': True, 'undirected': False, 'files': '../data/input/theta.npz'}\n", + "INFO:root:Results will be saved in: outputs/3-fold_cv/network_with_anomalies_cv.csv\n", + "DEBUG:root:Read adjacency file from ../../../probinet/data/input/network_with_anomalies.csv. The shape of the data is (2698, 3).\n", + "DEBUG:root:Creating the network ...\n", + "DEBUG:root:Removing self loops\n", + "INFO:root:Number of nodes = 300\n", + "INFO:root:Number of layers = 1\n", + "INFO:root:Number of edges and average degree in each layer:\n", + "INFO:root:E[0] = 2698 / = 17.99\n", + "INFO:root:Sparsity [0] = 0.030\n", + "INFO:root:Reciprocity (networkX) = 0.201\n", + "INFO:root:Reciprocity (considering the weights of the edges) = 0.201\n", + "INFO:root:Starting the cross-validation procedure.\n", + "INFO:root:\n", + "FOLD 0\n", + "DEBUG:root:Fixing random seed to: 10\n", + "DEBUG:root:Preprocessing the data for fitting the models.\n", + "DEBUG:root:Data looks like: [[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]]\n", + "DEBUG:root:Random number generator seed: 10\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 3.20 seconds\n", + "DEBUG:root:num. realizations = 0 - ELBO = -12016.59156821239 - ELBOmax = -12016.59156821239 - iterations = 161 - time = 4.7 seconds - convergence = True\n", + "DEBUG:root:Best realization = 0 - maxL = -12016.59156821239 - best iterations = 161\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n", + "INFO:root:Time elapsed: 4.76 seconds.\n", + "INFO:root:\n", + "Time elapsed: 4.77 seconds.\n", + "INFO:root:\n", + "FOLD 1\n", + "DEBUG:root:Fixing random seed to: 10\n", + "DEBUG:root:Preprocessing the data for fitting the models.\n", + "DEBUG:root:Data looks like: [[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]]\n", + "DEBUG:root:Random number generator seed: 10\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 2.43 seconds\n", + "DEBUG:root:num. realizations = 0 - ELBO = -12141.210693139737 - ELBOmax = -12141.210693139737 - iterations = 131 - time = 3.45 seconds - convergence = True\n", + "DEBUG:root:Best realization = 0 - maxL = -12141.210693139737 - best iterations = 131\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n", + "INFO:root:Time elapsed: 3.51 seconds.\n", + "INFO:root:\n", + "Time elapsed: 8.28 seconds.\n", + "INFO:root:\n", + "FOLD 2\n", + "DEBUG:root:Fixing random seed to: 10\n", + "DEBUG:root:Preprocessing the data for fitting the models.\n", + "DEBUG:root:Data looks like: [[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]]\n", + "DEBUG:root:Random number generator seed: 10\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 2.50 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 200 - time = 4.74 seconds\n", + "DEBUG:root:num. realizations = 0 - ELBO = -12204.589153360392 - ELBOmax = -12204.589153360392 - iterations = 261 - time = 6.21 seconds - convergence = True\n", + "DEBUG:root:Best realization = 0 - maxL = -12204.589153360392 - best iterations = 261\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n", + "INFO:root:Time elapsed: 6.27 seconds.\n", + "INFO:root:\n", + "Time elapsed: 14.55 seconds.\n", + "INFO:root:Completed cross-validation for parameters: {'K': 3, 'flag_anomaly': True, 'rseed': 10, 'initialization': 0, 'out_inference': False, 'out_folder': 'outputs/3-fold_cv/', 'end_file': '_ACD_2K3', 'assortative': True, 'undirected': False, 'files': '../data/input/theta.npz'}\n", + "INFO:root:Completed cross-validation for algorithm: ACD\n", + "INFO:root:Results saved in: outputs/3-fold_cv/network_with_anomalies_cv.csv\n" + ] + } + ], + "execution_count": 5 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Loading the Cross-Validation Results\n", + "\n", + "Now we are ready to load the cross-validation results into a DataFrame and analyze them to determine the best number of communities \\(K\\). We will load the results from the CSV file generated during the cross-validation process and display the first few rows to get an overview of the data." + ], + "id": "f445f0fe358d708f" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:46:40.699655Z", + "start_time": "2024-10-30T09:46:40.686731Z" + } + }, + "cell_type": "code", + "source": [ + "# Step 3: Load the Cross-Validation Results\n", + "\n", + "# Load the cross-validation results into a DataFrame\n", + "adj_file_stem = adj_file.split(\".\")[0]\n", + "cv_results_file = \"outputs/\" + str(fold_number) + f\"-fold_cv/{adj_file_stem}_cv.csv\"\n", + "cv_results = pd.read_csv(cv_results_file)\n", + "\n", + "# Display the cross-validation results\n", + "cv_results" + ], + "id": "cc5007e5be242199", + "outputs": [ + { + "data": { + "text/plain": [ + " K fold rseed flag_anomaly mu pi ELBO final_it \\\n", + "0 2 0 265 True 0.482160 0.003595 -10952.354486 551 \n", + "1 2 1 265 True 0.490233 0.003594 -11116.213476 291 \n", + "2 2 2 265 True 0.484847 0.003967 -11186.622153 241 \n", + "3 3 0 265 True 0.552818 0.002587 -12016.591568 161 \n", + "4 3 1 265 True 0.559593 0.002336 -12141.210693 131 \n", + "5 3 2 265 True 0.555133 0.002499 -12204.589153 261 \n", + "\n", + " aucA_train aucA_test \n", + "0 0.868516 0.694000 \n", + "1 0.873517 0.693991 \n", + "2 0.863744 0.699252 \n", + "3 0.924452 0.804518 \n", + "4 0.934237 0.810586 \n", + "5 0.929155 0.800536 " + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Kfoldrseedflag_anomalymupiELBOfinal_itaucA_trainaucA_test
020265True0.4821600.003595-10952.3544865510.8685160.694000
121265True0.4902330.003594-11116.2134762910.8735170.693991
222265True0.4848470.003967-11186.6221532410.8637440.699252
330265True0.5528180.002587-12016.5915681610.9244520.804518
431265True0.5595930.002336-12141.2106931310.9342370.810586
532265True0.5551330.002499-12204.5891532610.9291550.800536
\n", + "
" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As we can see, the resulting dataframe shows information about the used data folds, the \n", + "number of communities, the random seed, the anomaly flag, the parameters `mu` and `pi`, the \n", + "ELBO score, and the number of iterations needed to reach convergence of the ELBO function. \n", + "Moreover, we can also see the scores for each combination of parameters both on the folds used \n", + "for training, and the folds used for testing. Since we are interested in determining the best `K` \n", + "value (best in terms of AUC scores over the folds), we will group the results by `K` and calculate \n", + "the mean score for each group." + ], + "id": "2c695b7b5bf2e042" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:46:44.202474Z", + "start_time": "2024-10-30T09:46:44.187962Z" + } + }, + "cell_type": "code", + "source": [ + "# Remove the specified columns\n", + "cv_results_filtered = cv_results.drop(\n", + " columns=[\"fold\", \"rseed\", \"flag_anomaly\", \"final_it\", \"mu\", \"ELBO\", \"pi\"]\n", + ")\n", + "\n", + "# Group by 'K' and calculate the mean for each group\n", + "cv_results_mean = cv_results_filtered.groupby(\"K\").mean().reset_index()\n", + "cv_results_mean" + ], + "id": "7983a377655e595d", + "outputs": [ + { + "data": { + "text/plain": [ + " K aucA_train aucA_test\n", + "0 2 0.868593 0.695747\n", + "1 3 0.929281 0.805213" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
KaucA_trainaucA_test
020.8685930.695747
130.9292810.805213
\n", + "
" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 10 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Now it is evident that `K` equal to 3 is the best choice, as it has the highest mean score (both \n", + "in training and testing). We will use it to run the algorithm with the whole dataset, and \n", + "then analyze the results." + ], + "id": "5074bf2a0a999ab8" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:46:46.725917Z", + "start_time": "2024-10-30T09:46:46.720087Z" + } + }, + "cell_type": "code", + "source": [ + "# Get the best K\n", + "best_K = cv_results_mean.loc[cv_results_mean[\"aucA_test\"].idxmax()][\"K\"]\n", + "# Turn K into an integer\n", + "best_K = int(best_K)\n", + "best_K" + ], + "id": "14b92f566a1a7094", + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 11 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Run the algorithm with the best K", + "id": "7176d4658ae08ed9" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "First, we instantiate the model with the previously used numerical parameters, and then we run \n", + "it with the best `K` value." + ], + "id": "a0d8606a486c7d9b" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-30T09:46:51.941708Z", + "start_time": "2024-10-30T09:46:48.588006Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.models.acd import AnomalyDetection\n", + "\n", + "model = AnomalyDetection()\n", + "\n", + "inferred_parameters = model.fit(\n", + " graph_data,\n", + " K=best_K,\n", + " flag_anomaly=model_parameters[\"flag_anomaly\"][0],\n", + " rseed=model_parameters[\"rseed\"][0],\n", + " initialization=model_parameters[\"initialization\"][0],\n", + " out_inference=model_parameters[\"out_inference\"][0],\n", + " assortative=model_parameters[\"assortative\"][0],\n", + " undirected=model_parameters[\"undirected\"][0],\n", + ")" + ], + "id": "c2a363bd16e5892c", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:root:Fixing random seed to: 10\n", + "DEBUG:root:Preprocessing the data for fitting the models.\n", + "DEBUG:root:Data looks like: [[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]]\n", + "DEBUG:root:Random number generator seed: 10\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 3.05 seconds\n", + "DEBUG:root:num. realizations = 0 - ELBO = -15522.747909433549 - ELBOmax = -15522.747909433549 - iterations = 111 - time = 3.33 seconds - convergence = True\n", + "DEBUG:root:Best realization = 0 - maxL = -15522.747909433549 - best iterations = 111\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n" + ] + } + ], + "execution_count": 12 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:29:26.792243Z", + "start_time": "2024-10-29T15:29:26.785657Z" + } + }, + "cell_type": "code", + "source": "u, v, w, mu, pi, _ = inferred_parameters", + "id": "e22689a02d506519", + "outputs": [], + "execution_count": 10 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:29:26.974376Z", + "start_time": "2024-10-29T15:29:26.963887Z" + } + }, + "cell_type": "code", + "source": [ + "# Print the shape of each parameter\n", + "print(\"u shape: \", u.shape)\n", + "print(\"v shape: \", v.shape)\n", + "print(\"w shape: \", w.shape)\n", + "print(\"mu: \", mu)\n", + "print(\"pi: \", pi)" + ], + "id": "83f90e714b579a8b", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u shape: (300, 3)\n", + "v shape: (300, 3)\n", + "w shape: (1, 3)\n", + "mu: 0.5613593192719294\n", + "pi: 0.006983211971017939\n" + ] + } + ], + "execution_count": 11 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Community Detection\n", + "\n", + "Now that we have run the algorithm with the best `K` value, we can analyze the results. We will \n", + "first plot the adjacency matrix to confirm that our choice of `K` was correct. " + ], + "id": "34fe039c9dc326b2" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:29:27.704647Z", + "start_time": "2024-10-29T15:29:27.119229Z" + } + }, + "cell_type": "code", + "source": [ + "# Create a graph from the first adjacency matrix in the list A\n", + "graph = A[0]\n", + "\n", + "# Get the adjacency matrix\n", + "adjacency_matrix = nx.adjacency_matrix(graph)\n", + "\n", + "# Plot the adjacency matrix\n", + "plt.imshow(adjacency_matrix.toarray(), cmap=\"Greys\", interpolation=\"none\")\n", + "\n", + "# Add a color bar to the plot for reference\n", + "plt.colorbar()\n", + "plt.show()" + ], + "id": "beef58eaeddef40b", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 12 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "It is now more evident that the input data has indeed three communities, which matches the \n", + "results given by the cross validation. " + ], + "id": "d4cc15dad31944b7" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "We can now use the inferred parameters to plot the graph together with the communities.", + "id": "8af8c080e4aeda13" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:29:58.503847Z", + "start_time": "2024-10-29T15:29:27.778871Z" + } + }, + "cell_type": "code", + "source": [ + "import numpy as np\n", + "\n", + "# Get the community with the highest probability for each node\n", + "umax = np.argmax(u, 1)\n", + "\n", + "# Draw the graph using the spring layout\n", + "plt.figure(figsize=(5, 5))\n", + "nx.draw(\n", + " A[0],\n", + " pos=pos,\n", + " node_size=50,\n", + " node_color=umax,\n", + " alpha=0.6,\n", + " edge_color=\"gray\",\n", + " with_labels=False,\n", + " cmap=plt.cm.Set1,\n", + ")\n", + "plt.show()" + ], + "id": "51969d1d338ae7c7", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 13 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Anomaly Detection\n", + "\n", + "As we have seen, the `ACD` method also provides information about the anomalies. We can use the \n", + "inferred parameters `pi` and `mu` to build a matrix `Q` that represents the probability of each \n", + "edge being an anomaly. We can then set a threshold to determine which edges are anomalous. We can\n", + " decide which threshold to use based on the distribution of values in `Q`." + ], + "id": "39297069408a8b0c" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:29:59.308831Z", + "start_time": "2024-10-29T15:29:58.587645Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.evaluation.expectation_computation import (\n", + " compute_mean_lambda0,\n", + " calculate_Q_dense,\n", + ")\n", + "\n", + "# Calculate the matrix Q\n", + "M0 = compute_mean_lambda0(u, v, w)\n", + "Q = calculate_Q_dense(graph_data.adjacency_tensor, M0, pi, mu)\n", + "\n", + "# Plot the distribution of values in Q\n", + "fig = plt.figure(figsize=(7, 3))\n", + "plt.hist(Q[0].flatten(), bins=100)\n", + "plt.title(\"Q distribution\")" + ], + "id": "1a09bf3319fce87", + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Q distribution')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmgAAAEpCAYAAAAnA94dAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwcElEQVR4nO3de3gU9b3H8U8S2A233YAxtxISkMql3DRoWCuIElklXjjiKSBiwMjtJFZIVaDlAGqPWNAjKDfRStRKuT1qlWAwBoEKUWo0BQKkgsHAgQ1UTBaiJpDM+cMnU7aJwIZcBni/nmeeujPfmfnO7+GhH2ZnfhtgGIYhAAAAWEZgUzcAAAAAXwQ0AAAAiyGgAQAAWAwBDQAAwGIIaAAAABZDQAMAALAYAhoAAIDFENAAAAAshoAGAABgMQQ0ABelTZs2KSAgQJs2bTLXjRkzRrGxsY1y/tjYWI0ZM8b8nJ6eroCAAH322WeNcv6BAwdq4MCBjXIuAI2PgAagQeXn5+v+++/Xz372M9ntdkVFRen+++/X7t27m7o1SdLu3bs1e/ZsHThwoKlbqcHKvQFoWM2augEAl6633npLI0eOVLt27ZScnKyOHTvqwIED+uMf/6i1a9dq1apVuvvuu+vtfC+//LKqqqr82mf37t164oknNHDgQL/uvhUUFCgwsGH/jXu23j744IMGPTeApkVAA9Ag9u/fr9GjR6tTp07asmWLrrzySnPbI488ov79++v+++/Xjh071LFjx3o5Z/PmzevlOD/FMAz98MMPatGihex2e4Oe61xsNluTnh9Aw+IrTgANYt68efruu++0bNkyn3AmSaGhoXrppZd08uRJzZs375zHOnTokIYOHapWrVopLCxMU6ZMUXl5eY262p5BW7lypeLi4tSmTRs5HA717NlTCxYskPTjc2P/+Z//KUm6+eabFRAQ4PNcW2xsrO644w5t2LBBffv2VYsWLfTSSy+Z2858Bq3ad999pwkTJuiKK66Qw+HQAw88oG+//danJiAgQLNnz66x75nHPFdvtT2DdvToUSUnJys8PFzBwcHq3bu3XnvtNZ+aAwcOKCAgQM8++6yWLVumq666Sna7Xdddd53+9re/1egJQNPgDhqABvHee+8pNjZW/fv3r3X7gAEDFBsbq/fee0+LFy/+yeN8//33GjRokIqKivTrX/9aUVFReuONN7Rx48Zz9pCVlaWRI0dq0KBB+sMf/iBJ2rNnj7Zu3apHHnlEAwYM0K9//Wu98MIL+u1vf6tu3bpJkvm/0o9fZY4cOVITJkzQuHHj1KVLl7OeMzU1VSEhIZo9e7YKCgq0ZMkSff311+ZLDefrfHo70/fff6+BAwdq3759Sk1NVceOHbVmzRqNGTNGJSUleuSRR3zqV6xYoRMnTmjChAkKCAjQ3Llzdc899+irr75q8DuRAM6NgAag3pWWlurw4cPnfL6sV69eevfdd3XixAm1adOm1pply5bpH//4h1avXm3eURo3bpx69+59zj4yMjLkcDi0YcMGBQUF1djeqVMn9e/fXy+88IJuvfXWWt+K3LdvnzIzM+V2u895PunHrx6zs7PNkBMTE6PHH39c7733nu66667zOsb59namZcuWac+ePfrTn/6kUaNGSZImTpyom266STNmzNCDDz7oM8ZFRUX68ssv1bZtW0lSly5ddPfdd2vDhg264447zrtPAA2DrzgB1LsTJ05I0k+GrmrV26vra7N+/XpFRkbq3nvvNde1bNlS48ePP2cfISEhKisrU1ZW1vm0XauOHTuedziTpPHjx/vcgZo0aZKaNWum9evX17mH87F+/XpFRERo5MiR5rrmzZvr17/+tU6ePKnNmzf71A8fPtwMZ5LMO51fffVVg/YJ4PwQ0ADUu/MJXtXbAwICFBoa+pM1X3/9tTp37lzj68FzfdUoSf/1X/+lq6++Wrfffrvat2+vBx98UJmZmedxBf/i7wsMP//5z30+t27dWpGRkQ0+VcbXX3+tn//85zXeLK3+SvTrr7/2Wd+hQwefz9Vh7d+flwPQNAhoAOqd0+lUVFSUduzYcda6HTt2qH379g32RmJYWJjy8vL07rvv6q677tJHH32k22+/XUlJSed9jBYtWjRIb7WprKxstHPV9pWv9OObqgCaHgENQIO48847VVhYqI8//rjW7X/961914MAB87mynxITE6P9+/fXCA4FBQXn1YfNZtOdd96pxYsXa//+/ZowYYJef/117du3T5L8enD/fHz55Zc+n0+ePKkjR474vF3atm1blZSU+NRVVFToyJEjPuv86S0mJkZffvlljXng9u7da24HcPEgoAFoEI8++qhatmypCRMm6JtvvvHZdvz4cU2cOFEOh0OpqalnPc6QIUN0+PBhrV271lxXPX3Hufz7eQMDA9WrVy9JMqfpaNWqlSTVCEx1tWzZMp06dcr8vGTJEp0+fVq33367ue6qq67Sli1bauz373fQ/OltyJAh8ng8WrVqlbnu9OnTevHFF9W6dWvddNNNdbkcAE2EtzgBNIjOnTvr9ddf18iRI9WzZ88avyTw7bffauXKled8xmvcuHFauHChHnjgAeXm5ioyMlJvvPGGWrZsec4eHnroIR0/fly33HKL2rdvr6+//lovvvii+vTpYz6b1adPHwUFBekPf/iDSktLZbfbdcsttygsLKxO111RUaFBgwbpV7/6lQoKCrR48WLdeOONPm9wPvTQQ5o4caKGDRumW2+9VX//+9+1YcOGGs/i+dPb+PHj9dJLL2nMmDHKzc1VbGys1q5dq61bt2r+/PnnfGEDgMUYANCAdu7cadx3331GRESEERgYaEgygoODjfz8/PM+xtdff23cddddRsuWLY3Q0FDjkUceMTIzMw1JxkcffWTWJSUlGTExMebntWvXGoMHDzbCwsIMm81mdOjQwZgwYYJx5MgRn+O//PLLRqdOnYygoCCfY8bExBiJiYm19hQTE2MkJSWZn5cvX25IMjZv3myMHz/eaNu2rdG6dWtj1KhRxjfffOOzb2VlpTF16lQjNDTUaNmypeF2u419+/bVOObZervpppuMm266yae2uLjYGDt2rBEaGmrYbDajZ8+exvLly31qCgsLDUnGvHnzalyTJGPWrFm1Xi+AxhVgGDwRCqDxvP766xozZozuv/9+vf76603dDgBYEl9xAmhUDzzwgI4cOaJp06apffv2evrpp5u6JQCwHO6gAQAAWAxvcQIAAFgMAQ0AAMBiCGgAAAAWQ0ADAACwmMv6Lc6qqiodPnxYbdq0qfefewEAADiTYRg6ceKEoqKiFBh49ntkl3VAO3z4sKKjo5u6DQAAcBk5ePCg2rdvf9aayzqgVf/0ycGDB+VwOJq4GwAAcCnzer2Kjo4+r59eu6wDWvXXmg6Hg4AGAAAaxfk8VsVLAgAAABZDQAMAALAYAhoAAIDFENAAAAAshoAGAABgMQQ0AAAAiyGgAQAAWAwBDQAAwGIu64lqAQCA/2KnZdRYd+CZxCbo5NLFHTQAAACLIaABAABYDAENAADAYghoAAAAFuNXQFuyZIl69eolh8Mhh8Mhl8ul999/39z+ww8/KCUlRVdccYVat26tYcOGqbi42OcYRUVFSkxMVMuWLRUWFqbHHntMp0+f9qnZtGmTrr32WtntdnXu3Fnp6ek1elm0aJFiY2MVHBys+Ph4bd++3Z9LAQAAsCy/Alr79u31zDPPKDc3V5999pluueUW3X333crPz5ckTZkyRe+9957WrFmjzZs36/Dhw7rnnnvM/SsrK5WYmKiKigpt27ZNr732mtLT0zVz5kyzprCwUImJibr55puVl5enyZMn66GHHtKGDRvMmlWrViktLU2zZs3S559/rt69e8vtduvo0aMXOh4AAABNLsAwDONCDtCuXTvNmzdP9957r6688kqtWLFC9957ryRp79696tatm3JyctSvXz+9//77uuOOO3T48GGFh4dLkpYuXaqpU6fq2LFjstlsmjp1qjIyMrRr1y7zHCNGjFBJSYkyMzMlSfHx8bruuuu0cOFCSVJVVZWio6P18MMPa9q0aefdu9frldPpVGlpqRwOx4UMAwAAlw2m2agbf3JHnZ9Bq6ys1MqVK1VWViaXy6Xc3FydOnVKCQkJZk3Xrl3VoUMH5eTkSJJycnLUs2dPM5xJktvtltfrNe/C5eTk+Byjuqb6GBUVFcrNzfWpCQwMVEJCglkDAABwMfN7otqdO3fK5XLphx9+UOvWrfX222+re/fuysvLk81mU0hIiE99eHi4PB6PJMnj8fiEs+rt1dvOVuP1evX999/r22+/VWVlZa01e/fuPWvv5eXlKi8vNz97vd7zv3AAAIBG4vcdtC5duigvL0+ffvqpJk2apKSkJO3evbsheqt3c+bMkdPpNJfo6OimbgkAAKAGvwOazWZT586dFRcXpzlz5qh3795asGCBIiIiVFFRoZKSEp/64uJiRURESJIiIiJqvNVZ/flcNQ6HQy1atFBoaKiCgoJqrak+xk+ZPn26SktLzeXgwYP+Xj4AAECDu+B50KqqqlReXq64uDg1b95c2dnZ5raCggIVFRXJ5XJJklwul3bu3OnztmVWVpYcDoe6d+9u1px5jOqa6mPYbDbFxcX51FRVVSk7O9us+Sl2u92cIqR6AQAAsBq/nkGbPn26br/9dnXo0EEnTpzQihUrtGnTJm3YsEFOp1PJyclKS0tTu3bt5HA49PDDD8vlcqlfv36SpMGDB6t79+4aPXq05s6dK4/HoxkzZiglJUV2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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 14 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "The distribution of values in Q is skewed, with most values close to 0.6. We can concentrate on the most anomalous values by selecting the top 10%.", + "id": "6dd9ad0350d168f8" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:29:59.385489Z", + "start_time": "2024-10-29T15:29:59.380780Z" + } + }, + "cell_type": "code", + "source": "import numpy as np", + "id": "780e7c6d6ea88184", + "outputs": [], + "execution_count": 15 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:29:59.959736Z", + "start_time": "2024-10-29T15:29:59.486980Z" + } + }, + "cell_type": "code", + "source": [ + "# Calculate the threshold for the top 10% most anomalous edges\n", + "threshold = np.percentile(Q[0].flatten(), 90)\n", + "\n", + "# Create a copy of Q and set the top 10% most anomalous edges to 1, and the rest to 0\n", + "Z_pred = np.copy(Q[0])\n", + "Z_pred[Q[0] >= threshold] = 1\n", + "Z_pred[Q[0] < threshold] = 0\n", + "\n", + "plt.figure(figsize=(5, 5))\n", + "cmap = \"PuBuGn\"\n", + "plt.imshow(Z_pred, cmap=cmap, interpolation=\"none\")\n", + "plt.colorbar(fraction=0.046)\n", + "plt.title(\"Z_pred\")" + ], + "id": "2a1711cf22e5a48d", + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Z_pred')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdsAAAGgCAYAAADin802AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABd2UlEQVR4nO29f3wU1fX//9qNJIAQIkISguGngiIKNEiMVqUlJSBaKfQjIBVEP1iRWDXVt8Uv8kPfLSpVUUGpWsRWEdSvPyoqFoOBaiPWVKr4A4WCQWVBpCQQJAEynz/orrvDvXfuzOzs7mRfTx/zaHbm/jh3QnP2nHvOuQHDMAwQQgghxDOCyRaAEEIIaelQ2RJCCCEeQ2VLCCGEeAyVLSGEEOIxVLaEEEKIx1DZEkIIIR5DZUsIIYR4DJUtIYQQ4jFUtoQQQojHUNkS0gKZM2cOAoFAssUghPwXKltCAAQCActrzpw5yRaTEOJTjku2AISkAn/+85+lz+bMmYMtW7aguLg4gRIRQloSVLaEAPjFL34hvP/YY49hy5YtuO666zBy5EjP5Th48CAyMzMRDNLpREhLgv+PJkTCRx99hF/96lcYNGgQ5s+fr91v6NCh6N+/P2pqanDOOeegTZs26NmzJxYvXhzTrqqqCoFAAMuXL8fMmTPRtWtXtG3bFvX19QCA9evXY8SIEejQoQPatm2LCy64AG+//fYx87311ls466yz0Lp1a/Tu3Rt/+MMf3C2cEBJ3aNkSIuDAgQO49NJLkZGRgeXLlyMrK8tW///85z+48MILcemll2LChAl45plnMG3aNGRmZuLKK6+MaXvHHXcgMzMTN910ExobG5GZmYk1a9Zg5MiRKCoqwuzZsxEMBvH444/jxz/+Mf72t79hyJAhAIAPP/wQw4cPR+fOnTFnzhwcPnwYs2fPRl5eXtzeBSEkDhiEkGO48sorDQDGE088YbvvBRdcYAAw7rnnnsi9xsZGY+DAgUZubq7R1NRkGIZhvPnmmwYAo1evXsaBAwcibZubm41TTjnFKCsrM5qbmyP3Dxw4YPTs2dP4yU9+Erk3evRoo3Xr1sYXX3wRuffxxx8bGRkZBv/vTUjqQDcyISaWLVuGJUuW4PLLL8ekSZMcjXHcccfhl7/8ZeRzZmYmfvnLX2LXrl2oqamJaTt58mS0adMm8nnDhg34/PPPcdlll+Hbb7/F7t27sXv3bjQ0NGDYsGFYt24dmpubceTIEbz++usYPXo0unXrFul/2mmnoayszJHchBBvoBuZkCg+//xzXHPNNejTpw8eeughx+MUFBTg+OOPj7nXp08fAMC2bdtw9tlnR+737NnzGBmAo0pYRl1dHRobG/Hdd9/hlFNOOeZ537598eqrrzqWnxASX6hsCfkvjY2NGDduHJqamrB8+XK0a9cuIfNGW7UA0NzcDACYP38+Bg4cKOzTrl07NDY2ei0aISROUNkS8l9uuukmvP/++7j//vsxaNAgV2N9/fXXaGhoiLFuP/vsMwBAjx49lH179+4NAMjOzkZpaam0XefOndGmTZuIJRzNpk2bHEhNCPEK7tkSAuCFF17AwoUL8dOf/hS/+tWvXI93+PDhmBScpqYm/OEPf0Dnzp1RVFSk7FtUVITevXvj97//Pfbv33/M82+++QYAkJGRgbKyMrz44ouora2NPP/kk0/w+uuvu14DISR+0LIlac+OHTtw1VVXISMjA8OGDcOTTz4pbNe7d2+UlJRojVlQUIC77roL27ZtQ58+fbBixQps2LABjzzyCFq1aqXsGwwG8dhjj2HkyJE4/fTTMWXKFHTt2hVfffUV3nzzTWRnZ+Pll18GAMydOxerVq3Ceeedh2uvvRaHDx/Ggw8+iNNPPx0ffPCBvRdBCPGOZIdDE5Jswik4VtfkyZO1xrvggguM008/3XjvvfeMkpISo3Xr1kb37t2NhQsXCud99tlnheO8//77xpgxY4wTTzzRyMrKMrp3725ceumlRmVlZUy7tWvXGkVFRUZmZqbRq1cvY/Hixcbs2bOZ+kNIChEwDMNIkp4npEUydOhQ7N69Gxs3bky2KISQFIF7toQQQtKGdevW4eKLL0ZBQQECgQBefPFFyz5VVVX4wQ9+gKysLJx88slYunSp7Xm5Z0uIJnv27EFTU5P0eUZGBjp37pxAiQghdmloaMCAAQNw5ZVXYsyYMZbtt27dilGjRuGaa67BU089hcrKSvzf//t/0aVLF1vFY6hsCdFkzJgxWLt2rfR59+7dsW3btsQJRAixzciRI22d4LV48WL07NkT99xzD4CjFdreeust3Hffff5QtosWLcL8+fMRCoUwYMAAPPjgg5Hi6oSkIvfccw/+85//SJ+Hi1NUVVUlSCJC/M3BgweV3iJdDMNAIBCIuZeVlWX7ABER1dXVx+S7l5WV4YYbbrA1TlKU7YoVK1BRUYHFixejuLgYCxYsQFlZGTZt2oTc3NxkiESIJVb5sYQQfQ4ePIg2HbKBpkOux2rXrt0xOemzZ8/GnDlzXI8dCoWOOUUrLy8P9fX1+O67746pACcjKcr23nvvxdSpUzFlyhQAR830V155BUuWLMFvfvObZIhECCEkgTQ1NR1VtBcMBI7LcD7Q4SPYv3YDtm/fjuzs7MjteFi18SThyrapqQk1NTWYMWNG5F4wGERpaSmqq6u1xmhubsbXX3+N9u3bH+M6IIQQEn8Mw8C+fftQUFCAYDCOiSzHZSBwnHNVFM5dzc7OjlG28SI/Px87d+6Mubdz505kZ2drW7VAEpTt7t27ceTIEaFZ/umnnwr7NDY2xhRd/+qrr9CvXz9P5SSEEHIs27dvx0knnRS/AQOBo5eb/h5SUlJyzAlaq1ev1q4mF8YX0cjz5s3D3Llzj7m/ffNWFF7985h7dU//FR0mDD+mbfh+3dN/jbkfvhf9v6K+4bbme9FjRH/WkUfWXnRfto5wG9UazGu2I6fOM9m45n7Rn80/E0JSm/p99Sg8uSfat28f34EDASCYOGW7f/9+bN68OfJ569at2LBhAzp27Ihu3bphxowZ+Oqrr/CnP/0JAHDNNddg4cKF+J//+R9ceeWVWLNmDZ555hm88sortuZNuLLt1KkTMjIyhGZ5fn6+sM+MGTNQUVER+VxfX4/CwkJkt89GwOTrz84+9l70fbObIXwv+n9FfcNtzfeix4j+rCOPrL3ovmwd4TaqNchcKzpy6jyTjWvuF/3Z/DMhxB/EfesuwZbte++9hx/96EeRz2HdMnnyZCxduhQ7duyIOdijZ8+eeOWVV3DjjTfi/vvvx0knnYTHHnvMVtoPkARlm5mZiaKiIlRWVmL06NEAju7BVlZWory8XNhHJ4S7+aW3pZ+Dl5xrKVd0e1lf8xyqsYKXnCsdM3rs5pfelj4T9Qv3ka3JPK8dROsO3wv/r3l81XyyZ7I1EUKI1wwdOhSqKsWi6lBDhw7F+++/72repLiRKyoqMHnyZAwePBhDhgzBggUL0NDQEIlOdkq08rKrFIBYhSIaV6V4ReNHtxcpR9F8VjKK2gcvOVf4XPQeVPOLZFTdi37X0fOp+ut+ESGEpAkpvmcbL5J2EMHChQsjRS0GDhyIBx54AMXFxVp96+vr0aFDB9Tt/JYuSEIISQD19fXokHci6urq4vJ3N/x3HCNKEGjlIhr50GFgVXXc5PKKpAVIlZeXS93GdhBZhSorU2a9Rj+T9VHdU7mJZVa22WK2spZla1WtXceiD/fXtb7NfVSubrNcMiuY1i0hpCXji2hkHaL/uMv2CXUUc/RntwrAyn2rmkekxKwUtM4XCNUzlZK2WosVqr1bnT11QkgLJU3cyC1G2QLxsY6srEKdgB9ZX6dy+A3Vlwi7gWuEkBZO0GXqj5u+CaRFKVtCCCE+I00s2xZzeLw5Ilf0zGxViSJ4raJpZeObUaXn6IwtWo9IxnjPYTWfuW/0JRrX/NxqTkIIaYn4XtmG92h13JM6ualWbmORsrByI7vd73TTT6etbrpO9KU7rmgP3c8uckJInAlbtm4uH+B7N7IsotUq0laUYyrLE7UK5FEVmlDlmaryd3UsY5GMVpHTqjF079tRljp5toSQNCZN3MhJy7N1A/NsCSEksXiWZ/vT893n2f5lXcrn2frejZxutKS9z5awBkKIS9LEjdwila3IFay6Jwvoseonm080po6cuvPIAqScKC9ZH5n8Ospe9A5VQV1UuISkMWmibH2/Z0sIIcTHMM/WH1gFPpnbik6xif7sRg5V1LEqglkW5GV+ZjW3bO06BzBYWd8iy9RJyUVasYSQdMT3ytap0lJFHUePoascrBSNnbKJsvui9YmipZ1UaVLVhValAunC6GNCiJA0iUb2/Z6tzh99K6vT/L+y+soyrMZ2as3JLFSzslONHw9rU1V20aokI/NsCSFKAkH3lw9g6g8hhBBLPEv9+Xmp+9Sf595I+dQf37uRVXu2ouPdrPY1ZVaelavWruvW7gk+5nbmn3XdymZ01ivam7UqdqFjLcdrv5wQ4mMCcOlGjpsknuJ7ZRtGFaxj94+52+Ap0f6n3T1b3UpL5sAlO+vW2eMWBZSpKmBFyyGS3ypwjRCSZqTJnm2LUbaEEEJ8SMBl6g+VbfKQWVwydNNtdAKxZOPaTf1RBT+p7lm5d0U4iThWWbWy57ReCSHpSotRtiolY6V8dd3FVnuVZgUqyuuVjavzTCf1x02erqifyh0sexdWip+5toSQCHQj+wOdU25ECi8eys+ObPF4rtonDWNn31b3mVV6j52xqWgJITFQ2fqPeLgp4+XqdDuObqGLVMxhVVnabgLXCCHEr/gjG1iBbnEHnedu28erbzLGTcY84d8drV1C0hgeROBfdPJWdfcTZTm0Vnm2srxY81wqd6tsH1WlnOzk2ep+OdHdZxXlKsvyc6MrS1HZEpLG0I1MCCGEeEyanPrDco2EEEIs8axc4+WjEMhs5Xgco+kQ8OdXUr5co+/3bEl6Qxc0IT6He7aEpD6MaCbE57g9uccnp/74XtlaFewPt3F6EIFVzeDo8UUyyeZ1cxCBSF7ZukVrkM0hG1v0XKdSlc7vJtyOSpOQNCVNAqRa1J6tkz/afvtDb6Wg/bYWgNYpIX7Asz3bKy5xv2e79CXu2SYSO6fc6PSJV55tPPcVnazRCfEYR3cM7ruSZMN/g0mEe7aEEEKIx6RJ6o/vLdt4VyDSKfSgUyAjHnLonviTalgV3fDDGkh6wa0M4jUtxrJVBRmpjoKLRvR/OKvTb1Rj6riSrfZcVQFVonF1DmaInks0pipASlVNSjS37HegClYjhKQRaRIg1WKUrfloN3M5QCen1JgVrCwwSTSGzpxWkc/me1bK0Tyvzqk+Vl8iRMpfFOUt6ic6gchuCUhCSAuHytYf6Bz/JlK6um4jnXY6StXuMXVO5HOqvHQVrfme7F3afceEkDSGytYf6O5rWuXL6ro1rVyyMllUBxHYybNVrcOOctM5LEEmiww7bmG6kQkh6YTvlW0YKxevqD1wrMtZ9Cwa0RwiS05nr9eOu1c2ltM8W9HcqsIcdtB9f1SyhBBWkCKEEEISgj9cwW7wx1eCOOHVHqJXFprdfV4vZbGDlQzcyyWEpBstUtm63XtMFDo5vXZxosicvhen8qXa74EQkkyC37uSnVw+UWNpXxvZK7ySRRVUlWro5iWn8hoIIUfxrDbyNRMQyMp0PI7R2AQsfjrlayO3mD1bUf6n+ZlVBKwqZzR6LNE9ncIRsvtWBTnM93TWqoMqVzf6vuiz6F2J3q1sLLt50ISQlopb65SWrWfILNt0wEpBU2kRQrzAO8t2Yhws26dS3rL1x1cCBdG1dmU5rdFtre7plFjUGVfnuapf9Lq8Jt57tqrfg/n3lch1EkJSEJ76QwghhHhMmuTZ+kNKm7hxpTrpK9uvtRrTzVyyilHximDWGcfJuuxWuiKEkJYA92x9CiN5CSGJxLM922snu9+zfeiJlN+zpRvZp1DJEuIOBhSmCGniRo67sp0zZw7mzp0bc69v37749NNPAQAHDx7Er3/9ayxfvhyNjY0oKyvDQw89hLy8PFfz6hwsYHVCjio9yGos3dQZ0VyyeUQHBViNZyVbNKo6xU4OCdB9v6I5+UePJBr+m0sRqGydc/rpp+ONN974fpLjvp/mxhtvxCuvvIJnn30WHTp0QHl5OcaMGYO333b2D18W8arKezVj/sMvUzzmn52gW0FJpgB13Md2lZjoy4JMRh35vTgliBBC/Iwnyva4445Dfn7+Mffr6urwxz/+EcuWLcOPf/xjAMDjjz+O0047De+88w7OPvtsx3OqFKKqxrDqFB+nbiar03nMJ+6oApSsvhw4qZ9s1U4kv93xVWPQoiCEfE8A7g4i8Efqjyf29+eff46CggL06tULEydORG1tLQCgpqYGhw4dQmlpaaTtqaeeim7duqG6ulo6XmNjI+rr62MuQgghLQA3dZHduqATSNwt2+LiYixduhR9+/bFjh07MHfuXJx33nnYuHEjQqEQMjMzkZOTE9MnLy8PoVBIOua8efOO2QcWEY+Ah3il/rh1PSeqjxdjqSx2q5KUhBDSEom7sh05cmTk5zPPPBPFxcXo3r07nnnmGbRp08bRmDNmzEBFRUXkc319PQoLC6XtrQKWzPdUNZNlY1kFIanqF6v6WY0pWofKJa7CSYCS6l2p9mDtBJgRQtIIt1WgWEHqKDk5OejTpw82b96Mn/zkJ2hqasLevXtjrNudO3cK93jDZGVlISsrS/hMpSRl2Amqin5mNaZVJLFIXpnCU81ntVYnwU0qJWqWzeoAA9F+rfmZKGKbCpeQdCQAdzuaVLYAgP3792PLli24/PLLUVRUhFatWqGyshJjx44FAGzatAm1tbUoKSlxNL5OKokoWElmlamsWJWyEo1vFbSlm5Zjvq9SYqI+MjmjvxTI3o/KijV/YVBZ8ipLnIqWkDSGlq0zbrrpJlx88cXo3r07vv76a8yePRsZGRmYMGECOnTogKuuugoVFRXo2LEjsrOzcd1116GkpMRxJLJIGYiUolVOqcx61Ul1kbWx28+s+Ky+QMjmsrM+kYVtfi5SxGY5dcdTjUmFSwhpqcQ9jOvLL7/EhAkT0LdvX1x66aU48cQT8c4776Bz584AgPvuuw8XXXQRxo4di/PPPx/5+fl4/vnn4y0GIYQQHxAIBF1fdlm0aBF69OiB1q1bo7i4GO+++66y/YIFC9C3b1+0adMGhYWFuPHGG3Hw4EF76/R7beScy78PyJK5Ma0CpOw8E6EKZlJZbW4CpFRy2w2YciK/amzd9+ckQIsQkhy8qo0cuKEcAUlMjg5GYyOMBQu15VqxYgUmTZqExYsXo7i4GAsWLMCzzz6LTZs2ITc395j2y5Ytw5VXXoklS5bgnHPOwWeffYYrrrgC48ePx7333qstpz8SlDRRKSPRHqLKDarqq4tVP7vjWqXSmD+7lV2nr93qT+bgKEIISST33nsvpk6diilTpqBfv35YvHgx2rZtiyVLlgjb//3vf8e5556Lyy67DD169MDw4cMxYcIES2vYjO8PIrCTt6lSVjqKV0cGJ8/t9tHZR47XXLLnOkFYqkApnXkJIWlAnGojm4sdibJYmpqaUFNTgxkzZkTuBYNBlJaWSgsrnXPOOXjyySfx7rvvYsiQIfj3v/+NV199FZdffrktMX2vbHXTY8KIXKyqyFud6GOdYCDdnFQ70b+idrJAMSuXtFVwmCwQLfqeKMBLNp8ZKl5C0pQ4RSObay/Mnj0bc+bMibm3e/duHDly5JiDb/Ly8iKH5Zi57LLLsHv3bvzwhz+EYRg4fPgwrrnmGtx66622xPS9snWqIGXI8mVV+7nhsVUR0bLUFyeWtGju6P46e7Zm+ayiqXW/1FilR9lNVSKEtHSCcLejebTv9u3bY/ZsZbUZ7FJVVYXf/e53eOihh1BcXIzNmzfj+uuvxx133IHbbrtNe5wWEyDlNH3EbpBSIpEFJskUVbLlNWMlDwOkCPEPngVIVdzoPkDq3vu05GpqakLbtm3x3HPPYfTo0ZH7kydPxt69e/HSSy8d0+e8887D2Wefjfnz50fuPfnkk7j66quxf/9+BIN6XxRaVIAUIYQQnxF2I7u5NMnMzERRUREqKysj95qbm1FZWSktrHTgwIFjFGpGRgYAwI6t2qKUrU6KixVWbUTRtE4KWsQLq2Ieun3d9DG/E6u0IEYjE0IiJPjUn4qKCjz66KN44okn8Mknn2DatGloaGjAlClTAACTJk2KCaC6+OKL8fDDD2P58uXYunUrVq9ejdtuuw0XX3xxROnq4Ps922hEe6zR96362X3mJU5d4vGay878Tt8dXceEkHjt2eoybtw4fPPNN5g1axZCoRAGDhyIVatWRYKmamtrYyzZmTNnIhAIYObMmfjqq6/QuXNnXHzxxfjtb39ra17f79nGY+/AT6TiFwMZqSYPIcQ5nu3Z3vQ/7vdsf3933OTyihZl2aYTIlctFRshxHfwIAKSiohyWFMVP8hICEkygYDLohb+ULYtKkAqHYgubMFAI0II8Qe0bAkhhCSRANwdAE/LNq3Rqb7k5ZypMBYtb0KIJQlO/UkWvrdsrUoiytpY9Y/G6rADpwX3rSKLZXPr1GKWjaEzj46cutWfVLWaWUGKEJIuAVL++ErgAbI9z3hZY15atnbyX3UVoeq56suGVeEKnaP6qGgJIS2dFqVsnRxAoFIGbpSAqpqTqAKVyppW9bcKlHJTJSraQo6eR/SzSP7wO9BV6oSQdCQYhyv18b0bWfesVatTeERuXzdFGWRHzUV/trIORf1UBxGojvITofslIx7vQDUPlS0h6YxLNzIDpBKD2cqK/t9UIZ7yuHEL2yER7zD8u6MbmRDS0vG9ZUsIIcTHuI0o9kk0sj+kjANeWmq6rmwzTvYyvViHmwMMnBDtPrd7UhEhpKURiMOV+rQYy1bn2DvZc3PkrDk9RXdv0U6gktU+rTm4SJbK5PREIx1FrqMEZek7qpOEzPvOhJD0JRgIIuDCOjUCQRyJozxe0WKUrRmZcrKDSEHKlJQ5yEonf9WMUwtZJZ9VEJQskEv1hUM3R1b2/szzUekSQlo6LUbZyiJ0oz/rFsCIRzSySA47z1UKSLZWJ0pLJ1pYFKntdm2q3xchJH0IIoiAix1NA/6wbH2/Z6tTNEFmjYqil1WVknTn05lfdV8HO3msVnLpyCfLp41+puqvIwchJP0I/NeN7ObyA763bGUWnm7+abTCMbs5zePK5kskKheu3X1QXevUat9X9Uyn4hQhhLR0fK9sCSGE+JcgAgi4iCg2GI2cWOy6IuNd4tCMyEoWtbEaQyaXToSxjhVu9R7iZYlyn5YQIuKosnWzZ+sPZesPZ7cGOn+8zS5Xc76n7jg6c+soKrupRGZXuVV/nf1luwFSTlG55gkh6Uu67Nn6Q0qXyHI+RQFC5jQeu7mmdnCqdOwqXRlu8oajZVHJIFL45rxmQghp6bQYNzJgXdhf9CxaWZgVrNvCC6rAIlFxB11LWFZow4ni0o0iVkUs67qpqVgJIWbSZc/W95atqOSfrkUmU3SiMZ3KpnPfjoVnbmuVquRERrsueZlla+U6dmOVE0JaBnQj+wy3wTeinFK3eKVIrNKYdOe3m/oTfZkrQckUa7y+uBBCiJ9pUW5kQggh/iIeFaT8QMAwDCPZQtilvr4eHTp0QN3Ob5GdnZ1scRJKPNNxCCFEl/r6enTIOxF1dXVx+bsb/jt+wqwHEGzdxvE4zQe/w39u/1Xc5PIKf3wl0CTerspUdn2KXN2pJq9OtHOqyUwISSyB/1q2bi4/4Hs3sipy1uoAgmhkBf1lY9mJwFVFOqv2mmXjyORTzaUjq1NUcqveHy10Qki64HtlK8JpgJQTZSWbX+bu1b2nUsC6AUd2Ipyt5tepuGX3PbGaFCEkGAgi6Cai2CfRyL5XtiJlICp+b8eCE+XZ6pQ1FLl17SiraJlFsoieq+YyyySz3kWfddeum3qU6i5vQkhyCDuDneOPPFvfK1uRYnFiDYpSV3Tcz7IxzJatHetVNqYKVeqNrL3Imle1Fd0TrVOVcxuvgiGEkJaB21xZ5tkSQgghBEALVbZ2yg0C3uwZejWmyMLUsbpl6PaJnkdkyZq9ALKCF+b+TuUmhLQMjrqR3fxHN3JC0Ak4ikdJQrv3dPJh4+E+dtPPKkrZaq1W+8hWczIwihDCACmfoNpX1YkqttqX1YlQNismUWCRbB7ZXrNsj1QnEEs3mtrK2ne6Z61at07wFiGEtDT88ZVAA50AKFX9YycKyQl2A4PMbthEVJCyCppyMj+VKSFERCAO//kBlmv0CJm1Gc9x7TxLBqkmDyHEOV6Va+x2++MItm7reJzmgwdQO2tKypdrbFFuZEDtbo1+LkLnma4FrHKZRrcx95UpaJlrVjVW9H0rmUXyWr0P2RiyHF26kQkhZtyWXPRLuUbbUq5btw4XX3wxCgoKEAgE8OKLL8Y8NwwDs2bNQpcuXdCmTRuUlpbi888/j2mzZ88eTJw4EdnZ2cjJycFVV12F/fv3u1oIIYQQkqrYVrYNDQ0YMGAAFi1aJHx+991344EHHsDixYuxfv16HH/88SgrK8PBgwcjbSZOnIiPPvoIq1evxsqVK7Fu3TpcffXVjhYgS0lxmupjZWGZ93rD91TpLHYtbPNc0eOrUmp05Je1D89htkpVlrzKwg6PJZOTEEIAIBgIuL78gKs920AggBdeeAGjR48GcNSqLSgowK9//WvcdNNNAIC6ujrk5eVh6dKlGD9+PD755BP069cP//jHPzB48GAAwKpVq3DhhRfiyy+/REFBgeW8ftiz9QpVBDMhhHiFV3u2ve54Ehku9myPHDyAf9/2i/Tas926dStCoRBKS0sj9zp06IDi4mJUV1dj/PjxqK6uRk5OTkTRAkBpaSmCwSDWr1+Pn/3sZ8eM29jYiMbGxsjn+vr6eIrtK5zktvoFVcqW0715WeqWuY1IBt00Klmf8DM76V2iPqJ3IkK2DtF8Ik+Mzl69zpyi8QlJd+KqbEOhEAAgLy8v5n5eXl7kWSgUQm5ubqwQxx2Hjh07RtqYmTdvHubOnRtPUUmKIitIEq8CIFbKU6YYdec3K1yV/FapVTp9dIqPmGWzmtNpFLndtDZCgPQJkPJFNPKMGTNQUVER+VxfX4/CwsIkSkS8QKZoddvLntvd23ZrlSXSqnO6Rx/PMePVl6QnbvddDZ/s2cZV2ebn5wMAdu7ciS5dukTu79y5EwMHDoy02bVrV0y/w4cPY8+ePZH+ZrKyspCVlRVPUQkhhKQA4QrHTjHS0bLt2bMn8vPzUVlZGVGu9fX1WL9+PaZNmwYAKCkpwd69e1FTU4OioiIAwJo1a9Dc3Izi4uJ4ikN8htM92+i2ZuzmH6v2bHWKiTgpOqKzHy3bz1XtvZqfy3KezXOb34NIRtXcqrUSkq7YVrb79+/H5s2bI5+3bt2KDRs2oGPHjujWrRtuuOEG/O///i9OOeUU9OzZE7fddhsKCgoiEcunnXYaRowYgalTp2Lx4sU4dOgQysvLMX78eK1IZNKyUe3ZOt0PFAUt2VUGTvdso+e0g9W6w/ft7Nmax5MpYqelOhklT5yQLufZ2k79qaqqwo9+9KNj7k+ePBlLly6FYRiYPXs2HnnkEezduxc//OEP8dBDD6FPnz6Rtnv27EF5eTlefvllBINBjB07Fg888ADatWunJUM6p/4QQkgy8Cr1p99vn3Od+vPx//fzlE/9sf2VYOjQoTAM45hr6dKlAI7m3t5+++0IhUI4ePAg3njjjRhFCwAdO3bEsmXLsG/fPtTV1WHJkiXaipa0XETFQsyfo4tpmK0x8zOZNWn1zK3cdttFyy5qIyuQIiuwojOX6r7OcyfvlpB0xh/2N0lbVArAat81+rMdJeBWWTidJ7ralpXii+5jV47oOeyuNVHvkKQPgUAg4kp2dvkjGpnKlvgWr4oouBnLiZKxq/x097F1gqfivbcaHpN7tkSXYBz+8wO+yLMlhBDSMgkGggi6CHIyWmqAVCrAACliBVNPCIkvXgVIDZj3EjJaH+94nCMHG/CvGZekfIAULVuSMljl2ZpdoFZ5uNHjqsaUyWA3f9bKrW2VZ6uSWSff1SrtRpVnq6qLrHrXOjIToiLw3//c9PcDtGxdwD8oycVJAYlkkgoyMQ+WOMUry/YHd650bdn+8zcXpbxl6w9nd4rCP1jxxWnhB7vjeh0p61WEr5OxncBIYkLiD5UtSVmscjtVebay56JnonndyOy0rWyNdnJadVOGdOTRHVdXXkJEBCLn/ji7/OJGprIlvkLnj7lq/9Z8z0qBm392qkis9mvDMkWXYbST02pHudpJNRIVu9CZjwqX6HI0z9bd5QcYIEUIISRpBAEEXehLv1iMfpGTpDl2z7aVFdk334vHvnu8rDizxag6j9eN/FauasYiEBJ/qGxJymCn9GB0mopIWcjcvqp9XNH4ZtnsKiKdfVhZJSgd17XK1S1Ky9Gp7mTHfS2bz80pTSS9SIYbedGiRejRowdat26N4uJivPvuu8r2e/fuxfTp09GlSxdkZWWhT58+ePXVV23NSTcySRnsWGtm5SfbL1QddadzXJwsb1SVoyuSM7qPztm0Vrm1VnOEFbqstKPIEyDKpZXJGv1Mlg9MC5noEIQ7q89u3xUrVqCiogKLFy9GcXExFixYgLKyMmzatAm5ubnHtG9qasJPfvIT5Obm4rnnnkPXrl3xxRdfICcnx9a8zLMlLZJU/GOfijIRootXebYld7+G49o4z7M9/F0Dqv9npLZcxcXFOOuss7Bw4UIAQHNzMwoLC3HdddfhN7/5zTHtFy9ejPnz5+PTTz9Fq1atHMtJy5akDHYsPFlVKXM71RhmRNad1dyy8VUWoWi9Vm5lO1W1VNa47D3JZDTPozte9H1CVLiNKA73ra+vj7mflZWFrKysmHtNTU2oqanBjBkzIveCwSBKS0tRXV0tHP8vf/kLSkpKMH36dLz00kvo3LkzLrvsMtxyyy3IyMjQlpPKlqQMIreslas3/L+q/VfZXqKdoCtVAJZqr1K116vjorWSS5VSZFVdS2cckSyy92fn3RISJhhwGY38376FhYUx92fPno05c+bE3Nu9ezeOHDmCvLy8mPt5eXn49NNPheP/+9//xpo1azBx4kS8+uqr2Lx5M6699locOnQIs2fP1paTypYQQkjSCASOXm76A8D27dtj3Mhmq9Ypzc3NyM3NxSOPPIKMjAwUFRXhq6++wvz586lsiT/RtWRF7UXPZO5PVaRsPCwyu/Wa7UQ661rjdgp5eCEnIYkmOzvbcs+2U6dOyMjIwM6dO2Pu79y5E/n5+cI+Xbp0QatWrWJcxqeddhpCoRCampqQmZmpJR+VLUlpZHueVnm0onHC/VQpK+bxZPubIhnNP6vmUI2pGxVsdp+r9rFVsok+q76MWO0ni+YiREYwEEDQhWlrp29mZiaKiopQWVmJ0aNHAzhquVZWVqK8vFzY59xzz8WyZcvQ3NyMYPBo7PNnn32GLl26aCtagHm2JMXQ3beMfh79v1Z9dIN4RGPJFJXKYgyPo2NJm/edZX1Elrpqjuh2umlE0etXKWgqVOKWQBwuO1RUVODRRx/FE088gU8++QTTpk1DQ0MDpkyZAgCYNGlSTADVtGnTsGfPHlx//fX47LPP8Morr+B3v/sdpk+fbm+dTP0hfkUnCEjULllBPF5Ye3bH1Fk7rVIiwqvUnx/f91fXqT9rbhxuS66FCxdi/vz5CIVCGDhwIB544AEUFxcDAIYOHYoePXpg6dKlkfbV1dW48cYbsWHDBnTt2hVXXXUVo5GJf7H7R143SlanbzxxogCdymO3n451S0hLp7y8XOo2rqqqOuZeSUkJ3nnnHVdzUtmSlMGtAlSl6sRznmTi1uqk1UpSjXhFI6c6VLaEEEKSRsBlgJRfjthjgBRp8STaktMtDmF1321bp/1p+RISf6hsScogSkWJTtOJvlTtRe1UFaZUczpZg24/3bXp/CwbUySbqI3OunXWZmf9hADfH0Tg5vIDdCOTlEJVUMEq+tjOHOEx7colkkGWC+x0Tjt5wKLPdpHl5NppH74viwAnREa8aiOnOkz9IS0S3bSgRJIKCihZaU/E/3iV+jPywTfQykXqz6HvGvDadaVxk8sr/GKBkzRA5Ua2095sadq1eu1aik4tTbN8dueWuYplMlgpWt13TVcxIfahZUsIIcQSryzbCxdWurZsXy0flvKWLfdsCSGEJI14HbGX6tCNTFIGu+5YnWhbVTvdce2iiuZV3deN9rUaT/ZMJ9pYNR5dx4Q4h5YtSVl0DyLQ/RyPZ15iNwfW7hqsjshLxXdCWj5HDxNwEY0cP1E8hZYtSRnc/kG3m0/r5JlOe6frsGvZ6nwWja9jYTuRjRAnhN3Ibi4/wAApQgghlngVIDX64TVo1aad43EOfbcfL077ccoHSNGyJS0WnTQYv+PECrdrPRNC3MM9W9JiUe1RtpQ9SCdH7MV7TELckC7RyFS2hBBCkka6lGukG5mkDKpgH6ti/eZ+qna6blRd97NOdSWrak+q4CVZuo/dClJ25VPJQFczIfZggBRJGVKhdrCXyNbX0tdNWgZeBUj9nz+86TpA6tlf/ogBUoToYlfhuAn08bKohYx4nGcbjdM6zl4GjNHqJXYJBNxffoDKlqQMOu5eKzeoyB1rNxfVLrrj67i93UYKW7mRnfY1u+WpUEm8CCCAYMD55aYgRiKhsiUpg/lMWPNnJ2UGo9uE2zW/9HbMuau6e6VOimVEKyirc2nNc1ntOZvXoCuLbJ4w4fdu9cXF6ksNIeR7uGdLCCHEEq/2bCc8WoXMts73bJsO7MfTU4em/J4tU38IIYQkjQDcuYLpRibEJvF0Qzrds4333G7uu5lL1Z4VpAhJPLRsScrgVfpLotNq7EYdu5GPFaSI30mXClK0bEnK4DYlRRbwIwsAsiOH1bxu+kf3s2t1Oom0trKwvbDACZERriDl5vIDti3bdevWYf78+aipqcGOHTvwwgsvYPTo0ZHnV1xxBZ544omYPmVlZVi1alXk8549e3Ddddfh5ZdfRjAYxNixY3H//fejXTvnm+Sk5aFyBYsUpk60r9WY5mfREb+yecLPwzKZx4keQzRHeEzRXOY5RWOr1qmqC+00glmEKJKcEB3SxbK1HY382muv4e2330ZRURHGjBkjVLY7d+7E448/HrmXlZWFE044IfJ55MiR2LFjB/7whz/g0KFDmDJlCs466ywsW7ZMSwZGIxNCSGLxKhp58pJ1rqORn7jy/JYXjTxy5EiMHDlS2SYrKwv5+fnCZ5988glWrVqFf/zjHxg8eDAA4MEHH8SFF16I3//+9ygoKLArEiHHIMprJYSkHjyIwAVVVVXIzc1F3759MW3aNHz77beRZ9XV1cjJyYkoWgAoLS1FMBjE+vXrheM1Njaivr4+5iKEEOJ/gnG4/EDc5RwxYgT+9Kc/obKyEnfddRfWrl2LkSNH4siRIwCAUCiE3NzcmD7HHXccOnbsiFAoJBxz3rx56NChQ+QqLCyMt9gkBdAJDtIt1xg9nqxykmoOHXlkcusGGJnLH+pWshLJKhpTNo5OOUYrGXTeHyHke+Ke+jN+/PjIz2eccQbOPPNM9O7dG1VVVRg2bJijMWfMmIGKiorI5/r6eircNETlFtYJmNJ5Fn1f1w1tbuekn66s5p9VAUsidAOc4iErITqEaxy76e8HPM+z7dWrFzp16oTNmzdj2LBhyM/Px65du2LaHD58GHv27JHu82ZlZSErK8trUUmKER1RK4quVUXjRkcGi/qL+prbmSOJo9vpyqnaO5ZZrKovDlaRx+Z2dqKRRfOq5BK9I511ExJNukQje65sv/zyS3z77bfo0qULAKCkpAR79+5FTU0NioqKAABr1qxBc3MziouLvRaH+ByREpGl4kT/rLIOZdixcp1aytEKS9cyVynU6LWKLO6wmzdaMZv7ir5YRPeTffFw4hUgJAB3+5k+0bX217h//35s2LABGzZsAABs3boVGzZsQG1tLfbv34+bb74Z77zzDrZt24bKykpccsklOPnkk1FWVgYAOO200zBixAhMnToV7777Lt5++22Ul5dj/PjxjEROc+wqNFnOqkwJqXJsRYjauylYYXeu8M92ClfYkcG8VxytpGV7yKq5rfaeCUlnbCvb9957D4MGDcKgQYMAABUVFRg0aBBmzZqFjIwMfPDBB/jpT3+KPn364KqrrkJRURH+9re/xbiBn3rqKZx66qkYNmwYLrzwQvzwhz/EI488Er9VEUII8QVuzrJ1u9+bSHjEHkkZ3O7z6bphVfuZ8ZJDVWVK1U8ll2gMO7JaVXiKdhM7kZ+0bLwqajH9T28jy0VRi8YD+7Fo0rkpX9TCLylKJA2wKrcoS+2R4cT1mwz3p1O3q0j5JcrNzdQfEi/CAVJuLj/AU39IyqAKZNL5HH1fZYVZpcwkQ1nEO11I1tduqpDdeWn5EiKGli1JWawsW1lbO1aaFzhVODpWoR0LU3ZP5iLWCX7SlZMQXdJlz5bKlqQ0KlewlZUWL9esTh8duaz62SWRFqbZslXtd1MREzukS7lGBkgRQgixxKsAqRuf/LvrAKn7fnFOygdIcc+WEEJI0mC5RkISjCitBZCXL5RVXhK1E30WVWKS7Wuq0mLMZQpV/WVjWsmu4xqXvTvzPfPYOsjKMIrWLpKHEBks10hIkjHvE8r2U3X+qIvG0nlmbmM1v1V/nX46JR4B67xcWblG0XPzFw7dPFudNRCiwu2+q1/2bKlsScpilQqk6hfdR8fKjCdOx46HTOG1OUkLspLD7pcaQsj3UNmSlMbsarWqCqXzTKeKU/Tc5p/dyKjjgjW7yHULV1hVl7Jyn8tkkc1pJRcVL9Eh4HLPNuCTPVu/WOAkTVCVFIwukK/CqviFKl9XZhWalY6uco9uL3PNiu7J9lpl85nlsvpyIJpP5hEQeRiSVfyDtDyY+pPCMPWnZeLWvSuzrKwsPi/k0N3ztDuf3bWI+gP26i8TAniX+nPr0++gtYvUn4MH9uN3E85m6g8hhBAiI12ikf1igZM0wG3lprB708qN7LUL1E1wkp228VyDyn1vdxy6l4kd0qVcIy1bkrJY5dmK2prvqfJsVXNG9xeNKbunyrOVzaUjo26Orm6wlnl+J4FnqjXSFU10SZfUH+7ZkhYJ/9gTEl+82rOds2K96z3bOeOKuWdLiC5uqhNZRfXqVIkStbOT+mPur7s+1dp00ndUY8rek6r4hm66UaLzl0nLhOUaCUkhVJWNop+LPjtVAroFNWRVlOIxvlUakq5c0e3tuLpl8+rKSogV6RIgRTcyIYQQS7xyI//vs++6diPP/D9D6EYmhBBCZKRLgJRf5CTEFkw/IcQfMPWHkARjFQxkvmcVQKVK/bFKdZEFSOns/6oCjGR5srJAKVVAlFV6j6rsoyowS/VeRe1F46vkIiSawH8vN/39AJUtSSlEdXjD96M/R7e3i1mJWSlC2bwiRSxbjyzQyVzT2NxXhCi3VjSulbIzv1tdJUsIsQ/dyCSlEVljqmhYVfRueDxR8QWdfm6wKmohQ1VwQsfCtnouspxFc5i/AFn9LgjRJYDvI5KdXH6xbBmNTAghxBKvopF///+/hzbHO49G/q5hP24aO9iWXIsWLcL8+fMRCoUwYMAAPPjggxgyZIhlv+XLl2PChAm45JJL8OKLL9qSk5YtSVms3KWiz+ZL1U42pxdWrM59nbnNVrnsnagsabvy2ZGT1i5JdVasWIGKigrMnj0b//znPzFgwACUlZVh165dyn7btm3DTTfdhPPOO8/RvFS2hBBCkkaiz7O99957MXXqVEyZMgX9+vXD4sWL0bZtWyxZskTa58iRI5g4cSLmzp2LXr162ZzxKFS2xDfoBPy4jYD1UwSt1T6zCB2rVqeSlJ/eE0lt4pX6U19fH3M1NjYeM1dTUxNqampQWlr6/fzBIEpLS1FdXS2V8fbbb0dubi6uuuoq5+t03JOQOGPl+jS7h3WjbaODeey4ae3KbdeFqmqrGlNWhtJJmUjROKJ5oyOuZeuMDjajK5no4iY4KrrUY2FhITp06BC55s2bd8xcu3fvxpEjR5CXlxdzPy8vD6FQSCjfW2+9hT/+8Y949NFHXa2TqT8kZbBrLVmlqshyY3UsN9H4duszm2VRrcFJ2o25n5USjVaWZllVqU7x+gJBiJds3749JkAqKyvL9Zj79u3D5ZdfjkcffRSdOnVyNRajkUnKoJMbGo9xvZrHrhxO5ImH7MlaP/E3XkUjL3yhxnU0cvnPirTkampqQtu2bfHcc89h9OjRkfuTJ0/G3r178dJLL8W037BhAwYNGoSMjIzIvebmZgBH3c+bNm1C7969teSkZUtSBpkVqqquZPXMjCoiV3UijkgeHcUpk9Esg5Vlq/tOzGPrWKiiXGYVslOHVPIQIiORR+xlZmaiqKgIlZWVEWXb3NyMyspKlJeXH9P+1FNPxYcffhhzb+bMmdi3bx/uv/9+FBYWas9NZUtSBpUFalX4QXRPpBDduIKj57Lqb26nE8xkdy/aSg6ZbFYyy/pbtdH5skJIsqmoqMDkyZMxePBgDBkyBAsWLEBDQwOmTJkCAJg0aRK6du2KefPmoXXr1ujfv39M/5ycHAA45r4VVLaEEEKSRqLPsx03bhy++eYbzJo1C6FQCAMHDsSqVasiQVO1tbUIBuMfO0xlS1IWJwFTov5u90njRTz2bKOxO5bK6tSZP15tCIkmGUfslZeXC93GAFBVVaXsu3TpUgczMvWH+Bg7QUVO+yYSJ/mrblKV4jEWIW4JBNzl2vrkhD0qW5K6ROdzivJsrQoxqCw5HcUiGl8n0EkXcz/R2qyCoFRWrEwWJ+/D/P5VCptKm5BjobIlLQKVa9RKQURjjsx1OrdqXHM/WaCUzmedYC6ZLNHvxWxVO1GaTr90kPQm0eUak4Vf5CRpim40r5VlG61M3OyP2okU1rkfltMc5Rs9n1c5wtHvxaxcZS5t3ajwVHTTk9QkEAi4vvwAlS3xBVbuW6s/7jL3sxknlZPi5UYWPbPKXbVS4iLMFr/suZ0xnbYjJBBwf/kBKltCCCHEY1iukaQMdl2kVgFCVpWOvHJ1xjvFx8lcbvqwnCMR4VW5xidWvo+2x7d3PM6Bhn2YfNGguMnlFbRsScpg9w+83apSbubyEqeuZ8CbdaTSuyEtH+7ZEuJjVPu5XiuTeH5pcDu2V2MQQuzBClKkRZKKCiUVZSIk2bgNcvKJYUvLlqQOVvmlOu11CkNY5ZC6jaS1W6HJnPeqO7aovVXxDdkcOtHaunnKjEQmdmCeLSFJwOz+VSkiVZqOKChKV5k5tUDtKhrdCle6X0LsFuQwF7UQPTOPbaWwo/N2CdGBe7YC5s2bh7POOgvt27dHbm4uRo8ejU2bNsW0OXjwIKZPn44TTzwR7dq1w9ixY7Fz586YNrW1tRg1ahTatm2L3Nxc3HzzzTh8+LD71RBCCCEpiC1lu3btWkyfPh3vvPMOVq9ejUOHDmH48OFoaGiItLnxxhvx8ssv49lnn8XatWvx9ddfY8yYMZHnR44cwahRo9DU1IS///3veOKJJ7B06VLMmjUrfqsivkRVLcnK+lOdrRo9tk6UslOrzGoOWaCWVWEJ3QAvJ4FZMkvUvA6dClrRlai4P010CcTh8gOu8my/+eYb5ObmYu3atTj//PNRV1eHzp07Y9myZfj5z38OAPj0009x2mmnobq6GmeffTZee+01XHTRRfj6668j5wcuXrwYt9xyC7755htkZmZazss8W2IF/+ATEl+8yrNdsepfrvNsx40YkPJ5tq6ikevq6gAAHTt2BADU1NTg0KFDKC0tjbQ59dRT0a1bt4iyra6uxhlnnBFRtABQVlaGadOm4aOPPsKgQYOOmaexsRGNjY2Rz/X19W7EJmkAFW1qILPaw1+GRBa1bC/bak86ekyz10A2p9UhEGbZzO2s+os8NSo5zM9k96PXpJpLhGyPXrbm8LO9f35N2Ibo4VjZNjc344YbbsC5556L/v37AwBCoRAyMzORk5MT0zYvLw+hUCjSJlrRhp+Hn4mYN28e5s6d61RUQkgKYTeQy9wn/FnlhtdRmtFBXyrXvChKW7XdIHom+3Ihk83cV4TTOtVW9b9lSjww6myt+eziNsjJLwFSjpXt9OnTsXHjRrz11lvxlEfIjBkzUFFREflcX1+PwsJCz+clhHiPrvKVWb1WpxPJIqutUFmfKmQy2tnaEPV1g9U+v1uF7ga3+67+ULUOlW15eTlWrlyJdevW4aSTTorcz8/PR1NTE/bu3Rtj3e7cuRP5+fmRNu+++27MeOFo5XAbM1lZWcjKynIiKiGEkBQmEACCaVDUwpayNQwD1113HV544QVUVVWhZ8+eMc+LiorQqlUrVFZWYuzYsQCATZs2oba2FiUlJQCAkpIS/Pa3v8WuXbuQm5sLAFi9ejWys7PRr1+/eKyJEOITdPKjrX4GYi1H1V6wyhWsm88sklM0ptnVrdqvNe8ty2SUIXNdq8aQ7Q1bueiJM2yl/kyfPh1PPvkkli1bhvbt2yMUCiEUCuG7774DAHTo0AFXXXUVKioq8Oabb6KmpgZTpkxBSUkJzj77qL9/+PDh6NevHy6//HL861//wuuvv46ZM2di+vTptF4JaWHYTVMSBTbpuIyt3MQi165ZYVqlWOkoIlnglDl1SiSHSilaET1G9Bx23dfR4yVK0bKohYCHH34YdXV1GDp0KLp06RK5VqxYEWlz33334aKLLsLYsWNx/vnnIz8/H88//3zkeUZGBlauXImMjAyUlJTgF7/4BSZNmoTbb789fqsihKQEugE4VkE75mdWitGsdGTPRLLp7mPqBFWZ+9nZLxbJoVKaOpa4KkI5WVYs82xTGObZEpJeiNJ6RM/djO01Xs7j1djR43qVZ/v86g9xvIs824aGfRjzkzNSPs+WtZEJIZ4h2kd0YkVZ7V1aKRqzm9lJ+pFoLNmYOv3tvAsda9/pc1H7RFq5wYD7yw9Q2RJCPMeugrMKnLJqb1c2O23cyhEvC9SOS9rtPF4q30Ac/vMDPM+WEEJI0uB5toQQ4hFWVZ/sVFJStXNqlZldveZnOuPGs1CEqkiH7nzR/XRkM7fpMGG4PaFJDAyQIoQkjEQFI5H441WA1MrKjTi+nYsAqf37cNGw/gyQIoSkL9FWoJ1iCbICDTqBQlaWrfmejkWoI6NobtV4TgOkzP3iGSBl/n05DWizA/dsCSHEA2RKSCe/VZb+IxtTNkf0eLJ+5opPugcfuFVMdgPJVKcEica1Wo+sH93I7qAbmRDie5hn698821fXfOTajXzhj0+nG5kQQsJ45Y50o2gStYfsx73qRMgcjkZ2c/kBupEJIYQkjSACCLrYd3XTN5FQ2RJCPEW1n2p1Ao65j9UJNqpKU6o9V6dnxlqNaZZfNJ9oH1m0XquDCmR7r3beh0pm4/AR4ThED7qRCSGeEa0oRAcChJWL1ck+uvOI+if6uDjRCT5216Q6NMCMeR43rl+vI49F0I1MCCFxQmS9ylJXRME+dq0wHeweP6ejtGUWqwqzDKI1ehlYZUZmTdc9/Vd0yDsx7jK4PbnHJ7qWypYQklislJFICTpJh5F9ls1lp+axynJVpd/I0nRUa5PJKEv7Uf0sGtuMlduaOINuZEKIZ0RbZnZcxU4sOZVCNX9267aW4Wbf124br6zdRLvdg4GA68sPUNkSQjzFTZ1jnbGsxoxnhSUrGZwqTjd4oXQTmqbkdr/WH7qWbmRCCCHJw23JRZZrJIQQHLt36bUlJguu0ulrp43dcf1W1MK8d15fX59kifwNlS0hJGGI6g2LAoTMQT/mCGbRmOafVfOKnkfPa+eZuc6wTq6weTxVFLOdPFvZz6J5dfdmw8+9yrMNBo5ebvr7ASpbQohnyApaRCsDlXKRjWMVKWtWJFaFHcwyyWQVzW3+bKXUZZa+boCXzjOrKGi7BTAAD1N/0uTweB5EQAghPicRhyl4dRDBurc2oZ2Lgwj279+H83/YN+UPIqBlSwjxDN0yheG2KheszPrScSNHj6cqjGE37UXlElatT5WnGz2eaG1W45qRlYC0yvk1w3KN7qCyJYR4hmhPM3xf1Da6jxmdYhiin60CtGQlI2V7oGZ5ose0Uoy6yNzWsvF05rLjuhbhlRuZe7aEEEKIx6RLuUYWtSCEeIadQhNWwUxO5ooeUxaspTOm2VIWBVOZg6RkuNlbVc2hE1XspipUhwnDHfclVLaEkARg/kPvROGEXb0qBSqbT+eZTJHptBfdV7l8w8/tvgdRCpSTCl0qpR2Wy4l8TggEAq4vP0A3MiHEM2R7mTrpMWZEubeyPrJ5RbKJ9op18nJl81mlJcnWo0IWwKQzj+x9Wf1sli8w6mzLuYgcKltCiGdYKQddy8lKgelYejrBRfGy5OwqUKv20UFcsshnnShrK+zmM8cD5tmmMMyzJcSfJCIflHiDV3m21dWfuc6zLSnpwzxbQkj6IrK67OTMRvcxtzPPE91f1ldlGarGi55T5f7VyRXWybO1GteMKlVJJZNsLvPaAe/ybNPFsqWyJYQQkjR46g9JGnS1kZaEyJIUFZIwtxFh9/8XOkU0rOZRyagqsKG712lnTTJrWmcvXGceVZSyV0Ut0gXu2RJCEobTL5JuAqC8kilV5rET1ex0bADY++fXPNmzfXf95673bIcUn8I9W0JIeqOKSJbtoUZ/jka056mTZ2qVyiPrZx4juo0smthKqar2bGUWqmqf27w+3fYyWWRtvUr9SZcKUrRs44iX3zAJISSZeBWN/N67m11btoOHnJzyli0rSMWRRFVcIcSvOM3ZDO9L6lilTgo/6Myvcy/e8+rixVyJlD8doLIlhHhGtJKUKUNZP7vzyApTOHUdW8lgdh2bvwxYlWvUnceqTbyVfnQAW/RnrwjE4fIDVLaEEEKSRxK07aJFi9CjRw+0bt0axcXFePfdd6VtH330UZx33nk44YQTcMIJJ6C0tFTZXgaVLSEk4ThxyzodWxTAZGcu3frDssIYqs9O0oN0XOrxIBFzJIMVK1agoqICs2fPxj//+U8MGDAAZWVl2LVrl7B9VVUVJkyYgDfffBPV1dUoLCzE8OHD8dVXX9mal8qWEOI50cpIlZsKxCc9SOS61nXXmvvp5raG16B6ZmctopxXlQJX5ciax5QpftU78uqIvUAc/rPDvffei6lTp2LKlCno168fFi9ejLZt22LJkiXC9k899RSuvfZaDBw4EKeeeioee+wxNDc3o7Ky0ta8TP0hhHiKqFyjiOhCF25zUlWlFXWLWcjSYlTpMqqUGztr0pFRJYdovap3oCqN6TkuyzWGdW19fX3M7aysLGRlZcXca2pqQk1NDWbMmBG5FwwGUVpaiurqaq3pDhw4gEOHDqFjx462xKRlSwjxFDfBTrroWMt2rFyr/FOZZaiybOOFaHyzG1tmFVsFqekEeMWbeG3ZFhYWokOHDpFr3rx5x8y1e/duHDlyBHl5eTH38/LyEAqFtOS95ZZbUFBQgNLSUlvrpGVLCEkqIsWhUriywg8iZWPXdWvnc7wQ7fU6ORLPieVs1/JPZbZv3x6TZ2u2auPBnXfeieXLl6OqqgqtW7e21ZfKlhDiGVan8ITbiPrJxhNhVhq6LlNZH9H4qgAo3cpNOvOp3oeqWpZszaq+snchkt2r2siBQAABF37kcN/s7GzLohadOnVCRkYGdu7cGXN/586dyM/PV/b9/e9/jzvvvBNvvPEGzjzzTNty0o1MCCEkaSQy8yczMxNFRUUxwU3hYKeSkhJpv7vvvht33HEHVq1ahcGDB9uY8Xto2RJCPMdsBYqifWU/q8aJxk6NZPNnXZe1Sjad59FWqMwyNstrHlPH7a5rYVvtTUc/8yoaOdFUVFRg8uTJGDx4MIYMGYIFCxagoaEBU6ZMAQBMmjQJXbt2jez53nXXXZg1axaWLVuGHj16RPZ227Vrh3bt2mnPS2VLCPEMqxxXJ/uDKkXmxDUrQ6aIdN3Adly0ujKJ2ou+uNiNvhbt4Zp/V965kRN7ePy4cePwzTffYNasWQiFQhg4cCBWrVoVCZqqra1FMPi90/fhhx9GU1MTfv7zn8eMM3v2bMyZM0d7Xltu5Hnz5uGss85C+/btkZubi9GjR2PTpk0xbYYOHRrxwYeva665JqZNbW0tRo0ahbZt2yI3Nxc333wzDh8+bEcUQohPiM7h1N0f1R1PFVVrtu6iFUm0klIpQXMAkiyiV5QXqxtQJdoLlvXXHdMqGlnWVvV7aSl5tgBQXl6OL774Ao2NjVi/fj2Ki4sjz6qqqrB06dLI523btsEwjGMuO4oWsHnqz4gRIzB+/HicddZZOHz4MG699VZs3LgRH3/8MY4//ngAR5Vtnz59cPvtt0f6tW3bNrJxfeTIEQwcOBD5+fmYP38+duzYgUmTJmHq1Kn43e9+pyVHqp76QwghycBtXrIOXp368+E/t6J9e+en/uzbtw9n/KBnyzr1Z9WqVbjiiitw+umnY8CAAVi6dClqa2tRU1MT065t27bIz8+PXNEv4K9//Ss+/vhjPPnkkxg4cCBGjhyJO+64A4sWLUJTU1N8VkUISSvcpOUkqohDwotFxAE/ypyquIpGrqurA4BjKmk89dRT6NSpE/r3748ZM2bgwIEDkWfV1dU444wzYpKKy8rKUF9fj48++kg4T2NjI+rr62MuQoj/kbmEZUUjdAJ57Lpzreomu3XpeoV5var3J+pnvmf1O/CK8J6tm8sPOA6Qam5uxg033IBzzz0X/fv3j9y/7LLL0L17dxQUFOCDDz7ALbfcgk2bNuH5558HAIRCIWH1jvAzEfPmzcPcuXOdikoIISRFOZq+4yLPNn6ieIpjZTt9+nRs3LgRb731Vsz9q6++OvLzGWecgS5dumDYsGHYsmULevfu7WiuGTNmoKKiIvK5vr4ehYWFzgQnhCQMVeqNOVBJ1sfcP9xGVShD9lmWciOS25xSo2PpWRXscJv6o/uurGo8m++JAskSRaKjkZOFI2VbXl6OlStXYt26dTjppJOUbcNRXps3b0bv3r2Rn59/zFmA4WoesgoeooLShBB/IHLxWlV4Ev3Bj1Z+qj5W5Q9Vz1VKyioH2Dy+ag0iOWT3ou/ryGcll8580YTH3/vn1yzbEjm29mwNw0B5eTleeOEFrFmzBj179rTss2HDBgBAly5dAAAlJSX48MMPY84OXL16NbKzs9GvXz874hBCfIDKuo3nHCIlp7OP6yS31Tym0/66lqTOPnQ83mlyUn8SfnZ8UrClbKdPn44nn3wSy5YtQ/v27REKhRAKhfDdd98BALZs2YI77rgDNTU12LZtG/7yl79g0qRJOP/88yO1JIcPH45+/frh8ssvx7/+9S+8/vrrmDlzJqZPn07rlZAWSrQ1qsqNlT03VztSBfSYCzKILGHRPLpK2kqpWbXR6W/+bFfBq4Kgop+rgqJk7y3epEuAlK08W1mx6McffxxXXHEFtm/fjl/84hfYuHEjGhoaUFhYiJ/97GeYOXNmTPrPF198gWnTpqGqqgrHH388Jk+ejDvvvBPHHafn1WaeLSGEJBav8mw//ddWtG/vfLx9++px6oDUz7O1tWdrpZcLCwuxdu1ay3G6d++OV1991c7UhBBCWiBOq0BF9/cDPPWHEOIp8cjdTHZOa6rj1ftJxHtPFzcyDyIghHiGKqJXhCo1R6ePVfCVKtJZJbeqvU6qkrmd7IQeWTudfVtzG513bTV/9Gfj8BHhOEQPW3u2qQL3bAnxDyIlYJU+IxojjCzYKRHBPFZzOX3mVh7A2QlKqjHNynrvn1/zZM/2sw+2ud6z7XNmj5a1Z0sIIXaQFWmQWWA6eaOyXF2RNar72e7xdyoZrb5QWClk0ZwySzv6faosW1Vf0byiNQZGnS2U2S3h0+Hc9PcDtGwJIQkjkRZoOuGl1Rwe16to5M0ffuHasj35jO60bAkh6YuVxaQqeKGz32lnTJH1KrNAVfu6KlnsVHVyUljDyjp14zEwz2FeL/ds3UFlSwghJGmwNjIhhMQZp6UazSUO7dT5le2h6lSVUrW167Z14+pV7f9aySOqq6waJ9w2YXu2aZJnyz1bQkjC4J6tN/h5z3brR7Wu92x7nt4t5fdsWdSCEOJ7WPSCpDpUtoQQz5C5J+0qR91DAJzgRBY3Y8V7DanwTlzhtnqUP7zIVLaEEO/QifIVIVLSOmfIeoUqqlq3j9+sb9nJQPEnPQ7Zo7IlhHiG7A+1k+AiL9rqjuNEmbeEvemWsIZUgdHIhBBCkka6pP4wGpkQQoglXkUjb/t0O7JdRCPX76tHj1MLGY1MCElvREfsxTtASjRHskmUHF4Hjnm9ZxuIw39+gG5kQohniJSr7GdzeUBZIQmdnFJVyUadgwhUhft1yzXqPtNdj5sj9mSyiMaQ0WHCcKWMRA3dyIQQQizxyo1cu+lL127kbn1PSnk3Mi1bQohn2Cl/qDuOzkEEqvNz7Rbkl81rZTFaHbHnNNpZZJmrxrFTXUoVOe6ZZes2e8cfXmTu2RJCEo8qb9XtHqHonFvZnFayyJSX3Rxb1fw6iNbg5AuLrgxM+Yk/tGwJIYQkjXQ5iICWLSHEM3QsJLuWbCILXNipeOU00tou4WpautHZdp5bucA9IT0KSNGyJYR4h47iMf9RtzqGz+ooOdE9u8pDdeC8TGbdecxH3tlRzqp3JTs+UHTEnh0Zw+PXPf1XdMg7UVtWXdKlqAWVLSEkaahSdET3o/vIlIcqZUfVTnRPlKYkUnBW6UyiMUTI3oeVfLLAsOifrcY23zc/Z+qPO6hsCSEJQydgSfeAed3+ZgUni0rWjZx2UkBDFUFsZxyZfKp8Zt33acbcxyvLNl3CkalsCSGeYbfog6yvm9Qf0dzRY4XvWylVkWtVVuhCZbGb5dBx6ep+sdBJNRL9rLMOryzbdHEjs6gFISRhOA28SWjAjg9JxPvxqqjFV1u+dl3UomvvAha1IIQQQmSkhxOZqT+EEA8Jp6eYU2OcFoVwkupi7if6rBpT1l41pmhccz/ze1GhCuZymuYja+vk9+WKsB/ZzeUD6EYmhCQMuoO9wav3Gj2uV27kHVt3uHYjd+nZJeXdyLRsCSGECOEXo/jBPVtCiKfIIlxVhwaEn8vGkM1hN3dUp3iFKPLYaUS1k2hkc1/VunTybGWyW81nHD5iKSeRQzcyIcRTZH/47VhNuuktbuXzor3bfskYW6Rs9/75NU/cyKGtIVfj1dfXI79nPt3IhBASjUwxOCkWEUZV2EEUqGQnKEnW3uqe3cArXUQBTDrz6Y4tw+s82xYeH0VlSwghhHgN92wJIZ6hsmJlxfzNP9udx2oc3bFF48nGke0T64xvFx15nM6jastyje6gZUsI8Qyn+7JO3auivlZjWR0KoCOLVblHt+i4sb1yI4fXRjeyOxggRQghxBKv8mx3fbHTdYBUbvc8BkgRQtIbUcCSU6vPabWleI5pVa3KqRxO8aLCk7mSlLcVpOJw+QAqW0JIymE3glj13Kkb2aq9F0rdDfEc37zv7WVxi0Ac/vMDVLaEEM8wp7l4+YdbFtBkNZ+OkhYFQ5nvmYO+ZHLY3VPWJV7v1bwWry3bdNmzpbIlhBBCPIbKlhCSMHTcvU7SaMz9RfuNTi1KWWEMq7ZeRCOr9lCt9ot1ZEvGnnO67Nkyz5YQ4imqfFTZH3RVzqjd0oR2UnJk8lnlCptdxDJlZ5WbaweVbCJULm6zLKI6zJ6l/rjcd/XLni2VLSHEU8x7n06VjLkkY6JPpJHt4TodQzSWSOnJ2offgZVcqi80suIiIkUeGHW2cByiB5UtISRp6Fp6IoVtx7ITKSSRFSt6ZnXKkEx2maIU9Y22kK2sf3N/K2tfJ0BMFgyVEFdyehSQorIlhHiHyr1q9YfcyurSHUcmi/lnq0pSMhmc5P5afdYpXWm2bEVKW+VJsLKoE7Vn6zai2C/RyFS2hBDP0LG4dPY3o++LxrGyilXWn919VCtXr0r5iaxnUf/oZ9E/6+4/W7nZzco8YcFQAtJlz5bRyIQQQojH0LIlhHiGjtUksvTsRimbn+lEB8v2TMPILFgd96ydoCTzZ5XrXObutQqUMlvI4T6ydSfU0k2TPVtfHkRQV1eHnJwcbN+8FdntU7fwNCHpjixdpO7pv1r2i24TPY6or7m9neeyZ3buW8kX3U+0Nqv3kUhk7377I8+h8OSe2Lt3Lzp06OB6nvBBBHtDu10fRJCT38nWQQSLFi3C/PnzEQqFMGDAADz44IMYMmSItP2zzz6L2267Ddu2bcMpp5yCu+66CxdeeKE9QQ0fsn37dgMAL168ePFK8LV9+/a4/B2vq6szABh7Q7uN5gNNjq+9od0GAKOurk5r3uXLlxuZmZnGkiVLjI8++siYOnWqkZOTY+zcuVPY/u233zYyMjKMu+++2/j444+NmTNnGq1atTI+/PBDW+v1pWXb3NyMTZs2oV+/fti+fXtKH6vklvr6ehQWFnKdLYh0WWu6rBNIj7UahoF9+/ahoKAAwaD7cJ/vLVt3R6UetWz1j/4rLi7GWWedhYULFwI4qk8KCwtx3XXX4Te/+c0x7ceNG4eGhgasXLkycu/ss8/GwIEDsXjxYm05fblnGwwG0bVrVwBAdnZ2i/3HHQ3X2fJIl7WmyzqBlr/WeLiPzezbV+8qfWffvnoAR5VuNFlZWcjKyoq519TUhJqaGsyYMSNyLxgMorS0FNXV1cLxq6urUVFREXOvrKwML774oi05falsCSGE+JvMzEzk5+ej8JSersdq164dCgsLY+7Nnj0bc+bMibm3e/duHDlyBHl5eTH38/Ly8OmnnwrHDoVCwvahUMiWjFS2hBBCEk7r1q2xdetWNDU1uR7LMAwETOax2apNNr5VtllZWZg9e3bKvdB4w3W2PNJlremyTiC91hpPWrdujdatWydsvk6dOiEjIwM7d+6Mub9z507k5+cL++Tn59tqL8OXAVKEEEKIE4qLizFkyBA8+OCDAI4GSHXr1g3l5eXSAKkDBw7g5Zdfjtw755xzcOaZZ7b8AClCCCHECRUVFZg8eTIGDx6MIUOGYMGCBWhoaMCUKVMAAJMmTULXrl0xb948AMD111+PCy64APfccw9GjRqF5cuX47333sMjjzxia14qW0IIIWnDuHHj8M0332DWrFkIhUIYOHAgVq1aFQmCqq2tjUltOuecc7Bs2TLMnDkTt956K0455RS8+OKL6N+/v6156UYmhBBCPIYHERBCCCEe40tlu2jRIvTo0QOtW7dGcXEx3n333WSL5Io5c+YgEAjEXKeeemrk+cGDBzF9+nSceOKJaNeuHcaOHXtMdFyqsm7dOlx88cUoKChAIBA4JhHcMAzMmjULXbp0QZs2bVBaWorPP/88ps2ePXswceJEZGdnIycnB1dddRX279+fwFVYY7XOK6644pjf8YgRI2La+GGd8+bNw1lnnYX27dsjNzcXo0ePxqZNm2La6Px7ra2txahRo9C2bVvk5ubi5ptvxuHDhxO5FCU66xw6dOgxv9Nrrrkmpk2qr5MkDt8p2xUrVqCiogKzZ8/GP//5TwwYMABlZWXYtWtXskVzxemnn44dO3ZErrfeeivy7MYbb8TLL7+MZ599FmvXrsXXX3+NMWPGJFFafRoaGjBgwAAsWrRI+Pzuu+/GAw88gMWLF2P9+vU4/vjjUVZWhoMHD0baTJw4ER999BFWr16NlStXYt26dbj66qsTtQQtrNYJACNGjIj5HT/99NMxz/2wzrVr12L69Ol45513sHr1ahw6dAjDhw9HQ0NDpI3Vv9cjR45g1KhRaGpqwt///nc88cQTWLp0KWbNmpWMJQnRWScATJ06NeZ3evfdd0ee+WGdJIHYqqScAgwZMsSYPn165PORI0eMgoICY968eUmUyh2zZ882BgwYIHy2d+9eo1WrVsazzz4buffJJ58YAIzq6uoESRgfABgvvPBC5HNzc7ORn59vzJ8/P3Jv7969RlZWlvH0008bhmEYH3/8sQHA+Mc//hFp89prrxmBQMD46quvEia7HczrNAzDmDx5snHJJZdI+/hxnYZhGLt27TIAGGvXrjUMQ+/f66uvvmoEg0EjFApF2jz88MNGdna20djYmNgFaGJep2EYxgUXXGBcf/310j5+XCfxDl9ZtuG6lqWlpZF7VnUt/cLnn3+OgoIC9OrVCxMnTkRtbS0AoKamBocOHYpZ86mnnopu3br5fs1bt25FKBSKWVuHDh1QXFwcWVt1dTVycnIwePDgSJvS0lIEg0GsX78+4TK7oaqqCrm5uejbty+mTZuGb7/9NvLMr+usq6sDAHTs2BGA3r/X6upqnHHGGTEl8MrKylBfX4+PPvoogdLrY15nmKeeegqdOnVC//79MWPGDBw4cCDyzI/rJN7hq9QfJ3Ut/UBxcTGWLl2Kvn37YseOHZg7dy7OO+88bNy4EaFQCJmZmcjJyYnp46Q2Z6oRll9VdzQUCiE3Nzfm+XHHHYeOHTv6av0jRozAmDFj0LNnT2zZsgW33norRo4cierqamRkZPhync3Nzbjhhhtw7rnnRtIgdP69ymrNhp+lGqJ1AsBll12G7t27o6CgAB988AFuueUWbNq0Cc8//zwA/62TeIuvlG1LZeTIkZGfzzzzTBQXF6N79+545pln0KZNmyRKRuLF+PHjIz+fccYZOPPMM9G7d29UVVVh2LBhSZTMOdOnT8fGjRtj4gtaIrJ1Ru+nn3HGGejSpQuGDRuGLVu2oHfv3okWk6Q4vnIjO6lr6UdycnLQp08fbN68Gfn5+WhqasLevXtj2rSENYflV/0+8/Pzjwl+O3z4MPbs2ePr9ffq1QudOnXC5s2bAfhvneXl5Vi5ciXefPNNnHTSSZH7Ov9eZbVmw89SCdk6RRQXFwNAzO/UL+sk3uMrZZuZmYmioiJUVlZG7jU3N6OyshIlJSVJlCy+7N+/H1u2bEGXLl1QVFSEVq1axax506ZNqK2t9f2ae/bsifz8/Ji11dfXY/369ZG1lZSUYO/evaipqYm0WbNmDZqbmyN/3PzIl19+iW+//RZdunQB4J91GoaB8vJyvPDCC1izZg169ow9Hk3n32tJSQk+/PDDmC8Xq1evRnZ2Nvr165eYhVhgtU4RGzZsAICY32mqr5MkkGRHaNll+fLlRlZWlrF06VLj448/Nq6++mojJycnJuLPb/z61782qqqqjK1btxpvv/22UVpaanTq1MnYtWuXYRiGcc011xjdunUz1qxZY7z33ntGSUmJUVJSkmSp9di3b5/x/vvvG++//74BwLj33nuN999/3/jiiy8MwzCMO++808jJyTFeeukl44MPPjAuueQSo2fPnsZ3330XGWPEiBHGoEGDjPXr1xtvvfWWccoppxgTJkxI1pKEqNa5b98+46abbjKqq6uNrVu3Gm+88Ybxgx/8wDjllFOMgwcPRsbwwzqnTZtmdOjQwaiqqjJ27NgRuQ4cOBBpY/Xv9fDhw0b//v2N4cOHGxs2bDBWrVpldO7c2ZgxY0YyliTEap2bN282br/9duO9994ztm7darz00ktGr169jPPPPz8yhh/WSRKH75StYRjGgw8+aHTr1s3IzMw0hgwZYrzzzjvJFskV48aNM7p06WJkZmYaXbt2NcaNG2ds3rw58vy7774zrr32WuOEE04w2rZta/zsZz8zduzYkUSJ9XnzzTcNAMdckydPNgzjaPrPbbfdZuTl5RlZWVnGsGHDjE2bNsWM8e233xoTJkww2rVrZ2RnZxtTpkwx9u3bl4TVyFGt88CBA8bw4cONzp07G61atTK6d+9uTJ069ZgviH5Yp2iNAIzHH3880kbn3+u2bduMkSNHGm3atDE6depk/PrXvzYOHTqU4NXIsVpnbW2tcf755xsdO3Y0srKyjJNPPtm4+eabjbq6uphxUn2dJHGwNjIhhBDiMb7asyWEEEL8CJUtIYQQ4jFUtoQQQojHUNkSQgghHkNlSwghhHgMlS0hhBDiMVS2hBBCiMdQ2RJCCCEeQ2VLCCGEeAyVLSGEEOIxVLaEEEKIx1DZEkIIIR7z/wCZIZITAwTCGwAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 16 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### Summary\n", + "\n", + "In this notebook, we explored the **Anomaly and Community Detection (ACD)** model. We began by loading and visualizing the data after importing the necessary libraries. Next, we performed cross-validation by defining both model and cross-validation parameters, using the `cross_validation` function from the `model_selection` module. The results were then loaded to identify the optimal number of communities \\(K\\) based on the AUC scores.\n", + "\n", + "With the best \\(K\\) value determined, we proceeded by running the ACD algorithm. For community \n", + "detection, we validated the choice of \\(K\\) by plotting the adjacency matrix and visualizing the \n", + "graph with the detected communities. For anomaly detection, we computed the matrix \\(Q\\), which represented the probability of each edge being an anomaly." + ], + "id": "b19053f87d2c9a5e" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-29T15:30:00.226075Z", + "start_time": "2024-10-29T15:30:00.222538Z" + } + }, + "cell_type": "code", + "source": "", + "id": "8eac7e3051b3aa95", + "outputs": [], + "execution_count": null + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/tutorials/CRep.ipynb b/_sources/tutorials/CRep.ipynb new file mode 100644 index 0000000..dc9bff7 --- /dev/null +++ b/_sources/tutorials/CRep.ipynb @@ -0,0 +1,784 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generation of Synthetic Networks using the `CRep` Algorithm\n", + "\n", + "In this tutorial, we show how to use the _Probabilistic Generative Models_ (`probinet`) package for generating synthetic network data. \n", + "\n", + "We use the `CRep` (**C**ommunity and **Re**ci**p**rocity) algorithm {cite}`safdari2021generative`, which is a probabilistic generative method designed to model directed networks. The main assumption of this approach is that communities and reciprocity are the main mechanisms for tie formation. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first configure the logger to show the information about the execution of the algorithms." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:41.042825Z", + "start_time": "2025-01-27T14:45:41.020908Z" + } + }, + "source": [ + "# Import the logging module\n", + "import logging\n", + "\n", + "# Get the root logger and set its level to INFO\n", + "logging.getLogger().setLevel(logging.INFO)" + ], + "outputs": [], + "execution_count": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generating a synthetic network using the `CRep` algorithm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "We start by loading the configuration file for the `CRep` algorithm. This file contains the parameters needed to generate the synthetic network. The configuration file is in YAML format and is included in the `probinet` package." + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:41.188568Z", + "start_time": "2025-01-27T14:45:41.103845Z" + } + }, + "source": [ + "# Import the `open_binary` function from the `importlib.resources` module\n", + "# This function is used to open a binary file included in a package\n", + "from importlib.resources import open_binary\n", + "\n", + "# Import the `yaml` module to convert the data from a YAML formatted string into a Python dictionary\n", + "import yaml\n", + "\n", + "# Define the path to the configuration file for the `CRep` algorithm\n", + "config_path = \"setting_syn_data_CRep.yaml\"\n", + "\n", + "# Open the configuration file for the `CRep` algorithm\n", + "with open_binary(\"probinet.data.model\", config_path) as fp:\n", + " # Load the content of the configuration file into a dictionary\n", + " synthetic_configuration = yaml.load(fp, Loader=yaml.Loader)" + ], + "outputs": [], + "execution_count": 2 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:42.072962Z", + "start_time": "2025-01-27T14:45:42.040867Z" + } + }, + "source": [ + "synthetic_configuration" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "{'N': 600,\n", + " 'K': 3,\n", + " 'eta': 0.5,\n", + " 'avg_degree': 20,\n", + " 'ExpM': None,\n", + " 'over': 0.0,\n", + " 'corr': 0.0,\n", + " 'seed': 0,\n", + " 'alpha': 0.1,\n", + " 'ag': 0.1,\n", + " 'beta': 0.1,\n", + " 'Normalization': 0,\n", + " 'structure': 'assortative',\n", + " 'end_file': '',\n", + " 'out_folder': '../data/input/',\n", + " 'output_parameters': True,\n", + " 'output_adj': True,\n", + " 'outfile_adj': None}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "As we can see in the dictionary, the reciprocity coefficient `eta` is set to 0.5, meaning that the network will have a moderate level of reciprocity. Nevertheless, we are interested in generating a network with a higher level of reciprocity, thus we increase this value to 0.8. We also modify some details regarding the output of the algorithm." + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:42.178686Z", + "start_time": "2025-01-27T14:45:42.171048Z" + } + }, + "source": [ + "# Increase the reciprocity coefficient\n", + "synthetic_configuration[\"eta\"] = 0.8\n", + "# The flag `output_parameters` determines whether the models parameters\n", + "# should be saved to a file\n", + "synthetic_configuration[\"output_parameters\"] = False\n", + "# The flag `output_adj` determines whether the adjacency matrix should\n", + "# be saved to a file\n", + "synthetic_configuration[\"output_adj\"] = True\n", + "# The argument `outfile_adj` determines the name of the file for the\n", + "# adjacency matrix\n", + "synthetic_configuration[\"outfile_adj\"] = \"syn_dataframe.dat\"\n", + "# The argument `out_folder` determines the output folder for the adjacency\n", + "# matrix\n", + "synthetic_configuration[\"out_folder\"] = \"tutorial_outputs/CRep_synthetic/\"" + ], + "outputs": [], + "execution_count": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the parameters are set, we can generate a synthetic network using the `GM_reciprocity` class. For a better understanding of the structure of the package and its configuration, we invite the reader to take a look at the tutorial on the [`MTCOV` algorithm](./MTCOV.ipynb)." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:46.263280Z", + "start_time": "2025-01-27T14:45:42.337904Z" + } + }, + "source": [ + "# Load the `GM_reciprocity` class from the `probinet.synthetic.reciprocity` module\n", + "from probinet.synthetic.reciprocity import GM_reciprocity\n", + "\n", + "# Define the class `gen` as an instance of the `GM_reciprocity` class using the\n", + "# configuration parameters\n", + "gen = GM_reciprocity(**synthetic_configuration)" + ], + "outputs": [], + "execution_count": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can check that the model parameters have been set correctly as attributes of the `gen` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:46.290336Z", + "start_time": "2025-01-27T14:45:46.280949Z" + } + }, + "source": [ + "gen.__dict__" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "{'N': 600,\n", + " 'K': 3,\n", + " 'avg_degree': 20,\n", + " 'seed': 0,\n", + " 'rng': RandomState(MT19937) at 0x7BD95787A640,\n", + " 'alpha': 0.1,\n", + " 'ag': 0.1,\n", + " 'beta': 0.1,\n", + " 'end_file': '',\n", + " 'out_folder': 'tutorial_outputs/CRep_synthetic/',\n", + " 'output_parameters': False,\n", + " 'output_adj': True,\n", + " 'outfile_adj': 'syn_dataframe.dat',\n", + " 'eta': 0.8,\n", + " 'ExpM': 6000,\n", + " 'over': 0.0,\n", + " 'corr': 0.0,\n", + " 'Normalization': 0,\n", + " 'structure': 'assortative'}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now generate a synthetic network using the `reciprocity_planted_network` method, which follows the assumptions of the `CRep` algorithm. Notice that a network generated with this method is directed and weighted. The function returns a MultiDiGraph NetworkX object `G` and its adjacency matrix `A`." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "ExecuteTime": { + "end_time": "2025-01-27T14:45:51.544733Z", + "start_time": "2025-01-27T14:45:46.331459Z" + } + }, + "source": [ + "# Generate the network using the `reciprocity_planted_network` method\n", + "G, A = gen.reciprocity_planted_network()" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Number of links in the upper triangular matrix: 2620\n", + "INFO:root:Number of links in the lower triangular matrix: 2597\n", + "INFO:root:Sum of weights in the upper triangular matrix: 3018.000\n", + "INFO:root:Sum of weights in the lower triangular matrix: 2998.000\n", + "INFO:root:Number of possible unordered pairs: 179700\n", + "INFO:root:Removed 0 nodes, because not part of the largest connected component\n", + "INFO:root:Number of nodes: 600\n", + "INFO:root:Number of edges: 5217\n", + "INFO:root:Average degree (2E/N): 17.39\n", + "INFO:root:Average weighted degree (2M/N): 20.053\n", + "INFO:root:Expected reciprocity: 0.885\n", + "INFO:root:Reciprocity (networkX) = 0.638\n", + "INFO:root:Reciprocity (considering the weights of the edges) = 0.827\n", + "INFO:root:Adjacency matrix saved in: tutorial_outputs/CRep_synthetic/syn_dataframe.dat\n" + ] + } + ], + "execution_count": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Notice that, although we set the reciprocity coefficient to 0.8, the actual network reciprocity is 0.638. This mismatch is because `CRep` generates weighted networks. By considering the edge weights, the actual network reciprocity becomes 0.827, pretty close to the desired one. " + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now inspect how the network looks like." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "ExecuteTime": { + "end_time": "2025-01-27T14:45:52.039555Z", + "start_time": "2025-01-27T14:45:51.569025Z" + } + }, + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Plot the adjacency matrix\n", + "plt.imshow(A.toarray(), cmap=\"Greys\", interpolation=\"none\")\n", + "plt.colorbar()" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAGiCAYAAADdmA6LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABNGUlEQVR4nO3df5AU5Z0/8Peyyy7gMrPya4e9XSIpI2TDDxEV5ox+o2wggF5UcpdYKB6h4mkWS0W9yOGBMUetFa80MbEwl1OxKvEwpsREbhUpxDWGBXF1zYLKaYrcDoe7a7SYYTnZBba/f3AzmZntmekfz9P9PN3vV9WWMtPT3U//eD79PP38KDMMwwAREREpY4TfO0BERES5GJyJiIgUw+BMRESkGAZnIiIixTA4ExERKYbBmYiISDEMzkRERIphcCYiIlIMgzMREZFiGJyJiIgU41twfvTRR3HOOedg1KhRmDdvHt544w2/doWIiEiY++67D2VlZTl/06dPt7UOX4LzM888gzVr1mDDhg146623MHv2bCxatAh9fX1+7A4REZFQX/rSl/DRRx9l/l5//XVbv/clOD/00EP4zne+g5UrV6KxsRGPPfYYxowZgyeeeMKP3SEiIhKqoqICsVgs8zdhwgR7v5e0XwUNDg6io6MDa9euzXw2YsQINDU1ob293fQ3AwMDGBgYyPx7aGgIn376KcaPH4+ysjLp+0xERGIZhoFjx46hrq4OI0bIKSeeOHECg4ODQtZlGMaweFNVVYWqqirT5T/44APU1dVh1KhRiMfjaGlpwZQpUyxvz/Pg/Oc//xmnT59GbW1tzue1tbV4//33TX/T0tKC73//+17sHhEReSiRSKC+vl74ek+cOIHRo0cLW191dTX6+/tzPtuwYQPuu+++YcvOmzcPmzdvxrRp0/DRRx/h+9//Pi699FLs378fY8eOtbQ9z4OzE2vXrsWaNWsy/04mk5gyZQoSiQQikciw5Q8fPizlZFtltn27+yQzDV4eH7/PBRGpKZVKoaGhwXKwsktUiTmtv79/WMwpVGpevHhx5v9nzZqFefPm4XOf+xx+9atfYdWqVZa253lwnjBhAsrLy9Hb25vzeW9vL2KxmOlvClUdRCIR0+Dc2Nhoa58SiQQaGhqELTd27Nhh+2X2WTF202BHsXVbTaOdbYleJxEFhxevJt1uwzAMAIVjTik1NTU477zz8OGHH1r+jecNwiorKzF37lzs3Lkz89nQ0BB27tyJeDwufHuJRML0/7MVCxzZv7EaYMyWS3/W2tpqaVt+sXosRK2TiEim/C5NTv/c6O/vxx//+EdMnjzZ8m98aa29Zs0a/PznP8dTTz2F9957D7fccguOHz+OlStXCt9WdmBwEiREB5YlS5Z4ti2rrAZdJ/tnJ6Cr8HBCRMHiR3C+66670NbWhj/96U/YvXs3rrnmGpSXl+O6666zvA5f3jl/85vfxMcff4z169ejp6cH559/Pl566aVhjcT85EdVbPY2vdy+zO2UWnd2OlnCJrtaW1uLPvASjRgxQki19tDQkOXlDx8+jOuuuw6ffPIJJk6ciC9/+cvYs2cPJk6caHkdZUa6Ml0jqVQK0WgUyWTSUf1/kPB9LhHpSHY+nl5/RUWFkOB86tQpT2NO4MfWLvaOVwfpql4n78tlkVX9zGptIhJNhXfOTgQ+OOte5eW2yldkwEuvK3tfRK6fNQDkFh/wKB+Ds8/yb0rVS8yJREJ4RmK2PqtdxKwo1gqdSAW8HikotA/OZqU5QI0Sc3rf1q1bl/Nv4Mz+is5InK6PGRrpjiVmKoQlZ5/I7t7jRnrfNm7cmPNvv8mo6mbmSH5S5d4i9TA4+8xqNXap1s1hCDIiM7L8d+JhOH4yyDxuPCdE+glMcLZajV0qMOV/7yRjy/+NlXXY+U2h70Rkwm7X4SbwhzmI+NnXPAjCfO3o6vDhw55sR9eSM/s5h5QK/aNV2Aci8odX/ZzPOussIf2cjx8/zn7OulDlfWux8cNV6B9dbB/MvvP7eJJeeL1QEDE422Q2EYYXga5YBpQ/friVyTrMHiysTBJi9ftC+2flO5amyQ5eL/KY3efp3ie60LVaO1TBWfYTtpP3xFbXaScDsrKs2YOFnUlCmCESBZ/ZfZ7ufaILBmcfiZpVycp67JYCrW5b9O9U5qTBHIUTrw1yi8HZR6KGkxQRvFWg+n7mn68gPoCQGCpcG6rfT1YEIQ1hE4jgnE3lLilmfbFL3TROhiFVIUOzSqd9pXAKwjUahDQ4xZKzBqw+Pcp6yjTri13qpsn/jYx9k/GunPTE8y0Hj6t/GJw1YHUSCLPl/Li5nExk4WQ/Zbwrp+F0yKB5vuXgcSW7QhWcrSh0E/nRXcrKNvO7NeiUCeTPzKVD8HJDp3NDZJeq929ZWRlGjBjh6o8l55Arlnnnv3tO3wilujW47cIl83f5M3MFNXhx3GwKA1XvX1Zra8JtZmalG5CMDDP/3bPVG0FUFy6rjdlUvUH9pHIjRdWF+eEjKGkPSjq8pn1wtnvirWZmboa9dNu1S8WL2UljNiK3wjzbWVDuL7/TwZKzT9wGW7frlTGSlt8XswxBeUghfwTxniBvMDj7yO3IXmHjR9DLP/5WxuflOaOwsnuP8kE2eAIRnJ1WfSUSCUeDfOjObtCT8V5dt/F5ibxk9x7lg2xhLDkroNgFWqjxktm7VDfszNjixdNuoW3YGd/abGpHu8eaiMgPugbnMsMwDM+36pLsSbpLETEeNMeUJqIwk52Pp9cfi8UwYoS7cujQ0BB6eno8jTmBKjl7xUlQzR9sQ+QoZLKG9GQJWC88X0TBweBcgqj30lYG25A1rWSh/U9n5oWq/GWU7MP4jt8rrIkhFfn90MhqbQ/5Xa0tS1CruoOaLiJyzqtq7bq6OiHV2keOHGG1tlWHDx/O+bffT2huBTWAqZYuEdeJ7tcakQi8D+TROjjX19fn/Nvtu2CR/LpovU6PqO2VqnoXScTDgmoPHESiBWX8CF2rtbUOziLICuhOL1o7XbHM9kXWzWL1PbnTObMLdWnT4eYnkuHyyy/3dftBufcYnH2iwmhXItkdnMPKBBVmnAZRu/vjdjmisNq1a5ffu0A+0j44q5TJ2y31ymB1UBVRQZTvnOzh8XKGx42cYslZUSL661r9vawhKWVnTG7WL2IwFhH74TWn+6rSw6ROeNzUotO9OmLECCF/nu+351v0WLH+ulYvMCsZg5OL1WoVtJuMqbW1teR2rE5xKbtxlk4ZsE77SiQar3/5Ah+cAXdzM1vlZF2ix/UutA072ymWDrMxtnWg4z4HHc+JfSqNIKgTVmv7yE7JMJvbUqKsYTNVXFea7Cdmkfucvi74lK8enhP7ZI0gGHQMzj4qVTIsFLyLdQOyckHLuOhFNsASuX9ezaAlcp+9qJkgIrUxOPus2BSIolswW90HGfx6Cnb73t7NNogoGMJexW5HYIJzfsbuR0avcnCRNeGEymkmkoEBxjm/8gvdSs1AgIKz11SaXanU0JqJRIJVvESC8IFUL+xKpSgZQdROsPOzqjv9uajMpNgUk6rhfNREpLPAB2c7JUaR/Z6dLKs6s2AvaxhQt2TNR01EemGDsADwOjMPQsnO6jF77LHHTD9X6fUAEQUPg7MmnI5/rWOfYSu8Co6Fhjblu3AiouFCF5ydjn9tFkiDUPL1MjjaOV5BOLZE5D82CAugUgHCTsBmsAnvu3oiv4U5/2G1dgClA4SbUbnSv9VhgJO0dFW3Tq2ziagwPuzqJ3TB2UmgKTbMZ6ltiLopvLy50lXdortiERF5jdXamhAx/WOpdQQ1mLEE7R0ea3M8LvIF7RizWlsx69atsz2zlOqzGHl90+RvT/aUkWbrDlpGYZWq16DfRB+XsF5fxQTt2gtNcH7ttddw1VVXoa6uDmVlZXj++edzvjcMA+vXr8fkyZMxevRoNDU14YMPPshZ5tNPP8Xy5csRiURQU1ODVatWob+/31VC8m3cuNH2zFIiWy7bvemtLF9s8ons3zvNcPK7VZltT+aNaxb8g5ZRkHx+zdxGJJLt4Hz8+HHMnj0bjz76qOn3P/zhD/HII4/gsccew969e3HWWWdh0aJFOHHiRGaZ5cuX48CBA9ixYwe2bduG1157DTfddJPzVJgQ8UTsZh12b3o31e35o2HZfUeeVujhxM1xsNuojJkluaXaNcTSub90fedcZhiG4fjHZWXYunUrrr76agBnSs11dXW48847cddddwEAkskkamtrsXnzZnzrW9/Ce++9h8bGRuzbtw8XXnghAOCll17CkiVLcPjwYdTV1ZXcbiqVQjQaRTKZRCQScbr7JYmeX1j2ev1ipUV6qTQH7ZiEBc8bOSU7H0+v//zzz0d5ebmrdZ0+fRqdnZ3SY042oY8Dhw4dQk9PD5qamjKfRaNRzJs3D+3t7QCA9vZ21NTUZAIzADQ1NWHEiBHYu3ev6XoHBgaQSqVy/mSR0dI6n4hGaXbZHQPbzkhqVsaxDmsjujQvS09ebivo543IL0KDc09PDwCgtrY25/Pa2trMdz09PZg0aVLO9xUVFRg3blxmmXwtLS2IRqOZPzcZgtuW2F4RHcCz3+daaXjldCQ1K8JYzefldaXKNUykAl2rtbVorb127Vokk8nMn1fvgkW8a5XJ6Xtts8FVrPRpFpUmBg8i8kpoWmsXE4vFAAC9vb05n/f29ma+i8Vi6Ovry/n+1KlT+PTTTzPL5KuqqkIkEsn584KbIKJDACo1/GihltNhLPkSEXlJaHCeOnUqYrEYdu7cmfkslUph7969iMfjAIB4PI6jR4+io6Mjs8wrr7yCoaEhzJs3T+TuuGK3j3RaoVmevO4f7PS3xVp9l/qciOTjw7E9ZWVlrqu0tSg59/f3o7OzE52dnQDONALr7OxEd3c3ysrKcPvtt+Nf/uVf8Nvf/hZdXV1YsWIF6urqMi26v/jFL+JrX/savvOd7+CNN97A73//e6xevRrf+ta3LLXUdkLEkJ1WlynUHanU+rzstpW9PQZaIr3wnrUnNNXab775JubMmYM5c+YAANasWYM5c+Zg/fr1AIB//Md/xK233oqbbroJF110Efr7+/HSSy9h1KhRmXX88pe/xPTp07FgwQIsWbIEX/7yl/Fv//ZvgpI0nA4Xs6h3vVbH/dbhmNjFEgWRt3jPyeOqn7Nf0v3XDhw4gMbGRgCF+1vmfy6yX2bY+3iuW7dOaqtuIgour/o5X3zxxaioqHC1rlOnTuGNN97Qt5+z1+rr6zP/b/X9qJVGTU5Hs/LzKdKPbTsNzHb2tdA7/CDg3N9E8rErlWaKlXidlob9LEUX27adAUW8aLhm5ziJHO9cNWxwRySf3++cH3jggUx7LDtCG5zDxE4JV/bEFkREYbFv3z787Gc/w6xZs2z/lsHZI/kl0qAO50hEpBK/qrX7+/uxfPly/PznP8fZZ59tf79t/0JjdqdVFDmzVaF3315w827czrJ2qs9FblckXR9kSj386fDuXuY+6npeRRJ5f+pEZLV2/hwPAwMDBbfb3NyMpUuX5sw1YUeogrOVATYKLV+IqLmTRSo1TaOddNl5iHDSQMzNPsqga9V7qYc/Hd7di9hHq9eTiAahumHPCvcaGhpy5nloaWkxXW7Lli146623Cn5vhbv25eRotqVEIiE1s7QyTrbVdcimazCkwvzsYmh1uzIahJKaRAwikv59IpHI6UpVVVU1bNlEIoHbbrsNO3bsyBnfw65QlZzN+PGU7Pbml7HPiUQisCUGKuzyyy8f9pnb64DBjVQi8p1z/hwPZsG5o6MDfX19uOCCC1BRUYGKigq0tbXhkUceQUVFBU6fPm1tv4UeBQ3pmJGUmrBC5HplbCcsdDhWu3btGvaZqveEDseTaMGCBejq6soMc93Z2YkLL7wQy5cvR2dnJ8rLyy2tR/vgbPWGVfnGtrtvZsu7GV/bzu+9yLh1aLxkhapBTlc8nuSE1/2cx44dixkzZuT8nXXWWRg/fjxmzJhheT3aB2c3QcVpwBYV6J2Ocy1qZLJC2/X7QUaHxktEpAeOEKYhESOByZpNyuoEFqXW44RX1dscvpKIwuDVV1/Fj370I1u/CXVwFsFpYCzVL9VqK3DZgSxdxVxq/+w8TBRaR6nPiYjs8nv4TqcCFZxFvKs0CyJO+0QW6/QvalAS2YFs5syZJbdjNvNXPgZcIuc4oqBzDM4KEPGu0iyI5H+W/RBQLOiU6vTv9TtvJw8vdgdrWbduHRoaGgJ3gxP5yc8RBXVXVlbm+n0zg7PHnAYQUQ2WrN4Edqu8zX4D/KUU7ITVY5V+IGGAJiJyLnTBWVRDqkJDZIoMSOmSrt1W1YVGaHLT3crJb0U8gTPAE9nDeyYXq7UV5ybImCk0RKbIgFSqhO5Fg6qgVXERBR3v2VzsSqUQqw2S3M7OJOsJtVhLaCfbFDmoh9dP5cxo9MESG5E4gQzOMka7KvQO1YsMKXvbhVpFF9uPYiVwZqgkCh+kxOK9KQartQOi2A1hVoUta5zrUtvO/8xpxtjV1eV6P0hNQRkGNax4r4nBam1F2Q2UpW4IK+tze1OZzRQkC4fKDC6eWyJ9BT44ux1Jy043JiejZJkxmynIC6JLWmGrlgtbeol0wGptHxw+fDjz/2YZo9XBQoqx+15a1Lr84LSkVSgoqZ5e0VRMLx8YKOwYnH1QX1+f+X+zjFGFaj23maPozNVtC3UzKgYlOoPnhkhPWgfnYlRpDOOmGrzU750QWRNgpth44l6ug7zBkrk+wnquWHJWjJVSs6yLVZcSp4z0lxpP3Kt1kDdkX8NhDSgy+J3f+IXBWUOy5i326yawO5SorP1khkqihDWgkDgMzgElar7mQp+LDGQyhhIVsR9EYcUHVXKKwVkSq+Ne2wlksm50q+/nmdEQ2cMHVf+x5BwifgUpGTd6a2ur5VbtzGjCjQ9npCMG5xDRKUiVylBV6G4GMOPXgU7XPZHuGJwDzmqGajU4JhIJYYFU1NzaRHQGH3KHY8mZADi7OVS4oezM5JVe1m1fcrd9wIkol9k9pcqYD37hxBcakZnxOykB6lpqlFklrusxIVKNKq+uyJ5ABWddBv9QVbEnbKtzR1vFkjEReYHV2j4RMblFsUChShDxYj+KPWGLmDu60PqISDxV8i4V6BaYgQAEZxFVNsWmlZQ1iphdDGZEZAeHVtWb9sFZJC+mlcyX3frZ7GLP/o43A5EYvJfc06XAwGrtkCkWUO3Ibv1c6Hsry5ntmxuyMy9mjnoI6nnSJbCQewzOCvGrmllEoBZBh3fCQcscZVxzVhrhyb7WvXwglLk+Ci8GZ4XYzfjdZASiG0pZYbVVtRXMBO0pdLxknHsr15YqDzl+zjvuJd4v5JVABme7/CodOGW1VbUVMjNBmTNw+aWhoSEQ6SBnVH1ooMJYctaI08zVbcMv1bi54KxUs6oyhaVoQUmHLGEfkYrUwuCskWKlH1lBNDtD97pEWWj9hmE4Xqfq1azkH1kjUqnwgKvCPphRdb/IudAF5/RFXChYehFcvC5R6hAw161b5/cukOJUuI5V2AczqozHoCKWnDVhdhGLuuFkXfxBv6kSiQQ2btzo924QSeX3fezXg4XfYzQwOCvG7cXg5L1ZfmlcxLu3RCKh7NO6KEFPHxEQ3uvczhgN9BeBDc5uu1O5fW/W0NCQsw43jdD8fuJOU2U/ZAtLOgsJe/r9xGMvHkvOmsm/CVR+7yt635yOblZsDPIg6erq8nsXhHFyroJUytHtWg3SsVcFg7NmVLwJSlWDO2nlXWwyDz/GEtdBkOa/Dfq5KkVG+nUL+KQnW8G5paUFF110EcaOHYtJkybh6quvxsGDB3OWOXHiBJqbmzF+/HhUV1dj2bJl6O3tzVmmu7sbS5cuxZgxYzBp0iTcfffdOHXqlPvUSOT3lI2As1beYc+ciUTjPVWaSg8woSg5t7W1obm5GXv27MGOHTtw8uRJLFy4EMePH88sc8cdd+CFF17As88+i7a2Nhw5cgTXXntt5vvTp09j6dKlGBwcxO7du/HUU09h8+bNWL9+vbhU/Z9SF4idC8iPG9Lq/mUvJ6oRmhdUuoGJSByVHmB0Dc5lhouRKD7++GNMmjQJbW1tuOyyy5BMJjFx4kQ8/fTT+MY3vgEAeP/99/HFL34R7e3tmD9/Pl588UVceeWVOHLkCGprawEAjz32GL73ve/h448/RmVl5bDtDAwMYGBgIPPvVCqFhoYGJJNJRCIRp7tPpLX8lvzFWvar1upftf0h76VSKUSjUWn5eHr93/72t03jih2Dg4N44oknPI05rt45J5NJAMC4ceMAAB0dHTh58iSampoyy0yfPh1TpkxBe3s7AKC9vR0zZ87MBGYAWLRoEVKpFA4cOGC6nZaWFkSj0cwfb2oqRHQtQv46RRM16YrZv61+55TIfSeiXI6D89DQEG6//XZccsklmDFjBgCgp6cHlZWVqKmpyVm2trYWPT09mWWyA3P6+/R3ZtauXYtkMpn5C0t1aFjSKVJ2pi+qYZfMQOJm3X4/fDDAeov5gTO6Vms7Ds7Nzc3Yv38/tmzZInJ/TFVVVSESieT8hUGYMr8wZzxO017s4SN/ncWGR1WpLz0V5jY/COsQuaEKzqtXr8a2bduwa9cu1NfXZz6PxWIYHBzE0aNHc5bv7e1FLBbLLJPfejv97/QyFD66PoiICGqy54IGgJtvvtnxPjBwBwOHyNWLreBsGAZWr16NrVu34pVXXsHUqVNzvp87dy5GjhyJnTt3Zj47ePAguru7EY/HAQDxeBxdXV3o6+vLLLNjxw5EIhE0Nja6SQuRaSApVmLIHvfXrwE7rFZPe/GO12xfvHxw4oMAiRaKknNzczN+8Ytf4Omnn8bYsWPR09ODnp4efPbZZwCAaDSKVatWYc2aNdi1axc6OjqwcuVKxONxzJ8/HwCwcOFCNDY24oYbbsA777yD7du3495770VzczOqqqrEp5C0Z7fLW/7yxUoM2eP++lV6d/JuXFYQK7QvIrZn5SFI1xoUUlcogvOmTZuQTCbxla98BZMnT878PfPMM5llHn74YVx55ZVYtmwZLrvsMsRiMTz33HOZ78vLy7Ft2zaUl5cjHo/j+uuvx4oVK3D//feLSxUFit0Mu1h3Ip1lp8vrICZie+l1BGl4VCJZXPVz9ovs/nFE6X647I/rDR7n8PGqn/M//MM/COnn/LOf/Uyffs5EujMrTWcHCpEBw827bR0ENV2kP92qtAEGZwooq4HCLPi6nW602LbMRvWysn4vAp/bbag08xqR7hicSQt2B9zwckQsO9tyOnmJ0/SIHD/eSfBOnzez34oaRIWomFA0CCPyi1krYq+rUXUs3dkZYKTUck76QqfPm9lv09+xOpxkYnAOINmZBjMld0QFSx3Og9N9bG1ttXyc/KqW1vGhx4wO11EYMTgHkIzGQNnYpcQ60Rlf9vqcvAP2Wv61aHUfRI0v7hWdA1xQHjJIDQzOHilWrUelOQ1OVtdX6vP8ZWS8L3U72IoX25W9fgY48XR+4BGBJWcqKOw3h87yuz+l/yvjwcru4CmiApmT9TDg6sPt8dc9/2JwpoJ0zJxUvyFlvnIwq/J20u+52DG0852MVtRu6XhNkzM81/5gcCZTYbohnXRvcrJeEd+5Xd5JIPcy+Kv+UEj6GTFihJA/z/fb8y0SBZBKQcXKxBLpd+Z25vh1k0aVjg+FC6u1iUKitbXVdtWzl6zsS/qduZU5fkUMZepFdy6iIGFwJrJpyZIlloJIqWE3rZYmzVqGq9TC2s1vsn9npwW8ziVxnfddRyw5U6gxwxmuq6uraJcnq6VEs5bhskuYTtbvdJ/Sv7PTAl7nErbO+64jP4Lzpk2bMGvWLEQiEUQiEcTjcbz44ou21sHgTEJ4neHoMC7zzJkzAeiRGYsa4lPWb1Wmw7UYZn4E5/r6ejzwwAPo6OjAm2++iSuuuAJf//rXceDAAcvrYHCmQFIhEMhuRS2SiHfCbsbm1hkHE3Lm8OHDfu+CNFdddRWWLFmCL3zhCzjvvPOwceNGVFdXY8+ePZbXoX1w9jtTI3+UyhB1CwSiR0Dzg27HnIbT8borRWTJOZVK5fwNDAyU3P7p06exZcsWHD9+HPF43PJ+ax+cmSFQEHl5XZtlyG4m2rCyjSAGAV0VGmdetvr6ek+2IzI4NzQ0IBqNZv5aWloKbrerqwvV1dWoqqrCzTffjK1bt6KxsdHyfle4TjkpLZFI8AFGQ62trZ5Vl5pdH3avmfR1VmifZQ30Qu7xXFiXSCQQiUQy/66qqiq47LRp09DZ2YlkMolf//rXuPHGG9HW1mY5QGtfcqbidLzxwlCqKpVGv99j2j0HOl5nOgnDPSGLyJJzuvV1+q9YcK6srMS5556LuXPnoqWlBbNnz8aPf/xjy/vN4Owj3nDmnJTadKN6MJM9XSrZ49f1EoRzp0o/56GhIUvvqNNYre0j1TNoXbg5jqz2l4/HV188d86sXbsWixcvxpQpU3Ds2DE8/fTTePXVV7F9+3bL62DJmUJNhcynVIMsEaOMyeL39km8oJ1TP0rOfX19WLFiBaZNm4YFCxZg37592L59O7761a9aXgdLzqSF7BJu0Eq7pRpkiZzBSqRC5yFo5ydsgnbuRFRL2/39448/7mp7AEvOpAmrwcqMnyUBmduWNaqX1eULnYcgZe5WR/8KWmmT/MfgbIHIG483sVxmx9erYOH1tmXN9GR1eatV7zqz2mo+SA8kQVNWVuZ6LmcRDcLsYnC2QOSNx5tYbkZeqJrVC4XOrR+BS1ZpOVuh2oyg1lSQnlRprW0XgzN5TsYDilkpLl0l6eXQmKqU3GWVlr1el07bJmu8foBicKZh+BTvHbNS3JIlSzw/ByJK7k7neVap5G6FqvtFcvEByhoGZ4l4EfpPxNCUMvahUGAq1gI6n8j3oaUCpYxAyvuDvMCSMxFZZrels9tA5nY6x2LvlHUqAeu0ryQGgzMRSeUmsFgpjTvtQuXmwcFqVyVRdCit8wGCAAZn8hgzHudEBxYZM0XZPb9+T/ChIh0eIHTCkjORBWHMeHToSiVq3aXOb7F37UQyMDgTeUiFkbesrsNpwHJDhcFPSnHT9Yso6BicSUuqB5/sccDtbE/nUbesTNDhZhhWIidYciaSRKcglb+vdvse6zqGOCBngg6/00T6Y3AmkkRGQ6VEIiFt4ggr225oaBj2+bp161xtR5WSqMiAqkqa0viwQF5hcKZQcDMYiVkgdbOd9L/zP9+4caOlbahOtYAqUpDTFlQsOVMOPmGrzenY01beqxb6NxF5z+2MVOk/z/fb8y2GhKwnbGb4fyH6WNhtvFXqOz9KWXaq6+2ul0hHLDkHiMoZEavV/kL2oBw6amhokJIOp43TdG59rhMe2+BhcDYhInPzelhCIlFElL7T7+nttj5nkHEmCA+WsrDkTDk4LKG3VMzUVdwnK0SVvp2sg0GGRGNwJvKRyExdRBerQlM/qsjpQ4TZ71R+IFF534jyMThTKLkZH9rKcna6X1lh9g432+WXX17yt4U4fYgQOVe22z7eVujysERiseRM5DM7GbwXGbXIbRTqG522a9cuT/YjTXQp1KyPt+ySLkvSzuh23BiciTyQXYLMzyT8HsRDt0zLDd0ebvxYv2pENVIN23HzS6iCc5gyz6DKLkGqViJUJdPy6zrn/aW2Qo1Uw3DedCs1AyELzqpknuQtO5mPHw3LrPzeTn9hO2kI8jjYZE3Qz1soqrU3bdqEWbNmIRKJIBKJIB6P48UXX8x8f+LECTQ3N2P8+PGorq7GsmXL0Nvbm7OO7u5uLF26FGPGjMGkSZNw991349SpU2JSQ2TC69HazKZHdLLeQn2EZbzLJiK12ArO9fX1eOCBB9DR0YE333wTV1xxBb7+9a/jwIEDAIA77rgDL7zwAp599lm0tbXhyJEjuPbaazO/P336NJYuXYrBwUHs3r0bTz31FDZv3oz169eLTVWIhaGKSgXFukq5CXitra2hDZiqX7scWEhPupacywzDMNysYNy4cXjwwQfxjW98AxMnTsTTTz+Nb3zjGwCA999/H1/84hfR3t6O+fPn48UXX8SVV16JI0eOoLa2FgDw2GOP4Xvf+x4+/vhjVFZWWtpmKpVCNBpFMplEJBJxs/tK06mvbFDkH3NVz4Hb0nnQqHqeqDDZ+Xh6/f/6r/+K0aNHu1rXZ599hrvuusvTmOP4nfPp06exZcsWHD9+HPF4HB0dHTh58iSampoyy0yfPh1TpkxBe3s7AKC9vR0zZ87MBGYAWLRoEVKpVKb0bWZgYACpVCrnLwyY2XhPxOQVIgf1KERUgzg7A66IKjnKKCHLvFdEz+dN3grNrFRdXV2orq5GVVUVbr75ZmzduhWNjY3o6elBZWUlampqcpavra1FT08PAKCnpycnMKe/T39XSEtLC6LRaOaPQYtUJnJQD5HMgoSdAVdEDUlbaJuqBjGrA8oUWob5FTlhOzhPmzYNnZ2d2Lt3L2655RbceOONePfdd2XsW8batWuRTCYzf6rexEEWtGMetPSkWR35zE2wccLtdJx+s7JvKu+/HUG7N3R952w7OFdWVuLcc8/F3Llz0dLSgtmzZ+PHP/4xYrEYBgcHcfTo0Zzle3t7EYvFAACxWGxY6+30v9PLmKmqqsq0EE//pQXtQvKTiCEtVSFryEo72/Biffm/SadLRPrD1io8XW0f9jxFh3NlR2iCc76hoSEMDAxg7ty5GDlyJHbu3Jn57uDBg+ju7kY8HgcAxONxdHV1oa+vL7PMjh07EIlE0NjY6Gj7QbuQ/KTTsSw0raGXDaX8mE+6UDB2si4/qBz40tX2qh47CpcKOwuvXbsWixcvxpQpU3Ds2DE8/fTTePXVV7F9+3ZEo1GsWrUKa9aswbhx4xCJRHDrrbciHo9j/vz5AICFCxeisbERN9xwA374wx+ip6cH9957L5qbm1FVVSUlgRRMfgYlP1sGu9lu9n6zdTOFhYiSr/Il576+PqxYsQLTpk3DggULsG/fPmzfvh1f/epXAQAPP/wwrrzySixbtgyXXXYZYrEYnnvuuczvy8vLsW3bNpSXlyMej+P666/HihUrcP/994tNFZFEVquO7ZLdj7bUQCYipsokUo2urbVd93P2Q1j6OZM8xUqOKpQqneyDCvtNZJVX/Zx/8pOfCOnnfOutt+rRz5nIK6XmMrby23yl5mLOlz8dpYqlRwZmPal4LQVJaBuEBZkXE8BTaaXmMrbyW7fyp6P0ejpD1a9FBhjndOv3rRsG5wDye35gojTR16LojL/Yw0qhlvVUnIrd/cg7DM4Bx5tTPFHH1Oug5de1kB5qlNei91R41eH3hCEsOZOSVLg53XJzc/s1jrPVEbHcTivpdK5qL68LBuVwEzXsq1MMzkSSOLm57Q5GIruaN/sBw+62io2J7VWQdfPOO3tfGai9F/ZjrmtXKgZnCiS7jWy8LEmabatY7YAKtR+i3nmrkJaw4THXE4NzwAXtqdltetxmVMW2X+y7UqX//O8LrSv7c6/OrRfbCdp1SupgtTYpSWYw8oPfpYBS/aNFHS8rw5N6dSycDIYiextEdugWmAEGZyrB7jSDIrjZjpsBS0RQNciUOh5uGt3l/1bVY0Ckk1AFZ9UHclCdqiW1/N96MYxlsRmxCn1vZR2ylDoeVhrdFUpfqd+qVvtC4cJqbcUlEolQDioShIwx+6HKahcl2cy2YbfKWbcSpln6rJS47aRTxvWqwj2gwj6EFVtrK063jFCUIKQ7+6EqCOmxIz9TL5TJO60Vchs03HRzMyPj/KpwzaiwD6SX0ARnIjOql2jyM/VCmbzTWiE/ggb7O+vL7Xnz47yzWptIQyqVaMISsNJtAuykV/Vjo/r+ieL2fvHjfmNwJtKA1VbJfmS2bmYnkrm/pRq/2V2Pk9HNVHqIMqP6/skSlocSPzA4U6hYfUeqUmbrd+OyUo3f7KyHmXmwlLoO/J70AmDJmTTAjDHcx0CFtKczcxX2RSUiZzpTid+TXgAMzqQBlUqDTskcvlO1jM0Ot13MvE57EK5FkUQdDx7X4diVikhBpYJO9vdWql1ljG1tZ5uFuH1fLSJTD1IDLyK/MTiTVLKnYiy1rVJBx2pXJbPvvSrt5H/vdA5nN8uI2pbobRKVwmrtgOATvVgy5lNOJBKOAnFQBDGdvO9IFgbngAhixqcDOw2FGhoaeJ4k8DNAqnQ+rUzXqSod9pGsYXAmpXiVSZtlYuluH6L69VrdripEH3s3faH9ZGW6ThlEpF2lhxxVsORMpBGzTCzd7UNUv16r2y3FSV9RlYNcsfHCRR1nv9PPOa3VwdbaRCSFk76iftZAlGK3EZ4Tfgc6v7dP+mNwJu04LRV5UZryu8SWJqJ7lhU6BSFVzg15y49q7ZaWFlx00UUYO3YsJk2ahKuvvhoHDx60tQ4GZ1JefqbqdJQpv+Z5Brx7/5o/fnUhOgVVUbxKswpDVtJf+BGc29ra0NzcjD179mDHjh04efIkFi5ciOPHj1teR4XdhBKZETWQhRm/GuiI5NW+6nRMzMi8jryiwpCVXmltbQ1VelOpVM6/q6qqUFVVNWy5l156KeffmzdvxqRJk9DR0YHLLrvM0rZYciYhdM1Q/Z7xqRgdj6nb6nQd0xxmOgRmkSXnhoYGRKPRzF9LS4ulfUgmkwCAcePGWd5vlpxJOyJLV37P+OSEyqVLVqeTakR0hUr/PpFIIBKJZD43KzXnGxoawu23345LLrkEM2bMsLxNBmfSTpAyeCeB1u7yfgZzlR8kKBzKyspcd4VKB+dIJJITnK1obm7G/v378frrr9v6Hau1SQt+trS1u+1i/Xjz+dVIzavjqdJMWEReW716NbZt24Zdu3ahvr7e1m8ZnDUS5szMr9JXa2trzradzBDlpKTr5nsrv7G6T+vWrXO87exlzVows0RNXvCjtbZhGFi9ejW2bt2KV155BVOnTrW/34ZhGLZ/5bNUKoVoNIpkMmm7ioFIFBkjW4nGamU1BPU8uEmX7Hw8vf6tW7firLPOcrWu48eP45prrrG8r9/97nfx9NNP4ze/+Q2mTZuW+TwajWL06NGWtsmSM3lK54FAzEqfqk/CwWplNah8jbgR1HS5tWnTJiSTSXzlK1/B5MmTM3/PPPOM5XUwOJOn/BwIJFt+da0Zp1XBugQ9u9X1RDryq1rb7O/v//7vLa+DwZlCaePGjcM+cxOg7FZxqzaKFEtAwcCHrOE48QWRTaplJIUacmXvZ6F9thvcZA3eYGVfZWyL1MCHrOBgcCbfyMhIEomE8KCRvZ+qZ35e7qvIccSJZOF8zkQKUL2Bli6By+p+mi2n8vEn0gWDMwWKysFP1e40bgKs29bgKp8vIj8xOJPnZGbIKga/NFn7lj6ehY6rX5NN6DhuOQUPq7WJLJKZIZcKRKq1kraiVLev9PH0Y2pNmQ9aOp6rMFO1FoTBmchjTqpjRbSSdpoJOf2dWbcvt0SlQVTgNxuPXIfpCOkvVK0FYXAm8pjXmUE6gBTabmtrq9RJLtIt0Yttw2rQbWhoUKqk43Y8cqKgYXAmLZgFEhndpoqxUioXGVQKDRdaTLHv86uJS62LLbFJpQc4p1hypoKCcIH7KX9mqLRCwcrprE4izpPIc+0keBazZMkSz6ez5LWvtyA8jDE4U0FBuMD9ZOfdY7HuSqWqpXU5T6UagJX6rajZtKw02NLlmBIfpFTD4KwJ3jjWFAsGsrsyydyGSKL20cpDE69bfehw7TrBkjNJFdQbxy8iu+kE9dyICKxBPTakj1AG5wceeABlZWW4/fbbM5+dOHECzc3NGD9+PKqrq7Fs2TL09vbm/K67uxtLly7FmDFjMGnSJNx99904deqUm12hEMtvGGYlqMjopmM3mMksVYroKsXA6h5rDsgpx8F53759+NnPfoZZs2blfH7HHXfghRdewLPPPou2tjYcOXIE1157beb706dPY+nSpRgcHMTu3bvx1FNPYfPmzVi/fr3zVFBBYcgcshuGWR0iU8ZxsRvMZE4c4TSwMiCLxeNJTjkKzv39/Vi+fDl+/vOf4+yzz858nkwm8fjjj+Ohhx7CFVdcgblz5+LJJ5/E7t27sWfPHgDAyy+/jHfffRe/+MUvcP7552Px4sX4wQ9+gEcffRSDg4Om2xsYGEAqlcr5I2vCnDmYVV2XahTmZJ2iqXrOVHzQU3GfSC2hqtZubm7G0qVL0dTUlPN5R0cHTp48mfP59OnTMWXKFLS3twMA2tvbMXPmTNTW1maWWbRoEVKpFA4cOGC6vZaWFkSj0cyfqpkX+S/72jCrunZ77YR51Co/7zun82jbfZgqNU55EAQ5bUFiOzhv2bIFb731FlpaWoZ919PTg8rKStTU1OR8Xltbi56enswy2YE5/X36OzNr165FMpnM/PHi0hfPHTnh9MHA7sOUm25qurCbNt0fWEJRck4kErjtttvwy1/+EqNGjZK1T8NUVVUhEonk/JGegpzpUWFeNJaz2yhQ1HZFUDnwyXpgefnll4Wur5BQBOeOjg709fXhggsuQEVFBSoqKtDW1oZHHnkEFRUVqK2txeDgII4ePZrzu97eXsRiMQBALBYb1no7/e/0Ml5T+cZQFWcMIjtENZYrdt1l/8bq9opN5CE7XxDVMl7X/GvhwoWebUu3wAzYDM4LFixAV1cXOjs7M38XXnghli9fnvn/kSNHYufOnZnfHDx4EN3d3YjH4wCAeDyOrq4u9PX1ZZbZsWMHIpEIGhsbBSXLHpbm7AvLu1ddMz4RVEx7/nXndKjWNKuD1shu3e9m/V4EdrfHmeyzFZzHjh2LGTNm5PydddZZGD9+PGbMmIFoNIpVq1ZhzZo12LVrFzo6OrBy5UrE43HMnz8fwJmnpcbGRtxwww145513sH37dtx7771obm5GVVWVlES65baKjfQVxAc3OzNX+cHOvZPdhc5sPaICV1CHObW6XSsTrqia54WiWtuKhx9+GFdeeSWWLVuGyy67DLFYDM8991zm+/Lycmzbtg3l5eWIx+O4/vrrsWLFCtx///2id0UYp2MYq0jVG4i8o+q1mSbqfnObThnDnFq5/7y8R8MwUp6uwbnMMAzD8626lEqlEI1GkUwmA904zO2TP5HuRN0D6fV4dU/x3i1Ndj6eXv+uXbtQXV3tal39/f24/PLLPY05HFtbYby5KexE3QNWWhyLnDLUy3vXq8aZurWAT9O15MzgTERK8jpTFxFQncwv7pZXjTM5JKy3GJyJSEmiMnWRJWInnKRD94E/yL3ABWdezET2Bfm+kVUilsnuwB+izl8QrwNWayuCVShE9vG+OUPXEcLyz5/T9QXxOmBw1kQQnwyJgm7dunWebMdKcJLRAEtEUMzeL6/TYbUanvmvdexKRUSBwS5M6kufI6+6Uv3ud78T0pXq0ksvZVcqIlXxyV9d+YGZ50pNXj88sVqbSAGyM2SWytSVf25UnH86LNtXCYMzkQIYPMXxO4P3Y/uitlnoOvQqTaLvA7+vhTBicCYiU36XPJ1UUbtt5CR6hieRY2n72V+72HHJPuYqTiWra8mZDcKISClBadQlKx0i1+vnsfaqQVh7e7uQBmHxeJwNwogovEQMvGG3hGin1Ctzyk0r6xYZTFn9rS4GZyLShtU5lu0EnUKlx0LrkDl+dva6VawiLkXFGg9dq7UZnImoKJVKQzIyf9HDe4ootQPeTWhBamJwJnJBpcAli0qloUKlSZXOg91pKe1W44sK/qQ2BmciFzjohbcKlSb9eIBwUu3sZj8LTYZRaj9UergCvL9PWK1NVEQYApdqmSDJk0gkSlY7JxKJnOte1j2gW/U3RwizhsHZhjAEGFkYuChIrFzPDQ0NOcuJvAdE50XM29TD4GwDAwyROsIcUES3GBeRt6l6PlhyJiLykKx+xLryu/Dg9/YLYXAOiCDfvERhZ7cltQxhzWP8SjeDs6byLxhVn/4o3MKaoXul1DCWbo6/nTxGp/Nsd1+Zt9oT6ODs9VB4RLJYuU51ytiLEZEOu92cSh1fEV2gRC/rhohjbOchw89rkyVnBTHwnqHjMIA68SLjCdODpoh0iOheVOqY53+/bt0619v0iojxy+2sPyjXppcCHZzpDN36QerGi4wnTJmb2cOkHyUvu6XpjRs3OtqOl2ljVbQ+GJyJSCnZD5OXX345AKCrq6vg8qUCTnodxcgOkMXW72UADMr7brt0q9IGGJyJLAlyxqWyXbt2AShe+1MquKXXUYzsACly/mUr7LzKSq8zqO0a+M6ZKMD8qN7TMSMka0S9yy3EzqssFRusEYOzFMxUSQTVMkJe13+RHjfb7jFJl2gbGhos/ZbHPLwYnCVQLVMlvaiaIfO6/ov0uNl2j0l2iTb9WxXeR5vtQ7H9UvUaNcNqbSISgkFQHV4EIT+GIbUyMEqx8bt5jcrH4OwD9jsuTacnc/KfrFKeqkHI7X45/b3XDdtEYMmZLGO/49JUzRRJTcWuF7Pv/BgwxK/+zF5PL2nlXbyX9zeDMxGRBhKJRNEBQ0SUws2WSzcC86qqXFYVtJXBWfhw7R6DM5GiWLUvh5txtAt9Z3VyCy8DFwOk3hicKdRUDoDMXNUVttnsVL5PSmG1NpGGgp6pmtE5o3VKdJpFNowSuW9OGpuKmFRF5WuKwZmIhJOR6YXxgcROmkW2/LbSMErk+XDS2FTE9kUd36B47bXXcNVVV6Gurg5lZWV4/vnnba+DwZlIYWEMpKXIztydvHMWtbwugtg9TaTjx49j9uzZePTRRx2vo0Lg/hBRgCQSiZxRrFTJVFXZDydUOo7Z7LbstlLNrUo6RVRLp3+fSqVyPq+qqkJVVdWw5RcvXozFixe72iZLzkRkKjtzVSWjVWk8aifbUeU45nNavV7oGKiaTrcaGhoQjUYzfy0tLdK2pXVwPnz4sN+7QBQaKrwrtJLpZy9TaC5nEYOQ6PietdgY2k4fNtKN0Nz0AZdJZIOwRCKBZDKZ+Vu7dq20/dY6ONfX1/u9C6GnSqZD8ulYGio0l/PNN99se11BeM+avR/5VdnFxtIuJt0Izep80F4fC5HBORKJ5PyZVWmLonVwJv+pkunoyMowiHSGCl2hvLzWrVbfy35gsBpws//rdn10BoNzHmaI5BU3I1WFTdiOhdXAqcJxKVbyJucYnPPwAvOHnYci2Q9QfEALPtFTLoqi27Wnw/76MQhJf38/Ojs70dnZCQA4dOgQOjs70d3dbXkdDM6kBDsPRbIfoPiApiY7o1/lB438qle771fNhusstLzIqmbVp5e1eq/4GcT9CM5vvvkm5syZgzlz5gAA1qxZgzlz5mD9+vWW18HgTERasDP6VX7QKFX1um7dOmGDj/g94pcIboJpoRm5wuQrX/kKDMMY9rd582bL62BwpmF0qKoiMuP02nUyhWSQA46btKl2XEIxtvZ99903bIenT5+e+f7EiRNobm7G+PHjUV1djWXLlqG3tzdnHd3d3Vi6dCnGjBmDSZMm4e6778apU6fEpIaEUO3movCyG2xlXLvFqrCdkvEA7KT1v0qDulAu2yXnL33pS/joo48yf6+//nrmuzvuuAMvvPACnn32WbS1teHIkSO49tprM9+fPn0aS5cuxeDgIHbv3o2nnnoKmzdvtlUPT0Th4dWDopUJKkSS9RBh93tR3alIPNvBuaKiArFYLPM3YcIEAEAymcTjjz+Ohx56CFdccQXmzp2LJ598Ert378aePXsAAC+//DLeffdd/OIXv8D555+PxYsX4wc/+AEeffRRDA4Oik1ZSPCpNry8OPdhub7s9Of1k9PSbz6/G5p5eSxDUa0NAB988AHq6urw+c9/HsuXL880De/o6MDJkyfR1NSUWXb69OmYMmUK2tvbAQDt7e2YOXMmamtrM8ssWrQIqVQKBw4cKLjNgYEBpFKpnD86g0+14SXi3HtdYtSZrGNRqGU5MDyIpqvYs5dxsl9+NTRLa2ho8Gz45VAE53nz5mHz5s146aWXsGnTJhw6dAiXXnopjh07hp6eHlRWVqKmpibnN7W1tejp6QEA9PT05ATm9Pfp7wppaWnJGWycGQaRGIXuJRVKiW6JbnEsaz2FWpYD5kHUz8FHRF4XHH65OFvBefHixfjbv/1bzJo1C4sWLUJrayuOHj2KX/3qV7L2DwCwdu3anMHGg5BxEKksCA/AZqXMYrInwxCVfrOxrHVi1r+70HLFagDMcOKi4lx1paqpqcF5552HDz/8ELFYDIODgzh69GjOMr29vYjFYgCAWCw2rPV2+t/pZcxUVVUNG3CcSBU6ZrphUaqUmX3uinWnKvVbq/tS6PeqzuhkZ37nYjUAZrwqOYeiWjtff38//vjHP2Ly5MmYO3cuRo4ciZ07d2a+P3jwILq7uxGPxwEA8XgcXV1d6OvryyyzY8cORCIRNDY2utkVTzATJjNBKGWGlRf9ea30k7YTBGVx8rBA8tgKznfddRfa2trwpz/9Cbt378Y111yD8vJyXHfddYhGo1i1ahXWrFmDXbt2oaOjAytXrkQ8Hsf8+fMBAAsXLkRjYyNuuOEGvPPOO9i+fTvuvfdeNDc3S516SxRdWnSK4neLTiotSNebTH4eJxkBVXZ6Su2z2UxUquYXoSg5Hz58GNdddx2mTZuGv/u7v8P48eOxZ88eTJw4EQDw8MMP48orr8SyZctw2WWXIRaL4bnnnsv8vry8HNu2bUN5eTni8Tiuv/56rFixAvfff7/YVPkoSKUov1t0UmlBut7sshOg3B4n2RNd+DHYitX3ycW2n/2bmTNnut4nGXQNzmWGYRieb9WlVCqFaDSKZDLJ989ERC4lEolMoF23bp3t9+9OyM7H0+s/dOgQxo4d62pdx44dw9SpUz2NORxbm4gCL6zV/1bTnV0C9iIwU2kMzh4Ia8YgmqrvtMg7Tuf9TgefIFxDVrqHFZsaU8b+yFxeBN2qtAEGZ+myq4vIHb4DDx8r8zAXYras3WtIZiBxOh+0lUFIvMxz7G7L6/xQ13fODM6SeTHEotVlSCwec/lKzcNcit2BMQptX4bsdWeX6IM4apvO++4XBmcNcOaY4VS42cN2zHVkd2AMv1gp0fvdJcvNPafqcVcZgzNpiTc7ecmP6m0vuH1NYIXfD9Ks1iYiCiiZAxCp9qDpJB3FfqNa+nTB4ExEyhI1f7HI3xeiehCyOgmIk3SonHaWnIkc8LvKi9Rmlum7nenJbJ1huA6LtfKW+cAThmMrA4Mz+UrlJ25SX/r6sdrvt9Dnfl6HIqqR7awje2rMNLfpL/Z73uPOMDiTUGY3PsnntHQiulTjVynJab9fUYHD65bMblqhqzACmJfXia7V2hxbm4iIPOfV2NqJRML1+lOpFBoaGji2NhGRVVYbOjldd5DJqHFR7f2zriVnBmcNBD2DIHLDynCWbtZdSBDG6TZLX2trq6UhREV/R7kYnCUSFVR5QVMxfHjzh5djvXv5ILBkyRLmOQpgcJYorBe4SsFCpX2RJazXme7sXJuFHgS8ur51bjjIam0SIgjBRKVgodK+EGUTcW16dX2LbtXO+7I0BmfFiL5ogxDsswUtPUAw00SlqX7eZexfdv52+PBh4esPEgbngAvaE2rQ0gMEM00qSL+nFT1WtCiqn3fZ+1dfXy91/Wms1qZQUf2pn/Ql6tpKv6cN2ljRhYg6bjLubeYX9jE4kyNBnBCe1OBnYCzUKlqHKSNFHTc36ymUFh0fdvzG4ExC8SYkP4gubeeTOZdxkO4ZFdPCam0iIgnSAU7HOYP92i9VarBU2Q8dMTgT/R8/M5IgjDYlSzrA+RHorJ4X1YaslHWs7KYlfz8YrK1jcCb6P36WvrwcbYrOsBJ4s89LsWkaZQ5Z6eVMb26morTC6hSfIrFam4jIBr8bWZV6IMoP3qWmacyvfnebvvTvvZzisVQaVWh0FhYMzkRgdZsfZGbQItZttzZDdCBTJYDx3vAHgzPx5oM6GaEZnp/iZE4ZqQIZ0zra0dDQIGRd6fPk9bnStVq7wvMtkiWJREK7cXNJDp6f4lQ7PqL3x+n6urq6lKmG9jI/CwqWnAUS+UTIC5nIuiCXnJ3Kr5bPPkaiSsJWMT+zL9TBWVZLRNIfuzbJI3tCBVVZaQkt8yEj+xg57eJktYU6uRfq4MyLKxycZHjs2iRP0O87N0NYinq/a5fVc6LjudP1nXOogzOFg44ZCukjP5i6DXR+X6+sNVIDgzMRKcerEbdErMurYCr6nXEhMmuNGPitY3AmIuXIHHGr2Lpkj5DlRrF3xn6yE3D9eF3Eam0NqXTjEZE9fjYss7NtWfmMKvlXsVbhxRw+fFjG7gRGqIOz7KdPVW4eoiDyovSYvQ2nLZWdBvxS+Uex9fqV99jpz1xfXy95b/QW6uAsm0pVT37ycuB+IqcKVc+mA53s+1nk8J8i9tVJgFcxz2O1dgCx5CuGlwP3kzVOru1Cv9HlPim1n4Xeh9oNOIWGqHTaGMqrBnBOW52THNoHZ6867RMFiZNrW4WuP27e9RaqohatoaEhp79y+r9OG0OJnGbRbUM7XR7EgkD74MwASjpiJmdfsfeZZsfTTSCye37MpolMb0Pm+NZeX0dmg6Sofi2zWjtgVL/gSG98qCwtv1+vjO5VbkbzMlvebQC125fZj+tI1hzPlIvBuQBecET+sjMWtNNxqr1u8e3F76zwqvDBQo5zDM4UOsww9Gel9CYzuLkZ6arY9Sdqn910wxJJhap4VmsTaYK1IlSI1cBRrHFXodbaaV50c1L5Gld531TC4ExE9H9EBI50a22ZnKyfNUZ6YXAugRc0BRWv7XCxUsVs1urc7N+FqDixBau1Q4oZnBg8ju4EZTQnK3itnJEdCJ0ek0Lv7p22yOY86OIwOJdQ6qLUNYNTDcc5dyfI16Gbkauc9ldWmdmgJjKPCfmDwZlCIcjBK+i8GGO61PjZVgOaF4HP7bUctnuB1doa4ZMjkXr8vC9F1ZCV6o/tFztjaquyz2EXyuDMlo7kBq8FOdyW6PxujJS/fTvTJ1rh5rqTMbpaIardH36WnB999FGcc845GDVqFObNm4c33njD8m9DGZydCFtVEBXGa0FNXjVGKjQFav72nc7jXIjTiSnsBktWm4vxzDPPYM2aNdiwYQPeeustzJ49G4sWLUJfX5+l35cZhmFI3kfhkskkampqkEgkEIlEbP328OHDnOSbcrz88stobGzkdaGYMN2rXqTVyja8POapVAoNDQ04evQootGolPVHo1FHccJsXelJP7LXVVVVhaqqKtPfzJs3DxdddBF++tOfAgCGhobQ0NCAW2+9Fffcc0/JbVa42mOffPLJJwD4hEZEpLtjx45JCc6VlZWIxWLC4kR1dfWwdW3YsAH33XffsGUHBwfR0dGBtWvXZj4bMWIEmpqa0N7ebml7WgbncePGAQC6u7ulnFRVFXp6C7owpjuMaQbCme4wphkADMPAsWPHUFdXJ2X9o0aNwqFDhzA4OChkfYZhDHv3XKjU/Oc//xmnT59GbW1tzue1tbV4//33LW1Py+A8YsSZV+XRaDRUF3NaJBJhukMijGkGwpnuMKZZduFq1KhRGDVqlNRtyMIGYURERAJNmDAB5eXl6O3tzfm8t7cXsVjM0joYnImIiASqrKzE3LlzsXPnzsxnQ0ND2LlzJ+LxuKV1aFmtXVVVhQ0bNhSs7w8qpjs86Q5jmoFwpjuMaQ6DNWvW4MYbb8SFF16Iiy++GD/60Y9w/PhxrFy50tLvtexKRUREpLqf/vSnePDBB9HT04Pzzz8fjzzyCObNm2fptwzOREREiuE7ZyIiIsUwOBMRESmGwZmIiEgxDM5ERESK0TI4u5mGSzWvvfYarrrqKtTV1aGsrAzPP/98zveGYWD9+vWYPHkyRo8ejaamJnzwwQc5y3z66adYvnw5IpEIampqsGrVKvT393uYCntaWlpw0UUXYezYsZg0aRKuvvpqHDx4MGeZEydOoLm5GePHj0d1dTWWLVs2rEN/d3c3li5dijFjxmDSpEm4++67cerUKS+TYsumTZswa9aszEhQ8XgcL774Yub7IKY53wMPPICysjLcfvvtmc+CmO777rtv2JSD06dPz3wfxDSTYIZmtmzZYlRWVhpPPPGEceDAAeM73/mOUVNTY/T29vq9a460trYa69atM5577jkDgLF169ac7x944AEjGo0azz//vPHOO+8Yf/M3f2NMnTrV+OyzzzLLfO1rXzNmz55t7Nmzx/jd735nnHvuucZ1113ncUqsW7RokfHkk08a+/fvNzo7O40lS5YYU6ZMMfr7+zPL3HzzzUZDQ4Oxc+dO48033zTmz59v/PVf/3Xm+1OnThkzZswwmpqajLfffttobW01JkyYYKxdu9aPJFny29/+1vjP//xP47/+67+MgwcPGv/0T/9kjBw50ti/f79hGMFMc7Y33njDOOecc4xZs2YZt912W+bzIKZ7w4YNxpe+9CXjo48+yvx9/PHHme+DmGYSS7vgfPHFFxvNzc2Zf58+fdqoq6szWlpafNwrMfKD89DQkBGLxYwHH3ww89nRo0eNqqoq4z/+4z8MwzCMd9991wBg7Nu3L7PMiy++aJSVlRn/8z//49m+u9HX12cAMNra2gzDOJPGkSNHGs8++2xmmffee88AYLS3txuGceahZsSIEUZPT09mmU2bNhmRSMQYGBjwNgEunH322ca///u/Bz7Nx44dM77whS8YO3bsMP7f//t/meAc1HRv2LDBmD17tul3QU0ziaVVtXZ6Gq6mpqbMZ3an4dLJoUOH0NPTk5PeaDSKefPmZdLb3t6OmpoaXHjhhZllmpqaMGLECOzdu9fzfXYimUwC+MtsYx0dHTh58mROuqdPn44pU6bkpHvmzJk5s74sWrQIqVQKBw4c8HDvnTl9+jS2bNmC48ePIx6PBz7Nzc3NWLp0aU76gGCf6w8++AB1dXX4/Oc/j+XLl6O7uxtAsNNM4mg1fKeIabh00tPTAwCm6U1/19PTg0mTJuV8X1FRgXHjxmWWUdnQ0BBuv/12XHLJJZgxYwaAM2mqrKxETU1NzrL56TY7LunvVNXV1YV4PI4TJ06guroaW7duRWNjIzo7OwOb5i1btuCtt97Cvn37hn0X1HM9b948bN68GdOmTcNHH32E73//+7j00kuxf//+wKaZxNIqOFPwNDc3Y//+/Xj99df93hVPTJs2DZ2dnUgmk/j1r3+NG2+8EW1tbX7vljSJRAK33XYbduzYoe3UfU4sXrw48/+zZs3CvHnz8LnPfQ6/+tWvMHr0aB/3jHShVbW2iGm4dJJOU7H0xmIx9PX15Xx/6tQpfPrpp8ofk9WrV2Pbtm3YtWsX6uvrM5/HYjEMDg7i6NGjOcvnp9vsuKS/U1VlZSXOPfdczJ07Fy0tLZg9ezZ+/OMfBzbNHR0d6OvrwwUXXICKigpUVFSgra0NjzzyCCoqKlBbWxvIdOerqanBeeedhw8//DCw55rE0io4i5iGSydTp05FLBbLSW8qlcLevXsz6Y3H4zh69Cg6Ojoyy7zyyisYGhqyPMC61wzDwOrVq7F161a88sormDp1as73c+fOxciRI3PSffDgQXR3d+eku6urK+fBZMeOHYhEImhsbPQmIQIMDQ1hYGAgsGlesGABurq60NnZmfm78MILsXz58sz/BzHd+fr7+/HHP/4RkydPDuy5JsH8bpFm15YtW4yqqipj8+bNxrvvvmvcdNNNRk1NTU6rRp0cO3bMePvtt423337bAGA89NBDxttvv23893//t2EYZ7pS1dTUGL/5zW+MP/zhD8bXv/51065Uc+bMMfbu3Wu8/vrrxhe+8AWlu1LdcsstRjQaNV599dWcrib/+7//m1nm5ptvNqZMmWK88sorxptvvmnE43EjHo9nvk93NVm4cKHR2dlpvPTSS8bEiROV7mpyzz33GG1tbcahQ4eMP/zhD8Y999xjlJWVGS+//LJhGMFMs5ns1tqGEcx033nnncarr75qHDp0yPj9739vNDU1GRMmTDD6+voMwwhmmkks7YKzYRjGT37yE2PKlClGZWWlcfHFFxt79uzxe5cc27VrlwFg2N+NN95oGMaZ7lT//M//bNTW1hpVVVXGggULjIMHD+as45NPPjGuu+46o7q62ohEIsbKlSuNY8eO+ZAaa8zSC8B48sknM8t89tlnxne/+13j7LPPNsaMGWNcc801xkcffZSznj/96U/G4sWLjdGjRxsTJkww7rzzTuPkyZMep8a6b3/728bnPvc5o7Ky0pg4caKxYMGCTGA2jGCm2Ux+cA5iur/5zW8akydPNiorK42/+qu/Mr75zW8aH374Yeb7IKaZxOKUkURERIrR6p0zERFRGDA4ExERKYbBmYiISDEMzkRERIphcCYiIlIMgzMREZFiGJyJiIgUw+BMRESkGAZnIiIixTA4ExERKYbBmYiISDH/H64B4/N4+fbNAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, the generated synthetic network reflects an assortative community structure as imposed with the parameter `structure`. In this setting, nodes tend to connect more within their own communities than with nodes from other communities, resulting in higher edge densities within the diagonal blocks of the adjacency matrix. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When `output_adj=True`, the function saves the network edges as a dataframe into the `syn_dataframe.dat` file in the output folder. The first and the second columns of the dataframe describe the source and the target nodes, respectively, and the last column represents the weight of their interactions. " + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:52.089580Z", + "start_time": "2025-01-27T14:45:52.066550Z" + } + }, + "source": [ + "import pandas as pd\n", + "\n", + "# Load the dataframe\n", + "df = pd.read_csv(\n", + " synthetic_configuration[\"out_folder\"] + synthetic_configuration[\"outfile_adj\"],\n", + " sep=\" \",\n", + ")\n", + "# Print the first 5 rows of the dataframe\n", + "df.head()" + ], + "outputs": [ + { + "data": { + "text/plain": [ + " source target w\n", + "0 0 18 1\n", + "1 0 50 1\n", + "2 0 95 1\n", + "3 0 196 1\n", + "4 0 204 1" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sourcetargetw
00181
10501
20951
301961
402041
\n", + "
" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are all set now! In the next section, we will use the `probinet` package to analyze the network\n", + "and extract the community structure and reciprocity coefficient." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyzing the network using the `probinet` package\n", + "\n", + "First, we start by importing the data using the `probinet` package. This means, we will load the data \n", + "from the `syn_dataframe.dat` file and generate the adjacency matrices needed to run the `CRep` algorithm." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "ExecuteTime": { + "end_time": "2025-01-27T14:45:52.733083Z", + "start_time": "2025-01-27T14:45:52.122398Z" + } + }, + "source": [ + "from probinet.input.loader import build_adjacency_from_file\n", + "from pathlib import Path\n", + "\n", + "# Define the names of the columns in the input file that\n", + "# represent the source and target nodes of each edge.\n", + "ego = \"source\"\n", + "alter = \"target\"\n", + "\n", + "# Set the `force_dense` flag to False\n", + "force_dense = False\n", + "\n", + "# Set the `binary` flag to False to load the edge weights\n", + "binary = False\n", + "\n", + "# Call the `build_adjacency_from_file` function to load the data from the input file\n", + "graph_data = build_adjacency_from_file(\n", + " Path(synthetic_configuration[\"out_folder\"])\n", + " / synthetic_configuration[\"outfile_adj\"],\n", + " ego=ego,\n", + " alter=alter,\n", + " force_dense=force_dense,\n", + " binary=binary,\n", + " header=0,\n", + ")" + ], + "outputs": [], + "execution_count": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get some information about the data, we can call the `print_graph_stats` function from the\n", + "`input.stats` module." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:52.914251Z", + "start_time": "2025-01-27T14:45:52.792399Z" + } + }, + "source": [ + "from probinet.input.stats import print_graph_stats\n", + "\n", + "# Extract the list of graphs\n", + "A = graph_data.graph_list\n", + "# Call the `print_graph_stats` function to print the basic\n", + "# statistics of the graphs in the list `A`.\n", + "print_graph_stats(A)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of nodes = 600\n", + "Number of layers = 1\n", + "Number of edges and average degree in each layer:\n", + "E[0] = 5217 / = 17.39\n", + "M[0] = 6016 - = 20.053\n", + "Sparsity [0] = 0.014\n", + "Reciprocity (networkX) = 0.000\n" + ] + } + ], + "execution_count": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the network is loaded, we can give it as input to the `CRep` algorithm to obtain estimates of the latent\n", + "variables describing the communities and the reciprocity. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the model\n", + "Finally, we are ready to run the `CRep` model! The way this works is in a two-step process:
\n", + "1. Initialize the `CRep` model by creating an instance of the `CRep` class.\n", + "2. Execute the `fit` method on the created instance to run the algorithm.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:45:53.018588Z", + "start_time": "2025-01-27T14:45:53.004569Z" + } + }, + "source": [ + "# Import the `CRep` class from the `probinet.models.crep` module\n", + "from probinet.models.crep import CRep\n", + "\n", + "# Create an instance of the `CRep` class\n", + "model = CRep()\n", + "\n", + "# Print all the attributes of the `CRep` instance\n", + "# The `__dict__` attribute of an object is a dictionary containing\n", + "# the object's attributes.\n", + "print(model.__dict__)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'inf': 10000000000.0, 'err_max': 1e-12, 'err': 0.1, 'num_realizations': 5, 'convergence_tol': 0.0001, 'decision': 10, 'max_iter': 1000, 'plot_loglik': False, 'flag_conv': 'log', '__doc__': '\\n Base class for the models classes that inherit from the ModelBaseParameters class. It contains the\\n methods to check the parameters of the fit method, initialize the parameters, and check for\\n convergence. All the models classes should inherit from this class.\\n ', 'attributes_to_save_names': ['u_f', 'v_f', 'w_f', 'eta_f', 'final_it', 'maxL', 'maxPSL', 'beta_f', 'nodes', 'pibr', 'mupr'], 'u_f': array([], dtype=float64), 'v_f': array([], dtype=float64), 'w_f': array([], dtype=float64), 'use_unit_uniform': False, 'theta': {}, 'normalize_rows': False, 'nodes': [], 'rng': Generator(PCG64) at 0x7BD954D0F840, 'beta_hat': array([], dtype=float64), 'best_r': 0, 'final_it': 0, 'message_for_invalid_initialization': 'The initialization parameter can be either 0 or 1. If 0, the model will be initialized randomly. If 1, the model will be initialized with the parameters stored in the file specified in the `files` parameter.', 'eta_f': 0.0}\n" + ] + } + ], + "execution_count": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Model created! Now, we can run the model using the `fit` method." + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "ExecuteTime": { + "end_time": "2025-01-27T14:46:16.537641Z", + "start_time": "2025-01-27T14:45:53.052185Z" + } + }, + "source": [ + "# Import the needed modules\n", + "import time\n", + "import numpy as np\n", + "\n", + "# Get the current time\n", + "time_start = time.time()\n", + "\n", + "# Run the `CRep` models\n", + "inferred_parameters = model.fit(\n", + " graph_data,\n", + " out_inference=True,\n", + " out_folder=synthetic_configuration[\"out_folder\"],\n", + ")\n", + "\n", + "# Print the time elapsed since the start of the `CRep` algorithm\n", + "print(f\"\\nTime elapsed: {np.round(time.time() - time_start, 2)} seconds.\")" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Algorithm successfully converged after 681 iterations with a maximum log-likelihood of -15729.3730.\n", + "INFO:root:Inferred parameters saved in: /home/dtheuerkauf/software-workshop/prob-gen-model-for-nets/docs/source/tutorials/tutorial_outputs/CRep_synthetic/theta.npz\n", + "INFO:root:To load: theta=np.load(filename), then e.g. theta[\"u\"]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Time elapsed: 23.48 seconds.\n" + ] + } + ], + "execution_count": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Done! The model has been run and the results are stored into the variable `inferred_parameters` and saved into the file `theta_CRep.npz` in the output folder." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyzing the results\n", + "We can now retrieve the results from the saved file. " + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:16.624423Z", + "start_time": "2025-01-27T14:46:16.608333Z" + } + }, + "source": [ + "filename = synthetic_configuration[\"out_folder\"] + \"/theta.npz\"\n", + "# Load the contents of the file into a dictionary\n", + "theta = np.load(filename)" + ], + "outputs": [], + "execution_count": 14 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:16.806167Z", + "start_time": "2025-01-27T14:46:16.783651Z" + } + }, + "source": [ + "# Unpack the latent variables from the results of the `CRep` models\n", + "# The `u` variable represents the out-going memberships of the\n", + "# nodes in the graph.\n", + "# The `v` variable represents the in-coming memberships of the\n", + "# nodes in the graph.\n", + "# The `w` variable represents the affinity of the communities\n", + "# The `eta` variable represents the reciprocity coefficient\n", + "u, v, w, eta = theta[\"u\"], theta[\"v\"], theta[\"w\"], theta[\"eta\"]" + ], + "outputs": [], + "execution_count": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now compare the inferred parameters with the actual ones.\n", + "\n", + "Notice that we don't expect good results in retrieving the communities because we are in a regime\n", + " with high reciprocity. Indeed, as explained in the main reference {cite}`safdari2021generative`,\n", + " the `CRep` algorithm gives increasingly less weight to the communities as reciprocity increases, resulting in poor community detection performance when the communities are not fully determining edge formation. On the other hand, it well summarizes the network reciprocity." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:17.005703Z", + "start_time": "2025-01-27T14:46:16.875687Z" + } + }, + "source": [ + "import networkx as nx\n", + "\n", + "# Print the actual network reciprocity\n", + "print(f\"Actual network reciprocity: {np.round(nx.reciprocity(A[0]),3)}\")\n", + "# Print the inferred reciprocity coefficient\n", + "print(f\"Inferred reciprocity coefficient: {np.round(eta, 3)}\")" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Actual network reciprocity: 0.638\n", + "Inferred reciprocity coefficient: 0.679\n" + ] + } + ], + "execution_count": 16 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a more graphical approach on how to investigate the results, we invite the reader to take a\n", + "look at the tutorial on the [`JointCRep` algorithm](./JointCRep.ipynb).\n", + "\n", + "Notice also that the `GM_reciprocity` class provides various methods to create synthetic data according different generative assumptions, and the `reciprocity_planted_network` method used in this tutorial is just an example." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This tutorial provides a guide on using the `probinet` package to generate synthetic network data. In particular, it uses the `CRep` algorithm, which is a probabilistic generative method designed to model directed networks assuming that communities and reciprocity are the main mechanisms for tie formation.\n", + "\n", + "The tutorial also shows how to analyze the generated network with the `probinet` package, and how to infer the latent variables using the `CRep` algorithm. In addition, it guides the user on how to import the inferred results.\n" + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:17.276112Z", + "start_time": "2025-01-27T14:46:17.271357Z" + } + }, + "cell_type": "code", + "source": "", + "outputs": [], + "execution_count": null + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,md" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/_sources/tutorials/DynCRep.ipynb b/_sources/tutorials/DynCRep.ipynb new file mode 100644 index 0000000..95ef183 --- /dev/null +++ b/_sources/tutorials/DynCRep.ipynb @@ -0,0 +1,1280 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "# Decoding Temporal Relationships with `DynCRep`\n", + "\n", + "Welcome to our tutorial on `DynCRep` - a cutting-edge tool from the `probinet` package. Traditional network analysis models often fall\n", + "short when it comes to capturing the dynamic nature of real-world networks. `DynCRep` is designed to bridge this gap, providing a robust solution for analyzing and understanding the temporal evolution of complex networks.\n", + " \n", + "The `DynCRep` (**Dyn**amic **C**ommunity and **Re**ci**p**rocity) model is a tool that helps us to \n", + "better \n", + "understand complex, evolving networks. In real-world scenarios, networks are rarely static. They \n", + "change and evolve over time, influenced by various factors such as changing relationships, evolving interests, and temporal events. The `DynCRep` model captures these dynamic interaction patterns by considering the temporal order of connections between pairs of nodes in the network, rather than viewing them independently {cite}`safdari2022reciprocity`. This is a significant departure from standard models, which often assume that the connections between pairs of nodes are independent once we know certain hidden factors. The `DynCRep` model integrates community structure and reciprocity as key structural information of networks that evolve over time. In this tutorial, we will guide you through the process of applying the `DynCRep` model to a dynamic network.\n", + "\n", + "> **_NOTE:_** We suggest the reader to have a basic understanding of the `CRep` and `JointCRep` \n", + "> models before diving into this tutorial. If you are not familiar with these models, we \n", + "> recommend checking out our tutorials [`CRep` algorithm](./CRep.ipynb) and [`JointCRep` \n", + "> algorithm](./JointCRep.ipynb) before proceeding with this one." + ], + "id": "4f53d59b92e1690e" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Data generation", + "id": "db00d6b74c4c30ee" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Before we dive into the tutorial, let's take a moment to understand the key idea behind the \n", + "`DynCRep` model. The `DynCRep` model considers a temporal network as a sequence of adjacency\n", + "matrices `A` where `A[t]` represents the adjacency matrix of the network at time _t_. The model \n", + "takes in the sequence of adjacency matrices `A` and learns the parameters of the model that best \n", + "describe the temporal relationships between nodes in the network. \n", + "\n", + "For this tutorial, we will use synthetic data generated using the `SyntheticDynCRep` class from the `probinet\n", + "synthetic.dynamic` module. This is the generative model created using the same modelling\n", + "assumptions as the `DynCRep` model. It takes in the parameters:\n", + "1. `N` - The number of nodes in the network.\n", + "2. `K` - The number of communities in the network.\n", + "3. `T` - The number of time steps in the network. \n", + "4. `avg_degree` - The average degree of nodes in the network.\n", + "5. `structure` - The structure of the network. \n", + "6. `ExpM` - The expected number of edges in the network. \n", + "7. `eta` - The reciprocity parameter. \n", + "8. `corr` - The correlation between u and v synthetically generated. \n", + "9. `over` - The fraction of nodes with mixed membership. \n", + "10. `undirected` - Whether the network is undirected. \n", + "\n", + "To gain a deeper understanding of how these parameters influence the model, we can experiment by \n", + "adjusting some of them and observing the resulting changes. Let's begin with a straightforward scenario: a network with 50 nodes, divided into 2 communities, observed over a single time step. We'll set the average degree of the nodes to 5. We'll then examine the structure of the network when the parameters are set to create an assortative network." + ], + "id": "8189fd133afd1b7d" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:35.526568Z", + "start_time": "2024-11-07T17:45:32.308679Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.synthetic.dynamic import SyntheticDynCRep\n", + "\n", + "# Set the number of nodes, communities, and time steps\n", + "N = 50\n", + "K = 2\n", + "T = 0 # total number of time steps is T+1\n", + "avg_degree = 5\n", + "\n", + "# Structure of the network\n", + "structure = \"assortative\" # This is the default value\n", + "\n", + "# Initialize the synthetic network class\n", + "synthetic_dyncrep = SyntheticDynCRep(\n", + " N=N, K=K, T=T, verbose=2, avg_degree=avg_degree, figsize=(3, 3), fontsize=10\n", + ")\n", + "\n", + "temporal_network = synthetic_dyncrep.generate_net()" + ], + "id": "870f30f609a456c4", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 1 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As seen above, the network has been generated with the specified parameters. It consists of 50 nodes clustered into 2 communities. The network is assortative, meaning that nodes are more likely to connect to nodes within the same community. This explains why the adjacency matrix\n", + "looks like a diagonal-block matrix. Let's see what happens if the structure is changed to \n", + "disassortative." + ], + "id": "ede6041074fe5267" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:36.045229Z", + "start_time": "2024-11-07T17:45:35.602708Z" + } + }, + "cell_type": "code", + "source": [ + "# Set logging level to DEBUG\n", + "import logging\n", + "\n", + "# Make it be set to DEBUG\n", + "logging.getLogger().setLevel(logging.DEBUG)\n", + "logging.getLogger(\"matplotlib\").setLevel(logging.WARNING)\n", + "\n", + "# Structure of the network\n", + "structure = \"disassortative\"\n", + "\n", + "# Initialize the synthetic network class\n", + "synthetic_dyncrep = SyntheticDynCRep(\n", + " N=N,\n", + " K=K,\n", + " T=T,\n", + " verbose=2,\n", + " avg_degree=avg_degree,\n", + " figsize=(3, 3),\n", + " fontsize=10,\n", + " structure=structure,\n", + ")\n", + "\n", + "# Generate synthetic dynamic network\n", + "temporal_network = synthetic_dyncrep.generate_net()" + ], + "id": "773600db7d8053d4", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=0\n", + "DEBUG:root:Number of nodes: 50 \n", + "Number of edges: 138\n", + "DEBUG:root:Average degree (2E/N): 5.52\n", + "DEBUG:root:Reciprocity at t: 0.11594202898550725\n", + "DEBUG:root:------------------------------\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASAAAAEYCAYAAAD8qitAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAv7klEQVR4nO3dfVhUZd4H8O8ZZAYEZhSMNwWxNLUUTUiY3taKIiuTla7LXDdZJVsNXJX2SWlVKivc2nwpSXsMtXqWZN1WW9Mwo9RSBMPo0RXxDR9YdSAsGcB4kfk9f7AcHRngHJjhzBl+H69zXc6Ze875nRF+3vd97vs+AhERGGNMARqlA2CM9V6cgBhjiuEExBhTDCcgxphiOAExxhTDCYgxphhOQIwxxXACYowphhMQY0wxLpWAXnrpJYwdO7bd18xx1PBdC4KA7du3Kx0Gu45TJ6C8vDy4ubnhscce69Ln//jHPyI3N9fOUfUeEyZMwIIFCySV7YnvevPmzejXr1+n5dpLhhcvXsTEiRPtH5gEGRkZCAsLg4eHB6KiolBQUKBIHM7GqRNQZmYm5s2bh/379+PChQuyP+/t7Q0/Pz8HRMZaERGuXr2qiu86MDAQOp2ux8+bnZ2NlJQUpKWl4ciRIxgzZgxiY2NRWVnZ47E4HXJSNTU15O3tTSdOnKCpU6fSa6+91qZMeno6+fv7k7e3N82aNYsWLVpEY8aMEd9PS0uzel1QUEAxMTHk5+dHer2e7rvvPiosLLQ65s8//0zPPvss+fv7k06no9tvv5127Nghvv/NN9/QPffcQx4eHjRo0CCaN28e1dbWiu8PHjyYXnvtNZo5cyZ5e3tTSEgIvffee1bnKC8vp6eeeor69+9Pffv2pYiICDp06BCVlpaSIAh0+PBhq/KrVq2i0NBQam5utvldDR48mJYvX05PP/00eXl5UWhoKH366adUWVlJTzzxBHl5edHo0aOtjltVVUVPPfUUBQcHk6enJ40aNYqysrLE9xMSEgiA1VZaWkpff/01AaBdu3bRuHHjyN3dnb7++mur7/qXX36h2267jWbPni0e7/Tp0+Tt7U2ZmZk2r4GI6K233qJRo0ZR3759adCgQTR37lyqqakhIhLPe/2WlpbW5hibNm1qU27Tpk1ERASAtm3bRkREpaWlBICys7PFf8/IyEgqKSmhgoICioiIIC8vL3rkkUeosrLS6hwbNmygESNGkE6no+HDh1NGRka710RENH78eEpKShJfNzc3U3BwMKWnp3f4ud7AaRNQZmYmRUZGEhHRjh076JZbbiGLxSK+n52dTTqdjt5//306ceIE/elPfyIfH58OE1Bubi599NFHVFxcTMePH6fExEQKCAggs9lMRC0/GNHR0XT77bfTF198QWfOnKEdO3bQrl27iKjll8jLy4tWrVpFJ0+epAMHDtAdd9xBv/vd78RzDB48mHx9fSkjI4NOnTpF6enppNFo6MSJE0TUklhvvvlmuvfee+mbb76hU6dOUXZ2Nh08eJCIiB566CF67rnnrL6L8PBwWrZsWbvfVes5169fTydPnqS5c+eSXq+nRx55hP72t79RSUkJxcXF0ciRI8Xv8N///je9+eab9P3339OZM2fo7bffJjc3N8rPzyciosuXL5PRaKTZs2fTxYsX6eLFi3T16lUxEYSHh9MXX3xBp0+fpkuXLrX5rr///nvSarW0fft2unr1KkVHR9Ovf/3rDv/NV61aRV999RWVlpZSbm4uDR8+nObOnUtERA0NDbR69WrS6/ViPK3J6XpXrlyh559/nm6//Xax3JUrV4jIdgIaMWIE5eTk0PHjxyk6OpoiIiJowoQJ9O2339KRI0do6NChNGfOHPH4//M//0NBQUH0ySef0NmzZ+mTTz4hX19f2rx5s81ramhoIDc3N/G8rWbMmEFPPPFEh99Hb+C0Ceiuu+6i1atXExFRU1MTDRgwgL7++mvxfaPR2OYXNSoqqsMEdKPm5mby8fERazi7d+8mjUZDJSUlNssnJibSs88+a7Xvm2++IY1GQ7/88gsRtSSD3/72t+L7FouF/P39ad26dURE9N5775GPjw9dunTJ5jmys7Opf//+VF9fT0REhYWFJAgClZaWtnsdN57z4sWLBICWLl0q7svLyyMAdPHixXaP89hjj9Hzzz8vvv7Vr35F8+fPtyrTmoC2b99utd/Wd/3GG2/QgAEDKDk5mYKCgqiqqqrdc9uydetW8vPzE19v2rSJDAZDp59r79/dVgJ6//33xfc//vhjAkC5ubnivvT0dBo+fLj4+pZbbrGqKRIRLV++nIxGo81Yzp8/TwDE/2Ba/dd//ReNHz++02txdU7ZB1RSUoKCggJMmzYNANCnTx9MnToVmZmZYpni4mJERUVZ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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 2 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As seen above, the network now has a disassortative structure, meaning that nodes are more likely\n", + " to connect to nodes in different communities. This is reflected in the adjacency matrix, which \n", + " has connections off the diagonal. \n", + " \n", + "Notice that the generated network has about 140 edges. If we want to generate a network with a \n", + "larger number of edges, we can increase the `ExpM` parameter. Let's see what happens when we set it to 200." + ], + "id": "d21fc63eff17e73c" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:37.008779Z", + "start_time": "2024-11-07T17:45:36.470099Z" + } + }, + "cell_type": "code", + "source": [ + "# Set the expected number of edges\n", + "ExpM = 200\n", + "\n", + "# Initialize the synthetic network class\n", + "synthetic_dyncrep = SyntheticDynCRep(\n", + " N=N,\n", + " K=K,\n", + " T=T,\n", + " verbose=2,\n", + " avg_degree=avg_degree,\n", + " figsize=(3, 3),\n", + " fontsize=10,\n", + " structure=structure,\n", + " ExpM=ExpM,\n", + ")\n", + "\n", + "# Generate synthetic dynamic network\n", + "temporal_network = synthetic_dyncrep.generate_net()" + ], + "id": "dd099629ae9656e5", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=0\n", + "DEBUG:root:Number of nodes: 50 \n", + "Number of edges: 201\n", + "DEBUG:root:Average degree (2E/N): 8.04\n", + "DEBUG:root:Reciprocity at t: 0.11940298507462686\n", + "DEBUG:root:------------------------------\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 3 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Now the resulting network has about 200 edges, as specified by the `ExpM` parameter.\n", + "\n", + "Another key element of the `DynCRep` model is the reciprocity parameter `eta`. This parameter \n", + "determines the level of reciprocity in the network, i.e., the likelihood that a connection between\n", + " two nodes is reciprocated. The difference between this reciprocity parameter and the one \n", + " introduced in the standard `CRep` model is that the dependency on the reciprocated tie is on the \n", + " previous time step, while standard `CRep` considers only the same time _t_, being an approach \n", + " valid for static networks. Let's see how the network structure changes with different values of \n", + " `eta`. By default, the `eta` parameter is set to 0. Let's see what happens when we increase to 0\n", + " .5. Notice that to observe the effect of the reciprocity parameter, we need to generate a \n", + " network with more than one time step." + ], + "id": "e1148b94c91b0b4b" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:37.929956Z", + "start_time": "2024-11-07T17:45:37.035518Z" + } + }, + "cell_type": "code", + "source": [ + "# Set the number of time steps\n", + "T = 1\n", + "\n", + "# Set the reciprocity parameter\n", + "eta = 0.5\n", + "\n", + "# Initialize the synthetic network class\n", + "synthetic_dyncrep = SyntheticDynCRep(\n", + " N=N,\n", + " K=K,\n", + " T=T,\n", + " verbose=2,\n", + " avg_degree=avg_degree,\n", + " figsize=(3, 3),\n", + " fontsize=10,\n", + " eta=eta,\n", + ")\n", + "\n", + "# Generate synthetic dynamic network\n", + "temporal_network = synthetic_dyncrep.generate_net()" + ], + "id": "42b78da990f738ea", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=0\n", + "DEBUG:root:Number of nodes: 50 \n", + "Number of edges: 133\n", + "DEBUG:root:Average degree (2E/N): 5.32\n", + "DEBUG:root:Reciprocity at t: 0.09022556390977443\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=1\n", + "DEBUG:root:Number of nodes: 50 \n", + "Number of edges: 149\n", + "DEBUG:root:Average degree (2E/N): 5.96\n", + "DEBUG:root:Reciprocity at t: 0.2684563758389262\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:Compare current and previous reciprocity.\n", + "DEBUG:root:Time step: 1\n", + "DEBUG:root:Number of non-zero elements in the adjacency matrix at time t: 149.0\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t: 0.2684563758389262\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t-1: 0.19463087248322147\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 4 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As seen above (more concretely in the graph statistics), the reciprocity in the second time step \n", + "network is higher than in the first time step network. This is because the `eta` parameter has been\n", + " set to 0.5, which increases the likelihood of reciprocated connections in the network. From a \n", + " graphical perspective, the network structure is more clustered in the second time step, given \n", + " that the existing connections `(i,j)` in the first time step are more likely to be reciprocated \n", + " as `(j,i)` in the second time step. \n" + ], + "id": "46b2cb239e52a104" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "## Decoding Temporal Relationships with `DynCRep`", + "id": "ed662409d15d469e" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "Now that we are more familiar with the generative model, let's move on to the next step: decoding\n", + " the temporal relationships in the network using the `DynCRep` model. For the actual analysis, we\n", + " will generate a synthetic network with 300 nodes, divided into 3 communities, and observed over\n", + " 6 time steps. We will set the average degree of the nodes to 10 and the reciprocity parameter \n", + " to 0.5. " + ], + "id": "7fb4cc3a9708289d" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:42.478949Z", + "start_time": "2024-11-07T17:45:37.951379Z" + } + }, + "cell_type": "code", + "source": [ + "# Set the number of nodes, communities, and time steps\n", + "N = 300\n", + "K = 3\n", + "T = 5\n", + "avg_degree = 10\n", + "eta = 0.5\n", + "\n", + "# Initialize the synthetic network class\n", + "synthetic_dyncrep = SyntheticDynCRep(\n", + " N=N,\n", + " K=K,\n", + " T=T,\n", + " verbose=2,\n", + " avg_degree=avg_degree,\n", + " figsize=(3, 3),\n", + " fontsize=10,\n", + " eta=eta,\n", + ")\n", + "\n", + "# Generate synthetic dynamic network\n", + "A = synthetic_dyncrep.generate_net()" + ], + "id": "dd3f0fdd325fe464", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=0\n", + "DEBUG:root:Number of nodes: 300 \n", + "Number of edges: 1479\n", + "DEBUG:root:Average degree (2E/N): 9.86\n", + "DEBUG:root:Reciprocity at t: 0.0392156862745098\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=1\n", + "DEBUG:root:Number of nodes: 300 \n", + "Number of edges: 1623\n", + "DEBUG:root:Average degree (2E/N): 10.82\n", + "DEBUG:root:Reciprocity at t: 0.17621688231669747\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=2\n", + "DEBUG:root:Number of nodes: 300 \n", + "Number of edges: 1724\n", + "DEBUG:root:Average degree (2E/N): 11.493\n", + "DEBUG:root:Reciprocity at t: 0.24013921113689096\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=3\n", + "DEBUG:root:Number of nodes: 300 \n", + "Number of edges: 1767\n", + "DEBUG:root:Average degree (2E/N): 11.78\n", + "DEBUG:root:Reciprocity at t: 0.2693831352574986\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=4\n", + "DEBUG:root:Number of nodes: 300 \n", + "Number of edges: 1859\n", + "DEBUG:root:Average degree (2E/N): 12.393\n", + "DEBUG:root:Reciprocity at t: 0.2883270575578268\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:t=5\n", + "DEBUG:root:Number of nodes: 300 \n", + "Number of edges: 1894\n", + "DEBUG:root:Average degree (2E/N): 12.627\n", + "DEBUG:root:Reciprocity at t: 0.2925026399155227\n", + "DEBUG:root:------------------------------\n", + "DEBUG:root:Compare current and previous reciprocity.\n", + "DEBUG:root:Time step: 1\n", + "DEBUG:root:Number of non-zero elements in the adjacency matrix at time t: 1623.0\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t: 0.17621688231669747\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t-1: 0.12322858903265557\n", + "DEBUG:root:Time step: 2\n", + "DEBUG:root:Number of non-zero elements in the adjacency matrix at time t: 1724.0\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t: 0.24013921113689096\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t-1: 0.2122969837587007\n", + "DEBUG:root:Time step: 3\n", + "DEBUG:root:Number of non-zero elements in the adjacency matrix at time t: 1767.0\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t: 0.2693831352574986\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t-1: 0.25806451612903225\n", + "DEBUG:root:Time step: 4\n", + "DEBUG:root:Number of non-zero elements in the adjacency matrix at time t: 1859.0\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t: 0.2883270575578268\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t-1: 0.28348574502420654\n", + "DEBUG:root:Time step: 5\n", + "DEBUG:root:Number of non-zero elements in the adjacency matrix at time t: 1894.0\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t: 0.2925026399155227\n", + "DEBUG:root:Fraction of non-zero elements in the transposed adjacency matrix at time t-1: 0.2983104540654699\n" + ] + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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reetqKjAggULMGjQILi5ucHV1RV1dXUoLS0FAOTn56N3794YPHiw2uN/+eUXpKenw9nZmSuRkZFobW1FSUkJVy84OJj7t0wmg4+PDzffkJ+fj1GjRsHDw0OtjKioKNjb22PPnj0A7k4MP/zwwwgICNDat/Yyvb29AQBBQUGdtrW1o6WlBatXr0ZQUBA8PDzg7OyMQ4cOcddCF6NHj9ZZ56WXXsLgwYOxceNGbN26Vecc1Q8//ICJEyfinnvugYuLC+bOnYuqqircunWLV5sMgc91a7tm9fX1KC4uRmxsrMo98NZbb6G4uFi0NlorXczdAEPZsmULmpub4efnx20jIsjlcmzcuBFubm4GnXf+/PmoqqrC+++/j759+0IulyM8PByNjY0AgG7dumk9vq6uDn/729/w/PPPd9rXp08f7t9du3ZV2SeTydDa2spLhoODA+bNm4dt27bhiSeewI4dO/D+++/r7Ft7mTKZTOO2tna8++67eP/997FhwwYEBQWhe/fuWLJkCXctdNG9e3eddW7cuIHLly/D3t4eV65cweTJkzXWvXbtGh599FHExcXh7bffhoeHB06cOIHY2Fg0NjbCycmJV7v0hc91a7tmdXV1AIDNmzd3ejna29urPb+npyfs7e1RUVGhsr2iogI+Pj7Gd0DCSNKCam5uxieffIL33nsP+fn5XPnll1/g5+eHL774AgAwbNgw5OTkqBx7+vRprec+efIknn/+eUydOhUjRoyAXC5HZWUltz84OBi///47Ll++rPb4e++9FxcvXsTAgQM7FQcHB179Cw4ORn5+Pm7evKmxznPPPYcffvgB//rXv9Dc3IwnnniC17n14eTJk5gxYwaefvpphISEoH///p367eDggJaWFoNlPPvsswgKCsL27duxbNkyFBQUaKybl5eH1tZWvPfeexg7diwGDx7c6cst3/YY225NeHt7w8/PD1evXu30+/fr109jW0JDQ1VcMFpbW5GVlaXT4rd2JKmg9u/fj7/++guxsbEIDAxUKTNnzuSGeS+88AK2bt2Kbdu24fLly1i5ciUuXLig9dyDBg3Cp59+ioKCAuTk5CA6OlrFonnooYcwfvx4zJw5E5mZmSgpKcF3332HjIwMAMCyZctw6tQpJCQkID8/H1euXMG+ffuQkJDAu39z5syBj48PoqKicPLkSVy9ehVff/01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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAASgAAAEYCAYAAADvfWu0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/hklEQVR4nO2de1wV1drHfxuEjcgtRG4J4l2Ri4qGZJq9kqBmYnYOImkZ6ZEDlqFmdBQsK8rMbpKWqdjFvFRqmqGEiqmoiZI3REUMTDaGxlUFgfX+4WEOG/ZlZvbM3jN7r2+f9Ulm1qy1ZvbMM8965lnPoyCEEFAoFIoEsTL1ACgUCkUbVEBRKBTJQgUUhUKRLFRAUSgUyUIFFIVCkSxUQFEoFMlCBRSFQpEsVEBRKBTJQgUUhUKRLBYnoJYsWYKBAwdq/ZsiHnK41gqFAtu3bzf1MCj/RfYCKjc3F9bW1hg/fjyv4+fPn4/s7GyBR2U5jBo1CnPnzmVV1xjXOiMjAy4uLnrraROWZWVlGDt2rPADYzEehUKhVvr162f0cUiNDqYegKGsXbsWc+bMwdq1a3H9+nV4e3tzOt7BwQEODg4ijY4CAIQQNDU1yeJae3p6mqzvAQMG4JdffmH+7tBB9o+n4RAZU1NTQxwcHMiFCxdIdHQ0eeutt9rVSUtLI+7u7sTBwYE8//zzZOHChSQ4OJjZn5qaqvb38ePHSXh4OOncuTNxcnIiI0eOJHl5eWpt/v3332TWrFnE3d2dKJVKMmDAALJz505m/6+//koeeeQRYmdnR7p27UrmzJlDamtrmf3dunUjb731FpkxYwZxcHAgPj4+5LPPPlPro7S0lEyZMoU88MADxN7enoSEhJCjR4+S4uJiolAoyG+//aZW/4MPPiC+vr6kqalJ47Xq1q0bWbp0KZk2bRrp1KkT8fX1JTt27CA3btwgTz75JOnUqRMJDAxUa7eiooJMmTKFeHt7k44dO5KAgACyceNGZv+zzz5LAKiV4uJisn//fgKA7N69mwwePJjY2NiQ/fv3q13rO3fuEH9/fzJz5kymvcuXLxMHBweydu1ajedACCHvv/8+CQgIIPb29qRr164kPj6e1NTUEEII02/rkpqa2q6N9evXt6u3fv16QgghAMi2bdsIIYQUFxcTAGTz5s3M7zlkyBBSWFhIjh8/TkJCQkinTp1IZGQkuXHjhlofa9asIf369SNKpZL07duXpKenaz0nQtrfh5T7yFpArV27lgwZMoQQQsjOnTtJz549SXNzM7N/8+bNRKlUki+++IJcuHCB/Oc//yGOjo46BVR2djb56quvSEFBATl//jyJi4sjHh4epLq6mhBCSFNTExk2bBgZMGAA2bt3LykqKiI7d+4ku3fvJoTcf8g6depEPvjgA3Lx4kVy+PBhMmjQIPLcc88xfXTr1o24urqS9PR0cunSJZKWlkasrKzIhQsXCCH3BW+PHj3IiBEjyK+//kouXbpENm/eTI4cOUIIIeTxxx8n//73v9WuRVBQEElJSdF6rVr6XL16Nbl48SKJj48nTk5OJDIykmzZsoUUFhaSqKgo0r9/f+YaXrt2jbz33nvk1KlTpKioiHz88cfE2tqaHDt2jBBCSGVlJQkLCyMzZ84kZWVlpKysjDQ2NjKCIigoiOzdu5dcvnyZ3Lx5s921PnXqFLG1tSXbt28njY2NZNiwYWTSpEk6f/MPPviA7Nu3jxQXF5Ps7GzSt29fEh8fTwghpL6+nnz44YfEycmJGU+L8GrN7du3ybx588iAAQOYerdv3yaEaBZQ/fr1I5mZmeT8+fNk2LBhJCQkhIwaNYocOnSInDx5kvTq1YvMnj2baf/rr78mXl5e5PvvvydXrlwh33//PXF1dSUZGRlazys1NZXY29sTLy8v0r17dzJ16lTyxx9/6LwWloCsBdTDDz9MPvzwQ0IIIffu3SNubm5k//79zP6wsLB2D3JoaKhOAdWWpqYm4ujoyGhIe/bsIVZWVqSwsFBj/bi4ODJr1iy1bb/++iuxsrIid+7cIYTcFxbPPPMMs7+5uZm4u7uTVatWEUII+eyzz4ijoyO5efOmxj42b95MHnjgAXL37l1CCCF5eXlEoVCQ4uJirefRts+ysjICgCxevJjZlpubSwCQsrIyre2MHz+ezJs3j/n70UcfJS+99JJanRYBtX37drXtmq71smXLiJubG0lMTCReXl6koqJCa9+a2Lp1K+ncuTPz9/r164mzs7Pe47T97poE1BdffMHs//bbbwkAkp2dzWxLS0sjffv2Zf7u2bOnmqZJCCFLly4lYWFhWseze/dusmXLFvL777+TzMxMEhYWRnx9fZkXo6UiWyN5YWEhjh8/jpiYGAD35+vR0dFYu3YtU6egoAChoaFqx4WFhelst7y8HDNnzkTv3r3h7OwMJycn1NbWoqSkBACQn5+Prl27ok+fPhqP//3335GRkcHYWxwcHBAREYHm5mYUFxcz9YKCgph/KxQKeHp64saNG0wfgwYNgqurq8Y+oqKiYG1tjW3btgG4bxh+7LHH4Ofnp/PcWvfp4eEBAAgMDGy3rWUcTU1NWLp0KQIDA+Hq6goHBwfs2bOHuRb6GDJkiN468+bNQ58+fbBy5UqsW7cOnTt31ln/l19+wejRo/Hggw/C0dER06ZNw82bN3H79m1WY+IDm+vWcs3q6upQVFSEuLg4tXvgzTffRFFRkdY+xo4di3/84x8ICgpCREQEdu/ejcrKSmzZskWks5IHsrXCrV27Fo2NjWpGcUIIlEolVq5cCWdnZ17tPvvss7h58yY++ugjdOvWDUqlEmFhYWhoaAAAdOzYUefxtbW1+Ne//oUXX3yx3T5fX1/m3zY2Nmr7FAoFmpubWfVha2uL6dOnY/369XjqqaewceNGfPTRR3rPrXWfCoVC67aWcbz33nv46KOP8OGHHyIwMBCdOnXC3LlzmWuhj06dOumtc+PGDVy8eBHW1ta4dOkSIiMjtda9evUqnnjiCcTHx+Ott96Cq6srDh06hLi4ODQ0NMDe3p7VuLjC5rq1XLPa2loAwJo1a9q9HK2trVn36eLigj59+uDy5cu8x20OyFKDamxsxJdffon3338f+fn5TPn999/h7e2Nb7/9FgDQv39/HDt2TO3Yo0eP6mz78OHDePHFFzFu3DgMGDAASqUSFRUVzP6goCBcu3YNFy9e1Hj84MGDcf78efTq1atdsbW1ZXV+QUFByM/Px61bt7TWeeGFF/DLL7/g008/RWNjI5566ilWbXPh8OHDmDhxIp555hkEBwejR48e7c7b1tYWTU1NvPt4/vnnERgYiA0bNmDhwoUoKCjQWjcvLw/Nzc14//33MWzYMPTp0wfXr1/nNR5Dx60NDw8PeHt748qVK+1+/+7du7Nup7a2FkVFRfDy8hJ8jHJClgJq165d+PvvvxEXF4eAgAC1MnnyZGaa99JLL2HdunVYv349Ll68iNTUVJw7d05n271798ZXX32FgoICHDt2DLGxsWoazaOPPoqRI0di8uTJyMrKQnFxMX7++WdkZmYCABYuXIgjR44gMTER+fn5uHTpEnbs2IHExETW5xcTEwNPT09ERUXh8OHDuHLlCr7//nvk5uYydfr3749hw4Zh4cKFiImJ0at18aF3797IysrCkSNHUFBQgH/9618oLy9Xq+Pn54djx47h6tWrqKioYDQJNqSnpyM3NxcbNmxAbGwsoqKiEBsbq1VD69WrF+7du4dPPvkEV65cwVdffYXVq1e3G09tbS2ys7NRUVGhdern5+eH4uJi5Ofno6KiAvX19azHrY/XX38daWlp+Pjjj3Hx4kWcOXMG69evx4oVK7QeM3/+fOTk5ODq1as4cuQIJk2aBGtra8aEYanIUkCtXbsW4eHhGqdxkydPxokTJ3D69GlER0dj8eLFeOWVVxASEoI//vgD8fHxetv++++/MXjwYEybNg0vvvgi3N3d1ep8//33GDp0KGJiYuDv749XXnmFeRsHBQUhJycHFy9exIgRIzBo0CCkpKRw8s+ytbXF3r174e7ujnHjxiEwMBDvvPNOuylCy9Tm+eefZ902FxYtWoTBgwcjIiICo0aNYoRma+bPnw9ra2v4+/ujS5curO1TFy5cwIIFC/Dpp5/Cx8cHAPDpp5+ioqICixcv1nhMcHAwVqxYgXfffRcBAQH45ptvkJaWplbn4YcfxuzZsxEdHY0uXbpg2bJlGtuaPHkyIiMj8dhjj6FLly6M1i0EL7zwAr744gusX78egYGBePTRR5GRkaFTg7p27RpiYmLQt29f/POf/0Tnzp1x9OhRdOnSRbBxyREFIZadNCE5ORm//vorDh06ZOqhcGbp0qXYunUrTp8+beqhUCiiIEsNSggIISgqKkJ2djYGDBhg6uFwora2FmfPnsXKlSsxZ84cUw+HQhENixVQVVVV8Pf3h62tLV577TVTD4cTiYmJCAkJwahRo0Sb3lEoUsDip3gUCkW6WKwGRaFQpA8VUBQKhRUHDx7EhAkT4O3tzTpu1oEDBzB48GAolUr06tULGRkZnPqkAopCobCirq4OwcHBSE9PZ1W/uLgY48ePx2OPPYb8/HzMnTsXL7zwAvbs2cO6T2qDolAonFEoFNi2bVs7v7jWLFy4ED/99BPOnj3LbJsyZQoqKysZx2Z9UA2KQqGIQm5uLsLDw9W2RUREqK2I0IcsBVR6ejr8/PxgZ2eH0NBQHD9+XPA+9IVgvXv3LhISEtC5c2c4ODhg8uTJ7ZaBsEXf3J4QgpSUFHh5eaFjx44IDw/HpUuX1OrcunULsbGxcHJygouLC+Li4piFq4b0/dxzz7W7Dm0X9PLpOy0tDUOHDoWjoyPc3d0RFRWFwsJCtTpsrnFJSQnGjx8Pe3t7uLu7Y8GCBWhsbDS471GjRrU779mzZxvct9jcvXsX1dXVrEpVVVW7bUIu+VGpVEz0hxY8PDxQXV2NO3fusGpDdgJq8+bNSEpKQmpqKk6ePIng4GBEREQw4S6EZMCAASgrK2NKa2/zl19+GTt37sTWrVuRk5OD69ev816wq29uv2zZMnz88cdYvXo1jh07hk6dOiEiIgJ3795l6sTGxuLcuXPIysrCrl27cPDgQcyaNcvgvgEgMjJS7Tq0XRbCp++cnBwkJCTg6NGjyMrKwr179zBmzBjU1dUxdfRd46amJowfPx4NDQ04cuQINmzYgIyMDKSkpBjcNwDMnDlT7bxbL5vh27eY3L17Fx2dneDs7MyqdO3atd22tkuHTI7JIlHx5KGHHiIJCQnM301NTcTb25ukpaUJ2o+uQHaVlZXExsaGbN26ldlWUFBAAJDc3FyD+kWrgGmE3A9m5+npSd577z21/pVKJfn2228JIYScP3+eAFAL1/vzzz8ThUJB/vzzT959E3I/rO/EiRO1HiNU3zdu3CAASE5ODiGE3TXevXs3sbKyIiqViqmzatUq4uTkROrr63n3TYjmQHytEapvIamqqrofwnjUIILwIbrLqEEEACktLSVVVVVMaQmCqA9N90pbRowY0e4arlu3jjg5ObE+J1lpUA0NDcjLy1Ob11pZWSE8PJzTvJYtly5dgre3N3r06IHY2FhmIWxeXh7u3bunNo5+/frB19dX8HEUFxdDpVKp9eXs7IzQ0FCmr9zcXLi4uKgFiAsPD4eVlVW7cDN8OHDgANzd3dG3b1/Ex8fj5s2bzD6h+q6qqgIAJkgfm2ucm5uLwMBAtWlEREQEqqur9Uat0NV3C9988w3c3NwQEBCA5ORktcgIQvUtCjYdoLC10Vlgcz8UnJOTk1pRKpWCDSMsLKxdFp+srCy9QSNbI6uAdRUVFWhqatI4r71w4YKgfYWGhiIjIwN9+/ZFWVkZXn/9dYwYMQJnz56FSqWCra1tu/RGHh4eUKlUgo6jpT1N59yyT6VStYu40KFDB7i6uho8nsjISDz11FPo3r07ioqK8Nprr2Hs2LFMui8h+m5ubsbcuXMxfPhwBAQEMOek7xprs3G07OPbNwBMnToV3bp1g7e3N06fPo2FCxeisLAQP/zwg2B9i4ZCcb/oq8OR2tpatQB6LeFqXF1d4evri+TkZPz555/48ssvAQCzZ8/GypUr8corr+D555/Hvn37sGXLFvz000+s+5SVgDImrXOjBQUFITQ0FN26dcOWLVtEib0kVaZMmcL8OzAwEEFBQejZsycOHDiA0aNHC9JHQkICzp49a5KIEtr6bm1DCwwMhJeXF0aPHo2ioiL07NnT2MPkhkgC6sSJE3jssceYv5OSkgDcj0KbkZGBsrIytXA73bt3x08//YSXX34ZH330Ebp27YovvvgCERERrPuUlYByc3ODtbV1uy855eXlouczax2C9fHHH0dDQwMqKyvV3vBijKOlvfLycrXoiuXl5UziydbxzFtobGzErVu3BB9Pjx494ObmhsuXL2P06NEG952YmMgY1rt27cps9/T01HuNPT09233Bbbk3DOlbEy3hey9fvoyePXsa3LeoKKzuF311ODJq1CgQHW6TmrzER40ahVOnTnHuqwVZ2aBsbW0REhKiNq9tbm5GdnY2p3ktH1qHYA0JCYGNjY3aOAoLC1FSUiL4OLp37w5PT0+1vqqrq3Hs2DGmr7CwMFRWViIvL4+ps2/fPjQ3N7eLi20o165dw82bNxlhybdvQggSExOxbds27Nu3r10wNzbXOCwsDGfOnFETkFlZWXBycoK/vz/vvjWRn58PAGrnzadvo9CiQekrcoC1OV0ibNq0iSiVSpKRkUHOnz9PZs2aRVxcXNS+pgjBvHnzyIEDB0hxcTE5fPgwCQ8PJ25ubkyCxtmzZxNfX1+yb98+cuLECRIWFqYzrZAuampqyKlTp8ipU6cIALJixQpy6tQpJi/aO++8Q1xcXMiOHTvI6dOnycSJE0n37t2ZNFaEEBIZGUkGDRpEjh07Rg4dOkR69+5NYmJiDOq7pqaGzJ8/n+Tm5pLi4mLyyy+/kMGDB5PevXurfe3h03d8fDxxdnYmBw4cYHLTtc5PR4j+a9zY2EgCAgLImDFjSH5+PsnMzCRdunQhycnJBvV9+fJl8sYbb5ATJ06Q4uJismPHDtKjRw8ycuRIg/sWE+Yr3vjhRBH1qM6C8cMJAFJVVWWy8bJBdgKKEEI++eQT4uvrS2xtbclDDz1Ejh49Kngf0dHRxMvLi9ja2pIHH3yQREdHk8uXLzP779y5Q/79738zmX8nTZqkM5+cLjRlxAVAnn32WULIfVeDxYsXEw8PD6JUKsno0aPb5eW7efMmiYmJIQ4ODsTJyYnMmDFDY9JKLn3fvn2bjBkzhnTp0oXY2NiQbt26kZkzZ7Z7GfDpW1OfaJXhlxB21/jq1atk7NixpGPHjsTNzY3MmzeP3Lt3z6C+S0pKyMiRI4mrqytRKpWkV69eZMGCBe0eZj59iwkjoJ54hCgmjdJZ8MQjshBQdC0ehWImVFdX34/T/+RIKGx0m5fJvUbgx4OoqqqCk5OTkUbIHVkZySkUCgtE+opnCqiAolDMDSqgKBSKZLFS3C/66sgAKqAoFHODalAUCkWyiOSoaQqogKJQzA0FWGhQRhmJwVABRaGYG2Y0xZOHnteG+vp6LFmyRNDof7Rv2rfU+uaNQvE/Q7m2IhMBZTJHzfT0dLz33ntQqVQIDg7GJ598goceeojVsS0OaaZwMqN9076lCuOoGRN5P+aTDkjDPeDbTMmfl0k0KGOG7aVQLA4zWixsEgG1YsUKzJw5EzNmzIC/vz9Wr14Ne3t7rFu3zhTDoVDMCzMSUEY3kreE7U1OTma26QvbW19fr2YDqKysBPC/UK3GpLq6Wu3/tG/at1gQQlBTUwNvb29YWXHQJaijJn/4hO1NS0vD66+/3m67r6+vKGNkg4+PD+2b9m0USktL9QbUU8OMvuLJws0gOTmZCS8K3NecfH19UXq5GE6O6gY+55gxqPp2r7GHSKEITnVNNXx6dYejoyO3A6mjJn/4hO1VKpUas004OTq1+wJBfjpq0PisJg5H847DWvcB0LpfyL741KOYJwqu2o4ZaVBGF6NChu11jhkj2LjYCJ/mHYcFFRRs26LCicIJMzKSm0TPS0pKwpo1a7BhwwYUFBQgPj4edXV1mDFjBqd2hJzK6dOaKBTZoM9Jk40RXSKYREBFR0dj+fLlSElJwcCBA5Gfn4/MzMx2hnNDaS1c+AoatlMwodDUVtttXPqjAtYCsbJiV2SALEP+Mh6z/xei1eZE7TaWgTn/ztXV1XD26Mza25t5LmY9zc6T/PPvqCe5mOia4vG5aQ3VNsTWVqg21B5zFU4G0fIVT1+RAfIYpYDoesgNvdlbjhdLkFj6wyh1AS2t8Sn0FHlgVgKKzQ3C9iE3xH7FVZBI68aWLlIX0NIZHxvtSR6PvjxGyRKxXADYakZiGuIpFNZQNwPpIMSXOrboEyRU0FCkgRXLIn1ksdRFF5o0HQrFoqGe5NJFTvaclrEaUwukSBNBf3f6FU+6aNKixLIdGUJr/x2qBQqLHIW8oL+7wppdkQFmJ6A0IUXbkRB9yvFBNAYWL+SpBkWRAhb/IEoIab0s9PlAyccXigooAxHjxpTSzS6lsUgZSb0sqAYlX6wmDjfooWt7rBg3pqFtCilUDBkLFW6aEf26UD8o6aPtJtAX08nYD5UY/UnlbS6VcUgN8a+LAvp9oPgJqPT0dPj5+cHOzg6hoaE4fvy4zvoffvgh+vbti44dO8LHxwcvv/wy7t69y7o/sxVQfNEnvIS+uehDbH6YXHMUSYPimi5u48aNePXVV5GamoqCggKsXbsWmzdvxmuvvca6T7MVUGJMTbi0qesm5buPwh1TXE9Tv3QUCitWhStc08UdOXIEw4cPx9SpU+Hn54cxY8YgJiZGr9bVGrMTUHxuSDHsSnzboDYfYREyfrx8EP4rXku6uPDwcGabvnRxDz/8MPLy8hiBdOXKFezevRvjxo1j3a/ZCai2N6SQEQ74oKl/tlE6xY6iIAeEEAxCtCGra8vhK151dbVaaZ1/sjW60sWpVCqNx0ydOhVvvPEGHnnkEdjY2KBnz54YNWoUneK1xtQ3Ft/Aea2N+VJ/e4s5PlNqs7KFgye5j48PnJ2dmZKWlibYMA4cOIC3334bn376KU6ePIkffvgBP/30E5YuXcq6DbMUUJrWuLE9RqyxcOmr7QMl9QdMquMT0p1EVnAwkpeWlqKqqooprTN+t4ZPurjFixdj2rRpeOGFFxAYGIhJkybh7bffRlpaGpqbm1mdiuwFlCZh1HqNG9uEA2I9ZJraleoDbW4Ycp1l/RtxmOI5OTmpFU35JwF+6eJu377dLmW7tfV9zY1tKgTBBdSSJUugUCjUSr9+/Zj9d+/eRUJCAjp37gwHBwdMnjy5nVTmgqYFty20dgsQOummJjTZjfhoc5raNbQNoZDCGCj6ECcelL50cdOnT1fTwCZMmIBVq1Zh06ZNKC4uRlZWFhYvXowJEyYwgorNmQjOgAEDUFZWxpRDhw4x+15++WXs3LkTW7duRU5ODq5fv46nnnrK4D75GqO5tqkLXdoS1ygL2jRCvgglWGStWUgUwYW+SH5Q+tLFlZSUoKysjKm/aNEizJs3D4sWLYK/vz/i4uIQERGBzz77jP2pCJ12asmSJdi+fTvy8/Pb7auqqkKXLl2wceNGPP300wCACxcuoH///sjNzcWwYcNY9dGSXqeq/CZcpo21yIdGSumWpDQWc4Jv2inFK69CobTTWZfU3wVZ9o5lpp26dOkSvL290aNHD8TGxqKkpAQAkJeXh3v37qn5UvTr1w++vr5afSkAoL6+vt3n0BaEcp4UCqH7MLbNjA9SGotYyGtqS6MZaCU0NBQZGRnIzMzEqlWrUFxcjBEjRqCmpgYqlQq2trZwcXFRO0aXLwUApKWlqX0K9fHx4TU2Y0yRhBaYlvDwtyBlISC1F6FOaDQD7YwdOxb/+Mc/EBQUhIiICOzevRuVlZXYsmUL7zaTk5PVPoWWlpaq7TeG1iLFqAVSQkxnSJM/8Bwx+e9Koxmwx8XFBX369MHly5fh6emJhoYGVFZWqtXR5UsBAEqlst3n0NYIkYeurVGaj/+SOSKG5sgVkz/wsoONkyYN+QsAqK2tRVFREby8vBASEgIbGxs1X4rCwkKUlJRo9aUQAza+SXz8l6TgGCo0VDjIEDrF0878+fORk5ODq1ev4siRI5g0aRKsra0RExMDZ2dnxMXFISkpCfv370deXh5mzJiBsLAw1l/wxISt0DDEcG0MfyxTYyzhKxchb3yokVwr165dQ0xMDPr27Yt//vOf6Ny5M44ePYouXboAAD744AM88cQTmDx5MkaOHAlPT0/88MMPQg+DF2yFhr4FyboenNbHynkayfYcxcSchbwhWCmsWBU5ILgflDFo7QfFx4eDq98O9fORB+b2O/H1g7J57W0o7PT4Qd29i3tvv2aZflBSh+tNzDciga6/+SAX7UoXUo98YA6IFbDOFMhjlDww9fo1ISMS6LNbyUlwUSEiPlZQsCpywKwElLYH1Zge5Hz70qVxSTHxKEW63BdA+v6jAsqktF5ga4wHWNuC3taCRleUTLnFgLIExH6xidU+neJJFKlNgdoabTUJSzlNzywNsV8SYrVvrbBmVeSAWQkobYgVA1xXW2z7pVCERv/07v5/ckAeozQCQsYA5yKYpCjEqFYnbxQKBaz0FAVdiydfDHErEMJIbmoBIUWhKVdM8Vuy+4Ynj0dfHqMUASGndEB7IznXdXltbVVSQK5GYilhit/SnDzJ5TFKEdBmsDZFaFy20ROM/UDL1Uhs6VA/KJnBJWSIEF7jbbdxCUynyf+JGt35IzUtzRjjoW4GEkKTlqEplbmQNwabVOl8p2w0TZWwSO3aGWM81FFTQmhycOT7kBsanE1Khm4Ke8ztt6I2KDPF0Ldb6ykZ1zRTFNMhNS3LUKijpgxgIwzEEhj6kohSKGJC3QxkABthwMY2JZR/ExVOFGOhz0mzpcgBsxJQfGxAbCMF6BJmhkaXFHPqR6eVlgc7E7k8Hn15jJIHYqQ919amoUtkaEYUipDQKZ4EabHx6NOixEyjRIUBRQrQKZ4E0RSPSSh3A0MEnaFTLKGX5Jg79FpZeDSDgwcPYsKECfD29oZCocD27dvV9hNCkJKSAi8vL3Ts2BHh4eG4dOmSWp1bt24hNjYWTk5OcHFxQVxcHGpraw06EUNoKwSEyJHHtZ62cRkr4J65QK+VhXuS19XVITg4GOnp6Rr3L1u2DB9//DFWr16NY8eOoVOnToiIiMDdu3eZOrGxsTh37hyysrKwa9cuHDx4ELNmzeJ/FgYidCA5odJJ0YeNwgeLXos3duxYvPnmm5g0aVK7fYQQfPjhh1i0aBEmTpyIoKAgfPnll7h+/TqjaRUUFCAzMxNffPEFQkND8cgjj+CTTz7Bpk2bcP36dYNPSCgMic5p6HIVXX3QKYy4mMP1VSgULDQoMxVQuiguLoZKpUJ4eDizzdnZGaGhocjNzQUA5ObmwsXFBUOGDGHqhIeHw8rKCseOHdPYbn19Paqrq9UKF4R84NkKGkNudF198NWqzOHBMwZia63G+B06KDqwKnJAUAGlUqkAAB4eHmrbPTw8mH0qlQru7u5q+zt06ABXV1emTlvS0tLg7OzMFB8fH07jEuOBN6RPIRHzqySffoRs0xyFqjHuCwXL/+SALCxlycnJqKqqYkppaamph9QOqeTfa40YAfn0waVPfXY/oR9mS0meShcLa8HT0xMAUF5erra9vLyc2efp6YkbN26o7W9sbMStW7eYOm1RKpVwcnJSK1JDigZtU2hxhvQptkASon0p/s5tUbAwkFukBtW9e3d4enoiOzub2VZdXY1jx44hLCwMABAWFobKykrk5eUxdfbt24fm5maEhoYKORyLQQhfK0PaFfKhFeoLKCAPYSIGiv8mRdBX+JCeng4/Pz/Y2dkhNDQUx48f11m/srISCQkJ8PLyglKpRJ8+fbB7927W/XEWULW1tcjPz0d+fj6A+4bx/Px8lJSUQKFQYO7cuXjzzTfx448/4syZM5g+fTq8vb0RFRUFAOjfvz8iIyMxc+ZMHD9+HIcPH0ZiYiKmTJkCb29vrsOhQDzDvb52jZVe3lIFDV+sAFgp9BQe7W7evBlJSUlITU3FyZMnERwcjIiIiHYzohYaGhrw+OOP4+rVq/juu+9QWFiINWvW4MEHH+R0Lpw4ceIEBg0ahEGDBgEAkpKSMGjQIKSkpAAAXnnlFcyZMwezZs3C0KFDUVtbi8zMTNjZ2TFtfPPNN+jXrx9Gjx6NcePG4ZFHHsHnn3/OdSg6MaWtQAp2Cj5rCfkipAAxN2FkkqwuImlQK1aswMyZMzFjxgz4+/tj9erVsLe3x7p16zTWX7duHW7duoXt27dj+PDh8PPzw6OPPorg4GD250IIIZxHamKqq6vh7OyMqvKbkrRHiY2m2FK6guS13m7KuFT6AvnpC/hnaVRXV8PZozOqqqpY3ectz0XYsp/RoWMnnXUb79Qh95WxrNtuaGiAvb09vvvuO2Y2BADPPvssKisrsWPHjnbHjBs3Dq6urrC3t8eOHTvQpUsXTJ06FQsXLoS1NbuAefIw5VPU4OIIymbZjlhwMVJTgSQcXDSotv6F9fX1GtusqKhAU1OTTheitly5cgXfffcdmpqasHv3bixevBjvv/8+3nzzTdbnQgUURTT4rlcUOsmFpWFtxa4AgI+Pj5qPYVpammDjaG5uhru7Oz7//HOEhIQgOjoa//nPf7B69WrWbcjDnZQiKqaYUunrk2pU/GETTqVlf2lpqdoUT6lUaqzv5uYGa2trnS5EbfHy8oKNjY3adK5///5QqVRoaGiAra2t/nPRW4Ni9gglDLh81aMCSDwULAuAdv6F2gSUra0tQkJC1FyImpubkZ2dzbgQtWX48OG4fPkympubmW0XL16El5cXK+EEUAEle4z1qb9tf5rQFJNLbMQ6b7F8y4yBWAHrkpKSsGbNGmzYsAEFBQWIj49HXV0dZsyYAQCYPn06kpOTmfrx8fG4desWXnrpJVy8eBE//fQT3n77bSQkJLA/F86jNGPkaPfQJBS0Bdzjcn7a6kpN85HqWkpTXieFgl3hSnR0NJYvX46UlBQMHDgQ+fn5yMzMZAznJSUlKCsrY+r7+Phgz549+O233xAUFIQXX3wRL730El599VX250LdDMwPXfYdfbYfKbohWCp83QzCP8qCjR43g3t36vDLS4+zbttUUA3KDDHE+CymgNCnydFkp8JgxbLIAbmMk2IAQkYHNSS2Fh8bldQ1KikKUDHX4hkbKqB4IMWbUhdCRgeVusAwNlK8HnrX4f23yAEqoHhgLo6EQj9chiaIoKjjHDOG13HWVgpWRQ5QAcUTU0aoFPJhlkpbUtRETE3Vt3t5HXffz8kc4mlSAWUQpnoguWpwuozTQoZqMXWadyn0JwXoFI8CQJyvTmIEiePrQMk3UiYbZ04+bcgxdZc5hVsxBXQtnsDI2cGvLXzHIlZoXSldG7aYYsxsNCSqQVko5hgoj2u7fNPC60rzbolTNb5QDYqiFVO+5U297INrqnYuLgxy1J5MBRtHTLloJnIZp6SR+tudz/j4akH66kr9WmlCbmMWay2eKaAalABI/e3OZ3x8tCBTLqMRE7mNWwH90Qrk4mhANSiWyO0t2oLQ4+ay9IXNWIRMS28ocv2N22KtULAqcoCzgDp48CAmTJgAb29vKBQKbN++XW3/c889184YFxkZqVbn1q1biI2NhZOTE1xcXBAXF4fa2lqDTkQXQkxX5PYWbUEo9wBt7Rm6ro6t3ckYwkOuv3FbLNoPqq6uDsHBwUhPT9daJzIyEmVlZUz59ttv1fbHxsbi3LlzyMrKwq5du3Dw4EHMmjWL++hZwnYtmhxuUDEfVGNEMtD2t77jzCEInrGw6K94Y8eOxdixY3XWUSqVWuMUFxQUIDMzE7/99huGDBkCAPjkk08wbtw4LF++3KjJO+UgkNoixBIbNumphIav5mWK30iO90VrqB+UHg4cOAB3d3f07dsX8fHxuHnzJrMvNzcXLi4ujHACgPDwcFhZWeHYsWMa26uvr2+XHofCnrYe4XyXvLQ+TgohhqWKqcdsThqU4AIqMjISX375JbKzs/Huu+8iJycHY8eORVNTEwBApVLB3d1d7ZgOHTrA1dVVa36ttLQ0tdQ4Pj4+Qg+bF6a+EbXRVpAIFTKltXDj04ZUlqqYe6p2GrBOB1OmTMGTTz6JwMBAREVFYdeuXfjtt99w4MAB3m0mJyejqqqKKaWlpcIN2ABMfSNqQ9unf112IDHWAHI51pjCXqq/m1CIlTTBFIguSHv06AE3NzdcvnwZAODp6YkbN26o1WlsbMStW7e02q2USmW79DgU9mjTetj6MAkhPNhE25SqRio3LPorHleuXbuGmzdvwsvLCwAQFhaGyspK5OXlMXX27duH5uZmhIaGij0ci8RQ4WMsjcPcNRtjoYD+6Z1M5BN3AVVbW4v8/Hzk5+cDAIqLi5Gfn4+SkhLU1tZiwYIFOHr0KK5evYrs7GxMnDgRvXr1QkREBID7mUUjIyMxc+ZMHD9+HIcPH0ZiYiKmTJli1C94lPsYy9eICh/jYdFTvBMnTmDQoEEYNGgQgPvJ/AYNGoSUlBRYW1vj9OnTePLJJ9GnTx/ExcUhJCQEv/76q1rG0m+++Qb9+vXD6NGjMW7cODzyyCP4/PPPhTsrC0FogcJXiIixbo/Cnw4KdkUO0Lx4FE4+UDR3HXf4XjO+efFe+voIlPYOOuvW367FR888TPPiUaSFPh8otqmjhB6DOWNsgU7dDCiyxZCIA3wFi6UJJFNj0TYoivnDJfMvG3S5NxgrhrslQd0MKCbFnDyhDU08Qe1h7aFTPIrJ4GrQFmsMbOtIZXmLJaFgMb2z2LV4FHExNP4SoF94CGEo55vqiss4KJqhGhRF8mgTQq01MG3CQ2x/KLYYS5MyN0FIbVCUdgiVaFIoWgshLgk4TZ2+3BTXzNymlB0UClZFDpiVgJKCQNC3zRRwdcLkOgU05LrLMaqp1KFuBhJFKuE8xEbfufDd33bqx3YKaIhWJkb6eEuHTvFkiDm9mQ1N72Tsa8G1v7b1qcDiBjWSUySDkNMrY0J9ncSDTvEokkHo6ZWxoEJHPBQsCx/S09Ph5+cHOzs7hIaG4vjx46yO27RpExQKBaKiojj1RwWUzGHrsyR2Ak+KdFBAv/2Jj4DavHkzkpKSkJqaipMnTyI4OBgRERHtIuS25erVq5g/fz5GjBjBuU8qoATEVJ/IxYiKqS/jr5juCnLAauJwg7zlxUSsKd6KFSswc+ZMzJgxA/7+/li9ejXs7e2xbt06rcc0NTUhNjYWr7/+Onr06MH9XDgfQdGKqRwL22pJQjwwurzQ2Rixhc5oLDWadxwWxFteDLgYydumc6uvr9fYZkNDA/Ly8hAeHv6/fqysEB4ejtzcXK1jeeONN+Du7o64uDje50KRGdoEBNcHhqtg0KY5GfqA0uUwwtLBSsGqAICPj49aSre0tDSNbVZUVKCpqQkeHh5q2z08PLSmizt06BDWrl2LNWvW8D8X3kdSJAPfTMFctRypaQqA9LQXKcDGjaBlf2lpqVpEzdahuQ2hpqYG06ZNw5o1a+Dm5sa7HapByRhjfqHja8OSqxuEnOFig2qbzk2bgHJzc4O1tTXKy8vVtpeXl2tMF1dUVISrV69iwoQJ6NChAzp06IAvv/wSP/74Izp06ICioiJ258Lx3CkSQkjPeaFz3wlhnzFWxhlzQwxPcltbW4SEhCA7O5vZ1tzcjOzsbISFhbWr369fP5w5c4bJAJWfn48nn3wSjz32GPLz81lnB+ckoNLS0jB06FA4OjrC3d0dUVFRKCwsVKtz9+5dJCQkoHPnznBwcMDkyZPbSd2SkhKMHz8e9vb2cHd3x4IFC9DY2MhlKJT/IlT0SyE0LjGnW3Qqxx6xPMmTkpKwZs0abNiwAQUFBYiPj0ddXR1mzJgBAJg+fTqSk5MBAHZ2dggICFArLi4ucHR0REBAAGxtbVmfC2tycnKQkJCAo0ePIisrC/fu3cOYMWNQV1fH1Hn55Zexc+dObN26FTk5Obh+/TqeeuopZn9TUxPGjx+PhoYGHDlyBBs2bEBGRgZSUlK4DEUSSOGtLqUHl08qdbZtSuFaywWFQv80j48jeXR0NJYvX46UlBQMHDgQ+fn5yMzMZAznJSUlKCsrE/ZcDEk79ddff8Hd3R05OTkYOXIkqqqq0KVLF2zcuBFPP/00AODChQvo378/cnNzMWzYMPz888944okncP36debEVq9ejYULF+Kvv/5iJVlp2injIVXjuNQQ4zrxTTu19seTsO/kqLPu7boaxD052LzTTlVVVQEAXF1dAQB5eXm4d++emq9Ev3794Ovry/hK5ObmIjAwUO1zZUREBKqrq3Hu3DmN/dTX17fz17B0uITdZVtfE2IKJ67nIGWkJMQV/w3pq6/IAd4Cqrm5GXPnzsXw4cMREBAAAFCpVLC1tYWLi4ta3da+EiqVSqMvRcs+TaSlpan5arA1sAHyucG5wiXsLtv6xobrObTGUOFriqmjsfpSKNgVOcBbQCUkJODs2bPYtGmTkOPRSHJyMqqqqphSWlrK7DNGokmK9DBU+OoSfGLY0nT1qW0cfLFWKFgVOcBLQCUmJmLXrl3Yv38/unbtymz39PREQ0MDKisr1eq39pXw9PTU6EvRsk8TSqWynb9GC1QAUYQMU9x6CYum/WzHoS3qKNuxGnJfW6wGRQhBYmIitm3bhn379qF79+5q+0NCQmBjY6PmK1FYWIiSkhLGVyIsLAxnzpxRWwGdlZUFJycn+Pv7G3IuvDDXKaAloS1ig9i/bVttS5dgM6ZPl8UGrEtISMDXX3+NjRs3wtHRESqVCiqVCnfu3AEAODs7Iy4uDklJSdi/fz/y8vIwY8YMhIWFYdiwYQCAMWPGwN/fH9OmTcPvv/+OPXv2YNGiRUhISBDMzZ4LlqyBmZtw5hqKmC+t1z5yDVms7Rg2x7LFYo3kq1atQlVVFUaNGgUvLy+mbN68manzwQcf4IknnsDkyZMxcuRIeHp64ocffmD2W1tbY9euXbC2tkZYWBieeeYZTJ8+HW+88YZwZ0VhhSUL59ZwFQr6YmwZYmsS4jcRM2CdsTHID8pUUD8o7piTP5OQ52Ks68KnH75+UJszf2flBxUdGWzeflByx9ymOLowF+EEsHM90LWNTVu6ECOdu5D3osVO8cwNmrnWvGg99WobI0uMfqTapjlN8Wg8KCNgTtqLHLD0661gEa1AJgqUZWtQFHkhFU1UrHG0dVvgC53iUVghlQdKaEx1XoYkfhDaI5xP9mY29jAhtD9rBbsiB6iAEhE5TDXEMPhKgbZfzYSOe841nLIxv6IqWP4nB6iAsnDkIGz4wOa8hFh2YoylK1yx2KUuFIo5IbUoooIF+QOLkL+C9CQ+chknhWIUjL2er3U/Qgk7OsWjyAZzNNTry3psCMZaz9eCNn8tQ86DTvEossGcbExsnC+l6HyrKcaUpnPRFhmBK1RAUQTBHLUbMRErYzIfuAgQTTGmdGVoNnT8VlCwKnKACigTYk7ajZQw5XUVQjgaOn6qQVFEgWpU8kGofIRiYPEhfyniIIWb25IxmxcEG+1JHvKJCiiK+Bj7wRcrxZY2I7bUBBt1M6BQOCC0ZmiMTD66lreIEQVTSCGn10mTRbQDqUAFlBlhyE0uNS1AF8ZI32RsVwZB40FRIznF2LB50Ay5yeVg/2IbjqR1iic2kQekiEGOmnSKRzEWYkaGlCNcshG3/b8+xArPwgeDoi9Y6hQvLS0NQ4cOhaOjI9zd3REVFYXCwkK1OqNGjWoXGGv27NlqdUpKSjB+/HjY29vD3d0dCxYsQGNjo+FnY4ZQwfQ/xL4WusKz8InvZGh9vphTyF9OAionJwcJCQk4evQosrKycO/ePYwZMwZ1dXVq9WbOnImysjKmLFu2jNnX1NSE8ePHo6GhAUeOHMGGDRuQkZGBlJQUYc6IQmmDNuHCRWDo8vw2pA0xsNiImpmZmXjuuecwYMAABAcHIyMjAyUlJcjLy1OrZ29vD09PT6a0Tmuzd+9enD9/Hl9//TUGDhyIsWPHYunSpUhPT0dDQ4MwZ0WRBXwjB/DJY6fpy5uptVN95+EcM4ZXu9RI/l+qqqoAAK6urmrbv/nmG7i5uSEgIADJycm4ffs2sy83NxeBgYHw8PBgtkVERKC6uhrnzp3T2E99fT2qq6vVCkX+8I0cwOcrHpegc8ZIma5vTABQ9e1eXu2bk4DindWlubkZc+fOxfDhwxEQEMBsnzp1Krp16wZvb2+cPn0aCxcuRGFhIZNdWKVSqQknAMzfKpVKY19paWl4/fXX+Q6VYsFwMapzwZD4TWJrbmy+0snlKx5vAZWQkICzZ8/i0KFDattnzZrF/DswMBBeXl4YPXo0ioqK0LNnT159JScnIykpifm7uroaPj4+/AZOMUuEDPgmpFAzRUZnNhqSXDQoXlO8xMRE7Nq1C/v370fXrl111g0NDQUAXL58GQDg6emJ8vJytTotf3t6empsQ6lUwsnJSa1QLBdtXt6mdg3QhClCxFjsVzxCCBITE7Ft2zbs27cP3bt313tMfn4+AMDLywsAEBYWhjNnzuDGjRtMnaysLDg5OcHf35/LcCgyQWjBoWnJiaGairaAcoZg6FdCvoj5FS89PR1+fn6ws7NDaGgojh8/rrXumjVrMGLECDzwwAN44IEHEB4errO+JjgJqISEBHz99dfYuHEjHB0doVKpoFKpcOfOHQBAUVERli5diry8PFy9ehU//vgjpk+fjpEjRyIoKAgAMGbMGPj7+2PatGn4/fffsWfPHixatAgJCQlQKpWcBk+RB2IlFuCTVkqbMyabgHJcESIbDB/E0qA2b96MpKQkpKam4uTJkwgODkZERISastGaAwcOICYmBvv370dubi58fHwwZswY/Pnnn+zPhRBCWFfWInXXr1+P5557DqWlpXjmmWdw9uxZ1NXVwcfHB5MmTcKiRYvUpmV//PEH4uPjceDAAXTq1AnPPvss3nnnHXTowM4kVl1dDWdnZ1SV32Q13TOFHYAib/jcM/qOab30hk3bivHDgH15qKqqYnWftzwXeb9dhoODo866tbU1CBnai3XbwH1zzdChQ7Fy5UoA9z+U+fj4YM6cOXj11Vf1Ht/U1IQHHngAK1euxPTp01n1yclIrk+W+fj4ICcnR2873bp1w+7du7l0bRBUOHFDTgJdrLG2nUYaajjnKpyA+24Gzh6dWdVtDZeveG1ddpRKpcaZTENDA/Ly8pCcnMxss7KyQnh4OHJzc1mN6/bt27h37147tyRd0LV4OpCi0dUQpJhk0lCMsfxFyOmeMeJIKVisw2uZDPn4+MDZ2ZkpaWlpGtusqKhAU1OTRhchbe5BbVm4cCG8vb0RHh7O+lx4uxlYAnJ6UNlgbucjBaToD8XGCN6yv7S0VG2KJ5Yd+J133sGmTZtw4MAB2NnZsT6OalAUigEI5d5gKjeDtu472gSUm5sbrK2tNboIaXMPamH58uV45513sHfvXuZjGVuogKLwRqqr+cVGV0RNscINc0GMpS62trYICQlBdnb2/8bc3Izs7GyEhYVpPW7ZsmVYunQpMjMzMWTIEM7nQgUUD8zlQTMUIVfzy+ma6tKapDCNFitgXVJSEtasWYMNGzagoKAA8fHxqKurw4wZMwAA06dPVzOiv/vuu1i8eDHWrVsHPz8/xi2ptraWdZ/UBsUDKdyE5oYxr6kQX/4kfw+I4CoeHR2Nv/76CykpKVCpVBg4cCAyMzMZw3lJSQmsrP6n86xatQoNDQ14+umn1dpJTU3FkiVLWPXJyQ9KKnD1gxIDOX2KtxQ0fcoX43fi0mbbulyOra6uhrNHZ85+UGdPFcPRUbcfVE1NDQIGdefkB2UK6BSPJ1LKXiun6ZGYaPIz4vs76bqmLf1oq6PNQ7313+J7kptDRHIqoADI7wHnG0dJSKRwzXSlhuJyjCa0tdPacVNbHbZOnWL6QZlLPCgqoCADe4IEkcI146qNCCEQhDxv0fygWBY5QI3kFNkjViROKQhhPlgpFLDSoyLp2y8VqAZFsXg0RThgk9VFqD6Fhk7xKBSWmNJWpUnw6LNbGWJX4oJctTNjQwWUmWNqY7apHkRtX/OMkTadD4IudbHUtFMUbphaOADm9aY2doRKIdpgG51T0KUuLIscoAJKRMxJOEgBNtdTCi+F1pjiHqA2KAqFA8YUGlJ7KXD1OhcCsdbimQKLElBSe7uaGmNdD6kJDWOiz+GTTV2uUA1Kpljyg6IJOV4PNstLuOwzFa09yQVfusRGOFEBRaEIDx83AGMLYi7LadoubG7Zbgj0Kx6FIjPE1qJ0LRDWhSjC04w+41EBRZElXAWOUEk9hWpfVBsUNZJTKKaFbXRObf9mi9hprcTAnIzkslws3BJjr7qmWk9NiiVCGpuYfG+VX/2s8d9saXuMc8wYVH27V7jB6qDl/uYcU5LNFI4KKPG4efMmAMCnV3cTj4QiVfgkvJRC25qoqamBs7Mz6/pcEndKHVkKqJbMpCUlJZx+OCGorq6Gj49Pu3xitG/at9AQQlBTUwNvb29uB1INyrS0BGZ3dnY2WTzlljxitG/at5jweQGzsTFRGxSFQjER5qNCUQFFoZgZVor7RV8dOSBLAaVUKpGamipaHnnaN+1bCn3zxozmeLLMi0ehUNrTkhevrLgMTo667WXVNdXw6u5F8+JRKBQKX2Q5xaNQKNpRQP9iYOoHRaFQTIIZmaCogKJQzA/qZkChUCQK1aAoFIp0MR8FigooCsXcMKfU51RAUSjmBtWgKBSKVKHhVigUinShGhSFQpEq5vQVjy51oVDMDDGTJqSnp8PPzw92dnYIDQ3F8ePHddbfunUr+vXrBzs7OwQGBmL37t2c+qMCikIxN0RKO7V582YkJSUhNTUVJ0+eRHBwMCIiInDjxg2N9Y8cOYKYmBjExcXh1KlTiIqKQlRUFM6ePcv+VGg0AwrFPGiJZlCpqtAboaC6uhounm6cohmEhoZi6NChWLlyJQCgubkZPj4+mDNnDl599dV29aOjo1FXV4ddu3Yx24YNG4aBAwdi9erVrPqkGhSFYnYIr0I1NDQgLy8P4eHhzDYrKyuEh4cjNzdX4zG5ublq9QEgIiJCa31NUCM5hWJm1NRU6zWC1/w3pVXbNFxKpVJjcL6Kigo0NTXBw8NDbbuHhwcuXLigsQ+VSqWxvkql0ncKDFRAUShmgq2tLTw9PeHTm106NgcHB/j4+KhtS01NxZIlS0QYHT+ogKJQzAQ7OzsUFxejoaGBVX1CSLu4UdpCG7u5ucHa2hrl5eVq28vLy+Hp6anxGE9PT071NUFtUBSKGWFnZ8ekyNJXWtK2tS7aBJStrS1CQkKQnZ3NbGtubkZ2djbCwsI0HhMWFqZWHwCysrK01tcIoVAoFBZs2rSJKJVKkpGRQc6fP09mzZpFXFxciEqlIoQQMm3aNPLqq68y9Q8fPkw6dOhAli9fTgoKCkhqaiqxsbEhZ86cYd0nneJRKBRWREdH46+//kJKSgpUKhUGDhyIzMxMxhBeUlLCJNUFgIcffhgbN27EokWL8Nprr6F3797Yvn07AgICWPdJ/aAoFIpkoTYoCoUiWaiAolAokoUKKAqFIlmogKJQKJKFCigKhSJZqICiUCiShQooCoUiWaiAolAokoUKKAqFIlmogKJQKJKFCigKhSJZqICiUCiS5f8BQk3+fgRIib8AAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 5 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "As mentioned initially, the synthetically generated network is a sequence of adjacency matrices `A` where `A[t]` represents the adjacency matrix of the network at time `t`. ", + "id": "4d175867b25e6d6f" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:42.509849Z", + "start_time": "2024-11-07T17:45:42.503305Z" + } + }, + "cell_type": "code", + "source": "A", + "id": "128d8026d19823ad", + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 6 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "To utilize the `DynCRep` model, we need to transform the sequence of adjacency matrices `A` into \n", + "a sequence of adjacency tensors `B`, where `B` is a numpy adjacency tensor derived from a \n", + "NetworkX graph. The `build_B_from_A` function from the `probinet.input.preprocessing` module can be used to perform this transformation. The function takes in the sequence of adjacency matrices `A` and the list of nodes in the network and returns the adjacency tensor `B`." + ], + "id": "af2dc7e76a297728" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:42.651426Z", + "start_time": "2024-11-07T17:45:42.635838Z" + } + }, + "cell_type": "code", + "source": "from probinet.input.preprocessing import create_adjacency_tensor_from_graph_list", + "id": "3244ed9989e3d136", + "outputs": [], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:42.691558Z", + "start_time": "2024-11-07T17:45:42.686505Z" + } + }, + "cell_type": "code", + "source": "nodes = list(A[0].nodes())", + "id": "acc4fb28b0c22eae", + "outputs": [], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:42.768222Z", + "start_time": "2024-11-07T17:45:42.738806Z" + } + }, + "cell_type": "code", + "source": "B, _ = create_adjacency_tensor_from_graph_list(A, nodes=nodes)", + "id": "3c8ab5840ac95a3b", + "outputs": [], + "execution_count": 9 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "Done! We now have the adjacency tensor `B` of dimensions `(T+1, N, N)` where `T` is the number of time steps, and `N` is the number of nodes in the network. The adjacency tensor `B` is a numpy array that can be used as input to the `DynCRep` model.", + "id": "6f96e87842868599" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:42.799984Z", + "start_time": "2024-11-07T17:45:42.793851Z" + } + }, + "cell_type": "code", + "source": "B.shape", + "id": "2c69ac6bc7acf5cb", + "outputs": [ + { + "data": { + "text/plain": [ + "(6, 300, 300)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 10 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:43.000333Z", + "start_time": "2024-11-07T17:45:42.858368Z" + } + }, + "cell_type": "code", + "source": "from probinet.models.dyncrep import DynCRep", + "id": "4db74c827cc0123a", + "outputs": [], + "execution_count": 11 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "First, we instantiate the `DynCRep` model by creating an instance of the class. During this process, we can modify the default attribute values by specifying our desired maximum number of iterations and the number of realizations. The `max_iter` parameter sets the maximum number of iterations for the optimization algorithm, and the `num_realizations` parameter defines the number of times the model will run.", + "id": "eff442eabc7e74f9" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:43.028100Z", + "start_time": "2024-11-07T17:45:43.017619Z" + } + }, + "cell_type": "code", + "source": [ + "dyncrep = DynCRep(max_iter=2000, num_realizations=3)" + ], + "id": "bfa7050787da3f30", + "outputs": [], + "execution_count": 12 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:45:43.068382Z", + "start_time": "2024-11-07T17:45:43.062210Z" + } + }, + "cell_type": "code", + "source": "T = B.shape[0] - 1", + "id": "fb8ef1bd2cba63d3", + "outputs": [], + "execution_count": 13 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": " ", + "id": "600dfd20ac0ac11f" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "The model requires the information to be properly encoded into a `GraphData` object. We show how\n", + "to do this below." + ], + "id": "9b0b305097362d64" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:18.318676Z", + "start_time": "2024-11-07T17:45:43.117297Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.models.classes import GraphData\n", + "\n", + "# Build the GraphData object to pass to the fit method\n", + "gdata = GraphData(\n", + " graph_list=None,\n", + " adjacency_tensor=B,\n", + " transposed_tensor=None,\n", + " nodes=nodes,\n", + " data_values=None,\n", + ")" + ], + "id": "b2c01cd8eeadcb93", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:### Version: w-DYN ###\n", + "DEBUG:root:Fixing random seed to: 0\n", + "DEBUG:root:Number of time steps L: 6\n", + "DEBUG:root:T is greater than 0. Proceeding with calculations that require multiple time steps.\n", + "DEBUG:root:Random number generator seed: 0\n", + "DEBUG:root:eta is initialized randomly.\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 4.47 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 200 - time = 9.48 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 300 - time = 14.02 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 400 - time = 18.14 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 500 - time = 22.27 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 600 - time = 26.64 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 700 - time = 30.89 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 800 - time = 34.99 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 900 - time = 39.29 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 1000 - time = 43.23 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 1100 - time = 47.19 seconds\n", + "DEBUG:root:num. realizations = 0 - Log-likelihood = -22812.612540028196 - iterations = 1121 - time = 48.03 seconds - convergence = True\n", + "DEBUG:root:Random number generator seed: 735514142\n", + "DEBUG:root:eta is initialized randomly.\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 1 ...\n", + "DEBUG:root:num. realization = 1 - iterations = 100 - time = 3.90 seconds\n", + "DEBUG:root:num. realization = 1 - iterations = 200 - time = 7.80 seconds\n", + "DEBUG:root:num. realization = 1 - iterations = 300 - time = 12.23 seconds\n", + "DEBUG:root:num. realization = 1 - iterations = 400 - time = 16.47 seconds\n", + "DEBUG:root:num. realization = 1 - iterations = 500 - time = 20.76 seconds\n", + "DEBUG:root:num. realizations = 1 - Log-likelihood = -23217.664835235308 - iterations = 551 - time = 22.76 seconds - convergence = True\n", + "DEBUG:root:Random number generator seed: 1031784211\n", + "DEBUG:root:eta is initialized randomly.\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 2 ...\n", + "DEBUG:root:num. realization = 2 - iterations = 100 - time = 4.15 seconds\n", + "DEBUG:root:num. realization = 2 - iterations = 200 - time = 8.26 seconds\n", + "DEBUG:root:num. realization = 2 - iterations = 300 - time = 12.72 seconds\n", + "DEBUG:root:num. realization = 2 - iterations = 400 - time = 16.79 seconds\n", + "DEBUG:root:num. realization = 2 - iterations = 500 - time = 21.23 seconds\n", + "DEBUG:root:num. realizations = 2 - Log-likelihood = -22765.317310971433 - iterations = 561 - time = 24.33 seconds - convergence = True\n", + "DEBUG:root:Best realization = 2 - maxL = -22765.317310971433 - best iterations = 561\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n" + ] + } + ], + "execution_count": 14 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "We can now fit the data into the model `DynCRep`\n", + "model. We need to set the number of time steps `T`, the list of nodes in the network, and other\n", + "parameters too. Given that the data has been generated using `K=3`, we will change the file to reflect this. The model\n", + " returns the learned parameters of the model, including the community memberships `u`, `v`, the\n", + " temporal relationships `w` between the communities, the reciprocity parameter `eta`, the edge\n", + " disappearance rate `beta` and the log-likelihood of the model.\n", + " > **_NOTE:_** The parameters `ag` and `bg` are the hyperparameters of the gamma distribution,\n", + " > which is used for regularization. The authors of the main reference assume gamma-distributed\n", + " > priors for the membership vectors. We fix them to 1.1 and 0.5, respectively." + ], + "id": "651e0414b2a704d3" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": [ + "u_dyn, v_dyn, w_dyn, eta_dyn, beta_dyn, Loglikelihood_dyn = dyncrep.fit(\n", + " gdata,\n", + " T=T,\n", + " K=K,\n", + " nodes=nodes,\n", + " ag=1.1,\n", + " bg=0.5,\n", + " out_inference=False,\n", + ")" + ], + "id": "92de43d150fbe7f8" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "The `DynCRep` model has been effectively applied to the adjacency tensor `B`, with the fitting process carried out over three realizations, all of which achieved successful convergence. As detailed in the referenced paper and other tutorials, the vectors `u` and `v` represent the outgoing and incoming community memberships of the network's nodes, respectively, and remain constant over time. Conversely, the affinity matrix, which delineates the edge density within and between communities, is a time-dependent function. By utilizing the `plot_matrices` function outlined below, we can observe the evolution of these relationships over time.\n", + " \n", + "> **_NOTE:_** You might be curious as to why the parameters `u` and `v` remain \n", + "> constant over time. As outlined in the primary reference, it's not necessary to estimate these \n", + "> parameters at every time step. The model is designed to estimate them just once. This is part \n", + "> of the first approach, where the affinity matrix is treated as a time-dependent variable, \n", + "> while the community membership vectors, `u` and `v`, are kept static over time. It's worth \n", + "> noting that an alternative interpretation could involve fixing `w` and allowing `u` and `v` to \n", + "> change over time. As explained by the authors, the model can be easily adapted to accommodate \n", + "> this alternative scenario." + ], + "id": "ce3578e52c967d1f" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:18.354932Z", + "start_time": "2024-11-07T17:47:18.348411Z" + } + }, + "cell_type": "code", + "source": "w_dyn.shape", + "id": "ad48baa897da2cba", + "outputs": [ + { + "data": { + "text/plain": [ + "(6, 3, 3)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 15 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:18.435476Z", + "start_time": "2024-11-07T17:47:18.422878Z" + } + }, + "cell_type": "code", + "source": [ + "# Set the colormap for the plots\n", + "cmap = \"PuBuGn\"\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from matplotlib.colors import Normalize\n", + "\n", + "\n", + "def plot_matrices(w, cmap=\"PuBuGn\"):\n", + " \"\"\"\n", + " Plot a temporal array in a row of subplots with a single shared colorbar.\n", + "\n", + " Parameters\n", + " ----------\n", + " w : np.ndarray\n", + " Temporal array to plot.\n", + " cmap : str, optional\n", + " Colormap to use for the plots. Default is 'PuBuGn'.\n", + " \"\"\"\n", + " # Get the number of time steps\n", + " T = w.shape[0]\n", + "\n", + " # Normalize the data for consistent color mapping\n", + " norm = Normalize(vmin=np.min(w), vmax=np.max(w))\n", + "\n", + " # Create a new figure with specified size\n", + " fig, axes = plt.subplots(1, T, figsize=(3 * T, 3), constrained_layout=True)\n", + "\n", + " # Loop over each time step\n", + " for t in range(T):\n", + " # Add a subplot for the current time step\n", + " if T == 1:\n", + " ax = axes\n", + " else:\n", + " ax = axes[t]\n", + "\n", + " # Display the matrix as an image\n", + " cax = ax.imshow(\n", + " w[t], cmap=cmap, norm=norm, interpolation=\"nearest\", extent=[0, 3, 0, 3]\n", + " )\n", + "\n", + " # Add a title to the subplot\n", + " ax.set_title(\"Time step: \" + str(t), fontsize=18)\n", + "\n", + " # Set ticks to be at 0.5, 1.5, 2.5 but show as 0, 1, 2\n", + " ax.set_xticks([0.5, 1.5, 2.5])\n", + " ax.set_yticks([0.5, 1.5, 2.5])\n", + "\n", + " # Set tick labels to 0, 1, 2\n", + " ax.set_xticklabels([0, 1, 2])\n", + " ax.set_yticklabels([2, 1, 0])\n", + "\n", + " # Add a single colorbar to the figure\n", + " fig.colorbar(cax, ax=axes, orientation=\"vertical\", fraction=0.046, pad=0.04)" + ], + "id": "f81a3adf24135671", + "outputs": [], + "execution_count": 16 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:19.866054Z", + "start_time": "2024-11-07T17:47:18.485456Z" + } + }, + "cell_type": "code", + "source": "plot_matrices(w_dyn)", + "id": "d40488b4450a844b", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Hs//ve99L62pqcmPrampSfv27Zv/eMCAAel9993X6Wvw05/+tN1xDzjggPxr2LnNmDEjP37MmDHpwQcfnH+svr6+3faP//iP7Y7/q1/9Kj388MPz46uqqtIBAwbkP06SJP3iF7+4W127Xtf58+fnn9O/f/92r3vQoEHpsmXLOnxtkydPLvjz+1pPPvlk/rl33333HsedffbZaUSkb37zmzt9DrJNvsiXztp5vG9961s9dkyySb7Il+74j//4j/zxf/nLXxblHJQn2SJbuuP222+XLeyRfJEvhdiyZUt67LHHpkmSpIsXL2537COOOKJbxya75It82ZudXx9nnHFGl54PvZ2mYBf09DeOgw46KD3zzDPT3/72t2mapunmzZvT2267Lf8N5Prrr0/r6urS8847L125cmWapmm6YcOG9Lrrrssf4/7779/t3D/96U/TXC6XVldXp5/+9KfTFStWpG1tbWlbW1v65JNPpueee27+m9Wf/vSnTl2DI488Mo2IdMKECelvfvOb/P6XXnopffzxx9PPf/7zu/2CetGiRQVdt9WrV6eHHHJIGhHp+9///nTp0qVpa2trmqZp2tLSkn7uc59Lq6ur04hI77nnnj1e17q6uvTEE09MH3nkkTRN07StrS2977770mHDhqURkQ4bNixdv379bufvzjeO73//+/nnPvHEE3sc96lPfSp/7WFX8kW+dNbO42kKsi/yRb50x7Rp09KISPv06ZOuW7euKOegPMkW2dJZmzdvTv/f//t/6Re+8IX8LyNPP/30Hjs+2SFf5Eshrr322jQi0o985CO7HVtTkD2RL/Jlb3Z+fQwePDh905velPbt2zc98MAD06OPPjr9yEc+ki5fvrxLx4XeQlOwC3r6G8eb3vSmdMuWLbs998Mf/nB+zDvf+c60ra1ttzGnnXZaGhHppZde2m7/tm3b0qOOOiqNiPT//J//s8f63vve96YRkV511VX7fC07tbS05OtavXp1wc8r9BvHJZdckkZEeuGFF+5xzK233ppGRDpq1Kh2+3e9rq973evSlpaW3Z77xBNPpH369EkjIr355pt3e7w73zhuu+22/HP39guz2bNn58dt2LCh0+chu+SLfOmsncfTFGRf5It86ao//vGP+b9q/vCHP9zjx6e8yRbZUog///nP+eO8djvnnHPSF154oVvHJ5vki3zZl+XLl6fV1dVpfX19+te//nW3Y2sKsifyRb7sza5fH7lcLh00aFC+iRmxfZbjdddd16VjQ2/gnoK9wMc//vGoqanZbf/EiRPz73/2s5+NJEn2OObXv/51u/0PPvhgPPXUUzF48OD4yEc+ssdzX3TRRRERcd999xVc74ABAyKX2/6l8+c//7ng5xViy5YtMW/evIiI+MxnPrPHcTvr/p//+Z9oaWnpcMwVV1wRhxxyyG77jz322PjgBz8YERHz58/f7fE777wz0u0N807Xv2HDhvz7/fr12+O4XR/b9TnQ0+TLq8o9X6C3kS+vynK+vPTSS3HuuefG5s2bY/DgwXHTTTf16PHhtWTLq7KULVVVVVFfXx/19fVRW1ub33/uuefGzTffHIMGDerW8aEQ8uVVWciXV155JS655JJ45ZVX4rbbbouDDjqoS8eBniBfXpWFfDnqqKPi5ptvjt///vexZcuWeOGFF2LTpk1x3333xejRoyNN0/jCF74QX/7yl7t0fCi16lIXQMSpp57a4f76+vr8+2PHjt3rmL/+9a/t9v/85z+PiIh169bFkCFD9nju1tbWiIj405/+VHC9ffv2jTPPPDPuv//+OOuss+KKK66Id7/73XHyySdHnz59Cj5OR5YtWxZbtmyJiIgJEyYU9Jw//elP7a7VTn/zN3+zx+f8zd/8TcybNy9+/etfx8svvxwHHHBA1wqGXk6+vEq+QM+SL6/Kar688sorceGFF8ayZcvigAMOiLvuumuvnxfoCbLlVVnKlte//vXR3NwcERFpmsZzzz0Xc+fOjS9/+ctx7733xu233x6XX355j58XdiVfXpWFfLnpppvisccei/e85z3xv/7X/+qx40JXyJdXZSFfPvShD+22r0+fPjFhwoQ4/fTT4/TTT49f/vKXMXPmzPjIRz4SdXV1PXZu2B80BXuBAQMGdLi/urq64DEvv/xyu/2rV6/O79/TX1vs6qWXXiqo1p2++c1vxnvf+974n//5n7jhhhvihhtuiD59+sTYsWPjfe97X1x66aVd+mvPnXVHREF1R0Rs3ry5w/2HHXbYHp+z87FXXnkl/vKXv3T4jacrdv08bd68OQYOHNjhuF1r3tPnFnqCfNm97ojyzBfobeTL7nVHZCdftm3bFh/60Ifi3nvvjerq6pg3b17B/6iH7pAtu9cdkZ1siYhIkiQOP/zwuPHGG+OUU06JD3zgA/HRj340xo0bF6NGjSrquals8mX3uiPKM1+eeOKJuOGGG6J///7x1a9+tUeOCd0hX3avO6I882Vfamtr44tf/GK8853vjI0bN0ZTU1O8//3v3y/nhp5i+dCM2rZtW0REjBs3Lj9del9bZwwbNiyWL18eCxcujH/8x3+M0aNHR1tbW/z85z+PT3/60zFy5Mj42c9+1uW6I7Z/Myuk7re//e2dPk+x7PqXO88999wex+18bODAgdG/f/+i1wU9Sb4AxSJfeodt27bF3/3d38Xdd98dVVVV8b3vfS+/PA+UI9nSe73//e+PYcOGRVtbW/zrv/5rqcuBTpMvpXHllVdGa2trXHfddXHwwQfHxo0b222vvPJKRGyfmbxz32sbLtDbyZfea/z48fn3//jHP5awEugaTcGMamhoiIjOTR3vrFwuFxMnToyvfOUrsXTp0vjLX/4Sd911VwwbNiz++te/xoUXXpifwl6onXVHdL/2Qppy1dXVPXr/iuOPPz7//uOPP77HcTsfO+6443rs3LC/yJfS5AtUAvlS+nzZOUNw/vz5+YbgeeedV5Rzwf4iW0qfLXuz8y/9n3766f1+bugu+VKafFmxYkVERFxzzTUxYMCA3ba77rorIiKeeeaZ/L45c+b02Plhf5AvvfvnFyhnmoIZ9da3vjUiIpqbm2Pp0qX75ZwDBgyICy+8MP8Xni0tLfGb3/wm//jOG9hGxB7/emXs2LH5tav/8z//s1v1LFq0aJ+PnXjiiT265vTRRx8dw4YNi4iIhQsXdjhm06ZN8d///d8RUfja2tCbyJfS5AtUAvlS2nzZtm1bXHjhhbFgwYJ8Q/D888/v8fPA/iZbeu/PLmma5n+577YKlCP50nvzBcqdfOm9+fLwww/n3x8xYsR+PTf0BE3BjHrHO94RI0eOjIiIj3/84/v8q46//OUvBR97X8fq27dv/v1dv1nsen+9F198scPnHnjggXHhhRdGRMSXvvSleOaZZ/Z6rr3VPXfu3Fi7du1u+3//+9/H97///YiIHv/L9yRJ4qKLLoqIiPnz58fKlSt3GzNnzpzYuHFjVFVVdXjjWujt5Etp8gUqgXwpXb7snCF49913R3V1ddx1110agmSGbClNtuxcvm9vvvWtb0Vzc3NERNktHQYR8iWiNPmycuXKvS5FOHny5IiIOOKII/L7rr766h6tAYpNvpQmX/a1DOvWrVvjuuuui4jtr/XMM8/s0fPD/qApmFHV1dUxd+7cqK6ujoceeihOP/30aGpqareG+h//+MeYO3dujB07tlM3Zv7FL34RJ554YvzLv/xL/O53v4u2traI2B6av/jFL+KjH/1oREQcfvjhceKJJ+afd/TRR+f/UuSb3/zmHkP2i1/8YgwZMiTWrl0b48ePj+9+97uxYcOG/ONr1qyJH/zgB/G3f/u3ccEFF+yxzpdffjne+c53xi9/+ct8ff/1X/8VEydOjK1bt8bQoUPjiiuu2O15F198cSRJEkmSFHxNdvXJT34yGhoaYvPmzfHud787li1bFhHbv+F+7Wtfi8997nMREXH55ZfH0Ucf3aVzQCnJl9LlS0TE2rVr2207bdy4sd3+Pd2oG3oz+VKafNl5D8EFCxZEdXV1zJs3zx82kCmypTTZsvNaf/e7341nn3223WNPPfVUfPazn42///u/j4iII488Mi6++OJOnwNKTb6U9t9GkGXypTT58uCDD0ZjY+NuP7+8/PLL0dTUFKeddlo88sgjERExffr0OOiggzp9Dii5lE6bMWNGGhFpIZdv57hFixa1279ixYr8YytWrOjwuYsWLdrneb71rW+lEZEeccQRHT5+zz33pAMGDMgf54ADDkhf97rXpTU1Nfl9EZHeeOON+3wtHdW16zGrq6vz+wYOHJg++OCDuz330ksvzY/p169fOmzYsPSII45IP/GJT7Qb98QTT6RHH310fmwul0sHDRqUHnjgge3O3djY2O55u17X+fPn5197//790379+uUfO+igg9Jf/vKXHb6+yZMnF/z53ZOlS5emr3vd6/LHGTBgQHrAAQfkP54wYUK6ZcuWLh+f7JIv8mVfdq1xb9uMGTO6fA6ySb7Ilz154IEH2l2X+vr6vW7z58/v9DnILtkiWwq9NrW1tengwYPTvn37tts/atSoPX7eqWzyRb501c5j7+nzBfJFvhR6bfr27ZsOHjy43e91c7lceu2113b62NBbVAeZNmnSpHj66afjq1/9avzf//t/46mnnooXX3wxDjzwwDjmmGNi7Nix8e53vzve9a53FXzMsWPHxt133x2LFi2KRx99NFavXh1r166N2traGDlyZEyYMCGuuuqqGDJkyG7PnTNnTgwdOjR+8IMfxB/+8If8FPLXTgU/9thj49e//nV8+9vfjh/84Afx2GOPxV/+8pfo06dPjBw5Mk4++eR45zvfGR/84Af3WOe4ceNi6dKl8YUvfCGamppizZo1cdhhh8W73vWumD59ehx++OEFv+bOGj16dPz2t7+NL33pS/GjH/0oVq1aFQceeGAcf/zxMXny5LjkkkvaTb+HciRfSpMvUAnky/7Nl51/GRyx/S9gW1pa9jr+pZde6vEaYH+QLfs3W0aPHh3f/e53Y/HixbF06dJobm6OF154IWpqauLII4+MU045JT7wgQ/EBz/4waiqqurx88P+JF/82wiKRb7s33w54YQT4pZbboklS5bEb37zm1i7dm28+OKL0a9fvzjuuOPitNNOi8svvzxOOOGEHj837C9Jmu5joVwoIytXrszf4HXFihUxfPjw0hYEZIZ8AYpFvgDFIFuAYpEvQLHIFyg+U5UAAAAAAAAg4zQFAQAAAAAAIOM0BQEAAAAAACDjNAUBAAAAAAAg45I0TdNSFwEAAAAAAAAUj5mCAAAAAAAAkHHV+/uEbW1tsXr16hgwYEAkSbK/Tw90Q5qmsWHDhhgyZEjkcr3rbwpkC5Q3+QIUi3wBikW+AMXQm7MlQr5AOevt+bK/bdmyJVpbWwse36dPn6itrS1iRfvHfm8Krl69OoYOHbq/Twv0oFWrVsXhhx9e6jLakS2QDfIFKBb5AhSLfAGKoTdmS4R8gSzorfmyP23ZsiX61g2MaH254Oc0NDTEihUryr4xuN+bggMGDIiIiFVPr4iBAwbu79NnwsRvP1rqEsrafZNPLXUJZWv9hvUxdOSI/P/HvYlsodQm/+CxUpdQ1l5+aVP8+BPvlS/QAfnSPfIl2xb9ZnWpSyhr7zhhSKlLKGv+fZRtb/vXB0pdQll76NIzSl1C2erN2RIhX3pC3QUTSl1CWVv3bz8tdQllq7fny/7U2tq6vSF4xkkR1VX7fsIr26L5gceitbVVU7Czdk4rHzhgYAwc6BtHV1T3PbDUJZQ1X3fd1xuXh5AtlNoBffuXuoRMkC+wO/nSM+RLNh144IZSl1DWfN31DPmSTVW1fvfSHb7uuq83ZkuEfOkJSSENCPbI11339dZ8KYk+B0RywL7bZGnulf1QzP5h4VgAAAAAAAAqS5IUvnXBnDlzYvjw4VFbWxvjxo2LRx/d8yqQ3/jGN+K0006Lgw8+OA4++OBobGzcbXyapjF9+vQ49NBDo2/fvtHY2BhPPfVUp2rSFAQAAAAAAKCyFLEpuGDBgpg2bVrMmDEjli9fHqNGjYqJEyfG888/3+H4xYsXxwUXXBCLFi2KJUuWxNChQ2PChAnx3HPP5cfcfPPNcdttt8XcuXPjkUceiQMPPDAmTpwYW7ZsKbguTUEAAAAAAAAqS5IrfOukW2+9NS677LKYMmVKHHfccTF37tzo169f3HHHHR2Ov+uuu+If/uEf4qSTTopjjjkmvvnNb0ZbW1s0NTVFxPZZgrNnz47rr78+3ve+98WJJ54Y3/nOd2L16tVx7733FlyXpiAAAAAAAACVpZMzBdevX99u27p1a4eHbW1tjWXLlkVjY2N+Xy6Xi8bGxliyZElBpW3evDlefvnlGDRoUERErFixIpqbm9sds66uLsaNG1fwMSM0BQEAAAAAAKg0uaTwLSKGDh0adXV1+W3WrFkdHnbt2rWxbdu2qK+vb7e/vr4+mpubCyrtM5/5TAwZMiTfBNz5vO4cMyKiuuCRAAAAAAAAkAWF3i9wx5hVq1bFwIED87tramqKUtZNN90U8+fPj8WLF0dtbW2PHttMQQAAAAAAACpLJ5cPHThwYLttT03BwYMHR1VVVbS0tLTb39LSEg0NDXst6ZZbbombbropfvrTn8aJJ56Y37/zeV055q40BQEAAAAAAKgsnWwKFqpPnz4xevToaGpqyu9ra2uLpqamGD9+/B6fd/PNN8cNN9wQCxcujDFjxrR7bMSIEdHQ0NDumOvXr49HHnlkr8d8LcuHAgAAAAAAUFk6uXxoZ0ybNi0mT54cY8aMiVNPPTVmz54dmzZtiilTpkRExEUXXRSHHXZY/r6EX/rSl2L69Okxb968GD58eP4+gf3794/+/ftHkiRx9dVXx4033hhHHXVUjBgxIj73uc/FkCFDYtKkSQXXpSkIAAAAAABAZSliU/C8886LNWvWxPTp06O5uTlOOumkWLhwYdTX10dExDPPPBO53KuLeX7ta1+L1tbW+OAHP9juODNmzIiZM2dGRMSnP/3p2LRpU1x++eXx4osvxtve9rZYuHBhp+47qCkIAAAAAABAZckl27dCxnXB1KlTY+rUqR0+tnjx4nYfr1y5cp/HS5Ik/umf/in+6Z/+qUv1RGgKAgAAAAAAUGmKOFOwt9IUBAAAAAAAoLIkue1bIeMyQlMQAAAAAACAypJEgTMFi17JfqMpCAAAAAAAQGWxfCgAAAAAAABkXC4XUVXA0qDbLB8KAAAAAAAA5clMQQAAAAAAAMg4TUEAAAAAAADIOE1BAAAAAAAAyLhcsn0rZFxGaAoCAAAAAABQWcwUBAAAAAAAgIxLctu3QsZlhKYgAAAAAAAAlcVMQQAAAAAAAMg4TUEAAAAAAADIuFyyfStkXEZoCgIAAAAAAFBZzBQEAAAAAACAjNMUBAAAAAAAgIzTFAQAAAAAAICMS3Lbt0LGZYSmIAAAAAAAABUoO7MAC6EpCAAAAAAAQIUpcKZgmCkIAAAAAAAA5Smp2r4VMi4jNAUBAAAAAACoLEmyfStkXEZ0ac7jnDlzYvjw4VFbWxvjxo2LRx99tKfrAiqUfAGKRb4AxSBbgGKRL0CxyBeAHZJc4VtGdPqVLFiwIKZNmxYzZsyI5cuXx6hRo2LixInx/PPPF6M+oILIF6BY5AtQDLIFKBb5AhSLfAHYVdKJLRs63RS89dZb47LLLospU6bEcccdF3Pnzo1+/frFHXfcUYz6gAoiX4BikS9AMcgWoFjkC1As8gVgF2YK7l1ra2ssW7YsGhsbXz1ALheNjY2xZMmSDp+zdevWWL9+fbsN4LU6my+yBSiUfAGKwb+NgGKRL0CxyBeA19AU3Lu1a9fGtm3bor6+vt3++vr6aG5u7vA5s2bNirq6uvw2dOjQrlcLZFZn80W2AIWSL0Ax+LcRUCzyBSgW+QLwWpYP7XHXXHNNrFu3Lr+tWrWq2KcEKoBsAYpFvgDFIl+AYpEvQLHIFyDTKnCmYHVnBg8ePDiqqqqipaWl3f6WlpZoaGjo8Dk1NTVRU1PT9QqBitDZfJEtQKHkC1AM/m0EFIt8AYpFvgC8RpJs3woZlxGdam/26dMnRo8eHU1NTfl9bW1t0dTUFOPHj+/x4oDKIV+AYpEvQDHIFqBY5AtQLPIF4LWS2N4m29eWnaZgp2YKRkRMmzYtJk+eHGPGjIlTTz01Zs+eHZs2bYopU6YUoz6ggsgXoFjkC1AMsgUoFvkCFIt8AdhFBc4U7HRT8Lzzzos1a9bE9OnTo7m5OU466aRYuHDhbjeoBegs+QIUi3wBikG2AMUiX4BikS8Ar0qSXCSF3C8wyUVa/HL2i043BSMipk6dGlOnTu3pWgDkC1A08gUoBtkCFIt8AYpFvgDslERhS4NW8ExBAAAAAAAAKGtJbvtWyLiM0BQEAAAAAACgsrinIAAAAAAAAGRcUrV9K2RcRmgKAgAAAAAAUFksHwoAAAAAAABZl9uxFTIuGzQFAQAAAAAAqCzuKQgAAAAAAAAZlyQFLh+qKQgAAAAAAABlKtmxFTIuGzQFAQAAAAAAqCxJrsCZgu4pCAAAAAAAAOXJPQUBAAAAAAAg63I7tkLGZYOmIAAAAAAAABWmwJmC7ikIAAAAAAAAZco9BQEAAAAAACDrkihsFmB2Zgpmp70JAAAAAAAABcgluYK3rpgzZ04MHz48amtrY9y4cfHoo4/ucexvf/vb+MAHPhDDhw+PJEli9uzZu42ZOXNmJEnSbjvmmGM6VZOmIAAAAAAAABUl14m3zlqwYEFMmzYtZsyYEcuXL49Ro0bFxIkT4/nnn+9w/ObNm+MNb3hD3HTTTdHQ0LDH477pTW+KP//5z/ntoYce6lRdmoIAAAAAAABUlCTJFbx11q233hqXXXZZTJkyJY477riYO3du9OvXL+64444Ox48dOzb++Z//Oc4///yoqanZ43Grq6ujoaEhvw0ePLhTdWkKAgAAAAAAUFFykRS8RUSsX7++3bZ169YOj9va2hrLli2LxsbGV8+Vy0VjY2MsWbKkWzU/9dRTMWTIkHjDG94QH/rQh+KZZ57p1PM1BQEAAAAAAKgoVUlVVCXVBWxVERExdOjQqKury2+zZs3q8Lhr166Nbdu2RX19fbv99fX10dzc3OV6x40bF3feeWcsXLgwvva1r8WKFSvitNNOiw0bNhR8jOounx0AAAAAAADKUC6SSHbMAtybdMeYVatWxcCBA/P797bMZzGcffbZ+fdPPPHEGDduXBxxxBFx9913x6WXXlrQMTQFAQAAAAAAqCgF3y9wx5iBAwe2awruyeDBg6OqqipaWlra7W9paYmGhoYu1dqRgw46KI4++uh4+umnC36O5UMBAAAAAACoKLlOvHVGnz59YvTo0dHU1JTf19bWFk1NTTF+/Pgeq3/jxo3xhz/8IQ499NCCn2OmIAAAAAAAABUlSZLIJftePrStgDGvNW3atJg8eXKMGTMmTj311Jg9e3Zs2rQppkyZEhERF110URx22GH5+xK2trbGE088kX//ueeei8ceeyz69+8fI0eOjIiIT37yk3HOOefEEUccEatXr44ZM2ZEVVVVXHDBBQXXpSkIAAAAAABARUkiF0kBswALGfNa5513XqxZsyamT58ezc3NcdJJJ8XChQujvr4+IiKeeeaZyOVePe7q1avj5JNPzn98yy23xC233BJnnHFGLF68OCIinn322bjgggvihRdeiNe//vXxtre9LR5++OF4/etfX3BdmoIAAAAAAABUlFySi1wn7inYWVOnTo2pU6d2+NjORt9Ow4cPjzRN93q8+fPnd6mOXWkKAgAAAAAAUFFyO+YK7lvnlw/trTQFAQAAAAAAqChJkoukgFmAhYwpF5qCAAAAAAAAVJTtMwULafiZKQgAAAAAAABlqdj3FOyNNAUBAAAAAACoKMmOt0LGZYWmIAAAAAAAABXFTEEAAAAAAADIuGTHXQULGZcVmoJl6L8/Mr7UJZS13E23lLqEspVu3VLqEiii3HVTS11CWWv7wu2lLqGsrV+/Pur+odRVUCxH3f6fpS6hrD019ZxSl1DW5Eu2NZ50WKlLKGu5888sdQllLX35lVKXQBENqu1X6hKAjGr74c9LXUJZW/q7llKXULY2btxQ6hJ6nVySRC4pYGnQQsaUCU1BAAAAAAAAKkouqqOqoDZZdlpp2XklAAAAAAAAUIBCZwqmZgoCAAAAAABAecrteNuX1D0FAQAAAAAAoDwlSS6SZN8Nv0LGlAtNQQAAAAAAACpKLpLIRQHLhxYwplxoCgIAAAAAAFBRkiQpcKagpiAAAAAAAACUJfcUBAAAAAAAgIzLJbnIFTBTMHVPQQAAAAAAAChPyY63QsZlhaYgAAAAAAAAFcVMQQAAAAAAAMi4JJLIFTALsM1MQQAAAAAAAChPSZJEkhSwfGgBY8qFpiAAAAAAAAAVJRcRuQL6fdlZPFRTEAAAAAAAgApjpiAAAAAAAABkXC4KmwVopiAAAAAAAACUKTMFAQAAAAAAIOOqctu3fUkzNFVQUxAAAAAAAICKkkuSyBUwC7CQMeVCUxAAAAAAAICKkuzYChmXFZqCAAAAAAAAVBQzBQEAAAAAACDjkmT7Vsi4rNAUBAAAAAAAoKIkBc4UTDLUFdQUBAAAAAAAoKLkdmyFjMsKTUEAAAAAAAAqSpIkBc0CNFMQAAAAAAAAylQu2b4VMi4rNAUBAAAAAACoKGYKAgAAAAAAQMaZKQgAAAAAAAAZl0REEgXMFCx+KfuNpiAAAAAAAAAVxUxBAAAAAAAAyDj3FAQAAAAAAICMM1MQAAAAAAAAMs5MQQAAAAAAAMi4qmT7ti9t2ekJagoCAAAAAABQWZJIIlfITMHITldQUxAAAAAAAICK4p6CAAAAAAAAkHHJjrdCxmVFrrNPePDBB+Occ86JIUOGRJIkce+99xahLKDSyBagWOQLUCzyBSgW+QIUi3wBeNXOmYKFbFnR6abgpk2bYtSoUTFnzpxi1ANUKNkCFIt8AYpFvgDFIl+AYpEvAK9KkqTgLSs6vXzo2WefHWeffXYxagEqmGwBikW+AMUiX4BikS9AscgXgFe5p2ARbN26NbZu3Zr/eP369cU+JVABZAtQLPIFKBb5AhSLfAGKRb4AWVboLMAszRTs9PKhnTVr1qyoq6vLb0OHDi32KYEKIFuAYpEvQLHIF6BY5AtQLPIFyLJcJ7aumDNnTgwfPjxqa2tj3Lhx8eijj+5x7G9/+9v4wAc+EMOHD48kSWL27NndPmZHit4UvOaaa2LdunX5bdWqVcU+JVABZAtQLPIFKBb5AhSLfAGKRb4AWZZLkoK3zlqwYEFMmzYtZsyYEcuXL49Ro0bFxIkT4/nnn+9w/ObNm+MNb3hD3HTTTdHQ0NAjx+xI0ZcPrampiZqammKfBqgwsgUoFvkCFIt8AYpFvgDFIl+ALCvmPQVvvfXWuOyyy2LKlCkRETF37tz48Y9/HHfccUd89rOf3W382LFjY+zYsRERHT7elWN2+Fo6/1IAAAAAAACgfCVR2NKhO3uC69evb7ftes/VXbW2tsayZcuisbExvy+Xy0VjY2MsWbKkS7X21DE7PVNw48aN8fTTT+c/XrFiRTz22GMxaNCgGDZsWGcPBxARsgUoHvkCFIt8AYpFvgDFIl8AXlXo0qA7x7z2vqozZsyImTNn7jZ+7dq1sW3btqivr2+3v76+Pp588sku1dpTx+x0U3Dp0qXxjne8I//xtGnTIiJi8uTJceedd3b2cAARIVuA4pEvQLHIF6BY5AtQLPIF4FU7ZwIWMi4iYtWqVTFw4MD8/nJcXrnTTcG3v/3tkaZpMWoBKphsAYpFvgDFIl+AYpEvQLHIF4BXdfaeggMHDmzXFNyTwYMHR1VVVbS0tLTb39LSEg0NDV0ptceO6Z6CAAAAAAAAVJTqJCl464w+ffrE6NGjo6mpKb+vra0tmpqaYvz48V2qtaeO2emZggAAAAAAAFDOOntPwc6YNm1aTJ48OcaMGROnnnpqzJ49OzZt2hRTpkyJiIiLLrooDjvssJg1a1ZERLS2tsYTTzyRf/+5556Lxx57LPr37x8jR44s6JiF0BQEAAAAAACgonR2+dDOOO+882LNmjUxffr0aG5ujpNOOikWLlwY9fX1ERHxzDPPRC736mKeq1evjpNPPjn/8S233BK33HJLnHHGGbF48eKCjlkITUEAAAAAAAAqSi4Ku8deV+/DN3Xq1Jg6dWqHj+1s9O00fPjwgu75urdjFkJTEAAAAAAAgIqSFLh8aNKF5UN7K01BAAAAAAAAKkqxZwr2RpqCAAAAAAAAVJRi3lOwt9IUBAAAAAAAoKLkClw+tJAx5UJTEAAAAAAAgIpi+VAAAAAAAADIODMFAQAAAAAAIOPcUxAAAAAAAAAyzvKhAAAAAAAAkHGWDwUAAAAAAICMS3ZshYzLCk1BAAAAAAAAKkoShd0vUFMQAAAAAAAAypTlQwEAAAAAACDjqpMkqgto+BUyplxoCgIAAAAAAFBRcklhy4cWMqZcaAoCAAAAAABQUXI7tkLGZYWmIAAAAAAAABXFPQUBAAAAAAAg4ywfCgAAAAAAABln+VAAAAAAAADIuCQpbGnQDK0eqikIAAAAAABAZTFTEAAAAAAAADIuSZJICpopmJ2pgpqCAAAAAAAAVJQkKWxp0Az1BDUFAQAAAAAAqCyWDwUAAAAAAICMs3woAAAAAAAAZJzlQwEAAAAAACDjLB8KAAAAAAAAGWf5UAAAAAAAAMi4ZMdWyLis0BQEAAAAAACgolTlkqjK7bvlV8iYclGypuAZd/w8qmoPLNXpy9rSK04vdQllre2znyx1CWVr/fr1UXfT50tdxl59cP7yOKCvbOmKti/cXuoSoFdruO2bkdT2LXUZZWnTJz9a6hKgVzvne7+Maj+/dEnTlDeXuoSy1ja/qdQllLX169dHXf3rSl3GXg257Q4/v3TRhk/+falLgF5t7Df+K6pq+5W6jLL0xJVnlbqEsjbm2PpSl1C21q/3M8FrmSkIAAAAAAAAGZckEYVMAszQLQU1BQEAAAAAAKgsSZJEUkDHr5Ax5UJTEAAAAAAAgIpi+VAAAAAAAADIuFyBy4cWMqZcaAoCAAAAAABQUZIdb4WMywpNQQAAAAAAACpKkmzfChmXFZqCAAAAAAAAVJRcFLh8aNEr2X80BQEAAAAAAKgolg8FAAAAAACAjLN8KAAAAAAAAGScpiAAAAAAAABkXC6SyBWwNGghY8qFpiAAAAAAAAAVxUxBAAAAAAAAyLhkx1bIuKzQFAQAAAAAAKCi5HJJVOUKWD60gDHlQlMQAAAAAACAipLseCtkXFZoCgIAAAAAAFBRcsn2rZBxWaEpCAAAAAAAQEVJku1bIeOyIlfqAgAAAAAAAGB/Sjrx1hVz5syJ4cOHR21tbYwbNy4effTRvY7/93//9zjmmGOitrY2TjjhhPjJT37S7vGLL744kiRpt5111lmdqklTEAAAAAAAgIqyc/nQQrbOWrBgQUybNi1mzJgRy5cvj1GjRsXEiRPj+eef73D8L37xi7jgggvi0ksvjV/96lcxadKkmDRpUjz++OPtxp111lnx5z//Ob/927/9W+dec+dfCgAAAAAAAJSvpBNbZ916661x2WWXxZQpU+K4446LuXPnRr9+/eKOO+7ocPxXvvKVOOuss+JTn/pUHHvssXHDDTfEKaecErfffnu7cTU1NdHQ0JDfDj744E7VpSkIAAAAAABARXntUpx72yIi1q9f327bunVrh8dtbW2NZcuWRWNjY35fLpeLxsbGWLJkSYfPWbJkSbvxERETJ07cbfzixYvjkEMOiTe+8Y3x0Y9+NF544YVOvWZNQQAAAAAAANiLoUOHRl1dXX6bNWtWh+PWrl0b27Zti/r6+nb76+vro7m5ucPnNDc373P8WWedFd/5zneiqakpvvSlL8UDDzwQZ599dmzbtq3g11Bd8EgAAAAAAADIgCTZvhUyLiJi1apVMXDgwPz+mpqaIlXWsfPPPz///gknnBAnnnhiHHnkkbF48eI488wzCzqGmYIAAAAAAABUlJ1NwUK2iIiBAwe22/bUFBw8eHBUVVVFS0tLu/0tLS3R0NDQ4XMaGho6NT4i4g1veEMMHjw4nn766YJfs6YgAAAAAAAAFSXpxFtn9OnTJ0aPHh1NTU35fW1tbdHU1BTjx4/v8Dnjx49vNz4i4v7779/j+IiIZ599Nl544YU49NBDC65NUxAAAAAAAICK0tmZgp0xbdq0+MY3vhHf/va343e/+1189KMfjU2bNsWUKVMiIuKiiy6Ka665Jj/+qquuioULF8aXv/zlePLJJ2PmzJmxdOnSmDp1akREbNy4MT71qU/Fww8/HCtXroympqZ43/veFyNHjoyJEycWXJd7CgIAAAAAAFBRkh1bIeM667zzzos1a9bE9OnTo7m5OU466aRYuHBh1NfXR0TEM888E7ncq/P23vKWt8S8efPi+uuvj2uvvTaOOuqouPfee+P444+PiIiqqqr49a9/Hd/+9rfjxRdfjCFDhsSECRPihhtu6NS9DTUFAQAAAAAAqChJkkRSwDTAQsZ0ZOrUqfmZfq+1ePHi3fade+65ce6553Y4vm/fvnHfffd1qY5daQoCAAAAAABQUYo5U7C30hQEAAAAAACgohR7pmBvpCkIAAAAAABAZUkiCur3ZacnqCkIAAAAAABAZbF8KAAAAAAAAGSc5UMBAAAAAAAg48wUBAAAAAAAgIxLCrynYIYmCkauM4NnzZoVY8eOjQEDBsQhhxwSkyZNit///vfFqg2oIPIFKBb5AhSLfAGKQbYAxSJfANpLOvGWFZ1qCj7wwANx5ZVXxsMPPxz3339/vPzyyzFhwoTYtGlTseoDKoR8AYpFvgDFIl+AYpAtQLHIF4AOJAVsGdKp5UMXLlzY7uM777wzDjnkkFi2bFmcfvrpPVoYUFnkC1As8gUoFvkCFINsAYpFvgC0V4nLh3brnoLr1q2LiIhBgwbtcczWrVtj69at+Y/Xr1/fnVMCFWJf+SJbgK6SL0CxyBegGPzuBSgW+QJUuu0TAffd8ctQT7Bzy4fuqq2tLa6++up461vfGscff/wex82aNSvq6ury29ChQ7t6SqBCFJIvsgXoCvkCFIt8AYrB716AYpEvAK/OFCxky4ouNwWvvPLKePzxx2P+/Pl7HXfNNdfEunXr8tuqVau6ekqgQhSSL7IF6Ar5AhSLfAGKwe9egGKRLwCF3U4wa7cV7NLyoVOnTo0f/ehH8eCDD8bhhx++17E1NTVRU1PTpeKAylNovsgWoLPkC1As8gUoBr97AYpFvgBs556C+5CmaXzsYx+Le+65JxYvXhwjRowoVl1AhZEvQLHIF6BY5AtQDLIFKBb5AtBesuOtkHFZ0amm4JVXXhnz5s2LH/7whzFgwIBobm6OiIi6urro27dvUQoEKoN8AYpFvgDFIl+AYpAtQLHIF4D2KnGmYKfuKfi1r30t1q1bF29/+9vj0EMPzW8LFiwoVn1AhZAvQLHIF6BY5AtQDLIFKBb5AkCnlw8FKAb5AhSLfAGKRb4AxSBbgGKRLwDt5ZIkcgVMAyxkTLnoVFMQAAAAAAAAyl0lLh+qKQgAAAAAAEBFSXa8FTIuKzQFAQAAAAAAqChmCgIAAAAAAEDWFdgUzNBEQU1BAAAAAAAAKk0ShXX8stMV1BQEAAAAAACgolg+FAAAAAAAALKu8iYKagoCAAAAAABQWZIdb4WMywpNQQAAAAAAACqK5UMBAAAAAAAg6ywfCgAAAAAAANlm+VAAAAAAAADIOjMFAQAAAAAAINvcUxAAAAAAAAAyr/KmCmoKAgAAAAAAUFFyyfatkHFZoSkIAAAAAABAZanA9UM1BQEAAAAAAKgoFdgTjFypCwAAAAAAAACKy0xBAAAAAAAAKkoSSSQFTANMIjtTBTUFAQAAAAAAqCiVuHyopiAAAAAAAAAVJtmxFTIuGzQFAQAAAAAAqChmCgIAAAAAAEDWVd5EQU1BAAAAAAAAKkuy462QcVmhKQgAAAAAAEBFsXwoAAAAAAAAZJ3lQwEAAAAAACDbLB8KAAAAAAAAWWemIAAAAAAAAGRbJd5TMFfqAgAAAAAAAGB/Sjrx1hVz5syJ4cOHR21tbYwbNy4effTRvY7/93//9zjmmGOitrY2TjjhhPjJT37S7vE0TWP69Olx6KGHRt++faOxsTGeeuqpTtWkKQgAAAAAAEBFSXKFb521YMGCmDZtWsyYMSOWL18eo0aNiokTJ8bzzz/f4fhf/OIXccEFF8Sll14av/rVr2LSpEkxadKkePzxx/Njbr755rjtttti7ty58cgjj8SBBx4YEydOjC1bthRcl6YgAAAAAAAAFSbpxNY5t956a1x22WUxZcqUOO6442Lu3LnRr1+/uOOOOzoc/5WvfCXOOuus+NSnPhXHHnts3HDDDXHKKafE7bffHhHbZwnOnj07rr/++njf+94XJ554YnznO9+J1atXx7333ltwXfv9noJpmkZExLYtm/f3qTNj/fr1pS6BCrV+w/avvZ3/H/cmO2t6ZcumEldSvmQLpVQO+ZJuLfyvrmhPvlBK5ZAvfn7pOvlCKZVDvvj5pevkC6XSm7Mlwu92e4J8oVR6e76UwoYN6wu6X+CGHdfutf//1tTURE1NzW7jW1tbY9myZXHNNdfk9+VyuWhsbIwlS5Z0eI4lS5bEtGnT2u2bOHFivuG3YsWKaG5ujsbGxvzjdXV1MW7cuFiyZEmcf/75+34hUYKm4IYNGyIi4jefL6xAdld3zb7HQDFt2LAh6urqSl1GOzuzZdFnJpW2kDJWd1WpK4DenS9bbplR4krKV90XPlPqEqBX58svrvtAiSspX3WfKHUF0LvzZfMtnytxJeWr7gufKnUJVLjemC0Rr+bLH26cUuJKylfd9aWugErXW/Nlf+rTp080NDTE0KNGFPyc/v37x9ChQ9vtmzFjRsycOXO3sWvXro1t27ZFfX19u/319fXx5JNPdnj85ubmDsc3NzfnH9+5b09jCrHfm4JDhgyJVatWxYABAyIppAW7n61fvz6GDh0aq1atioEDB5a6nLLj+nVPb79+aZrGhg0bYsiQIaUuZTeyJftcw+7p7ddPvnRdb//c9nauX/f19msoX7qut39uezvXr3vK4frJl64rh89vb+b6dU9vv369OVsi5EvWuX7d09uvX2/Pl/2ptrY2VqxYEa2trQU/J03T3XKvo1mCvd1+bwrmcrk4/PDD9/dpO23gwIG98n/ccuH6dU9vvn699a9IZEvlcA27pzdfP/nSPb35c1sOXL/u683XUL50T2/+3JYD1697evv1ky/d09s/v72d69c9vfn69dZsiZAvlcL1657efP16c77sb7W1tVFbW1uUYw8ePDiqqqqipaWl3f6WlpZoaGjo8DkNDQ17Hb/zvy0tLXHooYe2G3PSSScVXFuu4JEAAAAAAADAHvXp0ydGjx4dTU1N+X1tbW3R1NQU48eP7/A548ePbzc+IuL+++/Pjx8xYkQ0NDS0G7N+/fp45JFH9njMjuz3mYIAAAAAAACQVdOmTYvJkyfHmDFj4tRTT43Zs2fHpk2bYsqU7fdkveiii+Kwww6LWbNmRUTEVVddFWeccUZ8+ctfjne/+90xf/78WLp0aXz961+PiIgkSeLqq6+OG2+8MY466qgYMWJEfO5zn4shQ4bEpEmTCq5LU/A1ampqYsaMGWW5Fmxv4Pp1j+uXXT633ecado/rl10+t93j+nWfa5hdPrfd4/p1j+uXbT6/3eP6dY/rl20+v93j+nWP68euzjvvvFizZk1Mnz49mpub46STToqFCxdGfX19REQ888wzkcu9upjnW97ylpg3b15cf/31ce2118ZRRx0V9957bxx//PH5MZ/+9Kdj06ZNcfnll8eLL74Yb3vb22LhwoWdWgY1SdM07bmXCQAAAAAAAPQ27ikIAAAAAAAAGacpCAAAAAAAABmnKQgAAAAAAAAZpykIAAAAAAAAGacpCAAAAAAAABmnKbiLOXPmxPDhw6O2tjbGjRsXjz76aKlLKhsPPvhgnHPOOTFkyJBIkiTuvffeUpdUVmbNmhVjx46NAQMGxCGHHBKTJk2K3//+96Uuix4kX7pOvnSPfMk++dJ18qXrZEtlkC9dI1u6R75kn2zpOvnSPfIl++RL18mX7pEvlBNNwR0WLFgQ06ZNixkzZsTy5ctj1KhRMXHixHj++edLXVpZ2LRpU4waNSrmzJlT6lLK0gMPPBBXXnllPPzww3H//ffHyy+/HBMmTIhNmzaVujR6gHzpHvnSPfIl2+RL98iXrpMt2Sdfuk62dI98yTbZ0j3ypXvkS7bJl+6RL90jXygnSZqmaamL6A3GjRsXY8eOjdtvvz0iItra2mLo0KHxsY99LD772c+WuLrykiRJ3HPPPTFp0qRSl1K21qxZE4ccckg88MADcfrpp5e6HLpJvvQc+dJ98iVb5EvPkS/dI1uyR770DNnSffIlW2RLz5Ev3SdfskW+9Bz50n3yhd7MTMGIaG1tjWXLlkVjY2N+Xy6Xi8bGxliyZEkJK6NSrVu3LiIiBg0aVOJK6C75Qm8jX7JDvtCbyJZskS/0JvIlO2QLvY18yQ75Qm8jX+jNNAUjYu3atbFt27aor69vt7++vj6am5tLVBWVqq2tLa6++up461vfGscff3ypy6Gb5Au9iXzJFvlCbyFbske+0FvIl2yRLfQm8iVb5Au9iXyht6sudQFAe1deeWU8/vjj8dBDD5W6FCBj5AtQDLIFKBb5AhSLfAGKRb7Q22kKRsTgwYOjqqoqWlpa2u1vaWmJhoaGElVFJZo6dWr86Ec/igcffDAOP/zwUpdDD5Av9BbyJXvkC72BbMkm+UJvIF+yR7bQW8iX7JEv9BbyhXJg+dCI6NOnT4wePTqampry+9ra2qKpqSnGjx9fwsqoFGmaxtSpU+Oee+6Jn/3sZzFixIhSl0QPkS+UmnzJLvlCKcmWbJMvlJJ8yS7ZQqnJl+ySL5SafKGcmCm4w7Rp02Ly5MkxZsyYOPXUU2P27NmxadOmmDJlSqlLKwsbN26Mp59+Ov/xihUr4rHHHotBgwbFsGHDSlhZebjyyitj3rx58cMf/jAGDBiQX++8rq4u+vbtW+Lq6C750j3ypXvkS7bJl+6RL10nW7JPvnSdbOke+ZJtsqV75Ev3yJdsky/dI1+6R75QVlLy/vf//t/psGHD0j59+qSnnnpq+vDDD5e6pLKxaNGiNCJ22yZPnlzq0spCR9cuItJvfetbpS6NHiJfuk6+dI98yT750nXypetkS2WQL10jW7pHvmSfbOk6+dI98iX75EvXyZfukS+UkyRN07S7jUUAAAAAAACg93JPQQAAAAAAAMg4TUEAAAAAAADIOE1BAAAAAAAAyDhNQQAAAAAAAMg4TUEAAAAAAADIOE1BAAAAAAAAyDhNQQAAAAAAAMg4TUEAAAAAAADIOE1BAAAAAAAAyDhNQQAAAAAAAMg4TUEAAAAAAADIuP8PDO0F/AJpCd4AAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 17 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "The interactions between communities vary across different timesteps, as depicted in the visualizations. These interactions, in conjunction with the vectors `u` and `v`, provide insights into the temporal evolution of community memberships. \n", + "\n", + "To further our understanding, we can compare the inferred community memberships with the ground \n", + "truth data used to train the model. This comparison is facilitated by constructing an overall \n", + "membership matrix, which contains the community clustering patterns of nodes at each timestep." + ], + "id": "7be76e0961cbbded" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:19.932941Z", + "start_time": "2024-11-07T17:47:19.913491Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.evaluation.expectation_computation import (\n", + " compute_expected_adjacency_tensor,\n", + ")\n", + "from probinet.utils.matrix_operations import transpose_tensor\n", + "\n", + "# Define the number of time steps\n", + "T = B.shape[0] - 1\n", + "\n", + "# Compute the expected adjacency tensor\n", + "lambda_inf_dyn = compute_expected_adjacency_tensor(u_dyn, v_dyn, w_dyn[0])\n", + "\n", + "# Compute the inferred membership tensor\n", + "M_inf_dyn = lambda_inf_dyn + eta_dyn * transpose_tensor(B)" + ], + "id": "b342ae6248636ee9", + "outputs": [], + "execution_count": 18 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "The comparison between the two temporal arrays can be done using the `calculate_AUC` function \n", + "from the `probinet.evaluation` module. This function calculates the Area Under the Curve (AUC)\n", + "for the given temporal arrays. We can use this function to compute the AUC for each time step, i\n", + ".e., the probability that a randomly selected edge has higher expected value than a randomly \n", + "selected non-existing edge. A value of 1 means perfect reconstruction, while 0.5 is pure random chance. " + ], + "id": "7e64ba3974a78a5b" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:08:10.948324Z", + "start_time": "2024-10-25T15:08:10.869920Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.evaluation.link_prediction import compute_link_prediction_AUC\n", + "from probinet.utils.tools import flt\n", + "\n", + "# Compute the AUC for each time step\n", + "for t in range(T + 1):\n", + " print(\n", + " f\"Time step {t}: AUC = {flt(compute_link_prediction_AUC(M_inf_dyn[t],B[t].astype('int')))}\"\n", + " )" + ], + "id": "51bf2762ba8bb228", + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'T' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mprobinet\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mutils\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtools\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m flt\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# Compute the AUC for each time step\u001b[39;00m\n\u001b[0;32m----> 5\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[43mT\u001b[49m \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m):\n\u001b[1;32m 6\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTime step \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mt\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: AUC = \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mflt(compute_link_prediction_AUC(M_inf_dyn[t],B[t]\u001b[38;5;241m.\u001b[39mastype(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mint\u001b[39m\u001b[38;5;124m'\u001b[39m)))\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'T' is not defined" + ] + } + ], + "execution_count": 21 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As we can see, the results obtained from the `DynCRep` model show a high AUC value for each time.\n", + " We can also get a graphical feeling about how the inferred temporal relationships compare to the ground truth data by using the `plot_temporal_arrays` function defined below." + ], + "id": "7c75e1f5207a5fce" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:48:13.179465Z", + "start_time": "2024-11-07T17:48:13.172503Z" + } + }, + "cell_type": "code", + "source": [ + "def plot_temporal_arrays(arrays, titles=None, cmap=\"PuBuGn\"):\n", + " \"\"\"\n", + " Plot a list of temporal arrays in separate columns.\n", + "\n", + " Parameters\n", + " ----------\n", + " arrays : list of np.ndarray\n", + " List of temporal arrays to plot.\n", + " cmap : str, optional\n", + " Colormap to use for the plots. Default is 'PuBuGn'.\n", + " \"\"\"\n", + " # Get the number of time steps from the first array in the list\n", + " T = arrays[0].shape[0] - 1\n", + "\n", + " # Create a new figure with specified size\n", + " plt.figure(figsize=(3 * len(arrays), 10))\n", + "\n", + " # Loop over each time step\n", + " for t in range(T + 1):\n", + " # Loop over each array\n", + " for i, array in enumerate(arrays):\n", + " # Add a subplot for the current array at the current time step\n", + " plt.subplot(T + 1, len(arrays), i + len(arrays) * t + 1)\n", + "\n", + " # Display the array as an image\n", + " plt.imshow(array[t], cmap=cmap, interpolation=\"nearest\")\n", + "\n", + " # Add a colorbar to the plot\n", + " plt.colorbar(fraction=0.046)\n", + "\n", + " # Add a title to the first subplot of each column\n", + " if t == 0:\n", + " if titles is not None:\n", + " plt.title(titles[i])\n", + " else:\n", + " plt.title(f\"Array {i+1}\")" + ], + "id": "5a4b78e4df83dcc4", + "outputs": [], + "execution_count": 25 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:22.665279Z", + "start_time": "2024-11-07T17:47:20.213499Z" + } + }, + "cell_type": "code", + "source": [ + "plot_temporal_arrays([B, M_inf_dyn], titles=[\"Ground Truth\", \"DynCRep-Dynamic\"])" + ], + "id": "58fde5cf86d1c07", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Hjg+8YlPYJ999sFdd92FOXPmoFKpDDkQ62c/+xk8z8NPf/rTlNZZz5w90njb294GxhiefvppHHnkkaM+33DQ1D5TAFi0aBEKhQL+8R//ETt27OhzvZGnnk996lOIogjf+MY3Uuevv/56EELwyU9+EoAw40ybNg2PPPJIqt0tt9wyhDsQUGPfdNNNqfM33HDDkMccLN72trfh2Wefxeuvv67P/c///A9+/etfp9oVCgUAfR8iMmRoFA8++CDWrl2Lgw46SKelAYJY5D3veQ++9a1v4T/+4z9w+umnD0nTA4DPfOYzOPzww3HllVdiy5Ytfa739PRg6dKlux3nq1/9KgqFAtatWwdACP/29nZcddVVCIKgT/vkPlJI/qZwzvGNb3wDlmXh4x//OADg2GOPxbx58/QxGGH68ssv45xzzoFt27jssstS10zTxBlnnIF/+7d/w8aNG3H44YcPmRxDaZTJ39JisYg777xzSOM1glNOOQWUUqxZs6aPBjzeNNqm10zf/va34/vf/z7OOOMMvPOd79QMSJxzvPjii/j+978PSmkf/2g9nHTSSTj++OOxdOlSvPTSSzjiiCNw//33495778VFF12U8md+8YtfxLp16/DFL34RRx99NB555JEUk0qjOPLII3HGGWfglltuQbFYxAc/+EFs3rwZzz333JDHHCz+8R//Eddddx3mz5+P8847D6+99hpuu+02vPvd7+4ThHDooYfiRz/6Ed7xjndgypQpOOyww3DYYYeN+hozNC9++ctf4tlnn0UYhtixYwcefPBBPPDAAzjggAPw05/+FI7jpNqfddZZuPTSSwGgrol3sLAsCz/5yU8wb948fOQjH8FnP/tZHHvssbAsC0899RS+//3vY/LkybvNNZ06dSrOPfdc3HLLLXjmmWfwrne9C7feeiu+8IUv4H3vex9OP/107LPPPti2bRt+/vOf49hjj00JT8dxsGnTJpx99tmYM2cOfvnLX+LnP/85lixZ0ifGoD88+eST+N73vgfGGLq7u/G73/0O//Ef/wFCCL773e/WFZRnnXUWbrrpJjz00ENYv359Yx9eAieccAJs28ZJJ52Ef/qnf0Jvby9uv/12TJ8+Ha+++uqQxx0MDj74YCxduhRr167Fhz/8Yfz93/89crkcfve732HWrFno6uoa1fkbwhhFEY84nnvuOX7BBRfw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L/i0adN4Z2fnWNxShgy7xd685znP9n2zoOmE6THHHMMvvPBC/T6KIj5r1ize1dU1hqsaG7z22mscAP+v//ovzjnn3d3d3LIs/uMf/1i3eeaZZzgAvmXLFs4557/4xS84pZRv375dt7n11lt5e3s79zxvz95AhgyDQLbn08j2/fhEU5l5VUmtefPm6XO7K6k1kVEsFgHEBOBPPPEEgiBIfT6HHHII9t9/f/35bNmyBYcffniqMsr8+fNRKpXw1FNP7cHVZ8iwe2R7vi+yfT8+0VTCdKCSWntbiSzGGC666CIce+yxmp1n+/btsG0bkyZNSrVNfj79lRhT1zJkGE/I9nwa2b4fv2hKOsEMwIUXXog//vGP+O///u+xXkqGDBn2ELJ9P37RVJrpUEpqTUQsWLAA9913Hx566CHst99++vzMmTPh+z66u7tT7ZOfT38lxtS1DBnGE7I9HyPb9+MbYypMGw13H0pJrYkEzjkWLFiAu+++Gw8++CAOOihdkf6oo46CZVmpz+dPf/oTtm3bpj+fuXPn4g9/+ANee+013eaBBx5Ae3s7Dj300D1zI3sIjzzyCE466STMmjULhBDcc889u+3z8MMP433vex9yuRwOPvhgbNy4cdTXuTch2/ONI9v3TYKxinwaarj7D3/4Q57L5fjGjRv5008/zb/0pS/xSZMmpaLUJiouuOAC3tHRwR9++GH+6quv6qNSqeg2X/7yl/n+++/PH3zwQf7444/zuXPn8rlz5+rrKkT+hBNO4Fu3buWbNm3i++yzz4QMkf/FL37Bly5dyn/yk59wAPzuu+8esP0LL7zAC4UCX7hwIX/66af517/+dW4YBt+0adOeWfAER7bnh4Zs3zcHxkyYDifc/etf/zrff//9uW3b/JhjjuG/+c1vRnOp4wYA6h533nmnblOtVvlXvvIVPnnyZF4oFPinP/1p/uqrr6bGeemll/gnP/lJns/n+bRp0/gll1zCgyDYw3ezZzEYYbpo0SL+7ne/O3XutNNO4/Pnzx/Fle09yPb80JDt++bAmJRg830fhUIB//7v/45TTjlFnz/77LPR3d2Ne++9N9Xe8zx4nqffM8awc+dOTJ06FYSQPbXsDMME5xw9PT2YNWtWqoZof3BdF77v9xmj9v88l8vttn4jIQR333136vtWi4985CN43/vehxtuuEGfu/POO3HR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09PTbsy73vUuvW7dOv3II4/ob3/72/o1r3mNfu1rX+tez/Ncv+xlL9NXXXWV/sd//Ef9la98Ra9evVqPj4+fiVuqUOGUOJf3vNbVvh8UDJwxffWrX61vvPFG97uUUl944YV6YmLiDK7qzODnP/+5BqC//vWva621PnHihPZ9X3/+8593Y374wx9qAPrxxx/XWmv9la98RXPO9dGjR92Yj3/843p0dFQnSXJ6b6BChTmg2vOdqPb98sRAhXmtpNZVV13ljp1KUutsxuTkJICCAPyJJ55AlmUd788ll1yCiy66yL0/jz/+OF7+8pd3KKNcc801aDQa+P73v38aV1+hwqlR7fmZqPb98sRAGdOTSWqdaxJZSinccssteN3rXufYeY4ePYogCLBixYqOseX3ZzaJMftahQrLCdWe70S175cvBpJOsAJw44034nvf+x7+/u///kwvpUKFCqcJ1b5fvhgoz3Q+klpnI2666SY88MAD+NrXvoaXvOQl7vjatWuRpilOnDjRMb78/swmMWZfq1BhOaHa8wWqfb+8cUaNab/l7vOR1DqboLXGTTfdhC9+8Yv46le/ipe+tFOR/oorroDv+x3vz49//GMcOXLEvT/r16/Hd7/7Xfz85z93Yx5++GGMjo7i0ksvPT03cprwd3/3d/j93/99XHjhhWCM4Utf+tIpz3n00UfxG7/xGwjDEL/0S7+E++67b8nXeS6h2vP9o9r3A4IzVfk033L3+++/X4dhqO+77z79gx/8QP/5n/+5XrFiRUeV2tmKd7/73XpsbEw/+uij+plnnnGPVqvlxrzrXe/SF110kf7qV7+qv/3tb+v169fr9evXu9dtifzVV1+tn3zySf3ggw/qF73oRWdlifxXvvIVvW3bNv2FL3xBA9Bf/OIXTzr+Jz/5ia7X63rDhg36Bz/4gf7IRz6ihRD6wQcfPD0LPstR7fn5odr3g4EzZkwXUu7+kY98RF900UU6CAL96le/Wn/jG99YyqUuGwDo+fj0pz/txrTbbf0Xf/EXeuXKlbper+v/8B/+g37mmWc65vnZz36m3/CGN+haraZXr16t3//+9+ssy07z3ZxezMWYbtq0Sf/ar/1ax7G3vvWt+pprrlnClZ07qPb8/FDt+8HAGZFgS9MU9Xod//2//3dce+217vg73vEOnDhxAl/+8pc7xidJgiRJ3O9KKbzwwgs477zzwBg7XcuusEBorTE1NYULL7ywQ0N0NsRxjDRNZ8zR/TcPw/CU+o2MMXzxi1/s+P/Wjd/6rd/Cb/zGb+CDH/ygO/bpT38at9xyi2tHqDA/9LvngWrfny3oZ9/32vMAhfujKFqqJS4Kzkg178nK3X/0ox/NGD8xMYHbbrvtdC2vwhLj6aef7iig6IU4jlEbGwXSrOP48PAwpqenO47t2rULu3fvXvC6ZmsfaDQaaLfbqNVqC77GuYp+9zxQ7fuzDafa97PteYCKpH76058ua4M6EK0x4+Pj2LBhg/t9cnISF110EZ7+Pz/F6Mhox9ixt12Nyf/6UM95ul872di5YuxtV9OaFjjPuYDGVAPrfumlGBkZOeXYNE1pU/32KwBP0MFcYvrRf8TTTz+N0dHi734qr7TCYGK2ff/EP3wXq1aMIaz50FojTXI02jlqPkecK4xEHvxA4IVGgpUjITyPg3OGJM6hNeB5HHmu4AccrWaGWt3HiUYCrYHVKyO8MBmjlUqcvyKCzBVeevcu/H/v3IEXrxnGM8eaWDkaQkqF6XaGkXqAkdEQNsDHOYdSGjJX8AP6f5tlEp5XeGSMMUipIAQdk1KBMQbOO71tO2eeFXOVIXMFYeaVuQIXzM1voZSie/UFGGMuslM+t3u+crCyOwKglHLHslQiCAsTkucS533wLpx4/60d556YnMQv/OtfPOW+77nnASCXOProPyJN08qYdqPfcvfZwnijI6MdH6oAoP/HN2a9rn2Nv/l1UF/+h5OOnSv6mcNe91xHXyG6MADz6b+pzoiUe3R05t99MTBb+8Do6GjllS4Q82lxmW3fn/+iVVixYgxBIKA0Ga7ROIfnCeS5RBh5EIKjHpGh5IKBMYYslQAALhiU1BCCY6ieIwgFahF5Q0PDAaIwQ5ZJDA0HUEoj3vcxNKcTjI3VwHSI2pAPrTRGEzImtboPpawxJYOlpC4MXclwWiilXMhTKQ3GZt8XvQzfzDlUzxCqUhpKKXiemPXckx3rNZ81+nkuO+ZVSkHu3jPrl4I57/vSngeKfb/ccUZaY850ufvJDBp/8+tOef5cxvR73QqzgIvOxxJi/fr1Hf8nAWofOFdaMJYSi7nnOSfjCAZwRj8LQd6nEBzMHLNGlIGBseI8ew7jdIwzBsHpfAYGxlkxltO5NC8ZYpqPxrHSJ2iHrWCzHO814FSY09Deg+htmuu1Tj2ufC+95l2UVHb3nl/ifb9YOGN9phs2bMAnP/lJfOYzn8EPf/hDvPvd70az2cT111+/4Lnna+yAuRm8yiieRgje+egD09PTePLJJ/Hkk08CAH7605/iySefxJEjRwBQGPG6665z49/1rnfhJz/5CTZt2oQf/ehH+NjHPob/9t/+G973vvct2u2cy1isPU/GznyYM2D49m3GsJUMKIczhGDFWMbhnhlMaJUBKw5tcD93G2UaT1aCGwNqDW394E5a0xLWQ80+9xwvulBjPud5F+lN6N7zfe77M4UzljN961vfimeffRY7d+7E0aNHcfnll+PBBx+cUaAwH1TG7iyCEPQAANVf4fm3v/1t/M7v/I773ebf3vGOd+C+++7DM8884wwrALz0pS/F//gf/wPve9/78KEPfQgveclL8KlPfQrXXHPNwu+jwiLveWPkNENr/ACyTBav9PhM9w/uRfvWbagd3I54674Zrze2fOAkV2Juzm5vLB7fO4+1Vzgpynse6HvfnymckdaYhaLRaGBsbAyTx55f1NxZldNcWjQaDYytOQ+Tk5On/LvZvzH+4Hc6c6Zf+Nqczq9w9sH9n7jxP6G15yPwPAENDZlrZJmEEBxSUrGNEAxxnCOKPPJYGUOWm5wpZ1BKQ3CONJXwA440ltDQiGo+kjiHzBWiGuVChccQt3MMjwRoTqcIIw9KaSoM8gXCyOvIC2qt6Twxez6znHs8Vc70ZPnQ8hzduUoAM9bS69yTHes1n11ndy54tvuYnJzEirWrT7lve+15YHD2/WD4z6cJlSFdhhjA3EmFpcVzWw7C8wWExxAdmoAfcESRhyAQiCIPfsAhPDomBIcQFAL2PQHfExCCw/cEuGAIAvo9iATC0IMQDEEoENY8eB6nuQTNxRgzY+j8IBSoHd4PAEVIuOtn+3s3OnKPJzGks53fa47Zzj3V9U81x2xr6Z53tvvouyd4QHOmA9Eas1CcDR7n2XAP84LgRZm8Umd2LRWWBVrtFGGQww8EWrduQdzKkaZFNW9gDF67laI+FLhcaJYq94GvtQYXDGkiEYQC7VYGaKA+FKDdomre4ZEAUmp4PkdrOsXYihqa0yki15Ij0dywFXkuXfiXmWpeKRUEJXadB1cOAmoNCMGgFUyq0Xq29Jp9hobzjssxRMYY8lzSNQAorbvmKyClgudxyFy798J5lZrGF+0y1uvURc4ZcPM6z1SbOTyag3Fq4RGCF9c3a5eyz31b3vPAwOz7c8KYnk4jtFRGb75zzraegTHOnNPD/lzhnMfYWA3Do6WWmQhQKnBtKQAZh6jmdXhFvq87ei0BIIp8AEBo+iUZYy5sWz7Xvr5iVc0drw/Ra3asDZNqDXAuzDFV6jHt9BI5Z1DQbt1aa9On2tk2I7j1eI3lM+d6Hjf3A3Bt5ufF/ds12R5THhRh3yDw6DomTGu/XLj5uPUozZqg3NrMrcDjnAy/WV8Qeu4+tDGwnqmy7gvlPW9/HwAMxipPAxZSAVzGcjNQs61nua1zVtiN1b3BKpyziNsZkjhHnktkmUSa5Gi3MsTtjLzKlI5bD1PmClIqGpvmEHt3IU3p/DimMfZcmSu0Wxma0ymylObOc5pLa7g50zR31yoMdLHGMomDfeam5aZsXMpfAMpjy6/DGNzyHIRy+w4rjeGlkDPQTcIgBDeGv5NIwrUU8fKjc030Ol2DvOtiTbbXtryWedE+du/5Adn3g7HK04CBMS7nGjyv81GhAiv6J23rizUorpWFWQNhTrHjwZBu3eV+tnP0Ohdmbjq/nA8trh0evG3m8ljpRLvg0hx2PTPPOckN9zo6h5zprDOeImc6FyM41zxt3wa1e88PyL6vjGmF5Y0B/IZaYWnRnErQnE6RpjmSWKI1neH5E21MNWK8cKKN1jR5ri+caCNu50hTiSxVaLcztNsZklii3c6QpjmmpxIkscTxEzGOT7aRpRKTkzF+/kILcTtDazpDmkg8f6INpRSOT7aRxDna7QyTkzEat2wrhTbJM7N0glpr8AMTUEq515UqnoEi7GqP22P22eZfy9dw15HF7+Wfy2O01sjzmeeXx1so2Xnd7nm6X8tzBX5gonTfM69D99dnzrPyTM8tLFZYuMIpMIDN2xWWFr/4sZ0IQlOV61PF7UjNRxT5GK759JrHMVzzqU3GI6IF3xfwfUFVuj6dH0YefJ9jqOZjqOaDMYZazcdY3cfY4R1YddcWeB7NzxjDUM2n6t9AoFbz4QUcaSIhpYZWRLGnlIJUilpsxrdAKyomUkpTCDqVUFIjzyXyTHUYrSyT0Jqes4xeB+CKj7SGM7BSKmQpjbFMTNYwS6mQpjkAZtal0GqmyHOaL0mIoi9NKGStlAbjMIabiomscc1SCaU00jTvuBfOGeT4FrfGJKbXLaSkkLnut36oIm048zidRTWnus7AFPgsdwiPHgAgBq4lusIS4OebDzljqKHhM+HyiUJxCI9ydjr0yJBaggemXeUpVzTG94kiMAipetTzODTI4CY7DkJr6kcNwqI1xvMpXxgwmNYbm08EyiFd+wgP3w61dSu0RgdhPWMARFG9y1hRVMQYL1X1Fv2fndegn1kpFG0Lh+gcGuP5lmrRL9ZkWn3semzhlAt5+0WO1HM/i1L7C3Ok9/b1qOYXVI+g9yaqMWR5n2He8p4HBmbfD4bJPwnKHmLZeJ1pz7EypIsFDjBBj8H/71phEdCcThDtuMGEb6k46MRkjOZ0ghOTMdotCuVONmIkce6KkOJ2hjimsG0cZ0hTieZ0gjSRaDQSTE7GyHKJqckEzx1vI2lTkVGa5jgxGUMrjcnJGEkskbRzTDcSJHFujJnuqAAuEyBkm7aUqoyLoqMit6id59mdm7Vz9QJV3RZVu+Xr2yIgrYvwba+CoHJBE5EudFZEF2thbt0u/Jx3EdhrsyYT+rXFSv3TApX2/ADt+8FY5Ukw8NWqZzEW5QtNeVOxwWjerrC04ILjxLaPO0MiOIcvqErVFwVpvW8qTQtjUK6o5WAcEEaezRMMFxx6F7jxDgOPg3Gaa+jgNviCvFvfjGe8INcndBYdddiscoFTr9d7/E7HCqL+XuguQJqV3GGOn/JlD3f2oqHi/ZwxrzX+W8chDh6a20V7XkIM5L4feGN6KpxpD/VcxqJ8oeFe56PCOY9f+OAmRyhgP9SF4M7AMQ5HdD90cJsjt+fmmP3ZEt1bQ/v89k+6ymDPkulzoL11ogjlckui31VB3IXZDWCv4/NoH+kDVuWmcx1LcJ3SnGp88/yv1b3nB2Tfn/XGdCk91LKhPleN9pLf9wBuqgpLi6duOUSFNrY61hTYKEmFN/aYUhrNLfupAEYTq49SVMlarqq1Fae6dF6uNJQi5p/agXE3r5J2DLoqczV0uULXCnvnFGLOc1N4pJQpHqLXiR2I5sgNd7B9doVG5hw7lzRFRLZKlwqRzLzmdVtBq5TqqBRWSnUUOVkoRXPY4qUsk24+AMWzWUeeSwR7tnSM0xrQSrviKVqHnjVMPSsqY7q8cLIP+aUgaDhXw8pLft8DGO6psLRgzOiYlvpMGSu8UTZrgU75d1OU5IqTSufY+c3Pra0HSp5w+cFm9brcNbuuM+P10nNwcF9xjoF/8EBxP3aO8two7p3G7zevsxlzzXZtN1vp+Mnuy/bntrYeKMaWot3l8+flAVdh3uWFk33I92MAzlWPc9mAi9I31MHYVBWWGAzQ0O5naJRyl3Rs6OCWjlM0tDN+ZeKF8jmWSs+a417ECnZMGeTV0hzUa2naYDLpcrJcFMxDdul2rJ1Pbd8FKRW4YOQJS41sy1b3JcHNZdmGmO01pSpkITjyrdtdUZPMFXEFG883TXMzVkDmynEZy1y5qt/yfTJG15SS5qFxRjPW0Bl6nnBMSLZFRgg6zjh5v/2HeUWXZzoY+/6sNaYLwWwVwv2cV2FxQOX4xaNChdz0ViqlSH4tl1g9/h+pste81th4AO1UupAq9XUq5Dn9nptQKIUjNZJUop3mUEohSXNMJzmNN/2W7VRCa412mpuwrUJqzrUhZ1vNClNBa8O+FGYFKBRMpPTahJDLXLZAifpPm3G6M0xaGF+a34Zwbf+ptdT2OkBB0KBkYchtmNmtHaV5dbGuYk1d92jupbxmKZWb361B6b77TLv3/Hz2/d13342LL74YURThyiuvxLe+9a05nXf//feDMYZrr72272ueFca0lxE7lWE72evzDV2eq6HeJcUASjFVWFpMxjmaSY6hvTcjzyTiROL/2/xXaMQZTrRStBNqhznRIn5dm7tLkxxpkjvO3SxVmIoz5GbsiVYGmWtMtjM8O01tL3au460UWgEnWhmyXGLFrutxopU6tRrObGETFSiVeziBIiwsPI7wjkMIb9/rvFX7OmAKqVjhyXJuVFnMgM5qZOrxLCvSWK+bC/IcrW3mpleWC5rHku9bEouyAABj6KhUtmvyPF4K4zJIVXiigPFsbZeM1kbizuu/vmqBEmyf+9znsGHDBuzatQvf+c53cNlll+Gaa67Bz3/+85Oe97Of/Qy33norfvM3f7PPBZtlz+usZYZeRuxUhm02JZW5Yrl7oct9fXMG9zsfFc55nDcaYsVwiPauuxFGHkaGA1wwVsN5oxEuWFHDyFCAWs3HBStqOO9DOxCExHxUqweo1QOEkYdaPUAQCawaibDyg7uwZqyGtWMRglDgRWMRLj5vCPWhACPDNP7CFTVwzrB2LEKt5mN6/2dw/lgNtbrvcpZlQgPh2f5P5QyV9TDzLVuQje90IWMyWsVY++zyjiasa4uJCkJ5er2bHam7Z1V43OUxKQRNoeTiOqzLOy686fL67XyFwg3rCGuT0S0oEi35f/9hXn9B+/6uu+7CDTfcgOuvvx6XXnop7rnnHtTrddx7772zniOlxB//8R/jtttuwy/+4i/2uWCz7HmddZaiH89yuXuhy319c8YAFiJUWHp050y7+zqtYWhuOejGzyggMi5Ta3z/nHKm5TFlSKlKNHvKGZMsk4YoochDuqph6BKXLa2Qc5OfZEXOtGyQirlKxk4Whs0aZcBUAuedhpyqeM11cpJUszlTwOirdr2Xdk0Ac+PsFwbrIdvrEzWi8cCNt1quGJ4zFlCAlKYpnnjiCVx11VUd93DVVVfh8ccfn/W8PXv24Pzzz8c73/nO/tdrrzPvMwcM/M2vW1RvbbHnqzALWJkN5Zz571rhJDgxnWKqSSHWNJZotlIcnYxxfCrBsUaMZjNFmuQ4ZhiQUhPqbbcytJopEiPZliQ5JpsUzn12MsbPGzGyTGLVTf8eTx9vod3KMLrl7UhjiaOTMZTU+HkjdpJvz0/FiNt5hyC2YxnSFELVusgZuvCpYG4s58zlGbXWzgjZcZyzDgJ6CxeCNUVJ3Z6gDSnb63NOIVfHvmSePU8Yz5U5QXA7v/UyrccpvGL/MVa05tg57X1ZD5kxZt6DPv/AHXu+2PeNRqPjkSTJjFOfe+45SCmxZs2ajuNr1qzB0aNHe17u7//+7/FXf/VX+OQnP9nnQjtxznw6qS//w4K9te7CpLPG+1vOqMK8FbqwajTE2EiEMPIQ1Txc8NEduHBlHeeNRbhgRR0jIyHCmocLV9YR1T0EoYDnC9SHAgwNh4giH/WhAFHk4Rc+tg21mo81K2tYu7KGIBQ48bG/xcWrKcw7feivEZm5hMewdkUNYc1DfSjAi1bUcN6Hd3dw2jptUsEcPZ81MkBRQNQhZM4BoAi3doddbc6y/ADQoSFa5sQtrqWNUaXjtveUMWZafwojTNcp1lQOFZcLkcrX8D3hfi/PWYS7Z54zJ8wS5l23bh3GxsbcY2Jior95e2Bqagp/8id/gk9+8pNYvXr1guYajG7Yk+BUhPLzIZyf7Zx+K3uXcvw5A1YqQKjCvBUAtFoZoiAD4ENrjedu2Y/j0wlqgUCcSYwqH34gcHw6wSrTwsEFQ5rY1hCOPFfwA46j7zmINJVoNFMirw8EGq0UzSTHWo/CoUHo4UQzwfBogMlmilWCQp9T7Qwn3rfH5SIBDSKoN96gVxgUayxhWnTKXiAZXbq3snGyLqtSGj3/52s4Q62khmYzDZfWyuQz0SEGblFuKbJrLhPrl9dk57NuuJTKebW0HO26W+155fuYM1hX0ZHZ908//TRGR0fd4TAMZ5y6evVqCCFw7NixjuPHjh3D2rVrZ4z/v//3/+JnP/sZfv/3f98ds186PM/Dj3/8Y/yrf/Wv5rTsgfdM+yk0mmtY1p6zkDBuv4axMqS9wZnoeFSoMDwcoj4UIAgFwtDD6g/vxuoVEUaGQ5w3FqE+REVD541FiCIPfiDgewJRzUet7iOIBD0HHoaHA4Shh5WjEVaNRvB8gZWjIdaurDkPNgxpLs4ZVo1GCCKaa+VoiKjmzfAYbTWtRdlr7H62P/dy3opez96eHSsbvB6eqZ3Derazndt97GSeZHcPahk2xD2TurA/z7R7z9t9Pzo62vHoZUyDIMAVV1yBRx55xB1TSuGRRx7B+vXrZ4y/5JJL8N3vfhdPPvmke/z7f//v8Tu/8zt48sknsW7dujmve+A9035QGbjBg898MEZhHs0k5lHOUOEsQ+ALJysGAMmOg1DS5u6oZYRzkkuzXL22whYwoUtucnoQpoWDPrCFoJYW4XEjx0bjgoCMptVRBQdqt+9Ctm2vm9Oi2zj2NnKdP5/KgPU+3vvn7nN7G+q5HTvZWnrx/c5m0PtBec8D/e/7DRs24B3veAde+cpX4tWvfjU++MEPotls4vrrrwcAXHfddXjxi1+MiYkJRFGEl73sZR3nr1ixAgBmHD8VziljOh9U4df+sNjvl2ACjNF/U115phUASEWVrvYzmrh2FTQYtNIQ4FCAY+5hCiiTDIDTz4yjJIpt85facPxqCG4qZYWt0hWQUoMxGtvatBtKa8g0hzAqNI7NSGrkWiMIPTL0wlbY6qJXE6yDmYlzhjyXxJQkiSTBGqiyTqkNKUtZ0mc1lb4UoqT3QWkNz4SqFQeyVCEwXxSSJEcU+UjTHLaHlPK5RTWxrdbNc0lC4FJDiDILFIWv81zC8wSSOEcQChdOljmRYtiw6VxR3vNA//v+rW99K5599lns3LkTR48exeWXX44HH3zQFSUdOXKkZ8h7oRj4MO9SozKkc8dSfPEQTHQ8KlSwKbhgYq8r/rGGpUzP54poUCq2sYxAhtFHQ5cMg3b5T21ec5c0JO5kvYDw4C7HdkTUecz1WgKmejb0kKbEpJRlEmkqiYrPXEN43CnXaK0dAYSlIfTM65Z83s5Fho7TFwcTak2T3LS50FgwqibOcwXGaY21ug8wkNELPKQJPfu+gFIa3u5Nrt3GigFkqTT0gxq+T895RmT3aSKRxDkAaoEJQg9aAWmaI4lzKKXdsX7Qvefns+9vuukmPPXUU0iSBN/85jdx5ZVXutceffRR3HfffbOee9999+FLX/pS39c8p4xpv0xJ3a/Nh2lpOeB0rfFk+en5rkEwAc88KmNaAQDiOEeS5Ght3AaZK0S3vYeEv9s5WqZlJs8UWs0UeSbh79tq6ARJuUVKbZ4VknZeapshBqShXe/EdDNFliqkiXRzAUCrmSHPFKY27ETczkrcs0XRDmPMGWJqPWHwPIEgELByb64FRRQVvJ4n3DkWjBeMRJ4nzHPRPmP7TynszSEMR2/BXsQ66AE5pzC21hqeX1yHc4Z050Gn1VqeDyjaYrhgxtBTeNwPijVRyw0QHT4EP+AFWUSfVqa85wdp3/dtTP/u7/4Ov//7v48LL7wQjLEZFlxrjZ07d+KCCy5ArVbDVVddhf/9v/93x5gXXngBf/zHf4zR0VGsWLEC73znOzE9Pb2gG+lGrw/vheZMT1bhu5yN6pnwrufy3s0FPvM7HhVOP5bbnneUeqbYZWrrB1xfpjUkVvibMYZ46z5Yqj/72sjt4+CmbcUZOEGvHd/6iZKeKStICExhkdMzFeVim4IwwYZw7VppfuZCsbaHk8bSefa4Pce+ZlVwijlKxUwcHcfLj/K6eKnoyc1Zul7HtUprLYggZq6p+1pFbpZBbd3qzu9VkHQqdO/5Qdn3fRvTZrOJyy67DHfffXfP1w8dOoQPf/jDuOeee/DNb34TQ0NDuOaaaxDHsRvzx3/8x/j+97+Phx9+GA888AD+7u/+Dn/+538+/7vogblW8S6WoanCwUsDCvN45jEY31DPNiy3Pb/uYxOuEEh45B1FNZ+qbj+0A35AfLNR5DvuWiHI86MHR7LjDgjBEQQehMcQ1TxEkQ8huOsj9XwBPyCvK6r5YIzRnB6H5wuEkQfP586QlA0k6zJU3T93HjtFAVKPytvZ5p05pjC6s517qjm657PgM9Y1e1VyP+jc84Oz7/suQHrDG96AN7zhDT1f01rjgx/8ILZv3443v/nNAID/8l/+C9asWYMvfelL+KM/+iP88Ic/xIMPPoj/9b/+F175ylcCAD7ykY/gjW98Iw4fPowLL7xwzmsZe9vV0P/jGx3HeuXt5mroqmKjmTjT74kolcZXqjFnBstpzwMAsibJffkANDHxZCnlGY9v2Ic8UxCCI0ul8Z4AGMYexgCmbCEPFc8wJpCmEtCA8BiyVCLPib9WKw14lAcMAuHm1Jro+RCU2YLIYyXBbirOcZR/RgrNeqwa2kmy0bnaUfEVRAeWH7eYy8LS9wmPOYUYIZiTgrNe4gzxctP2WS58cn2juSoRPOgOw6+VNnlhKlCCpkIwkyJ2RVxkYAt1GsAKoM8d5T1P1x+Mfb+oOdOf/vSnOHr0aAcv4tjYGK688krHi/j4449jxYoVblMBwFVXXQXOOb75zW/2nDdJkhlUUrNhPgQN3ecuVr7vbMBs7+ds78liv1c+9zseFZYXlmrPA7Pv+5/eeBtViUoqtskzhdgowsQx5UulpGN5riANB64dq5RCfe97jcYn5U7ThPKwSmkkcY6mmSfLSOYtNoU2SZLTPDnlU4njtjOMWlTnFvnLcp7RUgCWOWyBIkTtQtWuR7SYyz4ss1KRJy3/zDvCrLQ2uNds+Ls8zmqu2l5Rm58tr9+Gf/1DdxRzeNy81rlme7xM6jBXdO/5Qdn3i2pMLffhyXgRjx49ivPPP7/jdc/zsGrVqlm5EycmJjpopGwj7eR/fWjBa54L09FCPLNeHL5ng3Ge7T1ZbC+Ww4MwD151ci07LNWeB2bf96vOG8LIaIggJPWX2pCP89cMY9XqIZy/ZhjDhkzhRecPYWg4cD2kwyOhec2HOvAxIl5YVcfQhz6A8//qbrxozTAE51h9/jBecuEohkdCDA0HqNV9rFk7AuFxvGjNMPxAYHgkxHkvGsLQcIjjz7eQxFRN25xOEbdzxK0c/Kb/H7Qm7VSZUzXuiRfaOPFCG3E7R3M6QWMydsYfAKYaMWSuMN2g16YbCXm8+24DAKOlSlW07WaG48+3MNWIncGyEnPN6RQnXmiDMSBN6Pf/+9RxTE8lxBr1bBMA8NzPpzF5vE1eqeBUhSs1pqcSxHEGrTUak8RHPHm8TUVcmzYiSyV8U8A01aBw/jPH31CfzAABAABJREFUppHn0tEPtpopnvqnE44gf64o7/lB2vcDUc07Pj6OyclJ93j66afndN5yMFq9OHwXKv92LsHrquyrcO5gtn1f7lu0/ZC2n1EpDe/AHgBWtoxCpJ7HzRjtnqU0AuNbNiHbuNHQ41Eok17TpneTxtoKYCE6JdGGR0MEgQelNGp1ysGGkQesuRRTjQS1225Eq5WiOZUiqvnwA/I2a/Ui/6q1xlQjxtBwgFYrxehH7sDwcEj6p3u3oLlhHI3JmCqZY0kVudAYHgkhBMfk8RhxO0OaStNiwzEyFiKJc/gBR33Ix0UXjMLzOBqTMVadV0djMsaKVTUMj4aQUuH4Cy0wBmQ5VTBrpdFqphgaDpAmEsMjIbJUUuV0nKExGWPyeBtCcLSaKda8aAhKaTSnUkyeaENJjTWrhzoI+ueC7j0/KPt+UY2p5T48GS/i2rVrZ4i05nmOF154oSd3IkAcjN1UUnPBcst/no5CqLMNHvfgcd88BuMb6rmEpdrzwOz7vlcFbDlkmW/dAaCo3gWId1YYFRZRCknasKZVaCGFlZmVrPZBQtxwIU/OKccqlQIDIyUVRUZ+6n3jCAKBqW0fpsInnwgULEFEbkTLtaJcqu8LZKmC5wnEt25xRr+9dQKccyJcEMwYc/pCYWXVbEGWXReJoUuXl7XtPVprBIEhWAgEkpjahRgjxqji3ug9tn2vXDDqky2FkoNAIAhNj6rHEbczMFBbTRAIgAFxK+/7/1Tnnh+cfb+oxvSlL30p1q5d28GL2Gg08M1vftPxIq5fvx4nTpzAE0884cZ89atfhVKqo7F2qTAfD3CxvMaFhot7PZ/t8JjX8aiwvHAm9nyhSFIU7MwkZu/0hvwDux3rTSGB1k0ByKCskkuP6lfba9ntaY3svRFKGbFsWZDTj+z6M4SGGzgIBcY+uM95u4wxyLzwfDlniGo+8lwhCIlsIc+UyXWSgYpqPnxfoH7nAXMOp0IsMNTqRO7v+dRzCoCYiXwOrchwT7czAEBU85EmOaKajyyVzljW6j61FAluqqCJPlHmCp7PDdNRYURJtYeqnIPQQxLnRONojo/esR1xms9ajTwbuvf8oOz7vlc5PT2N//N//o/7/ac//SmefPJJrFq1ChdddBFuueUW7Nu3D7/8y7+Ml770pdixYwcuvPBCXHvttQCAX/3VX8W/+3f/DjfccAPuueceZFmGm266CX/0R3/Uf1XfPDAfg7YcvEa7hu7nsx0dDCgDEu4527Ac97w1SFbsulvUumwMOWeQO24ryZvBVdB2S4XZgiD7e/l167UVRUOEdP8nTIUvIDzS7/R8jvT2+wztIa0z2XKbq6alXlUGKQvCA5kr1OoULo5qXqcu6MR+ZFu2AQCyLTuo/xUMLKLrFfR/dNwaPOu1Mgac7w+ZayqMroggc4WR0dBV/+a5QnRoAvnWbWRMjYcb1Uidpz4UUKGuibJbJqkgFJBSYWxlzX2h0NBIdhyE1hqtVn/9xDNYjwZk3/ftmX7729/GK17xCrziFa8AQKTCr3jFK7Bz504AwKZNm3DzzTfjz//8z/GqV70K09PTePDBBxFFkZvjr//6r3HJJZfg3/7bf4s3vvGN+Df/5t/gL//yLxfpls4clpO3uJzWshB4jMPn9PAqcfAzgsHY84VHWdbiBApDWDiUp87h9e7L7NT6tCBN0M5n+5DS5F8NA5OtQHZjpVmbCQ1rZY4pWreSGv7+3Ug2baW5FD2Im1chOLDLzE1zds5frEMruHNlXqzNjrPXTzZvpddMFbSUynEK24poO4etag73bzNrLt2zed3SEvaD8p4fpH3PdL/Z4WWARqOBsbExTB57fs750wr9Y7F7TBuNBsbWnIfJyclT/t3s33j9of8JrzYEAMjbTTy+6Q1zOr/C2Yde+96GSKkwiHcc64YdQ/2UvGNcWZR7tlYOS+jea14K2yqEdx5GtnGjI59vTqem95TGRZHvQr1BaPhxQ89U6EoqQGqmqA8FVAmcKeIPNqFaIRjAgCjy0W5lCCOBPKM2HfIQtWuD8X2BNMldq4qdL0lyc50M9SEK02YZFRZZL9RW60pJXnLczhHVKJRb0BPC5WCV0ggjz7QTScdTHIQCJ05MYvVLzj/lvu2154HB2feDYfLPQczVs1xKD3Q5hJIFZx2PChW6obXucjZn+gflMcr5D6f2I8q+xmxuhzaM90ppyC2biEBfmbzp/vdA5hrDBzY4j9BWAfMDEx2eoTL9sOStlrxdhY7zirysLXYyXmDZE7U/a0PoX3pYb9Ndz4y33md0YHvHWmkdyq3HrsFWPUtZzGHXb1+3x/tB954flH1fGdNlgIXwCC8Hg7eU8DjreFSoAAD8wIQrPFIl9RSAQrLl0KL98LdjbH9kWYbLeqPWUFmU7YA9r5vRh3pMFbXfGCalLJdoTidQE/cgrHnI934YI6YFRWsqgorfv9HNxwXDyGgEsXsz6sM+koSUVzQ0PJ8jjARGRiOiPax5TlkmSXIwDoytrKH+gbsQRiSYDg3yNCMf2lT2nnihDa2BsRU1NKdTjIxGaDUzJHEGz+NYsaoGxhjynQcQRCTVNjQcIk1yhJGHJM4Qhh5qdR+1IR8joxHGVtTAOFAfCjDVSCAEx/BoiNEVEXxfYHoqgehT7qx7zw/Kvj/njelyyC3OxSAuh3WeCQziN9QKSwulFPItW8zPFJbNc+k8JQrVFp4eMwT1NkdonwvPq+g55aKzzxSA8+Lswxpwe26tHpChNaFb4ZGY+Mho5IyrzSGGkUei5ZwjCEn+zPOoQChLJdRthyBzjSjyqULXF67oh+/Z7tbt+9QKU6v78D0K52YbN1Lo1Rjg+lDgKnHDyMOq1UNUGJXmrmd0eCRErR4AoC8FVmXGCglkmTShX6BWD6BR5ELTlFinfE8gzyVGxyLA3Edqqnitse0HlWc6oOiHt/dM4Uzz455JCMbgmYfok5aswtmJ7kpdrXVBscdZqWK3+Nnm8GZTPLE/W+Nc9Frq0hjuxpTPTeIMuWH5sRJveUasQ34gnIKNEBxpIl1O0emTmnP9wOQ4PW6oETN6jRHZvdq5z/W2ypxIFeI20RuSEedOSUfmGnE7g/A4ZE7XmjzRprGBh1aT1tZqpojjDAC1tDhOXmOUfZ96UjljiOOsoCEU9IUhCD1ISb2xzakU0HQfQUDeMTEu9ff3Le/5Qdr355QxXYhBXExj1u86zlVDCgCe4B2PChXKJPDlnF+5/7QzH6o7qkptDq+72Igx5lpZ3JmlymBL8m7nsePidu4Kb/JcIjdC4O1WSqLgCR2L4xxxO0O7lTnN1STOIZXqEBD39oy785IkdxSCfM9O5JlElpLn3G5nSOIccTtHmuZOQNx6hpY7OE3pnMnpFGkswfdsR7tFWqxJnCONZSE+npFxb7czQ/gvi/kMwYM9lmXSMCLRGqdbKbK8OJ7EORrNtG86we49Pyj7fjC6YRcJy8UoLdU6FsuDXU6esGBw30zVYHxBrbDEKNMJag1wZpRTQIVAxWv2ZwYuACoSsnOUDWqneLYttrE21b5GFIXKecPWGEc13xElQNAShCAVF8YAz+MkuO1xcE5SN0LQMavBapc9etceJNv2A7pYoyWZyLbudqLjDMRYZH5x5PrC42CgeT2PXvMDOrZyNEQQCqRbb0OaSHCzduuFK0UEEZyR1+mZuYJQGD3YQiuWWbk1BgQRvT4yHJDXyhg00/ADgbHhAFku+/r7lvc8MDj7fjBM/gBjMcLDc51jrhqu/cxzpjGIuZMKS4tOMWq4nFynSkqnggtzEmlFmBboDNeSDmknnWD5NTKkHN1hX9ILpeIlbtprrPFJYvI200Q64niqvqWxShYsSHGcI922B2kiHakD9XxSS0sc58hShSxVYByGIYnmSKx3nCqTP9YuHGxJIjzTDhS3cyqAMjlSS7QQtzPoEg9xbrxaxhmylL5ElD3VJLZeKbXSCMFpLQl5y1kmHbVhP6hyphV6otswncrIlV+3P8/HSJ4tZPo+Zx2P+eDuu+/GxRdfjCiKcOWVV+Jb3/rWrGPvu+++rg9i1kE+UGF5wJIwWEPEeKcn2tnSok3/ZSeNYC9iBsubKw4ecuda2PPKnjEAZ8gAGEk3bZRbEozctQ9CMPg+N9y70sjAkfwb5UzpGkFIXLm+T7nVJKbwqS2gIv5d4ubNc2qFieOM8qCm+pY8R2Mc4wxCcCcX98KJmIqgQg+t6RRBKNBqEmk9GChnqnUH/Z8fUP6Wc5Mz5YXsWhBS5bBSylXu0jnCec2NqWQuHUgd6N7z8933pxuVMZ0D+jFCpxqrvvwPcya8n4s8XD9YTh7nXMFZ8e2Uz6MQ4XOf+xw2bNiAXbt24Tvf+Q4uu+wyXHPNNTOI18sYHR3FM8884x5PPfXUQm6hwiKjrNHZ6/jMT2/WMdbax16FMXacGt/c8XtHbhU92JFKXrKlOhSCI968E8qId1uPtZgTLlQKAFppcE5jrceL0i1pVTA5MTCsOPjeoqXH9XMW/bSMGUFysx6/g9SCm+ux0pcEXVzLsj2pIkfNTDjdVheHB3a6c5TuJMCwx+fT1lLe8/Pd92cCZ70xXQxvrB8jNJexp8OoDaIX2gvCVPPZR7+46667cMMNN+D666/HpZdeinvuuQf1eh333nvvrOcwxrB27Vr36NbqrHBmYXObtlJXCO7o9yzKPaSck/qJth/8LuzYSchgq4LLBAdlSkJpyBS6Ce+HRgLU77oDjBMzkW1FGVtZQ5pKABr1vRuQ5wr1eoCwRvnIqOYjCKg9Jjx4G9JUolYPDEevj/pQQPlKs+Y0lajt30StMYHA9PaPYHgkQBB4VESUF3lg3yfNVZlrBAH1hp6/ZhhB4CFJcoytjJAmEiNjIYaGQ0Cb1hhO9y84B+OkSlOrU2vM0DC10BB1oUJjw04kSQ4/IBamVauH6JyUCqc4Z1i1uj4ro9Rs6N7zVTXvMsEgemMWsxnEuRjKQb7vMnzBOh4A0Y6VH0mS9Dw3TVM88cQTuOqqq9wxzjmuuuoqPP7447Nec3p6Gr/wC7+AdevW4c1vfjO+//3vL+5NVVgQOitwUcpbFqH57nEAXPiyV5jXzmOP95qrnJPtPj/fMu4Kk2yeVimN0Tt3kaTazg8gCDyEt+8lb1B0qt1k23bDN7qmniccA5KVhxOCwsTxjkPwjDEngny6nyAUEF4RgrVr4YZ+0PbKMg4EAc3vB8K1DXFORUd2baQaQ+oxWhfXsgo2nifg+4Jk4Tg3+VjKq/o+kex7HhVW9aJ2PBm697zd98sdZ70xXQ7gb35dz1zofHG25EPngl7fUNetW4exsTH3mJiY6Hnuc889BynlDM9yzZo1OHr0aM9zfuVXfgX33nsvvvzlL+Ozn/0slFJ47Wtfi3/6p39a3BurMG+kCZEFkDaoQhxTi0iaUOuJbduI44xaVfJSS0dGbSD2OU1pnsT0ddp2kXaLzrXXieOMWIViamux4/KcOG3zjDzDLJOu5aXVTBGP73P5TaU0GreMI42laXGh4qQsIwL82sEdSBMJDe1ypllK89pwLTQQHthu1iZNW0xRLWtbgIhrNzfvF42dPBFT8RJjaE6nYAxot+i9U6aq2ZLt2/cnOrjbtN1oGicpjKy1XRPpnIIBU43EMUgxMGSZwlQjMcT8c0flmVaYFd3G72ReY9koLkZ4edCNbC9asaeffhqTk5PuMT4+vmjXW79+Pa677jpcfvnleP3rX48vfOELeNGLXoRPfOITi3aNCgsDaXYKJ+gdBB48X8AzHpHwuNPdFKLwsKx8ms1nMkbhXy6Y87I8T8APqLiG8+I6QSBIbiwQjn3ID2huao0RxuszDEihh9GPfhBZJl2lry3+8c26iAGJO/akqVtvoyIgqY0mqAfPp3CrNZBKabQ274HnkSdaq9Mc1iBrDdQPbIXwiB0p3L8dQUDaoytX1R3l4fBIiCyTqA8R0xIAV7mrbZUzGJq37jTFRER4D8Bx8cqcqn49j8QDRsciQ5pPxzlnGBkL+w7zVnSCywjL0YCcKa7dQQ/3+owhMA/fbMrR0dGORxiGPc9dvXo1hBA4duxYx/Fjx45h7dq1c7u+7+MVr3hFh55nhTOLMpWfI2E3xyxZu20pKec/gc6+UpqrIJe3OVFLHF8mgychb6r2VaVxZWJ526PKTDVxuvFW16/p+0WFqw1JK6UQ3b67CLOGwlXGKqUcgQQ3PaqW5cjzuWN0soxFoX3N40h2HHReZrZ9PzToPtI0d1W7eUZMSFYijnOGKPJM8Q8vvmQYRRjPE8RvbL6Y+L4gpqNI0Pp8EipnHE44XHhE4dhvAVF5z5f3/XLHWWlMB92AzAfz+QKxHL90dGMh31CDIMAVV1yBRx55xB1TSuGRRx7B+vXr5zSHlBLf/e53ccEFF/R17QpLB88Thhqw8DbJkNAHvD1e/Exlsc4zRZdnygsDwZj1Uj3n1XLO4QfEkesbT9XmMC3hgj+xv6OyFaCiptyEoi3DkTXydmxr0y4z1sitmXO8A/tpLlmotOSZclqhABxpvlQKWUbGN9y3peAVLmmsWmjj4YLBUSDacVlWcBZb7VU7xj5bjVPb0pNnhb4pzQ/yWE3YW6uySs8c/76VZ1phPlgsgzafLxCD8KWjzNHpzeMb6oYNG/DJT34Sn/nMZ/DDH/4Q7373u9FsNnH99dcDAK677rqOMPGePXvw0EMP4Sc/+Qm+853v4O1vfzueeuop/Nmf/dmi3VOFxUFZg1SUKOe6/5vYlhFb4WurccuFMbO11ZTtQHcVr4VUCumWraSVakgYtALyTCKqeQgCD0MfvAO1mu9CqES8X5A8cM4Q1WyIVzgxcEu24PnczEVhaG2UcsL928A5Q33IJ4MfDLsvBbkhuQeIaD+NJRhjqNV9tzZroIXgqA8RG5Lw6MuD53GEhns3CATyXLkvGkEoENWoSth61WkqwQVx/NbqVNVMxA19hnm79vx89v2ZQGVMlwj9kCsshVc5CF7nXOBzhsA85tO8/da3vhWHDx/Gzp07cfnll+PJJ5/Egw8+6IqSjhw5gmeeecaNP378OG644Qb86q/+Kt74xjei0Wjgsccew6WXXrpo91RhYbAhWK0LObQ0yY3XpgqPraT8YgWwLcE8hYStEox25wHMzUPkDNopzRCJPY0pq8/4xrvNM9VRYRvVfExPJWi3MqD5L5hqJCVWIxPO1ZapSGN6KjHk8xkZzzvvgFaUy0xiiempBHGbpNmEyX1mOw5ASY3GiRhxnGHqlnEj4K2NbBoVIfmBwNAIqb40JmOEEa0tjCiHm+cSk8dj8lAN326WSSLE9wXiODOkElSc1W5lmGokaEzGUFKj3SKhcZkrNKdSNCZjpIlErebPkKw7Fcp7fr77/kyA6X6VW5cBrCL75LHnl7Xy+rmObo7fRqOBsTXnYXJy8pR/N/s33n7/NxDVhwEAcWsa+/7oNXM6v8LZh/K+HxkZccftR5j1PCmPWHib5Zwp59x5YgWtYOHlWspAi/KYXucBVOFrqfqssbTn2spX6ykKUXDgUjGQQhgJytPmirzNvVuQ7DhI0m1G6zQ6sAOtzXvcPXk+R9zO4XkctQOb0dwyAc8XTmWGGyIJhqKgKE3IcyQiBlq7zcla6TTPpzB4kuTuZ6IRVBCeUdUxXyYYh+ndZZQfzbUboxVguZDjuInV684/5b7tteeBwdn3lWe6RFhM1qSlOnepsRhh5EEM91RYepTl1YjNp/zqTDWY8phepA3lsWWUjaZt+/BuP9QxxnqmWsFok1JONYp8ohc0ucUsk04GDjBjDRcwNHmgvi/QuHUf6Zz63LEONTftKegHjVGH0S1tjR9EEkvjXVNOFgyuwMiSVtSHAnDGnNh3mkoEoTD9psSpC1DY2rbAZJk0BU/Gk5aUT7WVvGlC1cp5pqjaVxd6pkppRJHn2JTmiirMe5ZhsXtB50ohOJ/rnK3FRwA6wj3BgIR7KiwtbM+oreLNS7Jf1Beqix5SWYh6SxPapepc5dpNbAjXGgArH2alz6RUSBOqhE3THNmmjc6YWE8QAGqHdlP+kzHnkfo+d2QKvi+I21YUFHmO6IEDvl/kdAtPmggpLL+v8Iye6MTtVBh18IAjWeCCmWsVFIHlLwPa8O56hhzCXs/mbOlLganmNa1EliDC5qRt8RURQ3S2HFmSCc8UgwnBnaJNP+je84Oy7ytjOgtOV4uKJXQ43WxHg1B8BCycTrDC2Qf7AU7hRfoICyPqyfQD6jNlDEW1Lag3knpATRWuV7D4UM+oMC0p5O3ZflXrZdrXLUuRbVERHsf0VEIqKuO3kbapIYE4/nwLtXrQQQrfbmZIEjLa7VbmiO8ZGIY+9AE0DQF9u5WhOZW6Ah7qGw3IY/U44ve/H0ppnLjxVmSpwtAw0QoKThXIWaow1YjhBwJZqtBqpviXZ6aQZxJDwwFOvNBGrR5g8niM6akEjDEMj4YUqi4xDkU1H61mCiHoPqk/VmDozv0YGg4wNBwiyxTCyMPzzzYBALV64KgHnzXH+sFikDb0I27xyU9+Er/5m7+JlStXYuXKlbjqqqtOOn42VMb0NOBUXql9zPb6uQzBivL4yphWAGZKsM2QUWPFGDu+d+XuzDlJg3QmJWGvueyxMPSMVqmh4TOUe5YMQRipNi4Ygkg4o27bcbgg71ONbybtUVZQ8g0fvm2mtBwHokP7iVwiEu4cAI7IwvM5gsAjT9FcZ3Q4gOcR129Uo7WFkefGlddq6QQBmBajgm4QYMi37XTvnR/QuPqQ32GIhccxXA/6ruYt7/n57Pt+xS0effRRvO1tb8PXvvY1PP7441i3bh2uvvpq/PM//3Nf162M6WmADcUOSmh1OWEQwz0Vlh7dBq+7jnJmzrQYc7Kay5mybMXP9rzuMfU7DxiDB6cPar1ZW8lqi6A8j8Kx3BhuLhj822+HrSL2TIg3vGOCKna37QUAeBP7O6qY8607O0KzNmxt05PWoNqiKOExRBG1sUipEITCtbwU7TPKaMNqp4SjlCq4gEthYa3QQfiglEIQeo4sQkqSjgsjb0ar0qmw0DBvv+IWf/3Xf42/+Iu/wOWXX45LLrkEn/rUp1w/ej+ojOkC0I9xPJn3uRTXW4zzlnquuWAQCxEqLC3KrEPEUGSVTLRrdSmzF1kjaI0RkSMUrS2dP6NrnoIk3l4DKGTGtNbIxncAYPD2bHMsSf7EfgjB0W5maLczxG0K2zoavpyEs/NcQW0dh5QK7WYGzjnidga5dZszfN6erWht2Ix2M3O8xJwzJDGRLwR7xzE9bULN5nXLVpSmucmJkicslUJzOgXntDbrycpcYXoqMULfijiOM4l2KwdjJCROFcHUmhPHGdrNDP62/0xh7Zgqi/NMUYh6OqXqYdP20w9mK0Cai8DFfMUtymi1WsiyDKtWrepr3ZUxXQBOt5TafK+3mOs83WFnj3U+KlSgMK77DQAV/RThXjuu8F4LNZeywkwRIi50Pa3GJ+8I53LO3Xg7lz3X9p+2t+w1RPEa8cZxJEleEtpmWHnwZmQpGWVbOEVsSArQpGqTZRIAc4xJNO8+mqE0ly2syjKJqY37IDg3BBBwrEhpmoMz5ipw260MMtfOKDLTLpNlRK5vlWwAuPYWzuGEz7NMOkF2u57G1o86qsW4nbse2xWHboVSJFDeb/dl9563+34uAhfzEbfoxubNm3HhhRd2GOS5oC9jOjExgVe96lUYGRnB+eefj2uvvRY//vGPO8bEcYwbb7wR5513HoaHh/GWt7xlBjfqkSNH8KY3vQn1eh3nn38+Nm7ciDzP+1r4uYJzPWfqcQafc/icDwyt2NmG5bbvu/Oj3Ghv2tdIDLw7Z8o7jKz5acbc5R5T+n1mrrV7TBAKhHccMr2jprjJF4giH0IUedTpnR9DGFEhkucTqb4l1OemypeKo5grdhq684Cr4BWukpbBP3QHMREFHkbu2gfhMTBOFb+ex+F7lJtlvJBMqw8Fjpw/jDwIw1ZULlwSgsLQRR64YEMiQQHuqnlt5XAQUN63VvepklgwNLd9AEEg6Jjoz2cr7/nyvl9KgQuLgwcP4v7778cXv/hFRFHU17l93eXXv/513HjjjfjGN76Bhx9+GFmW4eqrr0azWVRsve9978Pf/u3f4vOf/zy+/vWv41/+5V/wB3/wB+51KSXe9KY3IU1TPPbYY/jMZz6D++67Dzt37ux1yXMGVT61NwTrfFQ4/ViO+77s7RR9o+iZF7Uh2bmge1wvr6p7TJ4pZJs2uzyiZUeyxPK2v9WGo/NcORUZF14G9YZKy4FrxrU3bifhc/M6TQTkmzea0LNEaxOFmQHiwS34eqWZSzsZOdsrmxnZNNtmZCXelAuJW3F0uNezTBoRdpRadJmTWEuTnAghwEzuVCOJZd/cvN173u77uQhcLETc4vDhwzh48CAeeugh/Pqv/3pfawb6NKYPPvgg/vRP/xS/9mu/hssuuwz33Xcfjhw5gieeeAIAMDk5ib/6q7/CXXfdhd/93d/FFVdcgU9/+tN47LHH8I1vfAMA8NBDD+EHP/gBPvvZz+Lyyy/HG97wBuzduxd333030jTt+wYWA8vBkJ2qdaZfLId7WgzY8FsRhqtwurFc931h6IoP69l7Guf6gT47N+9sY6wx1OhUqVGS2II6zlQaQwc2FmNVqbAJJfakLrUb+7qFd2C/y+9aRiPGSkvTlp2IDLGyvbVOt5TWJpUqfTmg/linV6rtmov5nK4qCqNpDaiUqiBoYHRlKdXc33qD7j3fz76fr7jFoUOHsHfvXjz44IN45Stf2d+C7brndZbB5OQkALhE7RNPPIEsyzpizZdccgkuuugil/x9/PHH8fKXv7wjpn3NNdeg0Wjg+9///kKWM28sl1BqLwM438Klpb6n02WsqwKk5YflsO/LYVzO+Qyj14sByeEkH+4nY0AqKmVnhnnLKjQkYUahVKWUMzjEWCQQ7zjsWIlsCJcMqSI2IgWEhw+7flh7bVtspTWgtu9wOqskdUZGtX5wG61RkKaqFQHwfQrzWjL+qEZrC0MK8wI0vw2XW7IIpanvFoxaZBiY837JAy8oBKOabygZzRcJTqFf1qeVWSgDUr/iFrfffjt27NiBe++9FxdffDGOHj2Ko0ePYnp6uq/rztuYKqVwyy234HWvex1e9rKXAQCOHj2KIAiwYsWKjrHl5O/Ro0d7Jofta72QJMmMSq6zEUtlAJfC8J2uLyCCs45HhTOL5bLvbSUtY1SJ2smxW7xux+a57OjFBHrnQ20YtHy/FvY8G4q1aE0T+QIAYk6SCkksHaG8NXp+IJC0c6SpdMU5lmYQAMLIR7uVIQgEWrdsQLtFr4e37zV5Th+eyVVmqYRWGq1mBpkr1OqUz0y2TYALKmBqTifwPIEsk4jbGZ5/tunG2rWJre9Gczp1ajJa0X1a+xUEHuJ2Bs4ZWk16tlSHVh1G5vQl4MQLbXMfHvWxarhj/aB7z/e77/sVt/j4xz+ONE3xh3/4h7jgggvc4/Dhw31dd97G9MYbb8T3vvc93H///fOdYs6YmJjoqOJat27dkl/zbMJy8Lzn3dZTyptUtvTMYznseyupZr3RcguL1oCYmOh4HdBd3L1w85RzrOV2l+J4Mdb2s6rSOQBM1W1niw1REFJriCahGQBG39RU81raQ621I6O3hjrPlZNHS7bsANDFE2y8wjxTrprW9dtqOP1TxuDys1PG0Hu33+HW9tz770SeS8BwHJdJ+qmalwwzNDpyqwBcdbOtEG6bNhx7XCmNVpr3fO9PhvKen+++v+mmm/DUU08hSRJ885vfxJVXXulee/TRR3Hfffe533/2s591hOftY/fu3f2tu/9l0kIfeOABfO1rX8NLXvISd3zt2rVI0xQnTpzoGF9O/q5du7Zncti+1gvj4+MdVVxPP/30fJZ9zuFkBmypSCRmm3O+Bn0QRYLPViyXfd+bwah4zreMdxwDYIxANyHDTKaj2ebv9Vq57cbGgG0YFhpYs/c/zThfdxj5Yqwz2qUYtEZBwtAT9gtEj3vT5TltaLiUBy0LmM+4hhmv0fmFAqX5Ou4fNs/bebx8nX5wToiDa61x00034Ytf/CK++tWv4qUvfWnH61dccQV83+9I/v74xz/GkSNHXPJ3/fr1+O53v9tB7fTwww9jdHR0Vs3IMAxnVHLNB2dLUc5ccTIDthgkEnO95oJUcRjreFQ4/ViO+962k1guXWLcKcpdOS9R7HHKGZa9PqAzhGs9T5ujLM4tjK0N5VpGIIuRscjkRzWJYnscUd1D/uH7SdczzdFqpmhOpajVfQShAGAEvf1CtaUxGWNoOESrlaI+FGBkNIQXcFcZ3JiMEcc5kliaOYCRsRCex3HihbYjWiD1GY7RFRGSOCcu3eEAF79kDL4vcPxd78HqFw2hcSLGyvNqGBmLIJUC3/gOMAZkRhVGK9JYHR4JkaYSI2OhI3SI2xn4+H/GiRfa8DyO5nSKC9cOQytgqhFj8ngbSmlceP5I332m3Xt+UPa918/gG2+8EX/zN3+DL3/5yxgZGXG5jrGxMdRqNYyNjeGd73wnNmzYgFWrVmF0dBQ333wz1q9fj9e85jUAgKuvvhqXXnop/uRP/gSHDh3C0aNHsX37dtx44409S50XE8sh3HkuYiHvu0DBzSl69AVWWHost31vw7G2glVJ7cgU6HO7qIq1BlcrKoihgpyCeKF4BigcrKEZHDlBeZxVcyGKPlqLM7I+FR7JnCpabTsKCWabEG6gHBuQEJagQbv114d85JlEFNGzMiFb4XFAwBhdOJ1TmzsFGIaGA2Izyplrx0mTnCgNjcJNu5UhrHmoDwfwd74H6W0fQtzOXR402U90e55gUAEVVQUBiZAHgUCaSMcDrLVGuvdj1O6TKUSRQHM6RRT5lHvVlFtutdIS2cTcUN7z9vdBQF+e6cc//nFMTk7it3/7tzsStZ/73OfcmA984AP4vd/7PbzlLW/Bb/3Wb2Ht2rX4whe+4F4XQuCBBx6AEALr16/H29/+dlx33XXYs2fP4t1VhXljuXnvgxjuOduwHPe9ZR/Smph7irxhUYRUliHjgjnvlXKJRuC6K2zLSoxI9ph9zlIJqyJTDhH7pqI2z0n7E5q81/oQqbK0mimmpxIcPx6bHCoVRAUBebPCI1rByeOk8mLVXoKAqnGzlAqI7FztVgbPE0hi6fh/n3+hhbidod2ih9YaYUTFQ2BAEHoYXRFBK+D4C23kez+CYOOfIKr5CCMPWSbx3PMtSEXFU61mijSVmGok8AOBVjOj+Vo5WtMpphsJGidihO97G6RU8Lf/ZwyPhMhzScc3/EckcY76UDCjYOtUGNQwL9P9+uDLAFaRffLY88taef1Mg7/5dWfcGy+vodFoYGzNeZicnDzl383+jR9+9AcYGh4BADSnp/D//Palczq/wtmH8r4fGRlxxtR6lbZlpfBai5xmeYwV17Yk8HYMGVjV0fpijwPoeR5AHqA7Lgqv2BU0KYBxIk8QHhlTbtpnsoxCtlRxrOB7Alku4XsCShdeq4bxxk1vp+dzJHEO4XEoU/zk+WRYGQrKxHDiNiRbdoEbqkLi+yXvXGmaOzq4B+nWXchSiaHDe5BsuQ1pmsP3KZTMBUOwZwuSHQddtbPW2nnAjNEYW7AkleooOmq1p7H6Jeefct/22vPA4Oz7ipv3LMZiGNJ+PNXZ+mQXdP1SeXxF2lAB6DRwVthalj7kvYn9PVVjXKVq2SC4OYux5euUYRVguv8fWgk1q6ACTXk/3xeIW7kTG2+3UtNPSvlaGzbmnAxi3CLjmMQ5CX6b10m8XLm50rQgyRecxrSaGXIjkJ6lVJ3r+wLNW7cDjELFYeRBaY12K6V+1xYZTLnjNshcozmdIt68G3mukKYSea4Qx/RFYfLWvc741267CUmSI2nTPSmlkSb0pYA8Wzqe5xQWXn24v+hDec8P0r6vjOk5hPmEcPsxhkvhBQ9iuKfC0qKzctWEckvh2Hx8a+/zbO6tVPlbzNn7OnOp8rV8wE53lH6F1TDlghkiBwHGLSGCWW8pnCwMo7soFU/ZNVgZNavyAhijbq7jeRzMEvQLVrpH1nFvVmjcepNuDAetz15LFHzB7lrmeWrbh4lYXzCsvuO9HSxFnNG9CsPry8Dw7Pt39HzfZsOghnkrY3oOweqqDhIEYx2PChWAMmlDWYfTepNsBmkDjTHGqmREZsx7EtIGe571UC2IXIEqfa38WZpITDViRDUilPcNaUMaGy5cUyBEHLzEkxtGHuI4gx8IxDFVzEpJ9yY8IqX3vCI8rDXcmKjmw/eE00hV0nqg3EmkHX++hWjvJtRqPqYaCaKah+Z0inYrBTdsRTYHveLgLagf3IYg8CicLEgajgsGP+COtCHecw/lTAOBxmQMAAgigZoRH7fH+kH3nh+UfV8Z02WMQWIuWiojPYgl8hWWHs4LROFhAZ0tLeWfaUxn36SYODhz3i41hc6wb3HtMmo1H54vjEKLUVgx7SiWVs+SHYSR5xRZrIEVguTTlNJUdAR6DiMPvi8KdqYSwb7nkUGLIh9+IEh/1YS/OWPG2FFVre8J1O66A2Mrakh23gEptVtbfchHGPmOztDef3PHhxFvO0BrCj3Kv0YeOGOIDuwwwuFEHGFbe4ZHQjATTrc0g8OjYd9h2kFtjamM6TLGYhq+2YzdYhnBJTPSvPNRoUIvxRjbO0rk8XpGvhOAa0shr04j27S5NGf388w5LO1ft0drveA0kUZlRblK4UYjwbR5PH+ibaj9SGCbMYY0lm7uqckEjAHTjcSEZhnSVCJNcsStHI3JBE1TzcsYQ2s6hYZGEud4/kSMpG36WZspspTYj6znqraOgwuqSD4+2QZjQKORAKagKU0lnjveRrBnE5I4R6ORIG7naE6TADc9E6Xg8zfvwHQjwdRkghdOtJHEOVrTmdFJlZhuJDg+2Ua7mQEarj93ruje84Oy7/vqM60wuJjN2J3KCM63InixKonL30wH5RtqhaVF2ZhZr8crkS3MRqxuc5LW2yuP6/6v1cluBHeePdZhUM2PgfHQ7HWkVBgdDd2YWq5JI1Qw44kq1zvq+RwjYyF5eKOhU5TxA8o76kAjiITbA0QQEUBr4s89bwVpqHpmvC24IvJ5ClfLnAguVo7VIKXG6GhoiPgpdLt6ZQ3JjkPuffU8Dm3I8uvDAbQhpXDvi6nm5ZyBRfQlIggFhBe6Kl+tyXPtB93e6KDs+wGx+RXmg8XwOvs1iPaai+WpDmK4p8LSo0x0r2R3v6il0CvlTGXR8mLFqnsS3avOfGjZmNrzuvOqlpAexsNTknpDpxsphUaN6HcQEvFBnlFINk2k0zRlYIgiH0lMFbZJLBHHmSPxF4JCusIjcW7q3dRI2nmRMzXEEcKj9hTqR7U5U4nwfX8EmZNiTHMqRVTz0ZrOnKdryemFJbo3YekkziE4R7srZ2oJGpRSFJbefB0AIAyJAB9sfjnTKsxboW8sdTHQYode57Lexb4mY52PChUotGtlwIhxyIZWlVLG2JUJ68n4yZxI5fNcmh5Q5Yxy8TOKeUoE+laI22mXlkjxLWSujK4nnccFQ7uVIYlzxG0iO5CKCOwtcYQNT0upqHWGMcTt3PXJypxEubPUECkkuRMdTxMKn5JCTIo0zallJZao79tIvaVGXYZx4Nnd90EphVYzBeNAq5m6SlwpaQ7XhtPOHXUgYwzhbe91YVx3P80UzekEWUbC4y9s/xSJkLczWk8sO+5xruje84Oy7ytjepqwFD2YpxtzWe9if0HgpYq+QfmGWmFpYfOJ7hnGgym3pqDc2tLpgRJVYGehEnPnW3Fq7n63eqham/Eoj2eObL5saJ0RluahVKfBN2Otl0vi3aUvCJacXhWGm9Rf6GEpBS2xg1WrsddqbL7dKdwoI+5N1zbXUeRhOxFyhWIO48lrU0iktcaJjYfdlwopi/uSOT3r0jqlWY9UClL1Vuw5Gcp7fpD2fZUzPU1YroZzsVmSFt0brnKmFbpgeyftsyqxHxHdX8G5S8dMDvD2O6DGNxfMPqXKlm5i++7jQJEz7c7JRkZnlAWGfcmIZQtBoVNLYzg0rF1hEBdk1IeGAxPG9RBF5EmGkeek2az4N0p5UIAM9cho5NiYbF6S8sFwhjUIPeOJA7W67yqE260MtbqPOM5M9a9w12WmGtiGl+2a/H07kO/YW9A4mvcvS6XL/UY1zx3Pc4kklsjyvK+/b5UzrTCQ6NfbtD+frn7VQcydVDg9KFfclnOd5RaSMvLNmzrGdjIg9T6nfLi4Ruf/Q+OPumph63VSKJZYi/KMwqPW6yMuYRjjRXOnCYVvbc8qAPLuJPXJpkmOPKc+VQDuWUoKs+a5dCFkJen6tqcVgMsvUyUxrY2BPHnvwB7qcd2/22mxWoJ8gMjs4/HbnJh5lpKSjRVDzzKJ4dvHIXPtjucZucRS9n5vZ0OVM62wrLEQ41c2uPbn0+Vpcxd2Y5U4eAWHMv0fVY52Vt+WC5BsuNR+JvfWQ53Zy2muNGOM7hqTpdIZUhvKlblC0s4N25BlLuLGGNrcrSrCtiDKvzwjcok8o9ylDQMTcQN3oWUK55prSw3fE0Z2zhhNRUVQlotY5pQrVUqhdnjC8fomxthnW3bA9wTiLTs7jJfwiNOXMbpWdHAXsR8Zr5Xk78gLf+49RBtoj9cntqDdyub+RzXo2PMDtO+rMO85guUaZj4VOIPbTIOyqSosPcoE9TZkag0JusSyyQDxkqza7EUtvKupsZu0wYZoy4hqPoWWFSA8YTxBImUg0gY47zCKfCfmLQSD5BpCcJdfDSMBmdOz/RLAGSvyq+bSwuPw7b0r8mAF4y5n7PnckSn4PtEYjq2MqMBp07gzyPUh392jv28Hsm17AcDREypF6jNKaqo23rrHCX4rqQ3BBBH1j4xFjnxCa414++2ABpqtfsO8nXt9UPZ95ZmegziVl9qvF7uUId9BDPdUWFrYUKfNK2YZ/ZznElkmTWEMhR6pYEY5b5CoALU7V+bKVep2zJPKUtGQKryzTBqP0lb3mvBrZqqKMyq8SVOJVpOoARmIV1d4RMKQZ1Tck6XKzQWQlFuaSDfO0g1qFHlRIYrqW6U0kpjW7PvEpMQ47RkbzuWcIcuJHH9qMoGU1MbSNmuLW7kL+8qd+4hFiVPoGiC+3jSRYBxIEhonBEd4aB+ExxHdeSekVPA8geYUkUj4PsnHQQPR9v9Udu7nhCrMW2Fg0O2ldhvDfr3YpfR6O8I9g/IVtcKSwvMEPM/Q8BkCeSHo2feFI5f3fQp9CsFLxO0cQKFJagnZ7blunkA4mTTOOXyfPEXf0AXacZxzBIFH4VzQfIJzBAHx01rWJFsB6wfceX2ez91cABlq0ictDJIQhrRBwXw50EbgnO4nCGnNeabMFwSqDOaCOWk339zb8EjoCopqdVrb6Af3Iww9J/LNbbWzcYFJd5W87SC03rJCsmk7pFRI3n+r63utDxMtof1iAga0997bnWI+Jbr3/KDs+8qYVpgTC9JcsBQeqg35dId+Kpy7KPd4KqXhHdjnWjOKRydpgzYtH0CR8+wuQLJUhB2/69LvpWuWkaamCMd4y5kxJjYfmcT03G4XPaeWsCGJc9OCopBn5LVaYocsk0jT3M2Xm8KfLCVv2c6TxLlbQ5oUMmxZqlxxkMyJxMFKuNk1TW3YjjQ1a0noWnlWjM0zZTzb3FxbItizCWmaI88kwj0baK6caBIz49XbdbVaqSlEmju69/yg7PvKmC4SBk2NpVeF7mw4lSc727jFwCCGeyosLco9ngCgtu9wxy26ie6FVxL8niXuaAuF7M+2v9T+bonkrSdpEdV846UyBEFBYj88ElLhEy8Mdxh5CEJDhh94FLo1RUpSUn4SoGfbxmL/30tZEFB4noDnc9TqHryAu95Rzimv63mCVGAUDPuSh7GVkSkYUhgaKYjua3XfkE0oI/8GR3uolEZoiO6jGj1Pb55w6zmx8XZ4AYdWwIghtbcVy0JwjI5FFdF9hd44nYZkKdGrQnc+5y41WCnUwwblK2qFJYX1vCyjURLnyE0bh62szXOTczSVrFkqXY4UsGxIcHlS5wWa5ySmfGXh8eUQgiFNjRdo5pS5QrtJXhwDo/YXqZEmORonYtTqvhPmrtV8I8FWrNtemzGgPuQjbmckbdYmmj/b9+n7AvUh3yjNcPA9O6E10GpmUEYFxhpmzyOR7uZ0Cj/gSFOJuJ3h+WebkDmNbZyIURvyMT2VoDmdgguG4eEQGiaEbPiDo5qHuJ3D8zlazYyk4EIPQUD3Y9VnwkhAbHoH0SKa45wzTB5v9x3mZV0h3kHZ9+e8Me3Xoxw0CbPTNf9SXdN6CN1CzRXOXfgBeWVckJfoB4WcWRB68HzKQwahB//QHTTOo7E2R+rfcQcV9Zg8aRB4zqu08mfWMNm5gMLzFMb7FEYKTXjM6Y4y4wnbalqbh7SE9s5Y2YdhVSKiB6o6ppysEdg2BUEFvSGQbdsNIZh7H1SJNhGAuTeay67XVh1bWTVLQu/7hnNYlYkumGs7KgQCTP629E+poqJ4evennBdu5yL5tv7+vt17flD2/TljTJe7R7mQdfTDmdtPeHe265zsvPJri/HeMt75qFBB5spV41o1FJkrJ7Rtqe7yXCLfvNFR5FmqPa008s0bXXWvUrpUIdxZCWyp/4ggQbsxdF3lqoXL19CGss96wUoR/Z+9npTKjVOGrs+GnqVSjvqPrkPhW5feNTaT5iro/GCMrFaF4bVVwtLwFWepRLR/HECJ8MH0ulo7XKZGtLlhJTWiA9vde67dGuBeB4oCKQulNEb3/HnfdILde35Q9v2ALHPhOFNG83R4hP3c22KEd0923qLTCQ5gVV+FpYUlLyCKPfoII++Qm/YQ4yWaal9Lr2e9UkugYCt9SW6MKoShTQ+nb0kQmHvdVv1CUz+qnS9uG7YfDWRZ0TYz3Uopv1oiIbCFP1JqU1RkDKvxRm0bSprmjvEIgGtJYVSM7FpqkjhDnivn8VrU925AbFpjbEj6+akEjVv3wfM4ppsZhOBotzLEcebeQ6W0Ewq3PbxpItHesg9xTP2iNh/tedyp0nDB0GimRnWGjiul8X9v/tCsOerZUFXzVuiJ5eL5ngz9GPzTHS4exHBPhaWHJaJXSjtyhALaGUI7Ngg85ynmzmMsXCZbIOT5nR+J5Q9yvmcnAMzQ51yxsoao5kNrynt6vkC9HmDNmmFMTyXIU6qObTZTDI+ELtw6NBwiCCk0DQ1MTyUYGQ0Rt3IMj4QYGYsQBB6FZfdswvRU4qp1o4jmGFtZQxAINE7EhlKQ6ATjXR/Aefd8CGL3ZoSRh+HREL940QpqpdlyA9asGcZUI8H5n/oIVqysQSqFyeMxOCeVF+tNtpopRsZC5Lmk+9x7qxM3n55K0JiMEQTE9fviC0YBAM2p1Eivaay7cKTvv20V5q0wsCgb/G5jebIe1NNhWAdxU1VYWnTz6M7Oq9t13NEJdh3oMb7XNdKtu3ovyDJ08YJYvzhW5Ec9r/B07Vh3DkfhCYtiHhvmbG+93X2BsK9br9v2z/LS3IwxyPEtiLcecD2jjAHR7bvR2H43APIg5fgW8xrllRljqN2+y/1sPX/73NpGuebRQ5vBOcfKOzZ2KO7Y9buoAPrft5UxPQMYe9vVZ3oJZx26PemFhHQXw9iWPyAGpUS+wtKirD8KFMTyMzVJS/Jlqshf2mIfmHPKfavlucvHnBB5KY9qn61cmVuLuX6eKVNExBxxRFkD1ZEsmLV5HpEfCMGdrBoMgQKFmrkrWLL3bmXbbCGSM9RGos1SAto+0njLbng+cQR7XkH2wBnD2OFtAIBk6x4yYqagSkntWJfoXhha2++A53G0dnwAABwZBExbjedzxxjVLzr2/ADt+4E2ppP/9aF5nbcoH/ID1ld6JrAoBUgD+A21wtJC5toZQ0ukkGdFIZIt6rGFQba6xhX9GBIH0vAsinVy0y4jc+0o/6xRLZPTU6GP1QXVjtEIJq9pjYHn84L0AZbMnjw326/q9FRBsmbC49SeUsr/2vO11q4AifPC2FnjWi70sXleaLj8cRh64JyZNVOlsc21+gf3YmrThDNcbk2q4CK2OVlXeGSKuThnZi4KfytDcMEYUSBW1bxnMdSX/2HBxnC55ULPJEvRUmIQq/oqLC2Io7YIidoPbfuwIUrHV2taU4gf17TUGANoxzg+WTO/bY2xRUpBQIQFdky5NabdMhy6RqklN9XArSYV9khZiHHH7dz0mhqmoDQ3VcZkodIkh1b0bBmUrHg3QIZKmX7ZPFWG/Ui60LL1lrOMeksByhGnaY7GZIwsVQAY2q0UANBuZUiSHMnm7U4Srsx3TGuiymbqizVNMUpj6PbtAKj3FgxoTacI9283fyWiFZyeSmaVxJsNVTXvgGGpjeHpNlpzvZ/53PeZNMCLUdV399134+KLL0YURbjyyivxrW9966TjP//5z+OSSy5BFEV4+ctfjq985Svzum6FpUNHSnOGCkx3LtTmQEs5TXSfY8eeTIJtxiEAcKFi+tlSFsKFbG1oVHjkwSmzFjfWaJ8KUwFre0Ftla+tBrZVzJybvlJWsCI5eTbj6dYntkCa8KxttSFtUg3hUZGREFaejeTpbPEVs6xDRiFHKeUYmjhnxJLEGZLtE64H1RLqx+N7XTUvYyQlx9Dfvq2qeSt0YLl5rgtBrx7VMpbS2C403PO5z30OGzZswK5du/Cd73wHl112Ga655hr8/Oc/7zn+sccew9ve9ja8853vxD/+4z/i2muvxbXXXovvfe97C72VCosEyjF28u9adRcbwkVXr2SR79QuTFzOe9ocpW0LsSFim/+k/lCTx2ToOJckzsjAlY1LEAkkpr2F+HBJX5RIHIqxzPxuNUbTVDoyCMZgemaVE9zOM+VCu9YAxq3chLopXN0aP0hkFvu2ujaW+lCAoYPjSOIcYeghSXJDaUhGPG7lFOa2IW9jgD1PIM8V/IAbL1c6rzhuU7tMlipEkQ+lif0pjjPDjOT175kOaJiX6dlK4ZYxGo0GxsbGMHnseYyOjp7p5Qwk+Jtfd9oNfqPRwNia8zA5OXnKv5v9Gx//l+fc2EajgZUXrp7T+RZXXnklXvWqV+GjH/0oAPogXrduHW6++WZs2bJlxvi3vvWtaDabeOCBB9yx17zmNbj88stxzz33zPVWKywBeu37cmGQrTi1x7qhTH7Pji2Pm+2cMizfbK95rdEj75JCqbav1E5rDS9x/MIYKTJWRHSvEEYe0iQ3jEsoiB+M3qn10vxAIE1zeJ4gqbhMdfSJuoravbuRb9vp3huZE3F9GHpIE2m4gOneslQ61iaZk7FXSiMIPKQpGd4sleRJW5IIUM5YK1qTJdRQWru87eTkJFZd+KJT7ttee94e73ffnwkMpDi4tf+NqcYZXsnyx9jbru5ZqKVziUaj9/tnq6TnW+A1G+zfq5/vb1PTU64IY2p6iubpWncYhgjDcMa5aZriiSeewPj4uDvGOcdVV12Fxx9/vOf1Hn/8cWzYsKHj2DXXXIMvfelLc15zhaVBed9b4+cYeUxvKVAYt7KhtOdyzp1RtMbVjuk2ynYuO6bXeQAQx5kjKRCcE4sRDBtRqRI4N0TySlMo1/cE0lSSILhhXlqz7zCO3XwrFS8puiYXRagWjKp7/YCj3c7h2QphkNRaniunacoYw7Pvfi9eeOEEOCeNVM4Z1hzehWO33kaFTFPG8zOVt56RkksS4uO1htlWJlvPXCsrtE5xaBuatuT4WlHJldZAErc6/n6nQnnP298HAQNpTJ9//nkAwLpfeukZXslgYGzNeX0dn+vr88XU1BTGxsZOOiYIAqxduxYX/evOv/Hw8DDWrVvXcWzXrl3YvXv3jDmee+45SCmxZs2ajuNr1qzBj370o57XPXr0aM/xR48ePel6Kyw9zpV9v+bOw0t/jY98Ysmv0Y1T7fvZ9jwArF27FkEQLOXyFoyBNKarVq0CABw5cuSUH8rnMhqNBtatW4enn356WYRHtNaYmprChRdeeMqxURThpz/9KdI0nTFHdziul1da4exDte9PjeW254G57/vZ9jxAhjaKoqVa4qJgII2pDcOMjY0tm/8wyxmjo6PL5n3q50MwiqIFbaDVq1dDCIFjx451HD927BjWrl3b85y1a9f2Nb7C6UO17+eO5bTngbnv+4Xu+TOJqpq3wlmLIAhwxRVX4JFHHnHHlFJ45JFHsH79+p7nrF+/vmM8ADz88MOzjq9QoUIFYEA90woV5ooNGzbgHe94B175ylfi1a9+NT74wQ+i2Wzi+uuvBwBcd911ePGLX4yJiQkAwHvf+168/vWvx5133ok3velNuP/++/Htb38bf/mXf3kmb6NChQrLHANpTMMwxK5du6pc2SlQvU/U6vLss89i586dOHr0KC6//HI8+OCDrsjoyJEjHdWb/3/2/j3crqq8G4Z/Y8zTWmsfE0ISo0Fo61Ok+gqiYrS19WpeUrFWWp/vQz8rvrwWKyVUiBDI+UAggIAoolQsYp/WYu0neD3W5tILRR9r1ILm/RSRq62c+pSEQ7L32uswT2OM7497jDHnXHvtZK99yN4rmb9c81przznGmGOunXvf6z797re85S340pe+hK1bt2Lz5s141atehQcffBCvec1rFuoRSmiU/5+PjfIzWjj0ZZ1piRIlSpQosZhQxkxLlChRokSJWaJUpiVKlChRosQsUSrTEiVKlChRYpYolWmJEiVKlCgxS/SlMu21pdaJgr179+KNb3wjhoaGsHz5clx44YV44oknCmPCMMTll1+OU045BYODg3jPe94ziYTgmWeewTvf+U7UajUsX74c11xzDdI0PZ6PUqJETzhZZR4o5b5voPoM999/v/J9X917773qscceU5deeqkaHR1Vhw4dWuitzTvWrVunvvCFL6if//zn6sCBA+qCCy5Qp512mmo0GnbMRz7yEbV69Wr10EMPqUceeUS9+c1vVm95y1vs9TRN1Wte8xq1du1a9dOf/lR94xvfUMuWLVObNm1aiEcqUeKYOJllXqlS7vsFfadM3/SmN6nLL7/c/iyEUKtWrVJ79+5dwF0tDJ5//nkFQH33u99VSik1NjamPM9TX/nKV+yYxx9/XAFQ+/fvV0op9Y1vfENxztXBgwftmM9+9rNqeHhYRVF0fB+gRIlpoJT5Ikq5X5zoKzevaam1du1ae+5YLbVOZIyPjwPICMAfffRRJElS+HzOPPNMnHbaafbz2b9/P1772tcWOqOsW7cO9Xodjz322HHcfYkSx0Yp85NRyv3iRF8p06O11DrZWmRJKXHllVfirW99q2XnOXjwIHzfx+joaGFs/vOZqsWYuVaixGJCKfNFlHK/eNGXdIIlgMsvvxw///nP8f3vf3+ht1KiRInjhFLuFy/6yjKdSUutExHr16/H17/+dXznO9/BK17xCnt+5cqViOMYY2NjhfH5z2eqFmPmWokSiwmlzGco5X5xY0GVaa/p7jNpqXUiQSmF9evX44EHHsC3v/1tnHFGsSP9ueeeC8/zCp/PE088gWeeecZ+PmvWrMHPfvYzPP/883bMt771LQwPD+Oss846Pg9ynPC9730P73rXu7Bq1SowxvDggw8ec87DDz+M17/+9QiCAL/xG7+B++67b973eTKhlPneUcp9n2ChMp9mmu5+//33qyAI1H333ad+8YtfqA9/+MNqdHS0kKV2ouKyyy5TIyMj6uGHH1bPPfecPVqtlh3zkY98RJ122mnq29/+tnrkkUfUmjVr1Jo1a+x1kyJ//vnnqwMHDqh9+/apU0899YRMkf/GN76htmzZor761a8qAOqBBx446vhf/epXqlarqQ0bNqhf/OIX6s4771SO46h9+/Ydnw2f4ChlfmYo5b4/sGDKdDbp7nfeeac67bTTlO/76k1vepP64Q9/OJ9bXTQA0PX4whe+YMe02231F3/xF2rJkiWqVqupP/7jP1bPPfdcYZ2nnnpKveMd71DValUtW7ZMfexjH1NJkhznpzm+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3rwZr3rVq/Dggw/iNa95zUI9QgmN8v/zsVF+RguHvqwzLVGiRIkSJRYTyphpiRIlSpQoMUuUyrREiRIlSpSYJUplWqJEiRIlSswSpTItUaJEiRIlZom+VKa9ttQ6UbB371688Y1vxNDQEJYvX44LL7wQTzzxRGFMGIa4/PLLccopp2BwcBDvec97JpEQPPPMM3jnO9+JWq2G5cuX45prrkGapsfzUUqU6Aknq8wDpdz3DVSf4f7771e+76t7771XPfbYY+rSSy9Vo6Oj6tChQwu9tXnHunXr1Be+8AX185//XB04cEBdcMEF6rTTTlONRsOO+chHPqJWr16tHnroIfXII4+oN7/5zeotb3mLvZ6mqXrNa16j1q5dq37605+qb3zjG2rZsmVq06ZNC/FIJUocEyezzCtVyn2/oO+U6Zve9CZ1+eWX25+FEGrVqlVq7969C7irhcHzzz+vAKjvfve7SimlxsbGlOd56itf+Yod8/jjjysAav/+/Uoppb7xjW8ozrk6ePCgHfPZz35WDQ8PqyiKju8DlCgxDZQyX0Qp94sTfeXmNS211q5da88dq6XWiYzx8XEAGQH4o48+iiRJCp/PmWeeidNOO81+Pvv378drX/vaQmeUdevWoV6v47HHHjuOuy9R4tgoZX4ySrlfnOgrZXq0llonW4ssKSWuvPJKvPWtb7XsPAcPHoTv+xgdHS2MzX8+U7UYM9dKlFhMKGW+iFLuFy/6kk6wBHD55Zfj5z//Ob7//e8v9FZKlChxnFDK/eJFX1mmM2mpdSJi/fr1+PrXv47vfOc7eMUrXmHPr1y5EnEcY2xsrDA+//lM1WLMXCtRYjGhlPkMpdwvbiyoMu013X0mLbVOJCilsH79ejzwwAP49re/jTPOKHakP/fcc+F5XuHzeeKJJ/DMM8/Yz2fNmjX42c9+hueff96O+da3voXh4WGcddZZx+dBjhO+973v4V3vehdWrVoFxhgefPDBY855+OGH8frXvx5BEOA3fuM3cN999837Pk8mlDLfO0q57xMsVObTTNPd77//fhUEgbrvvvvUL37xC/XhD39YjY6OFrLUTlRcdtllamRkRD388MPqueees0er1bJjPvKRj6jTTjtNffvb31aPPPKIWrNmjVqzZo29blLkzz//fHXgwAG1b98+deqpp56QKfLf+MY31JYtW9RXv/pVBUA98MADRx3/q1/9StVqNbVhwwb1i1/8Qt15553KcRy1b9++47PhExylzM8Mpdz3BxZMmc4m3f3OO+9Up512mvJ9X73pTW9SP/zhD+dzq4sGALoeX/jCF+yYdrut/uIv/kItWbJE1Wo19cd//MfqueeeK6zz1FNPqXe84x2qWq2qZcuWqY997GMqSZLj/DTHF9NRphs3blS/9Vu/VTh30UUXqXXr1s3jzk4elDI/M5Ry3x9YkBZscRyjVqvhH//xH3HhhRfa8x/84AcxNjaGr33ta4XxURQhiiL7s5QShw8fximnnALG2PHadolZQimFiYkJrFq1qtBDdCqEYYg4jiet0fk7D4LgmP0bGWN44IEHCv/fOvG2t70Nr3/963HHHXfYc1/4whdw5ZVX2nKEEjNDrzIPlHJ/oqAXue8m8wC5+yuVynxtcU6wINm8R0t3/+Uvfzlp/N69e7Fr167jtb0S84xnn322kEDRDWEYojoyDMRJ4fzg4CAajUbh3I4dO7Bz585Z72uq8oF6vY52u41qtTrre5ys6FXmgVLuTzQcS+6nknmAkqSefPLJRa1Q+6I0ZtOmTdiwYYP9eXx8HKeddhqe/fcnMTw0XBg78r7zMf733+y6Tue1o42dLkbed362r1mudaKjPlHH6t84A0NDQ8ccG8cxCdXvnQO4Dp1MBRoP/xTPPvsshoez3/uxrNIS/Ymp5P7Rf/kZlowMo1LzoZRCHKWot1NUXI4wlRiuuvB8B4frEZYMBXBdDs4Zwjbx0L7yjo14+spb4PkczUaM2oCPI+MRFBROXVLF4bEQrURg+UgFQkiccedm/D9/thsvXzGI555vYMlwACkUGu0EQzUfQ8MBjIOPcw4pFUQq4fn0/zZJBFw3s8gYYxCphKPPCSHBGAPnRWvbrJkm2Vp5FNZIJbjD7PoGUkqkqYTnOWCMWc9Omgq4rtN1vbyzstMDIKW055JYwA8yFZKmAqfcfgvGrrmuMHdsfByv/G+/dky57yrzAJAKHHz4p4jjuFSmneg13X0qN97w0HDhjyoAqH/64ZT37bx2tLHTRS9r8He/FfJr/zLre/Y7enLRBT6YR/9NVUJ/DIeHJ//e5wJTlQ8MDw+XVuksMZMSl6nk/tRTl2DJyCj8wIFUpLiGwxSu6yBN6Q+863JUA1KUnDMwzpAMCABAe+/nIYWC43AM1FL4gYNqJQEUMDDkI/ATJInA4JAPKRXaN34OrUaMkdEqOAJUax6kVBiKBIKKa38GAM5JYUmhCsrScYruTSmldXlKqcDY1HKRV5pTryG7ulClVJBSTlKc3cZPtUbnekbpdypkKSXE7hun/FIwbbnPyTyQyf1ix4KUxizmdHf+7rfO29qlIp0BuFM85hFr1qwp/J8EqHxgof9PngiYS5l3OAfjDGAAZwyMMTgOWZ/m1ZyDVlLMvjIw6FdOyo8zBodzcIeuLb35cjgOs+O5Xosx0BhtRXKH1jAo6Ao2xfluA46FaQ3tPogxgE37Xscel3+WbuvOSSi7U+bnWe7nCgtWZ7phwwbcc889+OIXv4jHH38cl112GZrNJi655JKF2hKA7gpvPhVsiWPA4cWjBzQaDRw4cAAHDhwAADz55JM4cOAAnnnmGQDkRrz44ovt+I985CP41a9+hY0bN+KXv/wlPvOZz+Af/uEfcNVVV83Z45zMmCuZJyWo/5gbJclzh1GeWlFCKxTGUTy0UgXTSlUr6PrWz2rlSdcre7eS8ga0lQs7p3bjZtrTPOZDTb32NG86W2U+7XXn6EPolPke5X6hsGAx04suuggvvPACtm/fjoMHD+Lss8/Gvn37JiUoLAaUFuUCwnHoAADZW+L5I488gre//e32ZxN/++AHP4j77rsPzz33nFWsAHDGGWfgn/7pn3DVVVfhk5/8JF7xilfg85//PNatWzf75ygxhzJf/KNdsJZYNiR/3rtxO1obd6B243UIt97cdW7XOzEg2nwD2u1iUoyxytqb9/a49xLHRF7mgZ7lfqGwIKUxs0W9XsfIyAjGD700p7GzMqY5v6jX6xhZcQrGx8eP+Xszv2P8yduLMdOvfmda80uceLD/Jy77AFp77obrOlBQEKlCkgg4DoMQCp7nwHEYwjBFpeJqaxVIUwmALEopFRzOEccCns8RhRSXq1Q9RO0UaSpRqblQEnBcSl4aHPLRbMQIAhdSKaSJxPDHN0Puvq0QF1RK0frO1PHMfOzxmDHTLjHXbmt0xioBTNpLt7lHO9dtPbPPzn1N9Rzj4+MYXbnsmHLbTeaB/pH7/rCfjxNKRboI0YexkxLzixc33wbXc+C4FMv0fI4gcOH7LioVF67H4bgclYoLx+FwHAbOOTzXQe2WXXAcThm+DoPvO3Acmh8ELhyHwa84qNRceK4Dz+eo3LSblDJjNMaltfzAAVxKTDMu4c735udOdFrTR0vOmUrBdbXIJ41hx7z/sdboXK/bezO/+716dP/2acy0L0pjZovS4pwdFvTzc3iWJi/lwuyhxKJCqx0j8FN4PlmmaSwRRSlcj0OkEr5PCq/dilGt+XAcioUmsUTjY9sRRwJKKXCHIQ4F/IqDdpPcuLUBH+0WZfMODFI2b2vjNjQmIoyMVtFsxKhUPV2SI9C8ejvSVFi3L+OAUtpqo8CuteDyTkClAMdhUBLaa20sW7pmXqHI4nNchrwP0ZS3OJxDQXVZL4O5vxTKxoWtValg486UNWysTqUTufR+9brWMjXP6NIajFMJj0n6ArK9C9Gj3OZlHugbuT8plOl0FcFcKI1+Udy97HNBn4frbBPzvsRJj5GRKgaHcyUzFaAmfVuWApByqFTdglXkeapQawkAlYoHAAh0vSRjDEHFncS0Za6PLq3a87UBumbGGjepUgqcO/qczNWYFq1Ezhkksjk0j08qm3G4sXiVXYdzBtfl+nnMczMwnj2/2ZOpMXUcWk8pBd936T7aTWu+XNB6OsGLMQB6T5B2b3oLcDknxa/35weuLhFS+jzg6uzqnpCXefNzH6A/dnkcMFdKcDZrHM+s4X5Q+AAyweoUsBInLcJ2gihMkaYCSSIQRynarQRhO0GrmSCO6Hy7lSCJBUQqIYSksTHFQ+lVIGyTFRq2E7RbCUQq0W7FaDZixHGKOKJxrWYCpWCt1jhO0W7FSGKRU9DZHvMkDubVZAznlUv+C0B+bP46tMKlNfLKKSvTseU6ekzmctaK8oY9dj3H4VrxF4kkbCkQzx/FPdF1ugdZw9lz5WOmZu6MaB87Zb5P5L4/djlHOJqyWgzKZTHsYdHBdYtHiRIsq59kDLpMxbzqEhgTv2OAd+NOPY3ZOdn7Yg0qUFQsxmVp/p6b8ZUbtxWuF7ZnNpXfsD1vxnSbc5QH7nZ2GjFTA7ll65Rzu6/XW81p8Xz3OO200SnzfSL3J5Uy7cXdW2KRoA+/oZaYXzQnIms5RqFAq5HgpSNtNOoRXhpro9Ugy/WlsTaiMEXz6m1IE4l2i6zPKCRLNopSNCYiRKHAkbEQR8bbiGOB8fEQhw430W4lei2Bl8ZCItrXa45dtQPj4yGidmpdtMbCNHSCxiIUQtrrxs1qGJOUUnCu32HPm3PmVSlVmF+4j8h+zr/Pj1FKIU0nz8+PN5CieN/OdTqv5del5558n857TAulZbp40atynI7SLRXucUIfFm+XmF/82qc3wQ8oC9fzOFyPY7Dqo1LxMFT14PkOHJfjtE+s15m9ZE16vgPPd+C65pUjqLjwPI6BqoeBqgfOGapVD6M1H6Mfv47meBxDVQ+MMQzWPMoM9hxUqx5cnyOOBIRQUJIo9qSUEFIiClOIzVsARclEUioksUASC0ihkKYCaSIRb95hFU6SCChFr0lC1wHY5COlYBVsmkokMY0xTExEH6isKxtgel8SrWZsy4OiKLWvcZySi5ZDK25KJjLKNYkFpFSI4xRKZs9iaQX1HqOQrhsIIck93mv+UJ+SNvTHLqeJqRTcfLhPS5fscYLjFo8SJz2e3/QJXUuqy1sCh5Si78APXHg+lb40d/01XJfD4VQq4+rDcSl5h5SxY9fwfeL09X0HQcVDtOM2eL65ByUz+T6V3rgex+itm3VpTrYXKsWhdc2c4JY9Nq7o+Y4u66FxrpfFQRljlpSf9urQlwFnclzUlAS5Ho3JxztN6Y/rOmAMtF+Xo1rzbNJSUMk9j+t0rM9oXzohifbIaJyT3cPu2SM1Uql4do6hc6zWXEvAP210ynyfyH1fK9OR951fUKB5BVdajicKOMAcOvr7v2uJOUKzEVGiUSwQR5RodGS8jcZEhLHxEO0muWbHxkNEYYokoSSkMEwQhpSgFIYJ4jhFsxEhjsi1O14PkSQCE/UIL461ELVTm8Q0Nh5CSYXxekjz2wkOrd+NKEx17FAVMoDzllt83dZclnGWdJTFFpW1PItxWzonRHc3KWXdZlm7+fsbxWhcugCKCUF6yXxCFCUQFTOis71k61n3czqZwN5YzmYvJlGpN+Rkvo/kvj92OQXG//6bU3LpztRyPJoSLhV0b5iTzysvVKw/irdLzC+4tgINUb3DOXxjETrMWk9ezqLLslDp/chNG8ByFpbncniWLJ8hcB26zjkGbtwIT9eqejZ7lVsrklBMOupM5plM5FB8pu4JQRnRfjdMj/ihSMafOz3lekdPIJqcnNW5JmMMzo03TDF/GuiU+T6R+75WpvleonnMxgV7tLmla7c3zMnnxd3iUeKkxys/scF2ewFD1v2l4H6kso2BGzfmiOm1ouBAY8sdmvye6WukoKHnuZzReA60t95qafNO3fthS7RvFHM3TNWpZSqFN9/oxlY0+zWn/tlkD/Mb9vR+r06Z7xO572tlOptm3HNhNZWW6nH4DPpQqErML56+6nZKtFGU9KMkuUIN244QWRZsc/MtlACjYM8XMl+l0kw9lHBDa0kkQkHqtat7roYQElIqvLDpc1CSSHmMa5XcmHotaD7cXEKRSCXVxMY6OUnvEYBmB6K9Jwn1W01TYdcRgpKZTJ2sSCWETiIy2bRCSCSxXldfN+QKUkqdNJRl3OaTnAykpDVk/l5C2r2Ye5pzaSrg7/wY1fHq+yoFKP0cpr433bTFZi5PG6UyXVw4lru2V6up23qlpXocPoM+dPeUmF+wLnWm9px1i5pYIMu5L5H7mVkavUnrcgau34MBra0fz9Wj5iwwdmwLz+4PRbdocU/0GuzdoZft2JOtU0XBm5w/b9bxbtypr7NJa011b7ta7vNhHffo3A8Do8+F5/alb8u0t2DGKN28iwulu/YEAXdy31D7Q6hKzDM6+BCGb1hvOWfNH/aBG6+2Q5QCFIrJOTTVagx7rjMRCPbn/BhVUHLG+gMztZY0JkmEzZQ1mb5SW8J2noItHZHbqSaVO4wsYZHR8tls2hzbEBjsGMr65Ui37rJJTSKVYJxBacs3jlIa6zoQqYTrOkhTsiBN1q95dvPlwXE5hKB1aJxpip5lHBsmJFMiQ9nEDvH1pmIGbl6nwzLtXe7vuusunH766ahUKjjvvPPw4x//eFrz7r//fjDGcOGFF/Z8zxNWmc41ytrThQFjTuEoUSKNcy7TVOGlaz6JZRsvQhILtGKB4Z1/hvq1t6ClXZDGhZtqF6h1h1rXqUIYC4TatRnHAs2IaAeTlK63YiLHDxOBgd2XI00lojiFSJV1OZt6Uiit5GRG4pC5glFwTyulLFE9kLljofS4HMEDXUfBrZx3NStzc8DeB8jc2kJkityQz9u9I7euzcjN76njGVEknrBr5jy6yrjCe6wz7ZT5XuX+y1/+MjZs2IAdO3bgJz/5CV73utdh3bp1eP75548676mnnsLVV1+N3/md3+ltwxonhDLtpsQWQrGVFu88oA9bMZWYX4yHKVqxwMCujyBNBNpxiv9n0xcw3k4w1orxn1ffhSQRGNPcuWkqrWU2uuUDSHSXmTSRmAgTpInAWDvGWCuGFApj7QSHGiHiKEUYCaSJwJFmBCWBsVaMlzZ+EnGUYrxN5TWu69iMW0NnWNtLhA8GxrJ1XI7g5hsR7N1urVVzHSCrzlh/lEzFoWRmFec5c5muB813pDEWJXfIcjQKkXMiqDA1n67uyuJ5To4wX2UWaY6g3uzJdXnOpc5syY15BtfLOsYY4nzfd3vPr5plC7bbb78dl156KS655BKcddZZuPvuu1Gr1XDvvfdOOUcIgfe///3YtWsXfu3Xfq3HDRP6I7J7DHRTYlMptrkitF/s3WEW+/6mDe7RAQC8P1oxlZhfnDIUYGTQR3vX54iOz6XSGM93Ci3YVo1WUal6cDSRQLXmY+Lmv7PkCY7LsBQV+IGDlSNV6qYSOFg+UsGSmo/aALVgcz2OVaM1cM6wcqSKatXTbdG47nMKgJvWadR1Jd5+C0zXGKOozPV081YoWew0A2RNxLOuMTSHO8x2YzGaqdAeTRUt1vwYgPaZH0vdYlihO03REs064SjVbU+6blW7o83zkdJF7lkz5d4T8jIPWLmv1+uFYUEQIAiCwrk4jvHoo49i06ZN2XTOsXbtWuzfv3/KW+7evRvLly/Hhz70Ifyv//W/etywvs+MZvUx5iLxaCbrHG/M1f4W3HXdh4kIJeYZHTFTKCCr98QkSyiLmerLnck1rDi2ODk3hxXHmPlCyCzuqflpTXYuESVkcUiKryodx9Rctnou59wqpyxmajqxILdW5jo2YwxLUvYwysY48/sxSk+kpBxNzBTQ/VBVMTHJ7Algdpwh8jelSNQ6jiFNpP3CYKzVfMbwtDFFAtLq1asxMjJij717906a+uKLL0IIgRUrVhTOr1ixAgcPHux6u+9///v467/+a9xzzz297zWHk0qZzkQxHM3Cne3a/YAF/9LA8mwoJ9V/1xJT4MhEjImmIbpP0WzFODjexpGJCAfHQzSaMaIwxcHxEGGY2JISIrqPNdF9jChKMdaIEIUpXqiHeF4zIL1Uj/DM4SbCdoLhje9DHAocHG9DCoXn66Ft+fZiPUS7lRQaYluWIUUu1HzM07pPHWbH5r8EGEUHZOM4ZwUCegPrgtXEERkDUtGlbO7POblcLfuSfnVdR1uuzDYEN+sbK9NYnI6byR9j0Moz18PVyZK4jGVLn0GPv+CCzGdy/+yzz2J8fNweeetzppiYmMAHPvAB3HPPPVi2bNms1joh3LzTxdEUw3TcovkxnWMXXOmcqCi4eWfwLbfECYdTRgKMDAXwfAdKUvwv8F04LsNoqqwLdxVqqNRcS65QG8gUhR+4cByGpYxcviuWAFDA8K3bMHbVbiwd9FGt+Wjcdj9cl2PVkgE4LsPLltQQVF34kpTl6G2bke66zZaV5F2gRokZBQlkVm2hkTmnufm4Zd5VamKWncj3EDXPmFe4Zi0TO1VKWguZW0s560FKlmmWjGTO5zvG5PdhOIEtdWAuCzh7BtV170fFJDcvyf3w8DCGh4ePOnXZsmVwHAeHDh0qnD906BBWrlw5afx//Md/4KmnnsK73vUue87U6LquiyeeeAK//uu/Pr1tT2vUIsaxLMKZWIwL4do9US3bWYPlkhBKN28JAM1mojlzJaq7LkcUJjjSiNBo0msUaj7dJvHupgll7sYRWbJJLCxnb7MVI0kE6s0YY80IzWv3oN6M8MJERAlIbeIAPtKIIKXCWDNCElND8norxtjHbsy5RTPFoWRmPWaWKbOKz7hDTYzVoBs375SkBzluXpMZnKcuNCUymcLNlLKC4etlhT3nE506uXnNegbGYi6umV03FI6FFN/pgHUkH/Ug977v49xzz8VDDz2U7VNKPPTQQ1izZs2k8WeeeSZ+9rOf4cCBA/b4oz/6I7z97W/HgQMHsHr16mnfu+8t02MpuOkqwPw48/54JvGUlm138FxqvGIOStu0xNBQgIHBAK7LEe36DISQ8HwHnHMMSmk7wZyCCoLA1SQMDKxKNZecM7iSusm87M6PIdxxB5YMVQAArudgdLiCoVSiUvWsm3PZaAWcM5wyXIVfIYvY0R1mulH15TulmAQoulZ8Ne+7GW9mjON2t+xYzkXMpqA2NPHLzmsm8ajbekezJPO8vXm3r1nTWKXdnmO64B3lML3K/YYNG/DBD34Qb3jDG/CmN70Jd9xxB5rNJi655BIAwMUXX4yXv/zl2Lt3LyqVCl7zmtcU5o+OjgLApPPHQt8r0+lgpkpxtm7hErOHxzwwRi4fxUSpTEvYHqY23sh0OQlnkFLHGhnFCB2HWzcqKSVDek9WXLTjk7rFGi3l6HZsUrctkyqLNzLGbB9VxRWqe7ch2XYTbeEoyrG7kiu+P7rCmUKZsu7vi2OmUtTTO9dtvW7vzfypFHovyMs80LvcX3TRRXjhhRewfft2HDx4EGeffTb27dtnk5KeeeaZrl8mZouTQpnORulNpTRLRdodc/0lw2EOGKP/pqp085aAJhoQWXauFDozFkyXnHBIrvl2FQOTgCFMAABw/Z6rXFNsE7+ktYVQcLgmRLDMRg6EUGCMxrauuwFSKYg4hcNJaVsmJKGQKgU/cCGFAneQtS0zSUJglpnJuH/TVBBTkiCSBDuuEIek5zEkDMSQxHWWL21AaTIG16XMXcmBJJbwdeP0KEpRqXiI47RrXFUIaetZ01SAc0pQMlZ2vgwnTYnpKQpT29sVID7fJBE2Bjld5GUemJncr1+/HuvXr+967eGHHz7q3Pvuu6/n+wEniTKdDUqlOX3Mh7XudLh5S5ToZNlhjJShq//IS6XgIItFGl5cISUpPAFdUsM0+1C+h2euJyeyZBxD4q4UKUOr1FRGgCAlUfQZReS4jqXwY5oNyGT4GgpAKlGhRKA4FvB9F3GcUuatUvqLgi6lEcq6Yj3PQZqkcD0HUlI82PW4VuZKt5VzkCQCjNMezd6ikNaPoxR+QCqAX78TiMaQ7LqdFLEh4k8FPN9BEmevFB01X2gkHJchSQT8wIWSCnGc2pixH7hot3v79Tpd3Lz9gL5PQDqeKJOEjo6jNWef6WfnMAeuPpw+EaoS84t2mBCDUSqRphKVHZeh3UoQtlO0mpr1KBFoNWOkiYC3+xrb7cR0OTFdTaJ2So3D25TUJFKFdivGRCO2TEkilWg1Y7p3K0Ga0Py2Tl4iCzkrK2GMWUXs6vit6zo2vpovieFOlg1rlLJ5BWBbxDkOh+uR1ZcvnzGJReT25nBc3sFexHL0gMoSViil4HrZfcTWHYh33qYZnFhhPSCLj3KHSm5cl57LxKpdXYbDOFC55QZ4PrdkEb1WtOVlvp/kvmdl+r3vfQ/vete7sGrVKjDG8OCDDxauK6Wwfft2vOxlL0O1WsXatWvxb//2b4Uxhw8fxvvf/34MDw9jdHQUH/rQh9BoNGb1IEDxD/Z8KL7SSp0+5qp0yGNe4Shx/LHYZN7RyojrOOnE1k9b0oKsn2mWeBNuvdnGVKmfKcPQ3qvt+3w/U8aRNRnP9Sw1taSFpuSFxJ6MMMG4ZoE8/Z9uKL73hgJ7kSFAMG5eM8dcM89p33OWXeeYdN4c+X3l75V9DkWii/znY/aav9ekPXW5H9PlQXLrDjs/n7A0XXTKfL/Ifc/KtNls4nWvex3uuuuurtdvueUWfOpTn8Ldd9+NH/3oRxgYGMC6desQhqEd8/73vx+PPfYYvvWtb+HrX/86vve97+HDH/7wzJ9Co1tGLlBalP0MhzlwmKuP/viGeqJhscn86k/vptifw+G4ZB1Vax6CiotTPrEJnu/A9TgqVY+4azmHo61Dw0Ub7bgDrssRBC5cl6NSdVGpeHAc4rCt1ny4nmNrVitVD4wxVCqe7ZYSVFxba8kYikqrQ1EZmKbZxUSeY2TQ8u7XjpYMlF+7WxPzmSYK5YfwSfuaAXVgFxRlvn/kvueY6Tve8Q684x3v6HpNKYU77rgDW7duxbvf/W4AwN/8zd9gxYoVePDBB/He974Xjz/+OPbt24d//dd/xRve8AYAwJ133okLLrgAt956K1atWjXtvYy873yof/ph4Vy3uN10raIyQ3cyFvozcZgDroWp7BqzMFhMMg8ASJpIEglDJZim5HZ1XIUjV9+ENJFwHI44TsG5B1PqmOpWY9DNwpViukWYgzgWgIKN/9EaOpaq1/J1zNAQLiSJ0FatZguSyBKNBCXnWMo/3QrNWKwKyiYaMZ7ns83cvoabl+pMi/Wohr7PcZntzmLeZ31WMypB98ZdSK7bZj+zfOKTsahFKm0ZTp4NiepYKV5ruIahKAZt+ChMEhfnbBInY6/NwfMyT/fvD7mf05jpk08+iYMHD2Lt2rX23MjICM477zxLMrx//36Mjo5aoQKAtWvXgnOOH/3oR13XjaII9Xq9cADA+N9/c9LY2fzhz9eX5nEyW7bTpVM81vmZwuNe4SixuDBfMg9MLfcIJ5AmQmfdSqSJRDtKiWQhTC1JQxhSXFVoDlyR0lgllR6jEEfCJuWEUQopFVEUholW0tlaABBGqb1nFKao7boi53bNEyaQ69i4nfNxRkMBaCj/CJmLerKrOlvLHIwxTTeo46Ru7r3uNpO3SMWW7faaoQ/MjzM9Vw2xg5eLz5r9G/evd9ON2Rou19eKz5Q/enbzdsh8v8j9nCpTQyR8NJLhgwcPYvny5YXrruti6dKlUxIR7927t0Bw3AsrRS8wimAuqQL5u9+66JXxXHIWz7UVy+HC0Qcvk88XHeZL5oGp5X78pnsxNBLAD8gdW615WLFiEEuXDWD5ikEMDgeoVF0sXzGIgUEfvm6FNjgc6GseBocDVGselpxSw8AnbsGKz9+B5SsG4XCOZcsH8YqXj2BwKMDAENEKrlg5BMflWL5iEJ7vYHA4wLLlg5B778aRl1qIwhRpKtBsxAjbKcJWCn7Ze8iC1WTycZRi7HAbY4fbCNspmo0I9fHQKn8AmKiHEKlEo07X+HWXQklYknmRUiJVGCbwtvw5jrzUwkQ9tAorjlLEcYpmI8bY4TYYA+KI9vUfTx9BYyKCUgovvtAEALz4fANjh9tklTocYZhACoVGPUIYJlBKoT4eIgpp72kqkFy3mbJ7dQLTRJ3c+c8daiDVZPoA0GzEePo/x+zep4u8zPeT3PdFNu+mTZsKBMfPPvvstOb1qiTmw50pv/Yvi76x+GJ2bbsdmX0lTh5MJff5ukUhqJ2YqWeUUsHdsw0AlZsYF6nrcj1G2VeRUuNwsXkLkms3Qwhyc0opdVNxpWs3VZYBLMj9S2vTmMHhAL7vQkqFao04goOKi/jOf8BEPUJtx5+j1YrRmIhQqXrwfLI2qzUdf9XlMvXxEAODPlqtGMOf3IvBwQDN7Z/RDctT1DVxfxRSCc3YpjsxOBTAcTjGj4SW+jCJBVyXY2gk0LWfHLUBD6e9bBiuy1EfC7F0aQ318RCjS6sYGgkghMSRwy1wxpCk1ANWSYVmI8bAoI8kFhgaDpDEAmE7QRgmqI+HGD/SBuccrWaMFacOQCqFxkSE8SNtKKmwYtlAz27eTpnvF7mfU2VqiISPRjK8cuXKSR3P0zTF4cOHuxIRA9S3zpAcT4fs2GCxKYmjKcxue+0Hq3a+4XIXLvf00R/fUE8mzJfMA1PLfT4D1lLb5VyW6dbdALJMWoDimcFN15PL0rgkeebWNB1aqD5yciarOajlGKzLk3NGSlZKMDDbiFwIibCdwvMcTGz7LCU/6X6rQlAs1IxVUqFy41Ydk5VwXY5w41ar9E05jU26ckzsEohjGmOYmcy+qBl6RgCRJhLNRmzHUq2pgygk5csYQxC49tkMa9TwxzdTKzmHIdbxYuP+9X0HfqDLbFyOdisBA7mI/cABGBC20p6Tkooy3z9yP6fK9IwzzsDKlSsLJMP1eh0/+tGPLMnwmjVrMDY2hkcffdSO+fa3vw0pJc4777y53M6iQ6/KPW/VHiuOe6IqXZe5haPE4sJCyLwlVldZ95XOMo9OcnWpFOS2nQCQa4HWSQHIIC15w+TsVxPfVB0JNkYpcs5Q2X01AOh4bIpK1bXKZeT2ndZK45xBpJnlG2+9AUHFRZpK+AG9ponuM+oym53seZSRTPfjumcpWbkmi9n1sl6irset4m6GCQCgUiXmo0rVQxILqyyrNQ9M17RSzJRB7LoVIpVwPW6ZjvyAvhgEFddmOfuBiyhMwTmz5x2HI4zTKbORp0KnzPeL3Pe8y0ajgX//93+3Pz/55JM4cOAAli5ditNOOw1XXnkl9uzZg1e96lU444wzsG3bNqxatQoXXnghAODVr341/uAP/gCXXnop7r77biRJgvXr1+O9731v71l9JxGOFcddbFb4XMHJF233ibvnRMNilHljlZIi5ZOaWueVISXG8Fx7M8N0lOvyohWkIUTId2AxPxvlnW+pBgADgz5MJ5h09+1QCvA8IKg4lrVIKYVo8w02m9bUqgphSBiIUahaI3dxpeoW+oICKMQeXdcBAwOrOFZZmlpbBlawGv3AAWPAqV5N31NiaKQCkUoMDvs2YSpNpSVaMCVFUihL+F8b8G0zc6YpExVofSEkRpdWYfqvKii4HsfSpVU0m73VEzudRA19Ivc9W6aPPPIIzjnnHJxzzjkAiKH/nHPOwfbt2wEAGzduxBVXXIEPf/jDeOMb34hGo4F9+/ahUqnYNf7u7/4OZ555Jn7/938fF1xwAX77t38bn/vc5+bokUoAJ46l6jIOj9Phls3BFwT9IfOZRWlpBDsUYWZQdo/hHZ3EPbN2O5tdk6tWv+pSFnN4u6+l+KtQSNMsA1lqV69t/C0p/kvJRsq2VJNCwbt+i50nJB3EzSvh78muURxYwbv+Otss3OzD7E9KZeOh5n5GQQptYZt4srmX4RQ2nMhCSohUZ1KnEsH1G+l5zFyRXafn7DVmmsl8P8k9U70+6SJAvV7HyMgIxg+9NO34ab9jIeo95/qe9XodIytOwfj4+DF/b+Z3vOaWf4ZbHQAApO0m9m98x7Tmlzjx0E3ujXuVEoN44VwnzBjjrsyPyzflnqqUw8zrti5jDO7uTYA3iPjaTTZ22WzE1mIWQqJS8Wxikx9k/LhpKhCFghKQmrG1ApOE+qUomVmfALlq260EQcVBmkjEkdAWIq3tuOSqjaMUlZt3Q27fDaUodhpFqb5PgtoAuWmThBKLjBVKSUzE+1upegjb5LKOwjRHT0h8xYaeMKi4RLWoY72Ow+EHDsbGxrHsFcuPKbfdZB7oH7nvD5V/EqLTspyK0Wm+LNCFJmswcDgrHCVKdEIp1WFsTrYP8mOOZaFOmmffH22MQvu6PRCbt0BJwN2zHVIqDF3/F5BCYXDPFTa2arKA+Z7rrQVJlqO01qhRVkWrkpKXTNzVWrLGMlXZmLxVGm3aYbl5iVBCFl7NHkSqclZqzqpVZm/ZPkynHiFlbpyy+ydLWdrzvaBT5vtF7ktlugjQTSEeTZFNRZs4l1gMihQAXM4KR4kSAMD3XG8Tj4j9J/tTxhgrlGMY96QZY+oj8z0tjTVq3K4GeT1g5+3eXhgTaXII1+W6qwrQ2rgDzUYEDJ+OoOoiveGzGBoOyMWqKAmqffUmAFl5z9BwBc72j6E26CGKUkQ6Ycj1OIKKg6HhCqo1F0HFtclFYUjZsiNLqqjd/nFK/qm4gEJmaerM3rHDbSgFjIxW0ZiIMTxSQauZIAoTuC7H6NIqETb4HH6FkpkGBgPEUYqg4iIKEwSmtnfAw9BwBSOjVTAG1AZ8TIxH4A7D4HCAkdEqPM9BYyKC02Pv0E6Z7xe5P+mV6WKILS72OtSFRD9+Qy0xv5BSIt28Vb8nt2yaClsfqpTJks3ec4dlcUWRWVNmjLGkuFOsMwVQuC6lhNi2q2BhVms+KVrtunVcaiY+NFxBeM11RL2XkuVXqboIAhcOJw5g4gqmBKEkFpDX307jKl62rrYIE10Go5SyDEW1Ac+6c5ON15HrVSf/1AZ8m4kbVFwsXTYA1+OIoxRDwwHiOMXgUIBqzQdAXwpMlxlDsJ8kQrt+gWrNp/6tOhYax8Q65XkO0lRgeLRCLuNYII4oi3dktDpVb/MpUVqmfYpeeHvnEr2st1hcrgsBhzG4+nDmgkW7RN+jM1NXKZVR7PGsebXJxjXuyawOs7PbSfY+q+s0dab5n7kdk++wEmnqQQCa2EEhTQSajQi+71InGpfalMWRsDHFONZ0h3qu55NSdFyuqRETuqbpBKndGd0zTQWUVAjbRG9ISpzbDjMiVQjbCRyXI02J9GH8SNuObTVj+D69hu0EAJW0mOc3/L2eRzWpnDGE7QTc0BA69IXBD1wIQX1cGxMRoOg5/ICs40Y96vn3m5f5fpL7k16ZThdzpcwMEcNUJA3zee+j7WmxwnV44ShRIk8Cn4/5Fctc8u7arMl2dr1YdmLWpYbX2bm8m9eQvJt1zLiwndrEmzSlXqpxJNBuJUhiYYkRwjC1fVPjmOaEYQIhKSs2SQTiWMDdeTW9j2iOoRA0BPxJTJZhu50Qp3A7Bd+x0TIlJbFAHKe2F2sS0zHejBGHAnzndbQ3nXRk+InNnkQq7d6TRNj14oj2Z/rCmmthW1MpthIkaXY+ClPUm1HPdIKdMt8vct8fu1yEmKkCOhq94GyV5mz2tFjhMPqmSsdC76bEYkCeTlApgDOWK03JJwyZn5kmasgUar6MxSbOSKljsJkbuHOdbEzmIrat3nQDb0NsMDDog3HA87huEK5bvWkiB89zrMu3ctNOcMYwfOs2RNtuIVKEgFzChp2JG6Ymh2kGIlrLrziItu61WbyOQ1ZspeIBDBQD9R2MDgVk/W69AbUBX5M9+AgqboGknnMiYXBdB5wxYldyyVXsuhkZP2NUL+tXqOn50KBPVisjBiXPdzAyFFiSjOmiKPP9I/elMp0hjqd7eLprnIg9XPsxdlJifpHvzAIApgwx3yUlG5P1GjWxwKwkRhVcvYyZxt98khuYLFKZ0Q/m3L5mfanLUoxC55wjCsmaIyszgVJZ9i3jOubLgei6XQjDFNHWvYgjYe8vdU0nWbFkdaYJzTUuYJEqRMY6jrPSFGJZkpYkwnWJuCJsp+AOQxTm7iPILWzqT40LOtYMRklM98xbqlEoELZSiJTiuYa6MIrIWk4SYdfuBWXM9CRCL4pqLqy+mSjJXtzIixkeZ4VjJrjrrrtw+umno1Kp4LzzzsOPf/zjKcfed999HX+IWYF8oMTiQNb/M1NImVXKJlmoIue+zffpzIMxpvuQAs6NN9i5BmZe3jIGMjcvAN2yjepDm40IQ7fuAOcMnmfqPkkZSknxVYqZ0j38gK57HsVWozC1lIO1m7dZ/l3H0RzAitrFSSnhV5ysTZpDMdN2O9F1tVSHemQ8hBASQeCi1YjhBw7aLSKtBwPFTA3zk84aMnFcig2nth2bqSGlOKskDmIdHzVWNQDUJ+Kef7edMj9TuT/eKJXpNHC0ms/OcdNRWLNRanPRr7WfwFn27ZTPIBHhy1/+MjZs2IAdO3bgJz/5CV73utdh3bp1k4jX8xgeHsZzzz1nj6effno2j1BijpEnup98HphcP1oca/Rjt/JHS7CweUvh5wKzUkd6KufMZqwynlEdcs4Rbrqe3Mk6tss4sHTvn9s19aPQfqQC51mGMuPZtXDTHijjmla6ybjKlfRYF7fS53VyFpTdj8uzsYwzfT9mE46sW1v/M27xPJkFETXAEjZYt7lSllDCnleYkVWZl/mZyv1C4IRXpnNhjU1XCU233Zr82r/0pZW4ECjGTnoXqttvvx2XXnopLrnkEpx11lm4++67UavVcO+99045hzGGlStX2qOzV2eJhYWpLzV/3B2HT4qXuntvtO85Z3BdByoXL9Ur5daEzQrulqCUT3TqJLwfGPIpa5cBlYqXlaJ89jbEkQCgUNt1BYSQqNY8tHb/tY6fevB915bVxLFAtebbcbWBrBer6QIjJRE1GFL7wSGfrMdQaNIF2NKZwSGqa/V9l3q+rhyC5zuIohSjS6qII4GhkQCDQwEAXRrDuVaC3Lp3qzVqzj0w6MPQGEopEeskI893kCYCS5cNWFdwFJEr+ZRltSkZpaZCp8yX2byLBIvVGlus+1ps8BxWOACiHcsfUdQ9/T6OYzz66KNYu3atPcc5x9q1a7F///4p79loNPDKV74Sq1evxrvf/W489thjc/tQJWaFYgausQI74ptbtk524/Kp3bxmHXM+f5hz+Zhs53yAalkzgnwg3bSFlJ7roL3j0/B9B5W9O2wSUb7bDbmCTTszJ3Nj8yzhyPPJleu4NMe0g3M410lClORk3L2mHAjMfBmg5Clf0/8RDWBGv+j7rnUTG6J7T3edoXirLvHxOLWU091wHM4t9aD54uL7DlyXFHM3asejoVPmvT7JQDrhleliwEzbpfVai3oiots31NWrV2NkZMQee/fu7Tr3xRdfhBBikmW5YsUKHDx4sOuc3/zN38S9996Lr33ta/jbv/1bSCnxlre8Bf/5n/85tw9WYsaIIyILSFMq6aCG2XQubGclHWE7oVIVXcqRpgJ81xZq9J1k5SAiJb7aMKRykShMbelIrMtLwjAhVqGQylrMuDTV90nIMjTlK1GYotWMbTeW6o3XQkqgftV2mpdL5EkSIsCv3rgJcSSgQFaou/1KqltNlXXXKglU9mxCmtLcsJ0i1qxLACzdoNkffV6UADU+FhJDEwMaE7S3diumuKsqUhSaz6eydyt9RkLHZwW5b5XSrmBtUQPARD2yMV7i+5Wo10NNzD99lJZpiSkx03ZpvViv0+172m/oRiv27LPPYnx83B6bNm2as/utWbMGF198Mc4++2z87u/+Lr761a/i1FNPxV/91V/N2T1KzA7UszNrhu37VMbhGksplyBjGlm7nm4cvm0PlYBokgfXdcAd3dBaW5Gen811PUcTFDiQSsH3Hcs+5Pm0NpXGOFQm4msGpMDF4FBgieob1+6l5J+KS2McDj/ISmTAgImNeyihRxBpvLj+Drget0lWJku3telGel6Xo1qjchWjkAGgtucaOC5HteYhuP46eD65nZcsrcF1HaSxtHurDfjWjZskgmKpyNrPNTfu1slExN4EZApbpBKpbmYuhMTwSIWapScSiW4kPjxS6dnN2690gv3RdfUkwmzZjk60PqceY/BN3Eq/Dg8PT6t7xLJly+A4Dg4dOlQ4f+jQIaxcuXJ69/c8nHPOOYV+niUWFqbG0/QQVUpaN6aSWakM8fEW5xp6QRPvtHWjWhFxJ0vmMfFT08jbZMlynRgkcwlDnJuyGwmms4nTVMD3Xev6NV1tGKckpjwJhKntFELq5t/6WUy5DhjFM1n2GXDO7dxAMyAxphDtuA2MUelMsv1mS4CfpnQ/v+JA6Fiq6XjDOUOl4lKyD2PwPHJbO7q7jutSb1bjNjYMSQA9C+PMluyYPqoA7aHXBKK8zAOZ3C92nNSW6WK02mZavzqTZ1mMz9+J2XxD9X0f5557Lh566CF7TkqJhx56CGvWrJnWGkII/OxnP8PLXvaynu5dYv7gusYqNfWgXNP1OZpyj85n70n7WbIBdFimnCxXzyfyAbJSXWvVGio/Q5VnY5jaQoUCvBt2FjJbAUpqMq7oNJWWW9d0ZAFgXaCmPRpAbmH3ht20lsj6iKYpcQYLQeNs1xgpkSTEihTs/liBV7jTxapk/j7aPayKlq99r+8J3XzcrEfPo93asbT9S2l9IE2kZVIy2cc9/X771DI9qZXpQlhtc6XA5sIC7QerNc/R6c7gG+qGDRtwzz334Itf/CIef/xxXHbZZWg2m7jkkksAABdffHHBTbx7925885vfxK9+9Sv85Cc/wZ/+6Z/i6aefxp/92Z/N2TOVmBtk2bbKWn1AVs6SH0cEDTTGZOPmE2OmKqvJ64HOLF4DISTizTvgONz2E5WS+HkrVQ+e72Dg9htRrXnkQuVk9bm7txB7k7Z+K1VXu4IdRNdus8QOrk76qVRd+D65o5UkMvtgz0Zwzojw3ncAfxCeR18K0lTaTjcipZgnYwzVmoc0pb2lidR9UokY39SR+gG5kYPAhZASvu/Y9Qwnb6XqojbgkRs8cBDHAtyh56jWPLiuY4kbekGnzM9E7hcCJ7UynU/0wrN7olqVcwGPM/j6mEnx9kUXXYRbb70V27dvx9lnn40DBw5g3759NinpmWeewXPPPWfHHzlyBJdeeile/epX44ILLkC9XscPfvADnHXWWXP2TCVmB9MZhtiEyGKKo/9/e/8eJVd1ngnjz97nWtU3SQhJlhExWcmMzdgxE66yJ04yw4cmJpmQkG85Xk7gx8fYy7bEGARCV3QFtQTYxjYOJJ7YODPD4Hg+Y08YwjKDjbMSy/GAzbcMtlkziR2RGHGTuqu7qs5t7/374917n3Oqq6Wuvqi7pPOwiu4+Z5999qnW7rfe933e5820h2Q6x6DkoZkG2EZgnpSF8p6b5jqA2XlInCHPD5KIPY0pdp/xPPJus1TmrFdOudSJRoyolQHNn6HRiKz0ocgk5N5RhNoYikxhcoKE8VuTKRnPe0ahJHQJisDkRIyoTaQjR7d7S/fcAykUxk9EiNopJjbv1g28lW6bRiQkz6dSGaUUGuMRgpDWFoQu/IC6voydaNvuNEbBqNVM4HkOoiiFHziWnNVupphoxGiMRaQT3KJG4yKTaE4kaIxHVOpT8+zvaKYo7vnZ7vvFAFO9dm5dAjAd2cdfeWNJd14vYq650JNd3+3cUug007mGRqOBkdXnYHx8/JS/N/M73vXIdxDWBwEAUWsSd/7+FTO6vsKZh+K+HxoasseL8n2AET3Ivc1cW5fGCCFtbarxmoyXayQDDYpjul0HEMPXdfPjRf1fw3w1nqLjMEgJW8aSJoLIRoIMtuNy+9U02uYOQ3jndrS2HwQY5ShdjyNqZ/q+ZKxcz0Gw71a0dt2j85g0VmnZxCQmz1HJvH7W5GRN6zTXozB4HGVwffqeutRIOK7OLWtWcTH3bLxyx6XnJ2EHet+jqIWV61adct922/NA/+z7yjM9TTiZYZuJl9mLIT3V/U4X5mMN/RjuqbDwKLZX45xDlZyfqd1gimO6iTYUxxZRNJqWpNThKXk676okdG9SyqmGoYdEl7aYrjKGgQyVj+VaKCFJBPUGTaVl+TLtyTa33WXnMkYdum8pY6SzKzKJiW2HqTxFM4uFyGs/6wM+OCOjGoQukkTADxxLkopj8mKF9tZNiYzrcSsZaL34TFrNYVMGE9ao7ZrpZ6oU9WVVXd7nk6EK855hOJ39SxdDIrBfwsR+R8inQgVTR0qMV6VrLoX9I24Mjgn92qbe0pBilA7jKltPaWo+TZgzLrQ+M3NRTWUeTqYaUGkZtrVDuyxb2Hikrss1K5YIS4wzOA6zBtkKPejuMgCsVwoY8X7y/Fwt2OA4HPyuO4kYdXA/GUvdmcZxaEynDjGgPWQ91qzNHOec6Q8FxBqm8iJmx5icdH6PcsmR4+Y9ZCnH61jmb6+lMZ17fjb7vhc97s997nP4lV/5FSxfvhzLly/HlVdeedLx06EyptNgvj27U+n5TmfczPHi+dMpkbjY6Mfi7QoLC2p3RqK2hhQU1lzLyKUSEcoTGiMghNI1oJqF6+YqPkZdyHhersdtvarxMs15o1JklIAcl2NyIqYuKjvu0r09qcPLiTdaqA/4dr4gcNFupogiMtp818fyLjBgGPjk3WgWBOibE4kl9TguEYQ8j4hB0ZZtkFJh7KZtSFOJgUG/xEDOUonGeATPd5AmEq1mgn96eQJpQrWlY8fbqA/4GD8RYXIiBmMMg8MBrcvJtYzDmodWMwF3GCYnYqu2NHDPXgwM+hgYDMgrDT288VoTALV1Gxj0oRTwmj7WC+Yq2tCrHvfTTz+N97///fjmN7+JI0eOYN26dbjqqqvwT//0Tz3dt8qZVjhtmE3O9N7/9xnUBih/0m5O4rZrL1nyuZMKC4NuOdNueU7zJ61TV7fI+J0OJ8uZTjcmaqc23GrytVKXoNQHfIhMkhiCUlbEwZTUGMPMGIWrkyQjYYVMQEmgNroD2Z5DMKU9FKJWtiSmKAUI5G3ZTDlNELp0TwW02ylqml3caiaoD/hot9JCGRGza80yYT3UJM5s9xnznEV2dJJk8H0XzckYYc2z73OaCsTtDKloY8Xac2ecMy3ueaD3fX/55Zfj0ksvxf33329/X+vWrcNNN92Ebdu2nfJ6IQSWL1+O+++/H9ddd90pxxtUnulpRL+EVpcSqjBvhW7o1M3t9Amm5kzzMSfzH6a2Zcu/7zTSBvV79hXCsXk9qx84lslqyDiuDo9yRqFR7jB4o3fBsIhNz9Hw8J1wPY70jkMAAPeufSUWM9M6wSY0a8LWBib0a4yt4zLUah6NFdKuzdeC+QC0IQVszpmRITLevxmnlDbmuubViFX4AYn9m+OMUVu3XgNK04V5Z6LJPVs97iJarRbSNMWKFSt6WndlTOeAXo3jXEOrszXG82nET/cHgn4kIlRYWBhhAat6pKB7hCpb6pKfy5m8xhhlqc6binxs/j065slF4rOCwSp2kUl37AfA4O7danuienftheNwtJsp2u3Uhm1tmU0mqJwmk5C77oDIJNrNFJxztFspxK491vC5e7egddtOtJu5BrFh54IB/r4tmJzUoWatW2zUipIk0zlRCksLSaUrnHMbvjXGeHIitkIMRuO43aJ7RZG5J5XmtNtUHuNtv9FqEbsuhZfNs5rm40bwYaaYjoA0E03u2ehxd2Lr1q1Yu3ZtySDPBJUxnQMWKu84XX50tvebz3We7lyry8qvChW04p35CdClH3nnGDOOlUK9thMMz3uJmmvM9flcvNRdhnNux5u5zLWGxNTacVCrEilEW3cjjjMrbcgYw/KDH0aakDqQIU6RGpLUYg4MfO92W0Zj5m3vOExz8PzZDLEqTQUmth6iNTMjr0gh4CTJwBnTSkYCrWaq5RBZySCnKYnrc6dc1kNGGFoxiULUxJ6m93/40C1o7HrQNl6P2pk+n3fFabfTbqTpk6Jzz5t9v5Ca3AaHDh3CI488gkcffRRhGPZ0bU/GdHR0FJdeeimGhoawatUqXHPNNXjxxRdLY6IowsaNG3HOOedgcHAQ11577RRt1KNHj+Lqq69GvV7HqlWrsGXLFmRZ1tPCz1R0lrr0C1FooeByBo9zeJz3jazYmYaltu/LLdIojFc0WtQMvLN9Gi8ZWf3dlLmLuVD6eapKUucYP3AQHD5ILFZXk5s8B2HoWcar4zJM7v0cgtBBELpwPRLV9wMqq3E4kark3lE4LrNkp4F79uUMWodh4PAuIlEdPkRKRL5r250xzuB5xPr1XEf3WGWWbDUw6JM4v8sQhERWssL7nFvGMAn7u1Zq0bSRo2Pcsnlbd3yKRP11vrVW92zo2nE4fN9BfcCbUa66iOKeL+57o8ltXkEQTLl2Lnrc9957Lw4dOoSvf/3r+KVf+qWe1gz0aEy/9a1vYePGjfjOd76DJ598Emma4qqrrkKzmTO2brnlFvzFX/wFvvzlL+Nb3/oWfvazn+F3f/d37XkhBK6++mokSYJvf/vb+OIXv4iHHnoIu3fv7nnx/Y5uIdP5Ukg6U+Cw8qvC6cdS3PfFvGcxV9gtL2pCsjOB7NSy7ZJf7ZwrSyXSbTttHtGoIyVJZgUOaC7SuM0y0tE1uUUp83Zmwmjg6nHtrftyUXkGtLcfJK3cbdt06FmgqDAkjTKU9lrBqD5WZBS6pVpZZluxmTIj0+LNCE2YEDljpOFryFPG8wVNA5PrBaPm4sV6X2rbJnrW5u3c873s+9nqcd999904cOAAnnjiCVxyySU9rddgTmze1157DatWrcK3vvUtvOc978H4+DjOPfdcPPzww/i93/s9AMCPf/xjvO1tb8ORI0dwxRVX4C//8i/xm7/5m/jZz35m49oPPvggtm7ditdeew2+75/yvvPN5l0KakHTwRhS+bW/WdLrnAlmw+b9T48/h/oAMTdbzQn84Xsvqti8i4ylsO8XVwGpO5t3igKSMHNSHanpOFNWQCIykGHfcs4gpLQda0zuU2kGL0Ah1vDwfkxs3kX1nfq463HL5mUgr50VwtJJTDKE0AaR81wdiXOGNCGVIwaGOM60aAR0HlgTjZSi0LFWUcqJVcRAdlxeUj8SQiGOe1NAKu55oPd9/6UvfQnXX389/viP/xiXXXYZ7rvvPvz5n/85fvzjH2P16tW47rrr8OY3v9nmXA8fPozdu3fj4YcfxrvfnTsug4ODGBwcnO42UzCnnOn4+DgAWNbTs88+izRNS4nbt771rTj//PMtk+rIkSN4xzveUUoQb9iwAY1GAy+88MJcljNrLBUDNZ2natY3244yC4HT5S1XBKSlh6Ww74thXM45Ol2CbgpIFidxH06mgGSu6xbmLXahcTiFS4PQtZ6uMTCu58DTQgcUEmaW3SulhOc7qN+5xYZ5bYhU5V6zUoDcvR+O7rNKEn7kSRpDanqqmlZynkcKSEb2L6zR2oLAtWU1ph2deW6m28u5HokveL5DreOUIWpJLSFIHyTCmmc/PAhBOeBa3bMh+JlirgpIvepxP/DAA0iSBL/3e7+HN73pTfZ177339rbunkYXIKXEzTffjHe/+914+9vfDgA4duwYfN/HsmXLSmOLTKpjx451ZVqZc90Qx3GJBt1oNGa77CWN+TLqC6UBPF/36AUOZ3D0BneqnOmiY6ns+6L3KTIJ7hQ9zPJ5w84tqvgA3fOhVJ7ilJ7XGE9zndHONWhOJggCF4wz3ZkFEAkJ6g8Nh8i0jKCQDHGbQr+uxxFFqfZeBThjCEIP7VaKdO8nELVTCEGe7MA9+5DuPADXo24xCsq2c2s1U5uvNGQoQ2CKowy1uo8kyZAmAhONGINDAWp1F42xCEMjIZxtH8TEHX9kO72YDjJMp7L9wEXUTilH2kwpP6q9evN+xlGKIPQwdryNweEAQUhmJYkzjB1vg+Vv54xQ3PPm516xadMmbNq0qeu5p59+uvTzT3/6057n74ZZe6YbN27E888/j0ceeWReFnIyjI6OlijR69atW/B7nq04HQzlnq4r5E0qW7r4WAr73rRUM95osYTF5PTM9wTVod0LO08xx2rqJ0vHZT7WhDVl4RqAcqZC5CU2RrQ+iQVMA3PDdUozkiBUuq+pYf+acKvJmWaZ6YCjEO+g3qYlnWAdFjZ9R62nrvOZUlAJEGNA/cAtyDKJyTizDcnjRMAdvQuv3fYpZFrUweoXK8p3Kom8tEUBmc6tGhh2s2EIt7QerzkupUIrybq+9ydDcc/3076flTHdtGkTHnvsMXzzm9/EeeedZ4+vWbMGSZJgbGysNL7IpFqzZk1XppU51w3bt28vUaJfeuml2Sz7rMPJDNhcwrQnkz7spfXcTNCPTYLPVCyVfd9N6zVn6uZfS4ILHeL3Zp4i47d4PP+h8z7MhnuLOVlzsBhu7kq8scZer0oPsV+h8nH0v67oHNf5bPk9gIntn7DrUQpwDt5FHwp27ur40IGSsVQdz6QUEN61w97XPr8Z12WdvZKPgLOkObhSCps2bcKjjz6Kb3zjG7jgggtK5y+++GJ4nldiUr344os4evSoZVKtX78eP/jBD0o6iU8++SSGh4en7RkZBMEUWvRscDazYjuxEOL6xfxuEXMy3IyVXhVOP5bivjd1oCanR4o75t+HQmdO1fOcktcHlJm7xvM04dtOoXjTogzIlYAMhkZCnR9Vuik2R1h3ce6qATTGIiRJhlYzwWQjRm3Agx9QNxijtev5ju0zOjAYoNVKUB/0MTQc2GdLkgyNsQhRlCKOBILA1fcO4LocJ463ELVT6uSSZPA8juFlIeIoIy3dQR9vOW8EnufgxEdvxcpzaW0rVtYxvCwkgtHmD4AzVvKeJycoNJwkAsPLAkxsuRPtVoooStEYjzB2vA3X5WhOJnjT6kEoCUxOxBjXvVHXrho6qeJUN3Tu+X7Z9z3lTDdu3IiHH34YX/va1zA0NGRzHSMjI6jVahgZGcGNN96IzZs3Y8WKFRgeHsZNN92E9evX44orrgAAXHXVVbjwwgvxh3/4h7j77rtx7Ngx7Nq1Cxs3buxaNzQTLLU831LBYjxvt9/FXNbhIBe6drrUBVZYeCy1fW9KXYz3aViwuZdlxAtydq2SyjJbHYeVwramlRuFgxUUg+6AUg7v2h6jknKZQMHIekQ8yjIyuCKjUG99UOchrUHXrGIHWqc3Z/HWBzykiUAYesh0I3NA6/g60EYXOgxLeWIy8AyDg4FVMzLlOEmcwfOppVsqBdqtFEHNRX2QNHnrgx6iNok3eJ6D+NCfAQBch0HqJgG+Tz1Xfd9BEgt4PhGtzPsJUPg3DF20mgnC0EOt7lF5TibRaiV23ExR3PPm535AT57pAw88gPHxcfzar/1aifX0pS99yY755Cc/id/8zd/Etddei/e85z1Ys2YNvvKVr9jzjuPgscceg+M4WL9+Pf7gD/4A1113Hfbv3z/rhzjbjORSQzG8O9+/i34M95xpWIr73qgPKUXKPSIz3mhOQioyU7nDrPdKuURmc40GpI6UKyKZY+ZrmhC5xzB3zTlPM2rTlPqRUq9SbruztCYTTDQiHB9rk9HXkoK+T96s45Ks4PiJCH7gYKJB3V78wLUt4aJ2ivETEVrNBO1WCtc1xo00dt/Qnmm7RS+lSOS+3Uqpt2ngYnhZCCWBE8fbGP7UIYwdbyOseVYM//U3WhBCIo4EWk3qWNPQa2k1UztfcyLB5ESMxliE4Kb/m+QTd9yIwaEAWSbQGItw4ngbUTuzQv+9oF/DvFXXmAozxmzqXIvXzKbO9Mmnf4iBQao5a05O4P/6tQurOtOzFJ11pnmdI1DsYtK9zjQf00udqTkOoOt1AGxXlc46U6W9ThKm1yxgXT/KdflMmgpbZ5plEp7rWKMsVe61KmhvHMaAc8QR1Y1KTX5yvVxYvz66E/GuUQR37UK8406qI02F1vsl79y0WwtH9yDZuR9pIjBw9x7EO+603WtqB7cj2X0IWUoMZiGoXZwpw1FSE5EcZglLQsoS6ajVnsTK82ZeZ1rc80D/7PtKm7fCjHEqQ7oQOWmuafIOZ6U/YBXOXhQNnAnlCpEzbN279nWpM82NXLGTSz5nPrZ4nyLMdZ3/DrlDNZkm9GqYuZ7nIGpnJEAfZWi3Ut2JJe/GYgyrFAr1nf8PHJcjjjNw3ZjbMITTRCJqZVaxiHOONKXwsSmRyVJqkJ4lEu3tB+F5Dia37AMYNRwPQhdSKbRbCVy9Ns9zIHbfCZEpNCcTRNsPIMskkoSUlcZuPaAF8wUJ2SfSCupHrQztFon3JxF9KBBSIm7T8SyjsPDKu/f09Pst7vl+2veVMT3LsJAkrG7Gdq5h334M91RYWJSZqzqUWwjHZju7SxQary4P3Rbn7H6fklGeJndHxxnqozvy+bVnzB1Gure6N2h9dKcWRNBrKISTx/d8DgDgcF4KL1shfoeuM8bFceg+puWbEacwxh0w4fB8rbxAsjJ1s0b833E5wtFd2phxPW/hXvoac95xGVYe/ohdm51fa/dyTmpKr23Z2/V9mw79GuatjOkZjk7juZRUlGYCh7HSq0IFIO9qwlixD6fxJpk9b8aaptdAbhi6Cd1LUfZGi4xfx83DvUW02+QVRjtHSUxBKCSxwEQjQlhzSbjeJ6H48Vv328bfcZRpDV7SyQ1CF1GUwvMdRFGqhRukNnQMYc21QvZpSnOYMbW6pxWTmM0ht5oJXI/bFmkn3mgh3H8LwtDD5ESMsOaiOZmg3UqIXVz3EW2/06of1Q9uhe+7iKPMtobjDnncrkeebvvA5yEEKTc1xiIAgB86qNU8AAzjY+2ef7ede75f9n1lTM9wzDY0O5vc6EKgHynyFRYehoAE5B4WUC5pKX5PY6bWgk6Zt0NVvRz2ze9dRK3mwfUcMM50Nxhuy1GkltUztZhh6CEIXC33R2UxuZyggu+7UKCvQehqfVy6X9HQuy6H63OEoQfPd6j/qmkNxxg8nyOsEavWlN+MLKsh3nsfpFR2bfUBD0HogTNmw9RgNH90x920psAF52TMTZs3CleTspTnUWnP4HCA8NAeKyfouAxDI2HPYdp+LY2pjOlZjpMZzV4M5IIpJ/Hyq0KFbh1jTO0oqRipKflOALYshbqf0Lh8zs6vU+egUpapohHGC05ikhJMM2GF4MfHI0w2Ykw2Yrwx1kaaCsqjRsQMTiJh526Mx2AMmGzEOjTLkCTU7DtqZWg0YjSbCVrNFIwxtCYTSKUQRxneONFG1E7RaiZoNhP4ezeDsdxzNR8o0kTg+FgbjAHj4xGgBfGTJKP1JeTFjjdiRO0MzUmSc6SvDK1miuYkPU9jPMYbYxGiKENzMgHnDBO37sFkI8aJcWIxQ8HW584UnXu+X/Z9nyxzaWGphEAXGnMRYJiv96gfP6FWWFgUjZnxetyC2MJ0dY0mTGu8veK4zn9anflScx3QvS0bAPIqlaLeoozCwSMjIQaHAgwOBzhnWY281tDRDF5pa0ddj2N4OLAenjH2nkfh4bDuYng4wMCAj/qApwUifHvfc5bXENY81AY81Os+4t2fsOLz1PSbmpK7HseKZTUIoTAyEpJHKxU836H16fDt8FCAMHQxMEhrqQ/6UFqUYmAwwOBQgOGRAOcsCxEELgYGfWQZdcAZHA6wfKSGlffthFI0dy+oPNOzCP1S17oQRn+6Zzf3mu96037cVBUWHnnOtFwvavKoRrTBjCXvjP7cWcH7LkL3xRwpP3iwZDjNdZ15VcqZUuuzROdM00RgspEgCF2bZ/QDB3GcIUsoJJvEwvY0ZWAIax7iiBi2cZQhigo5U4fCto5uzk21m8p6nmFN50w1MUgIqetRTc5U4PjxFkRGHWMoZ+rpnCl5uiS2oHLSEqOOOHGUweEc7bbOmfrU8JwEGnwIQTWzwW0fAAAEAYnmt3bdg8Z41PPvtjKmi4SzxUucDU5l+HrFya7rtU3cTMFY+VWhAoV28zZgClSjaQwsGTtVCNXqkpiM2pSZMK/xyvLvpZ6Tfs62bbfC96YRt2nkbZSQisY2S8koCl1byjkj6b12hqidUVhW15Ma4Ygs1c3AhUSrSUSgqJ1az1hkJFifxFpIIc5s0/E4EmCgOZqTiS1ZiSNBLdC00ITpp+o63N6Hc2a/GoH95kRiBfKjdkblOG0KXQd7PgrTEzWO9PM0EzQnYxofpTi+5wu2CXlzMrYh7KxH0YbOPd8v+77vjWm/eIlLCbN9z+ba2m3k/Vf1fl2B0dcvn1ArLCxMPtF+1d9b0hEz40yodqoH2klUKvY8JQPDLavVnDMGku7HSipMxsCqghE3hl0KY4wlpCAv2Rhl20hcKSu+YIyxUooEELThpmvpZfqbkuHP5zT3UvoDhxG3h/2QQN1qlAQGD2zMPyyowhza4CtpPjAAJ7beR/NJswb9LJmyco0rDtxYOE9rlwqz6BpTZvL2y76fdT/TChV6gfza31gFpF5QDPP0y6aqsLAwsoHmq4SCwx17rqi9S8fICLqHDkHu2GFzn0WlIzPWOQmb11zX2ew6DD04LgP3iZHLXK0uxKlkxcgY1gfytmjcIVbswKCv6zldhCF5kkFI1yjF4PuuzvWWhSeUUhgaDq3qkslLUj44b9HmBy6V4iigVvcsQ7jdSiEPfQ5RlIIzYiGHYb5W1zN1plyvyYW3fxuyPYdyGUf9/qUJyRpO3vkQMX718SwTiCOBNMt6+v12hnb7Zd/3vWdaYeFRDO+e7rB6P+ZOKpweFBm3xVynMTidyLZtL40tKyDR9+5dZa3gItcov0f536GyYeQ8R6tAodUkJtWiLBVI4sx6kaQlDG28aO4kpvBtkf0qZLE/aoYsE1ZM34rqCwqzZplAllIIWQqS+zOhaQA2v2wamCdxRoIT+v5RlMI7sJO61MTUOcasJU0Fop0HSTQ/FdSdRod8haBjg6NbIDJlFZ/ShPK6QnT/fUyHKmdaoe8wU8NYDO+e7rA6Z7B5nT4RQqlwGlCU/yN92JyAZM4Xvzd6veaaTphjyfY7Ou80ZYzqMNZkePISHSMSEbdJO9coIXHdVSbTuVt/3xbbTBwgBaIsFeAO5UHTRFqyk1EoMqFlCueS4RVCwXMdcM4tcUhKZZuTmzxos5lASona3fsR6bWR0aPcq+c6iLYfsMZLKVgBf67zr+HBHbk6kst1izjS+n395oP0HA4dHzh4G0ko9ojSnu+jfV8Z07MYc82Bng5wVn5VqABM7RpTNK6l/Clyub3OWtLu85b/JHbT6u0UdqjVPXg+GRjf16INvouBISPakOcNc9EGjmzfvRTG1VKAJiwLBQShgzB04fmONW5GNB8gw+p51DfV9x2bWzX5X9fjqNU8KEmh3yB0sGx5SJq823bbtdUHPYShBzDAO7DNMpYd13Taoe4zjDGEoYd41yiJQ4DZ/K/vk1C/EWgw3ne0++MYHgl79iw793y/7PvKmFaYgpkYyqIhPtX4qjl4hfmECXVSXpHYuUIQ2zZNhSbGUOhRSqnPSSsaT6FH/XMmLVO3NE8i7HVS0lyMkZeWpdKOk5JEDrJUs4pTCSFJKL7VJGlABgbHpVeSZJbckyY0v5En9HwHaSL0OGryLTKZC+f7Wi6QM+vREnNXailBDn/lpccAAHpKSURBVMZpz4hMWcH8NBNw99yGifHYlrG0mgnJFraIAcwYIPYeJkNZsAqeR63eGIcd5zgcwaF9pOV7zyEIIeG6DiYnYijktbFQQLjtOhsGnymqMG+FvsVs9XtnOn5OHnAx3NMvH1ErLChc14Hrahk+zu33ruvA8xwKqeraTs6pLpPGMu155cLwFDrNr7Xz+OZ7Ok+SebC6tGYc59x6mmQ0SdTe88kzTFMBpfOGUpCAgetyLT1INaHGG0xT0580N0iOQ/MqCf3hQOkG5xyOQ5KEJiwsBLU+k0pZuUIpKQSc7r0Xg0OBJRTV6z7SVGD4E3vhBw7cu/YjS6WVCzSi/nz/Lvi+AyWp5tSUI8Xb9sA9sAvxlu1aC1hiYNCnUh39YQQMaI/+Wdew+snQuef7Zd9XxvQswKk8w/lqrVZsEj5f6MdwT4WFRbHGU0oF9849VkIwf5VFG0yZB/3cnYBUlBgszpXfMy9TKSKONQlHe8tpJkiWT5OPkkggiQXa7ZRasbVTK9iQRIKahQuJTHu9Say/au801V5zmpgXectRO0MS0/xmDUmSlcYZD11kJOKQxKJAEBKYuG0f1ZNu3UXr1SSmditFmgi0tuxBmul1JERI8vduRpJkaG7ZQ3KHkUCakUxiqg1pkgjEUYZWK8GKQ927+EyHKsx7lmMpi0fMlTTUef3JxPHnm6DUj+GeCguLYo0nAMjd++1xgyk5U5fjVNFGQxQy3xdrT5nx2FjuSRrU6h55qYxKWYzQ/eBQYHOm5uZB6CIIXJtX9XzHkpRMfhKgr9QlppwzNXBd8pDDmgvX1w3CZZ4zdl0HtboHqbSXG7gYWR7C84kwZHOmAx5qdU+LTUjd/q2cM61//DDlTGsuaQdvvwcANMtYwfU5lFQYGg5KOVPH4RgeDvH6ln09/X6rMO9ZjrNJPOJ0PisrhHqm01ytcHbBeF5G0SiOKA+ZH6c8aqK9NVPioaC0DJ9RQ4LNk1K5R2a/RlFK5SiJ9vjiDI6jhed1LtN8bTfJi2OM6bZqtKbGWITagGcbc9dqHpIoZ/MauUDKx5JRbrdSasXWTtFupaW6z/ogdYjxfArVKgWqFxXUBcbzycC6LhGS+I6PwvcdJIlA1E7xxmtNiIzGmrVNTsRWpH5wMICCysPijKFWd9G85Xa4LoezcyM9S+CSXnAtJ1kFoYux420ri2jqZ8fH2t063Z0UrCPE2y/7/qw3pkvZo+wFp41d28N95mNNxkPoJjxe4eyEMRrcIS/R87k2MuSBubrnpx+48A4fonFusWk1h3f4IJF6dJ7U993cq/RdLcSQ52P9wAWQe56OHmfKQxyX6jVNvtb1uBaxVzYPSaUm5fytabbNwKxIvpIo5WsNIcioESkF/ezMvg+d0oacM0R7Pk0i+nq9Yc2Do8f6AYnye54Dz+O2nKazKbmStGYwINrzaVqn/s+siTs0LghdgOVheMYY/MDtWQ6wc8/3y74/643pmeBR8t9+96yafvdq7GZyn+Kc8/HeMl5+VaggNAPW5DFFRh6nzQ9qqbssE8i2bbMSd0WpvWz7jgKbVxUYwmUmsJHsI4EEZcfQfaVlCxspQKXzs2ZNpsYVRh5QC9vbPK65zgg/aK1hu2YpteSffviCNKAJsxbDv7mWsGEuw65vePcNtqbVtJMz6zEhcLMWq1sMmj+8c6t9z408oSn3kYU5O9vjDe/5f3qWE+zc8/2y7/tkmf2L0+Ex9mK05iLAMJPx854z7UNWX4WFhREvIIk9+hNG3mHuzUGXcBghA6WU9UqNgALn3M5lGMJmnGECm/ysYe66rgMoFK7liNoUZkYhbJxlAhPNhFrDFUQIjCKSEApJostsMjJQjsOt0IIlCWkhfFOSwoiMbI1gHKW2tZrN5TKgvu8mRO0M3uhdFEpOBPDSzyAyCdflaLZSOA5Hq5kiijL7Hkqpa0gLrOEkFmjvOGzHmXy0iQBkGTUVH9f9S41XLaXE/7n5/t5LYyo2b4Vu6AfPd6EN/lzm78dwT4WFhxGil1JpFZ6i+6Ns6YsZ6/uuzZeaLiZFCULjURn93fw+BVLTXpIj7OzPuUz3ElUKqA/4cD0H9bqPNWsGMdGIkSXEjm02EwwOBQhrLhyHYXAogB84FB5VwOREjKHhAFEro36huleo1DWpE42YtG4TQWFoh2FkeQ1+4GD8RISonercsUS0736c8+AngPgEgpBym9mffxN+4MC5/f+H1atpbas/90ksW16DkBLjJyJwTnWpxhtuNRMMjQTIMkHPuf9mRJqVPDkRozEWWa3f89YOAwCaE4ltvXa+PtYLqjBvhb5FNwGGzq/zNX+v6MdNVWFh0a05N+vCcpkyzsoJdpuzu1Zv8edk153dG4ObeY1jWGhUY/OiTl7bygrelvnKOHJP2DKK8zCnybEa0QZzLdOC/46be3GOo9u37diJaNfdtsuNGdvY/Sd2bWLnLn0vmsN44sX5iusEIyH74cO3gnOO5Yf/Q04UYjkj2kYF0Pu+rYzpImA2Lb0qTEW3POd89CedD0PMWVGjsz82VYWFRbEXKZALy+f9SfN2Y7Z9mZR2rAlj0s8mD1hom1ZobZYfU1a+MD8vbW5SlcKjdJ80FTrszAqhT2Xzk5SDzD1k16Wm347DrVQftIAChZppLiIcSQCkdGRUhwyZiXMGKC2ib0pVMqp7VVC6YbiwjcON2P7I3VsBFI0ZhdTNPEJItHfdC8dhaN3xSTguQ2vPH1kGsBHFN9q8jOW52V5Q2vN9tO/72piO/9evL9q9zxQWMLBwoeh5ISD14SfUCgsL00MTUFasweQeRSYLfUGlHQdobVuZ999UEprkQ9dlmjBkGnKbsea8UsqOMSQjJZVVNLJ5Wm0MSDVJiz7oZuamfjPP6ep/25rN67icjJNm/ZqyENMnVf9gWb6Oy+Bwqh0tEn0Yh83vGpH8IHDBuWYNe9x+dRwO/+AeTGy7xxquEptXqzCZnKxdhsmrcjOXY9m8Sn/48HynYvOe6ZirMeyHXOiZgH5k9VVYWHi+UwqJmj/a5mXClabsBWDWkDmuLqnRBtCM8fxcT9bzKY9pCEamNIZpUQZAC81rwYV2K7NGPE2ojjRNSZsXgDV0SipEbd22TNepJkmmWcZkoZI4g5L01SgokXGiZ5e6kXeWCWSJVkFKMnBNTJK6ZVuWSkRtun+m79UYj6z3aLq5tFuU/4y37QNjsDWw5jloTUKTnTIbBVBSYWB0G51PiJjUmkwQHNimQ9wkKzjZiKdtiTcdKjZvn6EyhlMx3QeMxfTC54PV99nPfhZvectbEIYhLr/8cnz3u9896fgvf/nLeOtb34owDPGOd7wDjz/++KzuW+E0QXXmQafLn+a5yOLX8lSdf/iLLdimHAKQh4oZQ8nYmJCtyWM6bh4GRjEkTGK4lMPU7cxMc2+zbFuXqvdBZ1lKsT0beZ9kxE3I1xh6U+ua6bUZwXzGYUOzlNfVuVodUiZxfRrncPogEt9xD9WgAlZQP9o5akPaZFB7rItBxebtS5xJodr5wHQfMMzxxTC2cw33fOlLX8LmzZuxZ88efO9738M73/lObNiwAa+++mrX8d/+9rfx/ve/HzfeeCO+//3v45prrsE111yD559/fq6PUmGekOc580bgpruLCeECeYgW0I2xTY4zy8/Z/KfOUVLeU9r6U3MPY3SEkFbgwFzruo7NTTou0zlODj90EOuG3kkiEEWZJiHBCjQwbSiVoi4vrseRJMKKQTAGXTNLOU/T/NsINbg+/QmPWvqcDlczBlJKykhw3vU46gM+Bke3IGpnCAIXcZxpSUPK5bZbqTbC0tavpomA6zqo799EUoSZLulJyFON2uSVpolEGJJ8YRKTgpSUEkHo9l5n2qdhXqa60tOWNhqNBkZGRjD+yhsYHu6del2hN6GH+bq20WhgZPU5GB8fP+XvzfyOT/zsdTu20Whg+dqVM7re4PLLL8ell16K+++/HwD9IV63bh1uuukmbNu2bcr4973vfWg2m3jsscfssSuuuAIXXXQRHnzwwZk+aoUFQLd9b3p4kvfES8c6IaXS5TQ0tjhuumuKMHqz3eY1Rs/R9ZXQpKE4yqxHK4Si3p/ai3VdB1lGxoqE7sn4JHGmFZdgy3mkIuNmvDTPd5AkGVzXoRZyutbUEKwMozbLqG7VPXQIcscOEqTIBILARRILrQUMW4vq+Q68u3ajffte3SdWwfddJAkZXiPLCJUzoI3usec7VlBDKmXrc8fHx7Fi7bmn3Lfd9rw53uu+Xwy4i72A2cDY/8ZEY5FXsvQx8v6ruhK1VCbQaHR//wxLejqC19h/+stprz0ZzO+rl89vE5MTloQxMTlB83TcOwgCBEEw5dokSfDss89i+/bt9hjnHFdeeSWOHDnS9X5HjhzB5s2bS8c2bNiAr371qzNec4WFQXHfG+NnFXmgrDE1xq1oKG1jb86tUTTG1YzpNMpmLjNGZFIbS1UKPUZRapm6pvYVKKgRKTJwQko4nEEqkBSgy5EmEkHoWOWl1ftHcew/bIfnc02QIi/UqB6ZCLbnOYiiDK5+DgVqtWa8UhPupXdG4fUPfwTHjr2uQ8SK9pQCWINh1ScP4PXbdlv2sWo38cYbJ8gz1oY5SyWFqQWtwRCMzPtq30+HFVSdyODGUav0+zsVinve/NwP6Etj+sYbbwAA1v3CBYu8kv7AyOpzejo+0/OzxcTEBEZGRk46xvd9rFmzBuf/s/LveHBwEOvWrSsd27NnD/bu3Ttljtdffx1CCKxevbp0fPXq1fjxj3/c9b7Hjh3rOv7YsWMnXW+FhcfZsu/XfPJTp/2eK++7v/Tzmzt+ng+cat9Pt+cBYM2aNfB9f97XNJ/oS2O6YsUKAMDRo0dP+Uf5bEaj0cC6devw0ksvLYnwiFIKExMTWLt27SnHhmGIn/zkJ0iSZMocneG4bl5phTMP1b4/NZbangdmvu+n2/MAGdowDBdqifOCvjSmJgwzMjKyZP7BLGUMDw8vmfeplz+CYRjOaQOtXLkSjuPglVdeKR1/5ZVXsGbNmq7XrFmzpqfxFU4fqn0/cyylPQ/MfN/Pdc8vJs5qNm+FMxu+7+Piiy/GU089ZY9JKfHUU09h/fr1Xa9Zv359aTwAPPnkk9OOr1ChQgWgTz3TChVmis2bN+P666/HJZdcgssuuwz33Xcfms0mbrjhBgDAddddhze/+c0YHR0FAHzsYx/Dr/7qr+LjH/84rr76ajzyyCN45pln8Cd/8ieL+RgVKlRY4uhLYxoEAfbs2VPlyk6B6n2iUpfXXnsNu3fvxrFjx3DRRRfhiSeesCSjo0ePltib73rXu/Dwww9j165d2LFjB37xF38RX/3qV/H2t799sR6hgkb17/nUqN6jxUNf1plWqFChQoUKSwlVzrRChQoVKlSYIypjWqFChQoVKswRlTGtUKFChQoV5ojKmFaoUKFChQpzRF8a015bap0pGB0dxaWXXoqhoSGsWrUK11xzDV588cXSmCiKsHHjRpxzzjkYHBzEtddeO0WE4OjRo7j66qtRr9exatUqbNmyBVmWnc5HqVChJ5ytex6o9n3fQPUZHnnkEeX7vvr85z+vXnjhBfXBD35QLVu2TL3yyiuLvbQFx4YNG9QXvvAF9fzzz6vnnntOvfe971Xnn3++mpyctGM+/OEPq3Xr1qmnnnpKPfPMM+qKK65Q73rXu+z5LMvU29/+dnXllVeq73//++rxxx9XK1euVNu3b1+MR6pQ4ZQ4m/e8UtW+7xf0nTG97LLL1MaNG+3PQgi1du1aNTo6uoirWhy8+uqrCoD61re+pZRSamxsTHmep7785S/bMT/60Y8UAHXkyBGllFKPP/644pyrY8eO2TEPPPCAGh4eVnEcn94HqFBhBqj2fBnVvl+a6Kswr2mpdeWVV9pjp2qpdSZjfHwcQC4A/uyzzyJN09L789a3vhXnn3++fX+OHDmCd7zjHaXOKBs2bECj0cALL7xwGldfocKpUe35qaj2/dJEXxnTk7XUOttaZEkpcfPNN+Pd7363Vec5duwYfN/HsmXLSmOL7890LcbMuQoVlhKqPV9Gte+XLvpSTrACsHHjRjz//PP467/+68VeSoUKFU4Tqn2/dNFXnulsWmqdidi0aRMee+wxfPOb38R5551nj69ZswZJkmBsbKw0vvj+TNdizJyrUGEpodrzOap9v7SxqMa0V7r7bFpqnUlQSmHTpk149NFH8Y1vfAMXXFDuSH/xxRfD87zS+/Piiy/i6NGj9v1Zv349fvCDH+DVV1+1Y5588kkMDw/jwgsvPD0PcprwV3/1V/it3/otrF27FowxfPWrXz3lNU8//TR++Zd/GUEQ4Bd+4Rfw0EMPLfg6zyZUe753VPu+T7BYzKfZ0t0feeQRFQSBeuihh9QPf/hD9aEPfUgtW7asxFI7U/GRj3xEjYyMqKefflq9/PLL9tVqteyYD3/4w+r8889X3/jGN9Qzzzyj1q9fr9avX2/PG4r8VVddpZ577jn1xBNPqHPPPfeMpMg//vjjaufOneorX/mKAqAeffTRk47/+7//e1Wv19XmzZvVD3/4Q/WZz3xGOY6jnnjiidOz4DMc1Z6fHap93x9YNGM6F7r7Zz7zGXX++ecr3/fVZZddpr7zne8s5FKXDAB0fX3hC1+wY9rttvroRz+qli9frur1uvqd3/kd9fLLL5fm+elPf6p+4zd+Q9VqNbVy5Up16623qjRNT/PTnF7MxJjefvvt6l/8i39ROva+971PbdiwYQFXdvag2vOzQ7Xv+wOL0oItSRLU63X8t//233DNNdfY49dffz3Gxsbwta99rTQ+jmPEcWx/llLi+PHjOOecc8AYO13LrjBHKKUwMTGBtWvXlnqITocoipAkyZQ5On/nQRCcsn8jYwyPPvpo6d9bJ97znvfgl3/5l3HffffZY1/4whdw880323KECrNDr3seqPb9mYJe9n23PQ9QuD8Mw4Va4rxgUdi8J6O7//jHP54yfnR0FPv27Ttdy6uwwHjppZdKBIpuiKIItZFhIElLxwcHBzE5OVk6tmfPHuzdu3fO65qufKDRaKDdbqNWq835Hmcret3zQLXvzzScat9Pt+cBIkn95Cc/WdIGtS9KY7Zv347Nmzfbn8fHx3H++efjpf/zEwwPDZfGjrz/Koz/1693nafz3MnG9oL5mudMR2OigXW/cAGGhoZOOTZJEtpUv/YvAdehg5nA5NPfx0svvYTh4fz3fiqvtEJ/Yrp9/+zf/ADLR4YR1n0opZDEGRrtDDWPI8okhkIXnu/geCPG8qEArsvBOUMcZVAK+LlPbcc/fGwUns/RnExQH/Ax1oihFLByeYjj4xFaicCqZSFEJnHB/Xfg/7txD85bM4ifvTKJFcMhhJCYbKcYqvsYGg5gAnycc0ipIDIJz6d/t2kq4Lq5R8YYg8gkHH1MCAnGGDgve9tmzizN5yqiNEcmwR1m5zeQUiLLJDzPAWPMRnaK13bOVwxWdkYApJT2WJoI+EFuQrJM4JxPfhxjt20pXTs2Po6f+2c/f8p933XPA0AmcOzp7yNJksqYdqJXuvt0YbzhoeHSH1UAUP/jO9Pet/PcycZ2A//td0N+7W9OOW+v159t6ClEF/hgHv0zVSmJcg8PT/29zwemKx8YHh6uvNI5YjYlLtPt+1XnrsCykRH4gQOpyHANRxlc10GWCQShC8fhqIcpanUPnDMwzpAmAgDQPvjHkELBcTgG6hn8wEEtTAEFDAz5CPwUWSYwMOhDSoXorgfRnIwxMlIDUwFqdQ9KKQzHZExqdQ9SGmNKBksKVTKWjlM2XFJKG/KUUoGx6fdFN8M3dQ7ZNYQqpYKUEq7rTHvtyY51m88Y/SwTpXmllBD7Dkz7oWDG+76w54F83y91LEppzFKmu/Pffve05+ZqCCtDOgtwp/xaQKxfv770bxKg8oHF/jd5JmA+97wxjmAAZwyMMTgOeZ+Ow8H0Mc6Z/Z4x2J/NNYzTMc4YHM7BHQYGBu7k19JX6HlBY+z1NIdByVawaY53G3AqzGho90GMAWzG9zr1uOKzdJt3XlLZnXt+gff9fGHR6kw3b96Mz33uc/jiF7+IH/3oR/jIRz6CZrOJG264YUHudzIjWUQ3gzfTayssABxefvWAyclJPPfcc3juuecAAD/5yU/w3HPP4ejRowAojHjdddfZ8R/+8Ifx93//97j99tvx4x//GH/0R3+EP//zP8ctt9wyb49zNmO+9jwZQf3HXHt0jBdexng69BXaoNQP7STjx2gOBh1a1Ya2+L0xygBDeGgPGW8YQw47rn7oDlrTAvKhpp97hjedqzGf8bzz9CZ07vke9/1iYdFypu973/vw2muvYffu3Th27BguuugiPPHEE1MICvMFYyRnE2qtPMpFhOPQCwBkb8TzZ555Br/+679ufzb5t+uvvx4PPfQQXn75ZWtYAeCCCy7A//gf/wO33HILPvWpT+G8887Df/yP/xEbNmyY+3NUmMc9ry2k+anDC2Tl0yXUR3ci2nlwmlm7e1rx9v0I9nwU2V0P2DHma7T9zh7XXuGUKO55oOd9v1hYlNKYuaLRaGBkZATjr7wxr7mzKqe5sGg0GhhZfQ7Gx8dP+Xszv2P87q+Xc6Zf+eaMrq9w5sH+m9h4A1r774frOlBQEJlCmgo4DoMQCp7nwHEYoihDGLraWwWyTAIgj1JKBYdzJImA53MkkYCCQljzEEcZRCYR1igX6rgMUTvD4JCP5mSCIHQR3rUDjdsOYPjeOyD33V3KCyql6Dpn+nxmMfd4qpzpyfKhxTk6c5UApqyl27UnO9ZtPrPOYi6Yjx5GtvX2rs8xPj6OZWtWnnLfdtvzQP/s+/7wn08TKkO6BNGHuZMKC4vXtx2G6zlwXArHej5HGLrwfRdh6MLzORyXjjkOh+MwcM7huQ7q99xF17gOuMPg+w4ch8MPHASBC8dh9H3NhetyDNx7AOHdd5FRZkyP4UjvOAQ/cJDecQgAbB6183vzcyemetPTG7HpznXOMd21p7r/qeaYbi0l1vD2rdM+R881wX2aM+2L0pi5Yj48zm5zVJ7saYDDc5q8lIu7lgpLAq12gsDP4PnkmWaJRBxn8Dxi8/ra4LVbCWp1H45DudA0kZjcvANJLKCUAncYkljADxy0W8TmrQ/4aLdSpKnA4JCPxi074XockxMxRpbV0JxMENY8XZIjEIQOPDh5+FezeYWQcCixaz24YhBQKcBxGJSEDkkbz5bOma9QsN5xMYbIGEOWCboHAKlUx3w5zP2lUDYvbL1KBZt3Jtaw8TqVJV8BsPNaz1TpOVyag3Eq4XEcnt9fr12IHvdtcc8DfbPvzwpjOh8Gr9sc05GV+sHA9ss6wTXbxHxf4azHyEgNg8OFkpkQqEvflqUAZBzCmlvyijxPlWotASAMPQBA/RP3QGzfTt5n6E5R2gp0PeWyFTV7vD5A58xYEyZVCuDc0cdkoca07CVyziCh7LqVUrpOtVw243Dj8WrLp691Xa6fB+BKz8/z5zdrMjWmjpOHfX3fpfvoMK35cGHn48aj1GuCtGvTjwKXczL8en1+4NrnUNrAuppl3ROKe9783Afoj1WeBswXY3cuBup0sob7wpAC+cbq3GAVzlpE7RRxlCHLBNJUIIkztFsponZKXmVCx42HKTIJISSNTTJkmdRfBaKIxjRvvg3tVgqRSbRbCZqTCdKE5s4ymksp2DmTJLP3yg10vsaiiIP5ahjDReNS/ABQHFs8D21wi3MQyiVA+RhujTbT3iQ/OKp/ptA4Gf6ykESxpCh/lddE5+ke5F3nazK1tsW1zEr2sXPP98m+749VzhMWsoZ0PrAU1rDk4LrlV4UKLK+fNMxd40kxxvLzukTGO3QgH6+vYcX/WOe1+fcmZFnOh5bvPWV5U06wwnEzpts1J3ngbkdnkDM1kDu2T3tt9/lObQRnmqft2aB27vk+2fdnlTGdqbGabw9xqdapLtV1ldCHn1ArLCyaEzGakwmSJIO/52a0JlO8MRZhohHhjbE2WpPkuR4fayNqZ2hu3oE0kWhrzzWOyKuM4wyTEzHiSODEWIQT422kicD4eIRXj7cQtVO0JlMkscAbY21IKXFivE3Xt1OMj0eI21khtEmemZETNB6hlNKelzL/CpDX6Ny13x43x8xXk38t3sPeR+Q/F78vjlFKIcumXl8cbyBF+b6d83SeK85Lzz31PvSsPeY8K8906aJXozHfHuJS9TiX6rpK6MPi7QoLi5//7C74AbFwo92fhOdzDNU8hKGHoZpH51yOdfd9jMpkXO2heg4834Hrmq8cQejC8zgGah4Gah4YY6jVPIzUPYzcu9OOG9LnBmoesX99B7WaB9fnSGIBIRSUJIk9KSWElFRis30blCQykZSKQtCJgBQKWSaQpRLJtl3WIKWpgFL0NU3pPABLPlIK1sBmmUSa0BijxETygXQ+STIATK9LotVMbHlQHJNEXxJTyFpKBcahDTeRiYxxTRMBKRWSJCs9i5UV1GuMIzpvIISk8Hiv/KE+FW3oj1XOEX1hNKZBX3iPCwnHLb8qnPV4ddu9upaUJAA934EfuPar63G4Lkdz759Q+QynUhlXvxyXyDuOw+F5ukRGl8a4LpXJhDUP8R13U5mNw+EHRGbyfReOS/Mt+/gdujQnXwuV4tC85prgnlGbV/R8R5f10DjX4zYXyhizovy0VgeuZ0p7ynlRUxLkejSmmO80a3BdB4zBvh+1umdJS4Eu9TEfLsrzM1qXJiTRGhmNc/J72DV7ZEbCmleSW3QcjrDmWgH+GaNzz/fJvu9rYzry/qumNTZnihHq5w8C8wMOMIde/f3PtcI8oTkZo9VMkSQCSUzkoLHxCM3JGGPjkQ7lCoyNR4ijzJKQoihFFFHYNoro+uZkjCQWaDRijI9HSDOBifEYr59oI25TODhJMoyNR1BSodGIkMQCcTvDq5v2II4ynTtUJQZw0XNLt+4osIxz0lGeW1TW8+zMzZq5uoFYtzlrt3h/YxiVysO33QhBRUITiUeUGdH5Wphdtw0/Zx0C9ir3nM1aDFGpNxT2fB/t+/5Y5TQY/69fn/fylJMZ4TPFQJ8uzMv7VdxUrD+KtyssLLj2Ao0hcDiHZ4QZHC1az5k+VmSp5t7UyOEtYBxwjCfoMCrj0N6h73IwPTdjNBdYXurBCt4ZYXqJwxKpqdv5Lj/TMb32GRKQphV3mOFfeXP5dEIP+my+rs55Z3T9TBbi9OW+72tjOvL+q7oen4s3d7JrF8NL7GcDPi/vF3fLrwpnPX7uk1usoID5o17qGsNhjw0c2l4Qps/HN3d+vEPongy0EbB3OaPxPC8nAYBz7/6IFdovGupOTG8Aux2fg+GZITrvOxdbN/09ejs+LTr3fJ/s+742pnNpyD0fRup0GLqlHuZd8PegDzdVhYXFP9xyDxFtDDtWE2wM8cYcE0KiuW2UCDCKVH0Mk7XEqlXERJWaRCSlQiYVpCTln9rBrXbe125/QI9BBzNXQRUYurJAKBKZpJrYRJOThITQoVdSB6I5soz6rZqvhmgkZF4nKzIJoUlEhk0rhESa6Hn1ecOglVJq0lDOuC2SnAykpDlk8V5C2rWYe5pjWSbg77/djiP2MqCksuQpoX8n04Wpp0VlTJcWThWu7dVIdZtvqRu604EFfw/6MNxTYWHButSZMgbbn9R4hRSCZYXwJQo/65rSQg2omTfvk0rft3YcKnjCKI07lTdmx+n7uQfvmnpef/VHD0CvsPysdo0o174WjpuQq3fogD7PpszVdW350dL7wzru0bkeBobWjkOl9wLmbT3J+zIjVGHepYWlFq6tMEtwp/AJtT82VYUFRkc+cvjgx8qSdQwYGN1aukRBFQwmKxmpYq5PKWMsutxWWwhLFoIh7kirXUu1lroMJhWWKWuYvsm2HUaG144188k79kIICe4w8oRFLstn2bRFtSEGO8awk7Mduy2pSWSStIK155skmR7rQGQSrktaxiKTlvVrntMycl0OIWgeGkfPwgqMY6OEZEpkLJOYk5fde5jX6fBM+2Pfn7HGdL4xEwM8nyHPfs6VzicYc0qvChUyXVsppYTIFN647RNYue39SBOBtj7XuH0U7UTYkCrVdVJtptDfm5CnyBSiRKCdZJBSIk4yTMaZDXdKodBKSBw/SgUGDtyELKNxIlM25GzYrNAMWhP2pXAwQKFgEqVXOoRc1LIF8nAslB6nymHS3PjS/CbUbFi0xlKb+wC5QIMUyhpyE2a2a0dh3gIjN19TxzOiLDxBc0o7v12DDrn3gs49P5t9/9nPfhZvectbEIYhLr/8cnz3u9+d0XWPPPIIGGO45pprer7nGWFMuxmexTBG8+nxVt6zRh+2YqqwsBiPMjTjDAP7NyJLBaJE4P/b+qdoRCnWfeQ30I6pHGasRfq6JneXxBmW7breau6micRElCJLBcbaCcZaKUSmMN5O8cokldVEsbBzKQmMtRK8seUTSOIM420qm3FdB5zl5CXGgfohEnwwMB6x43IE9xxGcGif9VbNeYC8OuP9EalKd2Vheeja6t7qetBiRxrjdXOHPEdjmzmnWllT82nE9z3PKQjm5957kals1uS6vBDGzbV4zTO4Xt4xxgjn+77bO79qji3YvvSlL2Hz5s3Ys2cPvve97+Gd73wnNmzYgFdfffWk1/30pz/Fbbfdhl/5lV/pccF62bO6aolhph1dgLPH4ztjnpN75VeFsx7nDAdYNhigvfcBBKGLoUEfa5fVcc5wiNf/9OsYGvBRq3l407IaQq2I5HkOanUfE6P/CUHoolb34YcOVgyFCGou1ozUsGYkhB84OHckxM+fM4j6gI+hQR9B6GLtsho4Z1gzUkOt5qE+4GPVSA21ulfKWRpd3uSOUZiuMcZQGeOTbduOdMdeG1bO6zxl6Rqbt9RhXSnLhB5b3tmhjtRZs+q43OYxlSZbcad4H9bhHefedHH9eZjbdLhhpbA2Gd28M40R/+89zOvNad9/4hOfwAc/+EHccMMNuPDCC/Hggw+iXq/j85///LTXCCHwgQ98APv27cPP//zP97hgvexZXdXHmA/iUT9gvjzbRX/+PiQiVFh4KBNPpPTglLrOTqEAypmWCURTyTVk3M4Z/Uh3Z6rDeBkIIW0o0+jTmpwpCSXkeUjKryqdx5QlI8a5zk+yYs40X3c+V8HY6TH+oYOWcEVrVDbHWVyPafMmMmqpZnKmgO6v2vFemjUBzI4zHxiMh2wMa5ZKfX3ucRcZwzPGNASkRqNResVxPOXSJEnw7LPP4sorryw9w5VXXokjR45Me8v9+/dj1apVuPHGG3tfr7nPrK/sQ8zGMCyWOP5SwaKHm1lRDeWs+udaYRqMTSaYaJLQfRIJNFsJjo23cWIixrHxCJPNBHGU4ZVGZJWOqLVaipY+12omiOMMY5Mx4ijDa40IrzYipKnA/950H146QUL3w1s/gCQSODYeQQqFVxuRbfn2xkSEqJ2VGmJblSFFIdSiR2rDpw6zYzlnNs+olLJGyCkIUxQF6A1sCFaLTiTbdpQMrwkpm/tzTiFXq76kv7quoz1XZhuCm/mNl2k8TsfN9x9jeWmOmdM8l/GQGWP6PejxF1za8/m+X7duHUZGRuxrdHR0yqWvv/46hBBYvXp16fjq1atx7Nixrrf767/+a/zpn/4pPve5z/W40DL6o4BnnrCQhmHRjc6ZimKYh8/iU26FMw4rhgOMDAWUk1T0Rz7wXTguw7JMwQ9IQ3YtqyOouVZcoT6QGwo/cOE4DCsY6dOuXg5AAcMf34uxm/dg+YCP+oCPyXsehutyrF1eh+MyvGk5zelLMpbLPnEHsr1327IS25vUyZuFGwMJoOCFFmT7OF1bDKfaBtssz1l2wrB6mcnVMlYyuGYukx8thnW59ZRVbnyd/Hpz7+KcnQ3TPdcprdnMWbyu85oZoTO0q/f9Sy+9hOHhYXs4CILOK3vGxMQE/vAP/xCf+9znsHLlyjnN1fcf9U/lEc7GY+z1mn4RgOhLsAIJoQrzVgDQbJom4BLhvv+AOEpxYjJGs5VirBkjalPT7hOTMer7NiFLSYggiTPS6k2E1extthKkqUCjmWC8maB5+z40Wglem4gRxxmiNnm2JyZjSKkw1oyRJTRXo5VgbPOBQli0kFeUufc4hRzEmQ2HmtCyQS/avCho8xpmcLGsxZTImOun0+YtrrlIdOrU5jXzGVD4t1AyBFU6byQcSxTfmYB1kI/0vh8eHi69uhnTlStXwnEcvPLKK6Xjr7zyCtasWTNl/N/93d/hpz/9KX7rt34LruvCdV382Z/9Gf77f//vcF0Xf/d3fzfjZfe9MZ1Om/dk52c650wN3Hx4pZVn2x2cOaVXhQpDQwEGBgP4gYN472dQH/CxclmIocEA54yEqA8QaeickRDR3s/C8x14LnWCCesu/NBBre7B91286X5q57Z8OMSK4RCu52DZUIA1y2sIQyIaBYGLlctCcM5wznANfkhzLR8OENbcDmMDy6Y16DRMxa/m+27OW17r2d2zY4XaWla4R+cc3Tzb4rWdx07mSXbWoBZhjPVU6cLePNPOPd/Lvvd9HxdffDGeeuope0xKiaeeegrr16+fMv6tb30rfvCDH+C5556zr3/37/4dfv3Xfx3PPfcc1q1bN+N7n5Fh3k7DNFvh+8rALT485oExCvkoJlAFeiv4noOBe/ch3bmfDjBdTsIZpMxzjUHgWq1ewBgl7clx8uLi3Z/QJRw0laPbsUlJbcuM2IPv6xZsuo8qOFA7dAfSXUbRaHrj2N3Ilb8/lQHrfrz7953XdjfUMzt2srV00/udzqD3guKeB3rf95s3b8b111+PSy65BJdddhnuu+8+NJtN3HDDDQCA6667Dm9+85sxOjqKMAzx9re/vXT9smXLAGDK8VPhjDSmnZiLUZxLB5oKc4fDHDBG/0xV5ZlWACCkRPv2vbnerNDMWDAoqcAYhwSscg+TgBFMAABw/T1XhabYJn9J4gZCKDhcl4A4hqXrQAgFxmhsa+t+SKUgkoy6y/CCmpFQyJSCH7iQguawbcsKbOKiMhPnDFkm4Dicnknl+Uwj0p+zf2mNsApJXLN8iXmrtBiD6xJzV3IgTSR8nwhHcZwhDD0kSWbzqkQcytnEhq2bZQKcE0HJcYqhaQWA1uy6DuIoo3w1J49VZFr0Qvam2lDc80Dv+/5973sfXnvtNezevRvHjh3DRRddhCeeeMKSko4ePWrXOJ84K4zpXFAZ0pljIT54OAUFlMqYVgBQVtnRRBkhFFz9R14qBQd5LtLo4gopyeAJ6JIaMmZKGRJNXouplMrLb/R9lK6dBCvUc2p5PoAMmes61hA5roMkJgk/ptWADMNXKRI5oBIVpuX+BHzfRZJkxLxVU0X5jZfneQ6yNIPrOZCScriux7WsIRGfPNdBmgowTms0a4sjmj+JM/gBmQB+5wG0bt0Gz3fIEBsh/kzA8x2kSf6VsqM0hjEJx2VIUwE/cKGkQpJlNmfsBy7a7d5+vcU9D8xu32/atAmbNm3qeu7pp58+6bUPPfRQz/cDzoCcaYWlg6Ih7cw3z5Zg5TAHrn45lTGtACCKMsRxRtKAmbREoahNJS+plhRsNRNkqSDpQKFs5xYhlP4qEbczahzeTtFqkgJSu5VgYjJBmkgkcT4XALRbKbKUOqxE7ZSMFQOAvKyEMWYNses5cFzS1fV9x5JybAmKk7NhjVE2XwGTC831bh2Hl8pnmK4/dT1SS3K0Rm+uXsRK8oCcE3tZKQXXy+8jdu7SczCrrGTmA/KyGO5QrtR1iTHt+Y5eG9clN0B4zyF4Ps/FInq0MsU930/7vmdj+ld/9Vf4rd/6LaxduxaMMXz1q18tnVdKYffu3XjTm96EWq2GK6+8Ev/7f//v0pjjx4/jAx/4AIaHh7Fs2TLceOONmJycnNODAOU/2BU7dnHR6aHO1mP1mFd6VTj9WGp73krqmTIP06jbyRt2m36mjLFCP1Nmzw0d2grOtGi7MXBOfh01Fs+JPaaW1Iwp9jMl5IIJJoRr1mrWaEKxpoaTxpo8bs7+LRpl0wUnn4Pl5zmmHLfPWFhX8V52zsL9SvcqrLV4r841dd4rz80yyJ27UGzEPpucaT/u+56NabPZxDvf+U589rOf7Xr+7rvvxqc//Wk8+OCD+Nu//VsMDAxgw4YNiKLIjvnABz6AF154AU8++SQee+wx/NVf/RU+9KEPze4BpmHunsxLqtA/cJgDh7n61R+fUM80LLU9HwQu5f4cDscl7yiseQgCF+fctwueT3qzYc0j7VrO4TjMhjpdlyPe/XE4Doev61PDmosw9OA43MoNup4Dz+d2LsYYzrnvDuqW4jkIai5cj1tDUjJaHYaq8/vysVMQkLowb6ebd+qYTqM//fiZGL3iED5lXdOzkntBec/3z75nqljl2+vFjOHRRx+1CvtKKaxduxa33norbrvtNgDA+Pg4Vq9ejYceegi///u/jx/96Ee48MIL8b/+1//CJZdcAgB44okn8N73vhf/+I//iLVr157yvo1GAyMjI8C/vhjqf3yndG4uebuKbDQV8/meNBoNjKw+B+Pj46Xi62nHjozgvH1/Ch7WAQAyauEf99w4o+srLAwWa88DhX3/0evR3P9HJKyuSIknTYRtF+Z5ZGijKEUYevRHnwFZSq3GjAQh55Tr8zwHUZQBCgjrLuIoQ5ZK1AY8KK05226nGBwM0JxMEIQulCJ5Ps8n3V+TazViDIasYyT/uG6FZjxWBZrXiCbQe5mTjExNZ657W65HNfJ9jstshxjHYbYVnPESTa41uHsU6dYd9tmLxCfjUYtM2jKcYn6W6liV1ggmghIU5aAdTeQxJC5rYAtrbUw0sGLtuafct932PNA/+35ec6Y/+clPcOzYsZIu4sjICC6//HKri3jkyBEsW7bMbioAuPLKK8E5x9/+7d92nTeO4ym6jAAw/l+/PmXsXP7wT1dfejZ7toutZexxr/SqsLSwUHsemH7f/2TTAdsaTQiJLJWI4gxJnCHShlAIiTimfKnQGrhmrJJKjyHSjxV0iDNIqRBHGZpRnhsVQpGxBRDr1mxZRkSe+oFbSiHQYsiT8zx/WcwzGglAGz6mq/OxTvl8cS7zYjpEnedJ8++9w4dLYVYAEDt22nyqkQ80XWlsyNYxoWhWys+a9Zvwr3f4cD6Hy/W58prNcTOuF3Tu+X7Z9/NqTI324cl0EY8dO4ZVq1aVzruuixUrVkyrnTg6OlrSZOylkLYXGEMwX/k+M+dSN8bzub759uw5XDj6xSvy+ZLDQu15YPp9v+KcAQwNB/ADCsfWBjysWj2IFSsHsGr1IAa1mMK5qwYwMOjD163QBocCfc7D4HCAWt3D8hV1DNz3caz6j5/BuasH4XCOlasGcd6bRzA4FGBgyEet7mH1miE4Lse5qwfh+Q4GhwKsXDUIedf9OPFGi7zZTKA5mSBqZ/Dv2Ai+8f8GPzhqiVJJkmHseBtjx9uI2hmakzEa45E1/gAw0YggMonJBp3j2z8MpWBF5kUmkWUCUZTC2/VRnHijhYlGZA1WEmeIb7sdzckEY8fbYAxIYlrX3/3DCUxOxFBK4fXXmgCA11+dxPiJNnml2puXQmGyESOKUiil0BgnPeKx420icW3dSuxeTWCaaFA4/+VXJpFlwpYstZoJ/uEfx+zaZ4rinu+nfd8XbN7t27djfHzcvl566aUZXderkViIEK/82t+c9sbivWIph7bdDmZfhbMH0+37Yt2iKUMx9YxSKrh37QNg2pZRLaTrcj1G2a9C6Abj27chvX0rhKAwp5RSn1O6dpPGGgaw45Rbog0OB/B9F1Iq1OqUg433fRbJpx7B2MZbUNv7EbRaCZoTCcKaB88nb7NW92z+1RitgUEfrVaC4U/fTWHlOz5jDXFjPCImc0QlNOPb78PgUADH4Rg/EVnpQ+qxyjE0EiCOMng+R33Aw/lvGobrcjTGI6xYUUdjPMKyFTUMDgcQQuLE8RY4Y0gz8uiVVGhOJhgY9JHEAkPDAdJEEHM6StEYjzB+og3OOVrNBKvPHYCUCpMTMcbH2pBCYfXKAfSaSezc8/2y7+fVmBrtw5PpIq5Zs2ZKk9Ysy3D8+PGu2okACRp36jLOBEvNSJzMYE4ni7jUvdqFhstduNzTr/74hHo2YaH2PDD9vu/GgC2GLLOduwHk7F2AdGeDw9SmzCmEJE1Y06gmUX3kVCareVEjbtiQJ+eMjKyUYGDaCKFQz+lgYtf9RHzSdaVGICLTTcuVVAhH98D3HaSJhOtyRFu2W6Nv1kmkK6aNOX2gSBIaY5SZzLqoGbqweVlT3qOUgu87iGNaWxxRuRBjpBhlns2oRnke1apyhyFJRCnc7PsO/ECX2bgcUTsF09f4vgMwIGplPf+bKu/5/tn382pML7jgAqxZs6aki9hoNPC3f/u3Vhdx/fr1GBsbw7PPPmvHfOMb34CUEpdffvl8LmfJoVfjXvRqT5XHPVONrsvc0qvC0sJi7HkrrF4g7HSWeXSKq0ulIHfdAQCFFmidEoAMsiBK33lPU2vZ6WkZo8g5Q3jnVrqfzr0GoUvGJXAQhl6hHRuDyHLPN9m5H2HNQ5ZJ+IGLLKP8LgCqU/WIUex5RHii+3Hbs7RW94jF7FHNKa1LWCGHLJOYbKcAgLDmIYkzhDUPaSKssazVvbw0yHOstKLIJFyPa6UjDj+g5wlC17Kc/cBF1M5IxlEfdxyOKMmmZSNPh8493y/7vudVTk5O4v/8n/9jf/7JT36C5557DitWrMD555+Pm2++GXfeeSd+8Rd/ERdccAHuuOMOrF271rL/3va2t+Hf/tt/iw9+8IN48MEHkaYpNm3ahN///d+fMavvbMSp8rhLzQufLzjFou0+CfecaViKe96Uk5hm151NrYvGkLxQXmhvZpSOCl1e9PeGEFTswGJ+Nl5bsaUaAAwM+jCdYLK991h1Iz9wSCWo0G6tNuAVJAAZhDAiDNTMu1ancHFYc0t9QQGUco+u61D9aUj9QnP5P6pLLXqNfkBs41XegL6nxPCyECKTGBoOLPs303lTxmBLiqRQCGselFKoD/jEBDaN0AUpIfkBKSstW1GD6b+qoOB6HCtW1NBq9VZP7HQKNfTJvu/ZmD7zzDP49V//dfvz5s2bAQDXX389HnroIdx+++1oNpv40Ic+hLGxMfyrf/Wv8MQTTyAMQ3vNf/kv/wWbNm3Cv/k3/wacc1x77bX49Kc/PQ+PU+FMg8s4XEO/r5qDLwr6Y89TbpSxco9OoCD9B2NwaezJ0M0zVbrupNNwm1Cs8U6N96mUQnhwJ1rbDoAzo3dLRp0rvVah4DiwoWEHZMCMbi8ZY1qykTIEAJfzfLzUxsvlEJlC7dAuxDvutFrBSoHur/WLzTphPjBwAIppEhQZU5FJax04Jy/accmAgpl2bVo/GMyuT8LILuqWbOokLeSmQXHP03vfH/t+TnWmiwVTjzT+yhtLqu5ovmoyu82zGDWw833P2dSZrr/7L+HWBgAAWbuJI7f/xpKvN6uwMOi2741hIGIQLx3rhBljhNmL44pNuacr5TDXdZuXMQb3wC7AG0R6+1YrPt+cTMC1URNC2lAvY4Af5Pq4WSYQR4IISM0E9QEfSlGuU2mRfvIcqWY2DD20WymC0EGWkuwheYg0t+NSqDaJM1uqYuaL40zfJ0V9gMK0aUrEIuOFGrauEOQlR+0MYY1qcHN5QjKc1GVHIQhdKifSuV7HIe98bGwcK89bNeM60+KeB/pn3/eHye8TzJfh6TbPdHMvZK50KYSOHc5KrwoVOqHIDSoeOemY3H04tR9R9DWmczuUVrxvb90HsX2bZhTvh5QKQ3fdBJEpDN51M7JMIji407KA+cGDVsReSdOZhrxRY6yIoIQSe9iI0EtpyE6amawFGorC+FLRSxVeQuj7mPvp8SLL1yIyEp6gMSh8VXYNUlINryiI8Zv1G6a0Od4LOvd8v+z7ypguAczFIC4Fg7eQcDkrvSpUAAB+8KAlHkmpSo2qTcjVwPzxN2NMfSTn5WsAWENlULQD9ro795XGUI0psXCdfdsBAK0tO9GcjIGhtyCoucjuvJ/yk1mbwq4OQ3Tr7QB0vtNhGBoO4ey5HfVBD3GckReoc49B6GBoOERYcxGELtKUFJ+iKANjwIhuZh6EDoLABRTI0wxJxSmJBcaO071HltUwOZFgaDhEq5kijlK4LseyFTUwxuD5HH5IZKaBwQBJTESqOEoRBC5qdQ+1AQ9DwyFGltXAOFAf8DExHsNxOAaHA4wsq8HzHExOxFYlaabo3PP9su/7gya1gFgKEoKnuv90YhJnA4qfTFWfbKoKCwspJbJt2/X3FJY1PTdNPpMMqsx1cx1mw7HlUK4q5Vm5LjsxTGEg77hiIHbu1sZaaSatb1m5cu8hSCnhgLR+49tuJ+m9jLy3dN8nrUPs6F6jjsshJdWxyv33IE0EwpBUf4SQOh8JpJmwHViMYQ8CyrGacK5SAJjSBCjXMnE5J81hIahm1dSMDg4F9j01Nam29EeHf8OahzQVqNV9ZBkpT0EBQpAEo+c6yDKB4WUhPWMiSK6QM4wsq2F8POnp99vpjfbLvj/rPdOZGqj5DqcuBUGJfoDDGFz9cnqUJatwZqKTqauUyiX2eN682rBxc33bgnReR8cT831e12nqTFVhDC8RjczxOEqRaaatafGWpQLNyRie71C5iUuC+UksbE4xSfI2cgDg+TrH6XItjZjSOUZi957v5LW0mYCSClGb5A39wCVZP70mkSlE7RSOy5Fp0YfxsTaN9V20mgk830GrmSBqpwCopMVq8moCkedR02/OGNWRsrxDj++7ZLAF9XFtTiRkXH0Hvk/e8eRE3PPvt7jn+2nfn/XGdKaYb2PWy3zTCTrMF5Zyjarr8NKrQoWiCHwx51f0JMv50LzJdn4e6CQbGXZt8VgxzGs83WKtKABEbdID9vZvQ5YJZKlAkgi0WynSRJABTQSiiPqutlspGdKUvEEhSes31de5+7bS97EgLWAtIZimNHeaUH/WdjtFHGVU37l3u/U6U62ClMQCIiN94TSRGJ9MkEQCfN9OWpsmHSWxsNdmKRl3s3bTA9bMVzyWpvq52iSlONlKkGb58TjK0JiMe5YT7Nzz/bLv+2OVSxCLbYDm08AuZa/XYfRJlV6LvZoKSwFFOUFT9mFIOmXCkPmZaaGG3KBKWSD4GOKMlDoHKwtShOV58jE5gce0eot3jcL1HNsIfGDQB+OA65InZ1q5hTXXii/4ISkXhYfvBGcMwx/fi3jXKHzf1a3mXKvOZPqvOi6z7ePCmgs/dBDvvNOyeB2Hw/NJVAEMlAP1HSwfDuAHDpKd+1Ef8MF1iDoIXetp1+/ZB85JhMHUsvqBA8elMHFRjJ8xqpf1Q2p6PjTo03ldbuP5DkaGAiuSMVOU93z/7PvKmM4SMzVm82F0ZzrHmdjDtR9ZfRUWFuVm1LB5xGKXlM4OLqzQIi0viSmHa03NZVFOsHiODGkeTjbfm/mlUGTYdT0o5xxxRN5mEgsrHE/sW2UFDrzRuxBvvQNRlCHZdSeSWFhRBymJZZulElFEXmeaSGp5ptWPpFCItXecJuTF2pKhTFqRCNelmtSonREBKsp0txmaI2qniLbuzb3UTCJJBBhnSBNpw8vGU40j8kpFRnlSx6H8bRyTt5ymJD/YSeo6FSo271mE6QxVLyUtvWA2RnKhQ8OnCx5npdds8NnPfhZvectbEIYhLr/8cnz3u9+dduxDDz3U8YeYlcQHKiwNmNIRQ/whgQLzR5tN8VBFIXxbbJlWBGPM6uY6o4fstQbmuqJnDMD2PwWgW7qRcWlOxlozl8HzTN2nQJZKnTMlQfn49h0AAD8grVzPo9xqHGXaYBIxyujvOg5pAEulKK8qJHm4prWbMY5RqutqqQ71+FgEISSCwEVrMoEfOGg1SbQeDJQzVUQcMn1XPZ/yt5wzRFGKgUN5Kzc/IOawlNRDdqIR62s0oxhAYxY50849P9t9f7pRGdMZoNMIzbXmc7FKYRYrnDuX5+Us/3TKZ0FE+NKXvoTNmzdjz549+N73vod3vvOd2LBhwxTh9SKGh4fx8ssv29c//MM/zHr9FeYfRaH7qceBqfWj5bHGPnYrfzTj5I7tpZ9LuVVMNcLm0MChHZZNzDmHkgpSN+82Rn/FoY/aufWj0HqkAuc01ioTFR7JKgupfA22pMeGuPN6WsZ0Q3K9Hq8gasE40/djhQ8JKr8X8nC4yVEzxtDcdtCyi1UhFG6ak9P7mh+fTVlLcc/Pdt8vBs54Yzof3thMjdB8jztTMJfnLedOet9Un/jEJ/DBD34QN9xwAy688EI8+OCDqNfr+PznPz/tNYwxrFmzxr46e3VWWFyY+lLD1HUcEnMvepHuocP2e86p2bUq5Ev1TIU5YVnBRYGDIqlJaDGFTsH7gSEfvu+Sl7z/Hl0X6mLFg/chiQUAhfqBWyCERL3uo7X/T2z+1PcpfwpGXm2t7muNXg/1AR9+4Ng1U4cY8mo934HrcgzqeyeRgMjyHK/nUc9VkSn4PtWGrtK9WOM4w7LlNWqrNhJgYDAAFHnYjpY7dDgH40Ca0FqUIg1iwAj7Uwg4jjN4voMsFVixckBfQ8c5Z1ixsj6totR06NzzFZt3ieBsM1xnGjyHlV4AyY4VX3HcPZSUJAmeffZZXHnllfYY5xxXXnkljhw5Mu09Jycn8XM/93NYt24dfvu3fxsvvPDC/D5UhTmhzMCF9eJK+c0d26eGcQst1aabxxwvvsyxYk6283qAQrG5QD6QbdumjZ6D9h33EanoEBF8zNhimzfPM+3MnEIYW5OOTCcXXWIDUA7U5IGJJMSsdKDNDWv5wSLByvdpfs93LAmLjrt2bUbo3tSdmnuZDjau69hWaw7nWp5R2g8uvjb2UOXuPDNB5573+oSBdMYb06WIhQgH92M+dCbo9gl13bp1GBkZsa/R0dGu177++usQQkzxLFevXo1jx451veaf//N/js9//vP42te+hv/8n/8zpJR417vehX/8x3+c3werMGskcYZEl4wIIRFFVCKSxFR6Yso2oiilUpUsL+ng+3dRo+80LwcRGenVRhGVi8RRZktHzH2iKCVVoYjKWsy4LKPykiwlz5DKV6jkpdVMyKhmErXRHZBSoXHLTiSRKXEhclKakhBC7dAuJDEJHiSxgLvnVqpbzZQN1xpB+SzTpKZ2hiQR9r0xLGSzPnq/aOz4WGR7lzYnaW3tVoI4ynRomUQilIR9fwDQeySopZwRbFDKrInZ+080Yl1aBK33KzHRiCFkb6UxlWda4aQoGruFCAfPtO9pv6GbrNhLL72E8fFx+9q+ffu83W/9+vW47rrrcNFFF+FXf/VX8ZWvfAXnnnsu/viP/3je7lFhbqCenY4tGfF9l0pSdN9Q471RM20iy5AKEEO264AVHmCMvCjv7kPWy3Jdh0pJNNnH3Mf3HWo35ju61yd5bY7DdWkMiTP4vgvHpdKSwaEAaSrAGDB5+52W/OPpdfmBa4lJYMDEbfuJBCRINF7s/zhcj1uSlRF7kJK8V8dlqNVpDmOQTdrUcTlqdQ/BXTvh6zKZ5SvqcF0HaSIwMEhrqw/4qNVJbckwd1WB5SwyqclEJHgPwGrxUg0r9TgVQmJ4JLRGNE1IkWpoJOg5zNuvcoKVMT1NOF1KS/Pd53SxjbHHGHz98vSmHB4eLr2CIOh67cqVK+E4Dl555ZXS8VdeeQVr1qyZ2f09D//yX/7LUj/PCouLYo2nFWHXx4xYuykpKeY/ASPUkOc7SZpwmxZnVzY32ikGT428ie0rC+OKwvKmRpVpNnGWCTL0uoOLYbiakHRRBMKEag0zVkppBSRMjapROXI9bpuDG4JQYM65FOY1Xma66yC1cpPkhYNRXajISAlJCGl7oYahq8k/FLblDqkuGeNN7eLo/oP37iOlo9Ch0K7HkaVUsmMahzuubjvXozEt7vnivl/qOKuN6UIZiuK8CyUbeLo80MXOOc/lE6rv+7j44ovx1FNP2WNSSjz11FNYv379jOYQQuAHP/gB3vSmN/V07woLB9d1tHiAqQfl2pA4Jcm9/HsO99AhKzbgH7qz5JlyTgbC80h8gLxU13q1nJMIAhRp4pZymA7lBb3RAyVmK0CkpkyHoo3CkTHyZqwJgdp2a/oa9+ABmkvkXVqylOYyRCMpJfyDeyCkRJpK262FOrZo/VytM2ygJM0DHX6mg1M9X6PBa8aYr9QlRqK5Za+tfxUyX5OSsG3YRKY73vTYNabyTPsQC2UoivN260s6Vxhx/tmEjvsNRY1OdxafUDdv3ozPfe5z+OIXv4gf/ehH+MhHPoJms4kbbrgBAHDdddeVwsT79+/H17/+dfz93/89vve97+EP/uAP8A//8A/49//+38/bM1WYH+RsW2V7mQLlxt1mXLZtm+0SI3ftAVAmxkxXVlO0A50sXgMhJZJtu+A43PYTJaMiSKHIdzHwycOo1TwbQuUOg3vnbivywDlDWCNPMQgdxLdTbteILbgex8B991CY2aeSG8flaN2+B5wz1Ac8eL6D+r132Q8FWSatIL7IKOdJwvyeXVuWSt0nlZMqEmfUC1UTiAKtvev7jp2PNHkdhDViCRuvOkkEuMPscVeHn3slIHXu+dns+8XAWW1MFxK9CDvM1ns9Uw1oER5n8PVrNsXb73vf+3Dvvfdi9+7duOiii/Dcc8/hiSeesKSko0eP4uWXX7bjT5w4gQ9+8IN429vehve+971oNBr49re/jQsvvHDenqnC3GBCsEo33AaIlERem9TnkXtoMISYXGCeQsJ5z01zHcDsPCTOoEPGQmoRexpjjkmp4GnvNktliWEb1jxMTsRot1I0btqCiUYMzpi9n9x9J8K7tlOY9MAdmJyItQh9CtfjCD9+N5SkXGYcCYxv2oyoTa3ZHJfbBt5SKIyfiMB3b8HELTt0A2+l26YRCcnzqVRGKYXGeIQgpLUFIRnGLBMYPxHZri9GwajVTOB5DqIo1aISRM5qN1NMNGI0xiPSCW5Ro3GRSTQnEjTGIySxQK3m2d/RTFHc87Pd94sBpnrt3LoEYDqyj7/yxpLuvF7EXFu9nez6bueWQmu5zjU0Gg2MrD4H4+Pjp/y9md/xrke+g7A+CACIWpO48/evmNH1Fc48FPf90NCQPW7+hFnPU+aMUnO+OEYI8sRyWcHcyzWSgQbFMd2uA4jha6T6TEmKudYwX42n6DgMUuoSE5cjTcgTFULZdmzmK1Te6zQ8uAutrQfsM7keR9TO7H0BBddzEBy4Ha0dh8Cgy4WQE4qSmDxHJctiFCaHmyaCCE9giKMMrk/fk4yghOPqrjrIW9aZ99V45WaMqftVSiGKWli5btUp9223PQ/0z76vPNPThJMZtpl4pr0Y0lPd73RhPtbQj+GeCguPYns1Uhoqnp3aDaY4pptoQ3FsEUWjaTRmO8OWxjNVkvK5hi0chh7JC+rcYpoKKxQPZcbqDwGKPFDPc6gDjedoJi8ZP4jEyg8aow7dOJwxII6oQ8zE7QeJLKWZxYZc5LqOFbc3zb6TRMAPKGyrFGnqAhS2Nh8E0lRowpO0XnCW6W40urON+aAQ1qjtmtHuVUpRc/Iu7/PJUIV5zwDMhTjUy9ydWAyJwMVm6c4UfkfIp0IFUzNqWLxZoe0X1YWqvIZUmFCuIcoYdq60pBsTwqXwr7Ltw0zrMyEkkjjTKkV5OJlqQKWV/Ksd3kP5T8asR+p5nMQUNKOXcWbF5YGC0AMHPI/+HDsuL3jSJAAR7bo7n8vh4AdHiRg1epcVWaCOMjSmKAZhoLTurmvFIfIcMOdMfyjQbF5dSmTGmJy0IV+RMEQ+zjQmJ1IXtyQxsKkfUE6Fzj0/m33fix735z73OfzKr/wKli9fjuXLl+PKK6886fjpUBnTAk5GHOoVvej5mtfJ5plv47cUPNeZoB+LtyssLMwfcIBZUlAQusTI9R1bGmLZtqDaSKoBLSoJFWtGHV2SQt6eqVc1XqY5b1SKvLsPk0qQyzE5EVMXlR37dW9P6vBy4o0WanUfjpuLwrebKeKYjDa/YzN9MEipnGbgvo+jqQXonTtuRnMiIQKPNpK1uk8eq8sR3bYFUiqMbdqCNJEYGCRZQYcTAzlNJCYaETzfQZpItJoJfvbyBLJUYGDQx9jxNuoDPsZPRJiciMEYw+BwkKsmaYQ1D61mAseh5zQC9wP3HsDAoK/rVSWC0MUbrzUBALW6b6UHX9PHesFcRRt61eN++umn8f73vx/f/OY3ceTIEaxbtw5XXXUV/umf/qmn+1Y50z7EUsiHzgazyZne+/8+g9oA5U/azUncdu0lSz53UmFh0C1n2i3Paf6kFXOmUpYZv9PhZDnT6cZE7dSGZE0u0ZCMjNYu4+SBpimpBZmSGqP1a8K9SZLBdR3rQYejdyDbfRegc5cmP6pkHo41whVATsgy5TRB6NI9FdBup6jViPXbaiaoD/hot9JCGRGza80yQYbZpa4xpvuMeU5qX0fvQZJk8H0XzckYYc2z73OaCsTtDKloY8Xac2ecMy3ueaD3fX/55Zfj0ksvxf33329/X+vWrcNNN92Ebdu2nfJ6IQSWL1+O+++/H9ddd90pxxtUnmkfoh8N6WxRhXkrdEOnbm6nTzA1Z5qPOZn/MLUtW/59p5E2qN97lw3HmhCu8WaNcTNkHFe3L+OMmnxzh8E7fAiGRezqEK8JDae77jJ3L7GYmVYoMqFZE7Y26UkjpGCMreMy1GpUxiKEhB84tuTF1eFlMqR0L9MJR0ppvX8zTiltzAuCD1JK+IFrxSKEoNZxQehOKVU6FeYS5p2tHncRrVYLaZpixYoVPa27MqZzwOnOO872fvO5ztP9zP1IRKiwsCiqDkmZCx0YZaTyuZzJa4wRiSPkpS3l79ExTy4Sb+4B5N6uUgrpjt0AGNz9O6xKkjd6AI7D0W6maLdTRO0UzYkkl+HLqHF2lknIHTsgMol2MwXnHFE7tR8AKJ9L/UjbzdTqEht2rhFfmJzUoWZ93qgVGSKQyW8KSaUrnNPajCSjyCQmJ2Ld6FuSxnEq0G6ZXqbmnlSa025TeYy340PUkzUiZnGWSrRbKZqTCbGHObOCDjPFdASkmTS4mI0edye2bt2KtWvXlgzyTFAZ0zlgrgzdmVw7H8IM8+nJnm6v2GXlV4UKjBU9Rh1yZHlXl1LZRyHUazvB2A4zsNfkfT1Nj0+Tl83ZwGa8mctca+pP29vu1ELxCtGWnYjjzHaqARiWH9qINJFkzKVhxSrbbJxxBr5/FwBmFZOKNZrFuQyxyigNOZxrAQgSmhBaPpAzZhm4rWYKkVFONNFrS2IibynQ8WJZj5IA59CNzylErVT+/g8fvg2NnZ+1UotRO7M1tiYk3W6nJ40EdEPnnjf7fqYNLuaCQ4cO4ZFHHsGjjz6KMAx7urYnYzo6OopLL70UQ0NDWLVqFa655hq8+OKLpTFRFGHjxo0455xzMDg4iGuvvXaKNurRo0dx9dVXo16vY9WqVdiyZQuyLOtp4Usdc2HZzicRqt/hcgaPc3ic942s2JmGpbbvyy3SKIzHeH6OmoF3tk/jJSOrv5sydzEXSj9PVUnqHOMHDoJ7DuvaUU1u8hyEoQfHtDNzGSZ3P4ggdDRZikT1/SCXP3QcBrn7Tjgus2QnIlRpBq3DMHD3Hjp/9z2kROS7JOjvMjDO4Hmkz+u5VPLCeN4ybWDQt+L8QejCcRiJNhSIS67LUbt7P4KANIWNlKKr53M9btm8rV2fIFF/nyQWa3XPhq4dhxoN1Ae8GeWqiyju+eK+n0mDi7nocd977704dOgQvv71r+OXfumXeloz0KMx/da3voWNGzfiO9/5Dp588kmkaYqrrroKzWbO2LrlllvwF3/xF/jyl7+Mb33rW/jZz36G3/3d37XnhRC4+uqrkSQJvv3tb+OLX/wiHnroIezevbvnxZ8unA4NX4P5UEg6k+Cw8qvC6cdS3PdFbyevG0XXvKgJyc4EneO6eVWdY7JUIr19m80jGnUkIyxv6ltNODrLpuroKiiAUd4SgC7LkVbf1pyPth8AFJBt3aJDz0Lr+9LmkEYZSnutNBeFlqN2amtl04RCxKZdnWnxJqVCvH2PFf1nDMgyYclTJMYAys0ywHjJADUXV5KEIih3qhBHomdt3s49b/b9TBpczFaP++6778aBAwfwxBNP4JJLLulpvQZuL4OfeOKJ0s8PPfQQVq1ahWeffRbvec97MD4+jj/90z/Fww8/jH/9r/81AOALX/gC3va2t+E73/kOrrjiCnz961/HD3/4Q/zP//k/sXr1alx00UU4cOAAtm7dir1798L3/Vk9yFxwKnbs6dDwnQn6lcU7F+Tht96bDFeYHyzVfZ8buvyPdTcyUueYU8yKosdqwponG0PlJGQQTY4VgO36UhQtoO421DnGEHkssQmFMGup2w2z54vrkhJgOhxrQ996uJIAmLIt1aSRXmTcGjrOGYRu6G08egUFplihOXnhw4A2+iaczMAAplA/uBXxHfdASAFW8tqps06Pmg2lPW9+7gWbN2/G9ddfj0suuQSXXXYZ7rvvvil63G9+85ttmPjw4cPYvXs3Hn74YbzlLW+xudXBwUEMDg5Oe58p6+5plR0YHx8HAMt6evbZZ5GmaSlx+9a3vhXnn3++ZVIdOXIE73jHO0oJ4g0bNqDRaOCFF16Yy3JmjaVioE6l53u62rgtlXsAFQFpKWIp7PtiGJdzjk772U0ByeIkf9xPpoCUM2WnhnmLXWiohRmFUk0+lAwSSf55VhAhD+GSIZUkVn9wmw3zGiYtTKs5nROlUCuzIV6rQ6yXa3qqKqVsh5v6gG9l/8IarS0IXFtWI7VhNc/NOGzdLRjp+zIw6/2SB64Q3XE3pFQIa54tD5KSDHmt7tkQ/EwxVwWkXvW4H3jgASRJgt/7vd/Dm970Jvu69957e1t3T6MLkFLi5ptvxrvf/W68/e1vBwAcO3YMvu9j2bJlpbFFJtWxY8e6Mq3MuW6I47jE3Go0GrNd9pLGfBn1hdIAnq979AKHMzh6gzuVZ7roWCr7vqi/KzJphQZMaLJ43rBziyo+QPd8qNT6ssXnNcbTXGe1czVakyQCzzjTnVkAkZCg/tBwaGs2hWSI2xT6dT2OKEq19yrAGUMQemi3UqS776GQrH6GgXvvRLpjLykXae8wTQSUVGg1Uzg6X8kYK7VXi6MMtbqPJMmQJgKTEzEGBgPU6i4a4xGGhkM4Oz6MiZ2fsZ1eDEGJ6VS2H7iI2inlSJupzo/yUt1uHKUIQg9jx9sYHA4QhGRWkjjD2PE2mNP11zstinve/NwrNm3ahE2bNnU99/TTT5d+/ulPf9rz/N0wa89048aNeP755/HII4/My0JOhtHR0RKLa926dQt+z7MVC2UkZ13WU8ibVLZ08bEU9r3SSTvjjRZLWIznVjxvRA460dk0vFjukh/Px5oQsixcA0CzbsslNiRBSKUhKk9pItW6tkr3NTXsXyNGb3KmWSZ1/1LKYQIdOsHaK8xSadm0NsStYPufMgbU77wNQkhMRJltSJ7EAu6hQ3j91k8gy0jUwTQbBygMTGxeYhZD6dypzq0CsOxmkdHa27oMxxyXUqGVZF3f+5OhuOf7ad/Pyphu2rQJjz32GL75zW/ivPPOs8fXrFmDJEkwNjZWGl9kUq1Zs6Yr08qc64bt27eXWFwvvfTSbJZ91qGbAZuvfqq9nputke7HJsFnKpbKvu+m9Vr8A995DIA2Ap2CDGXGb/H4dOg2zhh3+j4n6HSNJiuUjbw11vk67bhpJ8nPKaW6Ppsq3Gdi2z0UltUfNpzRQ5BKQe7YXhJ6AIDa6A6gYy3F1HR48A77s31+mDzv1PeoV/IRcJY0B1dKYdOmTXj00UfxjW98AxdccEHp/MUXXwzP80pMqhdffBFHjx61TKr169fjBz/4QUkn8cknn8Tw8PC0PSODIJjC5KowO8yH59krWWtONbeMlV4VTj+W4r435SQmp0eKO+bfh9KlMHlO1fOcktcHwOYzzTMylmv95tfmxjZNiB3ruuU/m0Mjoc6PKmqK7XKEdRcrz62jMRYhSTK0mgmaEwlqAx78wAHAUB/wbfmL6TM6MBig1UpQH/QxNBzA9bllBjfGI0RRhjgSCAJX3zuA63KcON5C1E6RaMF+z+MYXhYijjLS0h308ZbzRuB5Dk585GasPHcAjbEIK1bWMTQSEhFpy3WIdhwsec+TEzEGhwIkicDQSICJ2/Yh0iIUjfEIY8fbcF2O5mSCtWsGoSQw0YgwfqINKRXWrhrquc60c8/3y77vKWe6ceNGPPzww/ja176GoaEhm+sYGRlBrVbDyMgIbrzxRmzevBkrVqzA8PAwbrrpJqxfvx5XXHEFAOCqq67ChRdeiD/8wz/E3XffjWPHjmHXrl3YuHFjV6rzTNDPLNeFXPtivCfdnmcu63CQC107XeoCKyw8ltq+N+FYw2CVmplqwrwosGKNwVWaEEOEHFYK25pWbhQOVlAsZ/EWx5luLiTRR2uxRtYj4lGWlctR6oOeDYMKX1o1IMdhunRF2fXXBzykiUAYesh0I3OAusjAgTa6KPU5JQPPMDgYWDUjw+ZN4gyeTy3dUinQbqUIai7qg6TJWx/0ELVJ2cjzHMR3fQEA4DoM0nd0rSg1Ifd9B0ks4Pncvh/0nlNpUBg6aE4mCEMPtbpH5TmZRKuVFMQmZobinjc/9wN68kwfeOABjI+P49d+7ddKrKcvfelLdswnP/lJ/OZv/iauvfZavOc978GaNWvwla98xZ53HAePPfYYHMfB+vXr8Qd/8Ae47rrrsH///lk/RL8aUqC/1w5M7XrTrUn5XNCP4Z4zDUtx35tyDqWIMJPnDXMSUpGZyh1mvVfKJTJbugIA7uhdWh0pV0QCUAoDp4mwXWSKIWIjrJBl1I+UepVy25Wl1Uww0Yhw/ERb51BJkcj3yZt1XJIVHD8RwQ8c2+3FD1zbEi5qp3audiuF6xrjRhq7b2jPtN2il1Ikct9upWAcCD9+D4aXhVASOKE7xowdbyOseVYM//U3WhBSIo4EWk3qn9rQa2k1UwShi6iVoTWZYLIRozEWIfjY+yCEhLfzQxgcCpBlAo2xCCeOtxFHGeoDvo0IzBT9GuatusZUmDFm40UXr5lN15gnn/4hBgapQ0hzcgL/169dWHWNOUvR2TXGGFPjVRrWbZHJC2DKGNNcu9gRxnig3TrQmHm6XQfAdlUxx4sEJSPLx7hmATs818p1OdKUGnRLqZBlEp7rIM0EPNehvKbxuqG9cS2I4HoccZTBcTmkJj+5HhlWhlwykRZCHyjSVGvlCvLOpfYuw0N7kezYhzQRGLh3P+Jt+2z3mtqhXUh23YUslfZe5tmMB8yY7suqCUtCyhLpqNWexMrzVs24a0xxzwP9s+/PaG3es1k5aCFwKkM6U0WnXsA1Td7pKOSucPaiaOBMuFEU/si7B+/s2jUmZ6rmnVzyOfOxxfsUYa7r/HfIHTJeJvQKRXk/z3MQtTLbbLzdSnUnlrwbizGsUijUd38IjktGkjvMdpAxYvdmriTJRfIdTmNazRSZbpCeJsTO9TwHWUpKR46pe1UK7VYCV6/N8xyIOw5AZArNyQTR1r3IMolE6w2P3bJXC+YLa/yNoH7cztBukXh/EtOHAvJs6XiWUVh45T17e/r9Fvd8P+37M9qY9nsItd+wEO93P4Z7KiwsysxVHcothGOzHTu7X4fO0G1xzu73mQnLl+ZlqB++A6Z1GbRnzB2tVat7g9YP7daCCHoNhXDy+K4HAABOgTxl1mDaqNm8KGDzoyQWwa04BXeYLcWx+sUHR+37ZPunOoV7cMB1HYSH9tgWckYvGID9apoAOPo+K++5CYOHt+drYvmzck5iFK/dtqfr+zYd+jXMe0Yb0wpLo23bXOAwVnpVqADA1oMyVuzDabxJZs+bsabpNZAbhm7G0YQx8/vk8UpzXbGTC0BNt7NUINp+p21/lsQCE40IYY0E5T2fhOIbm/dSvaYmCJEGL3mPQegiilJ4voMoIsasEPRsjkui9K6bh4eVgh0T1jxSTNLGWwqFVjOB6+m2aJu34MQbLQghUat5mGjECGsumpMJ2q0EXKsVRdv22d6s9dEd8H2XPGXdGo47DJ5P7dyC0EW0/08wcftBeL6DxngEAPBDB7WaBwD2WC/o3PP9su8rY3qGYzah2Zlcd7rQjxT5CguPXE8297CAcklL8Xsa0ynE0GXejm4K5bBvfu8iajUPrufoDi0OXJfbchQpcn1cpg2m6cji+borjG4WLqWC77tQoK9B6MLznFydqSCw77pk0MLQg+c71H9Vh785o04xYY1Ytab8ZmRZTedVlV1bfcBDEHpWztB4ta7LEe0apTUFLjgnY84Zs/q/Rjhi6N69UEphcChAeHi/Pe64DIPDQc9h2n4tjamM6VmOherJOl/gvPyqUKFbxxhTO0ri8WpKvhOALUshr47G5XN2fp06h+nC0unRGi84iQUYI5UjIkExNBoxJvXrjbE20lQgamdadpAhiYSdu37bB8AYMNmIddiZUd1onCFqZWiMx2g2E7Sa1Dy8NZlAKoU4yvDGWISonVI9azNBmpD6kfFczQeKNBE4Md4GY0CjEQOa0JQkAq+faCNNKOc53ogRtTM0J0nOkb4ytJopJifoeSbGYxwfa2Pslj1oTabgnGFi8y5MNmKcGG+j3UwBBVufO1N07vl+2fez1uY9m9HPda29YDoBhtP57MVPpv3yCbXCwqJozIzX4xbEFqYTVjeau8bbK47r/KdVVjeCvc4cKxlU/a2vxRfMWoSQGB4O7JhaRue4w7QnKm3tqOtxtO79L+ThDQe2o4znU95R+Qp+6Ng9QAIRvr6vi3OWUQ9V4ROb1xCuSHyewtUiI4GL5SM1CKEwPBxYeUHP51i5vEa9T60QP4fSYvn1QR9Ki1LY90WzeY0ofpZJEv13AygJDBzahmjnYXh+b+K8nd5ov+z7PrH5Swv9YkgXwrOc7tkXrOdrH4Z7Kiw88pxpuV4UMGILKOdMRV7yYgXvuwndy3I+tGhMzXWdedV2K7UC80kiIAXVhk42EgqNOsTs9QMHcZwhSykkm8TC9jRlYAhDD3FEDNs4Eoii1OaDHYdCuo5LzbmpdlMhbmflnCmnbjJCSl2PSjnTOBI4frwFkVHHmMmJGGHNQ2uS6lIZYzosTGUzTJOo/MChEhzO0e7ImRqBBiEkfN/FxHiEYHQPgoBE81s7Ds0qZ1qFeRcJSyEUuVQxH0a/+P6e7L1eqA8YjJVfFSpQaNe0AZNQoBpN0x2GjF1RsF6XxGQSSinb7FpKaY1y/j3yeQoC+qYRt2nkXRTFN8hSMookek/513YrRRxliNokdiAlCdAb4QgTnhZCotVMwBhD1M5snazIaHyaaCGFOLNNx2MdIs4yieZkkpesRMKKWKQJPSvjgOtwex/Omf1KpUU0B30QkIjamf3KGEOw9yYrkG+fp5mgORkjyySiKAXnHK0texC1UzQnYySRKD3jTNG55/tl3/e9Me0XL/F0YKE90bm2dht5/1W9X1dg9PXLJ9QKCwuTT7RfoT0YQzoqlYVoFwv5MZIKLBOVmL0+L/8wP5uSE6XFD0g4Ib+fEZsvfTVGWFB3GDLGsmyotZQgACvQoLRUYG7ETTcaPZfIG24b0hEd13MLpfue0ocIqagZOeyHBFqPksDgnf8hb0Iukc+hBSSUzO8/dvsnaD4p7VrsswnKP6+460OWfCSEgpASQnbv2HMyFPd8P+37Kmd6BmEpf7CQX/sbq4DUC6qcaYVOmNpJ81UW1I9I7i/X3KVjZATdQ4chd2y3uc+i0lGnsH3ncSDPmXbmZMOQxO2Zr9WXXGbVkEwYlDGGgUFliUHcIaM+MOjrek4XYUieZBC62qAy+D7Tud6y8IRSCkPDob2PyUtSPhjWsPqBqz1xoFb3LEO43UohRx8kj5IRC9ncl2k2sKk3TROBwU+OAlmEbPddBW1eeiPShGQNJ/f/KcKaa49nmUAcCaRZ1tPvt8qZnmGowsc5ZhrqXZB792HupMLpQZFxW8x1FktIisi2bSuNLSsg0ffuwbs67pF/n9+j/O9Q+6OWLWy8TsapljRNBLKUwqMmf0thWGjjRXMnMYVvi+xXoT1BkdH5LBNWTN+K6gsKs2aZsCFkKZRuEi6sZ2jyy6aBeRJnJDjBACWVbVZuerGKTNq1tG7bgWjHAQo5pwJpQuuJI8rZpqmwYekkoeNZSi6xEN1/H9OhypmeYVjKXt58YaaGcb5CvbMBt2E31jdNgissPIryf6QPW2bfFglIJg9q/iZ374dKx5JtOzrvNGWM6jDWaSKsITWhXJFJxO1Mqw0Z5SKujSGFYf392/KwLUjyL0sFuMN0nlTaMDAJN3AbWqZwrr63UPBcR7edg60BTbXsIBlviWYzgZQStXvvQqTXFmtjDwCe61CT8sL747ha01fnX8PRO0ihSa+H2t8RaandSugah47XD25Fu5Vi5ScOzuyXqlHa83207ytjehajHz4wcFZ+VagATO0aUzSuJqxbDN2SwDyNOVlrD95R1NhVtKFD2CGsefB8MnS+r0UbfBcDQ0a0AdY7DEMPQeCS4dx7GL4WbTAG0g9cQAFB6CCsufD8QjmMyJuJOy6H51HfVN8nTVwT2maMoX7PAYShByWVZRIvWx6SJu/tO+3a6gMewpoHMMC7cycc/fyuy8G05nEQusT2DT3EO+8kcQgw68X6Pgn1D42ENhQthER0x90YHglx/Lbu8o7T/g5Yf+77yphWmALjsc7Ucz3VuKo5eIX5hAl1Ul5RIU3p+ywTSFOhiTEUeiTCjLTeIEkBKnutyKRl6pbmSUSBNGTCmCSukGXSjpNa2D1LNas4lRCShOJbTZIGZKC8p+OSCIMh96SJtHMB1MotTYQdZ+QGFfK8qOPk7FspFTF3hdRSguQxcsYQbd2NOCbB/DQTcPduxcR4bMtY2nptUSuzYV+x5yAZSk6ha4BysEkswDgQxzTOcTiCwwfguBzhvfdACAnXddCcSKCgjbdPHwrCHTcUnfsZoQrzVuh7dPYknanneqpxc2IBF8M9/fIRtcKCwnUduK6W4ePcfu+6DjzPseLynkehT8fhBeF2DiDvSWoE2c21dh7fsW3SOOfwPMdK87m61tPVoVXjaZLRJBF4z+eo1TyrmmQYsJ7PrdfnetzOBZChpv6kuUFyHC3aIKE/HChdC6o94YDWnKXSsoCl9tZNazfPdZDuOYzBocASimp1WtvwfQdI3vAgtVnjhu1sGggc2EtiFJJqTk05Urz1Drh37kF82+26nyw1Qmdg9oMJGNC+6wudKeZTonPP98u+r4zpEsBCk3pmkxvt9frOJuHzhX4M91RYWBRLRqRUcA/utxKC+ass2mDKPIA859lJQCpKDBbnsj8X7llEHGsSjvaWU00EMvnIOMoQ7NuMdjuvOTWCDXGUQemwaJbSdUksLNEnSTKk2jhlmviTJuQtm3niiGpPiTiU2TZsaSItOUhkJOKQxMIShNJEYGLzbiSJQHT7dlqvXnu7lVJt6207kWZ6HQkRkvx9W5AkGZq37UKSZEgigTQjmcRUe/VmXa1WoolIM0cV5j3LMRcjstC5y7nO33n9dH1LzWs+0Y/hngoLi2KNJwDIXXvscYMpOVO30PB7mrijIQqZ7019qfnZCMkbT9KgVvfIS2UMvp+L2A8OBTZnOrHtbgAkdO8HeV7V8x1LUjL5SYC+mjIW8+9eiFyAwnUduB5Hre7C9bmtHTU5Y9d1UKt7JEnoOfADFyPLQ3g+EYaKOdNa3dNiE1K3f4OVPZRSIQh0zrRGXye3HbLrEULB9TmUBIa0qL3JmToOx7DOo/aCKsx7lqHToPQDmWe+cDqflRVCPaxfPqJWWFAYz8soGsVRhkyXcRhmbZbpnKNmsholIGEUhzIKiZo8qfUC09xzE5kseXyOw8gTSwrnMol2k7w4xpi+TiGJMzTGItQGPNuYu1bzkEQ5m7dcVgLUBzy0Wym1NmuTzJ+p+/Q8B/UBT3eayVuwtZpUzjIw6MPzHR06JkIS33kTPJ8ae0ftFG+81oTIaKxZ2+REjOZkAu4wDA4GUNAhZK0fHNZcRO2MwtG7/gO1ggtc+D49j+k+E4QOxo63SRZRH+ecYfxEu+cwL+sI8fbLvj/rjelsPcqlZjxPV/3n6a4zNR5CZ6PmCmcvjNHgDnmJnp+3M/MDF65HeUg/cOEdPkzjXBprcqTe3YeJ1KPzpL7vWq/StD9z3Dwf6wcugNzzdPQ4Ux7iuMz2HaX7cS1ir2we0gjaW2NlXlpVSUoSwldSl5eYBtuaEJTLGxqGMrPvg5FYNOCcIdr9SbqnXu+q+26Ho8f6WsDe8x14ntYclkWhC2bLjhyXalGj3Z+k/G3hPyk1m1qS1814HoZnjMEP3J7lADv3fL/s+7PemC41ozgb9NLJZS4CDDO5z3wbW8bLrwoVRCYtG9d0QxGZtI22jdRdlglk27ZaiTwrtScVsm1bC2xeVWAIl5nARvqPBBKUHUP3lZYtXLyH0pJ9xguWkuT/SBdYj9fjqNxF2dCzkPk1wq63UM6jbaaRGDRyfoCurZW54TUsYXM/xBM232uJUYZNXGw9p683Y6VQCO/aYd9zZdcAe97MWcwnS6kwvP+DPcsJdu75ftn3fbLMCifDTHKa04091fhTXTuf83dDP7L6KiwsjHgBSezpukiP244qTLcEM2xfI69nvFIjoMA5t3MZhrBSStdwGhEEZs8b1i8UCtdyRG2t9lMIG2eZwGQrofxqQYTAEISEUFQmo9WKlKL1mjKUJMm04hFZIlOSwoiMbI1yHKXIMmk9XgOREUHJO3yIQsmJAP7pZ8hSCdflaLZSOA5Hu5UiijL7HkqpbKNwU8ObxALt7QcRRRnC0V02H+265D1nGTUVbzQTQOVetZQKf3fTp6fNUU+His1bYclgvkpa5gtzuU8/hnsqLDyMEL2UFKost0VT1hCasb7vWk8xsx5j7jIZ1q7R383vUyA17d9FYzr6cy5bXtPty4D6gA/Xc1Cv+1i9ehATjRhZQuzYZjPB4FCAsObBcRgGhwL4gWOFGiYnYgwNB4haGQaHAgyNhPB9V6sZSUxOxEhiyguHIc0xsrwG33fQGIu0pCDJCXq+g3P++D60btmCIHQxOBwge/h/UinNthvt2lb9x09j2fIahJQYPxGBc6brYOnZWs0EQyMBskxg2fIakLVtc/PJiRiNschq/b75TcMAgOZEoluvKaxbO9Tz77YK81boW8y3Nzmf6MdNVWFhUSxp6fbztMetnOCp5+12j2THvu73MvPywvz6WDE/6rq5p2uMtPnKOHJP2DKK8zBnsZNN8VrGjLg/t51zciZzno+18zGGxq4H7NrE9u36HOWVTdN0831+L/1w3KV7aO9++T23Fu6ZM6JtVAC979vKmC4CZtPSq8JUdMujzncv1FnPUfgD0S8U+QoLi2L/USAXlp/akzSvC5WFXKQh+9DP0o4xdaVmnvIxZeUL8/PS5iZVYV5zfxNSNWIRjsNLPVCtyIJem+tS02/H4VaqD1pAgULN3BoyuoZZTWBDRLLGVgHJ7beDmVKVjOpeFRRcjzSATeNwIUisYeQe0iW2Rkzr71JjdSqdiXYeJhUm/eGgdcenLAM4TUiowdWkLKMY1StKe76P9n1fG9Px//r1Rbv3UvHc5gMLJWQ/H3P14yfUCgsL6g+qG4Br45SlORHJkHoMMciwayzpR4s4UA9PZY1NpstlTENuM9YaTE0gIqKP6QuqrKIRdF7TGAPX47noA4yYvfY8zVjTTxXM5msVVCn/a663XrHO2Vr2sDaYRaIP47D5XWMUg4C8SiUVXI/yw8Vc68TWQ9Zw2TVpZjGQf7XEI/1BxOFcz0Xhb6kFLhgjCcSKzVvhpDgTWMD9gH5k9VVYWBipPxNSNH+0zcuEKK1erS5NIX1cbktXWKE0xvO1nqye35TGGDlC3yfBAjPGlL44Lke7lVkjnmrt3TQlbV6ADLaSZMxNvtHUviZJplnGZKGSOIOS9NUoKJnm3YBuIq5ZyFmiVZCSrNAthlq2ZalE1Kb7Z7omtjEe6Q4xeYeXditFHGdakAL2Q4MhUtGacg1iIXRRTKGMJkmIwNSaTBDcZUTtSVZwciKetiXedKjYvBX6HtN524vphc8Hq++zn/0s3vKWtyAMQ1x++eX47ne/e9LxX/7yl/HWt74VYRjiHe94Bx5//PFZ3bfCaYLqzIN29Bu10oJ57rD4tTy28w9/sQXblEMAcg/NsIYB47nKgiYw5SRtaUkh1KwolqtDqsrWgtouMSxXcTL7QJKArp2j2J6Nc/rwIISyId/wzu1YvucGPZZIRo5j2rPR2l0vV3vijLxnE1I2Ck2cM92CTesQa2UpI6gfbb/TsnkBaiXH0Nu+rdi8Ffoe03nb5vhiGNu5hnu+9KUvYfPmzdizZw++973v4Z3vfCc2bNiAV199tev4b3/723j/+9+PG2+8Ed///vdxzTXX4JprrsHzzz8/10epME+gfGFZf9d0dzEhXHTUSjLG8hxnlp+z+U+dozRlISZEbPKfQugm3UJaI2audV2HcpNKkcABNIM4dBDrht5JIhBHwpbqqMJYk4uNowyuR4pFTiHvSDWzeXeaLJU2tGsMYNTKbP4zy6jhuOdzpBkpMyW7D2Hy4J8BIJWmIHARx5mWNKRcbruVaiMsC51tBFzXQf3Ax+D5XHu5Alkirc7w0OitSBOJMPQgFak/RVEKJUkWsWfPtE/DvExNR4Vbwmg0GhgZGcH4K29geHh4sZfTl+hV6GE+wtqNRgMjq8/B+Pj4KX9v5nd84mev27GNRgPL166c0fUGl19+OS699FLcf//9AOgP8bp163DTTTdh27ZtU8a/733vQ7PZxGOPPWaPXXHFFbjooovw4IMPzvRRKywAuu1708NTSmkZp+ZYJ6RU2gjR2OK46a4pwujNdpvXGD3H5ZYcxDmz7c3MOM9zbEjVdR1kGRkrErqXCEIXSZxpxSXkwg+KDL7x0jzfQZJkcF2HWsWlslQnahi1WSYsE9jMl2YCQeAiiYXWAoatRfV8B97B/Whv2aX7xCr4voskIcObJoI8aS3aYMhHULQmIwIhlbL1uePj41ix9txT7ttue94c73XfLwbcxV7AbGDsf2OiscgrWfoYef9VXYlaY//pL9FodH//Oq852dheYH5fvXx+m5icsCSMickJmqdjLUEQIAiCKdcmSYJnn30W2zX9HyCP4corr8SRI0e63u/IkSPYvHlz6diGDRvw1a9+dcZrrrAwKO57Y/zysKmyBsMYt6KhNNdyzq1RNMbVjOk0ymYuM0ZkUhtLVQo9RlFqRQoczq2KESkXKTt3poXkpaJQrutypIlEEDpWeWn1gbtx7Kbb4WnxeCFIEAHaQwYjdq/nc7TbGVzDEAa1WjNeaVHo3/RDTRJhCUhMh3/5BMO5nzyI12/diVQzfFV7Em+8cYI8Y22YDTPZeOYkqp//Tuz76RgyFFGulALiqFX6/Z0KxT1vfu4H9KUxfeONNwAA637hgkVeSX9gZPU5p+WamWJiYgIjIyMnHeP7PtasWYPz/1n5dzw4OIh169aVju3Zswd79+6dMsfrr78OIQRWr15dOr569Wr8+Mc/7nrfY8eOdR1/7Nixk663wsLjbNn3az7xidN+z5Wf/FTp5zd3/DwfONW+n27PA8CaNWvg+/68r2k+0ZfGdMWKFQCAo0ePnvKP8tmMRqOBdevW4aWXXloS4RGlFCYmJrB27dpTjg3DED/5yU+QJMmUOTrDcd280gpnHqp9f2ostT0PzHzfT7fnATK0YRgu1BLnBX1pTE0YZmRkZMn8g1nKGB4eXjLvUy9/BMMwnNMGWrlyJRzHwSuvvFI6/sorr2DNmjVdr1mzZk1P4yucPlT7fuZYSnsemPm+n+ueX0xUbN4KZyx838fFF1+Mp556yh6TUuKpp57C+vXru16zfv360ngAePLJJ6cdX6FChQpAn3qmFSrMFJs3b8b111+PSy65BJdddhnuu+8+NJtN3HAD1dxdd911ePOb34zR0VEAwMc+9jH86q/+Kj7+8Y/j6quvxiOPPIJnnnkGf/Inf7KYj1GhQoUljr40pkEQYM+ePVWu7BSo3icqdXnttdewe/duHDt2DBdddBGeeOIJSzI6evRoib35rne9Cw8//DB27dqFHTt24Bd/8Rfx1a9+FW9/+9sX6xEqaFT/nk+N6j1aPPRlnWmFChUqVKiwlFDlTCtUqFChQoU5ojKmFSpUqFChwhxRGdMKFSpUqFBhjqiMaYUKFSpUqDBH9KUx7bWl1pmC0dFRXHrppRgaGsKqVatwzTXX4MUXXyyNiaIIGzduxDnnnIPBwUFce+21U0QIjh49iquvvhr1eh2rVq3Cli1bkGXZ6XyUChV6wtm654Fq3/cNVJ/hkUceUb7vq89//vPqhRdeUB/84AfVsmXL1CuvvLLYS1twbNiwQX3hC19Qzz//vHruuefUe9/7XnX++eeryclJO+bDH/6wWrdunXrqqafUM888o6644gr1rne9y57Psky9/e1vV1deeaX6/ve/rx5//HG1cuVKtX379sV4pAoVTomzec8rVe37fkHfGdPLLrtMbdy40f4shFBr165Vo6Oji7iqxcGrr76qAKhvfetbSimlxsbGlOd56stf/rId86Mf/UgBUEeOHFFKKfX4448rzrk6duyYHfPAAw+o4eFhFcfx6X2AChVmgGrPl1Ht+6WJvgrzmpZaV155pT12qpZaZzLGx8cB5ALgzz77LNI0Lb0/b33rW3H++efb9+fIkSN4xzveUeqMsmHDBjQaDbzwwguncfUVKpwa1Z6fimrfL030lTE9WUuts61FlpQSN998M9797ndbdZ5jx47B930sW7asNLb4/kzXYsycq1BhKaHa82VU+37poi/lBCsAGzduxPPPP4+//uu/XuylVKhQ4TSh2vdLF33lmc6mpdaZiE2bNuGxxx7DN7/5TZx33nn2+Jo1a5AkCcbGxkrji+/PdC3GzLkKFZYSqj2fo9r3Sxt9ZUxn01LrTIJSCps2bcKjjz6Kb3zjG7jggnJH+osvvhie55XenxdffBFHjx6178/69evxgx/8AK+++qod8+STT2J4eBgXXnjh6XmQChVmiLN9zwPVvu8bLDYDqlc88sgjKggC9dBDD6kf/vCH6kMf+pBatmxZiaV2puIjH/mIGhkZUU8//bR6+eWX7avVatkxH/7wh9X555+vvvGNb6hnnnlGrV+/Xq1fv96eNxT5q666Sj333HPqiSeeUOeee25Fka+wZHE273mlqn3fL+g7Y6qUUp/5zGfU+eefr3zfV5dddpn6zne+s9hLOi0A0PX1hS98wY5pt9vqox/9qFq+fLmq1+vqd37nd9TLL79cmuenP/2p+o3f+A1Vq9XUypUr1a233qrSND3NT1Ohwsxxtu55pap93y+oWrBVqFChQoUKc0Rf5UwrVKhQoUKFpYjKmFaoUKFChQpzRGVMK1SoUKFChTmiMqYVKlSoUKHCHFEZ0woVKlSoUGGOqIxphQoVKlSoMEdUxrRChQoVKlSYIypjWqFChQoVKswRlTGtUKFChQoV5ojKmFaoUKFChQpzRGVMK1SoUKFChTmiMqYVKlSoUKHCHPH/B32g/a6SYc0HAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 21 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "As detailed in the main reference {cite}`safdari2022reciprocity`, the `DynCRep` algorithm operates in two distinct modes:\n", + "`Dynamic` and `Static`. The `Dynamic` mode (also known as _w-DYN_), which is the default setting, \n", + "captures \n", + "and \n", + "stores \n", + "temporal relationships in a time-dependent affinity matrix, allowing for a nuanced understanding \n", + "of evolving community structures. On the other hand, the `Static` mode (also known as _w-STATIC_, \n", + "despite `u`, \n", + "`v` and `w` being fixed in time, still allows for network evolution. This is \n", + "facilitated by\n", + " the appearance and disappearance of edges, governed by the parameters `beta` and `eta`. These two \n", + " modes \n", + " enhance the flexibility of the model, enabling it to effectively handle a variety of community structures. \n", + " \n", + "Let's see now how to use the `Static` mode of the `DynCRep` model to decode the temporal \n", + "relationships in the network. We will use the same synthetic network generated earlier, but this \n", + "time we will fit the `DynCRep` model in `Static` mode by setting the `temporal` parameter to `False`." + ], + "id": "8699bc2916196f8b" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:31.425319Z", + "start_time": "2024-11-07T17:47:22.704829Z" + } + }, + "cell_type": "code", + "source": [ + "u_stat, v_stat, w_stat, eta_stat, beta_stat, Loglikelihood = dyncrep.fit(\n", + " gdata,\n", + " T=T,\n", + " flag_data_T=0,\n", + " ag=1.1,\n", + " bg=0.5,\n", + " temporal=False, # <- Static mode\n", + " out_inference=False,\n", + ")" + ], + "id": "1ae7aa2265dfb62c", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:### Version: w-STATIC ###\n", + "DEBUG:root:Fixing random seed to: 0\n", + "DEBUG:root:Number of time steps L: 1\n", + "DEBUG:root:T is greater than 0. Proceeding with calculations that require multiple time steps.\n", + "DEBUG:root:Random number generator seed: 0\n", + "DEBUG:root:eta is initialized randomly.\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 0 ...\n", + "DEBUG:root:num. realization = 0 - iterations = 100 - time = 0.70 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 200 - time = 1.33 seconds\n", + "DEBUG:root:num. realization = 0 - iterations = 300 - time = 1.92 seconds\n", + "DEBUG:root:num. realizations = 0 - Log-likelihood = -26306.340911530962 - iterations = 341 - time = 2.25 seconds - convergence = True\n", + "DEBUG:root:Random number generator seed: 3440222609\n", + "DEBUG:root:eta is initialized randomly.\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 1 ...\n", + "DEBUG:root:num. realization = 1 - iterations = 100 - time = 1.11 seconds\n", + "DEBUG:root:num. realization = 1 - iterations = 200 - time = 2.34 seconds\n", + "DEBUG:root:num. realization = 1 - iterations = 300 - time = 3.59 seconds\n", + "DEBUG:root:num. realization = 1 - iterations = 400 - time = 4.42 seconds\n", + "DEBUG:root:num. realizations = 1 - Log-likelihood = -26306.34091141907 - iterations = 451 - time = 4.74 seconds - convergence = True\n", + "DEBUG:root:Random number generator seed: 641532337\n", + "DEBUG:root:eta is initialized randomly.\n", + "DEBUG:root:u, v and w are initialized randomly.\n", + "DEBUG:root:Updating realization 2 ...\n", + "DEBUG:root:num. realization = 2 - iterations = 100 - time = 0.66 seconds\n", + "DEBUG:root:num. realization = 2 - iterations = 200 - time = 1.40 seconds\n", + "DEBUG:root:num. realizations = 2 - Log-likelihood = -26336.01604861774 - iterations = 241 - time = 1.67 seconds - convergence = True\n", + "DEBUG:root:Best realization = 2 - maxL = -26336.01604861774 - best iterations = 241\n", + "DEBUG:root:Parameters won't be saved! If you want to save them, set out_inference=True.\n" + ] + } + ], + "execution_count": 22 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "As shown before, the affinity matrix `w` is now a constant matrix. ", + "id": "99f514b40c640571" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:32.023714Z", + "start_time": "2024-11-07T17:47:31.478473Z" + } + }, + "cell_type": "code", + "source": "plot_matrices(w_stat)", + "id": "b7437bb237722db7", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 23 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "### Summary\n", + "\n", + "We have shown this way how to use the `DynCRep` model to decode the temporal relationships in a network. The model provides a powerful framework for understanding the dynamic nature of complex networks, capturing the temporal evolution of community structures and reciprocity. We hope this tutorial has provided you with a solid foundation for working with the `DynCRep` model and decoding temporal relationships in dynamic networks." + ], + "id": "9fa1118285a8a6da" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-07T17:47:32.094679Z", + "start_time": "2024-11-07T17:47:32.090643Z" + } + }, + "cell_type": "code", + "source": "", + "id": "4bbfafb2b6270419", + "outputs": [], + "execution_count": null + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_sources/tutorials/JointCRep.ipynb b/_sources/tutorials/JointCRep.ipynb new file mode 100644 index 0000000..09705e0 --- /dev/null +++ b/_sources/tutorials/JointCRep.ipynb @@ -0,0 +1,1045 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analysis Of A Real-World Dataset Using The `JointCRep` Algorithm \n", + "\n", + "In this tutorial, we show how to use the `probinet` package for analyzing a real-world dataset.\n", + "\n", + "We use the `JointCRep` (**Joint** **C**ommunity and **Re**ci**p**rocity) algorithm {cite}`contisciani2022community`, which is a \n", + "probabilistic generative model designed to perform inference in directed binary networks. This method jointly models pairs of edges by assuming communities and reciprocity as the main mechanisms for tie formation. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first configure the logger to show the information about the execution of the algorithm." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:12.551052Z", + "start_time": "2025-01-27T14:46:12.510028Z" + } + }, + "source": [ + "# Import the logging module\n", + "import logging\n", + "\n", + "# Get the root logger and set its level to INFO\n", + "logging.getLogger().setLevel(logging.INFO)\n", + "logging.getLogger(\"matplotlib\").setLevel(logging.WARNING)" + ], + "outputs": [], + "execution_count": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Importing the data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a first step, we import the data using the `probinet` package. In this tutorial, we analyze a\n", + "social network that describes friendships between boys in a small high-school {cite}`contisciani2022community`. The network is represented as an adjacency matrix, where each row and column corresponds to a node in the network, and each entry in the matrix indicates whether an edge exists between the corresponding pair of nodes. The network is directed, meaning that the adjacency matrix is asymmetric." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:15.011572Z", + "start_time": "2025-01-27T14:46:13.205100Z" + } + }, + "source": [ + "from pathlib import Path\n", + "from probinet.input.loader import build_adjacency_from_file\n", + "\n", + "# Get the absolute path of the root directory of the project\n", + "root_dir = Path.cwd().parent.parent.parent.resolve()\n", + "\n", + "# Define the path to the input folder\n", + "in_folder = root_dir / \"probinet\" / \"data\" / \"input\"\n", + "\n", + "# Define the path of the adjacency matrix\n", + "adj = Path(\"highschool_network.dat\")\n", + "\n", + "# Define the complete path of the network\n", + "network = in_folder / adj\n", + "\n", + "# Flag to treat the network as undirected\n", + "undirected = False\n", + "\n", + "# Call the `build_adjacency_from_file` function to load the network data\n", + "# The function takes several arguments:\n", + "# - network: the path to the data\n", + "# - ego: the name of the column that references the node in one extreme of the directed edge\n", + "# - alter: the name of the column that references the other node\n", + "# - undirected: the flag that signals if the network is undirected\n", + "# - force_dense: if set to True, the algorithm is forced to consider a dense adjacency matrix\n", + "# - noselfloop : if set to True, the algorithm removes the self-loops\n", + "# - binary: the flag that signals if the network is binary\n", + "# - header: the row number to use as the column names\n", + "graph_data = build_adjacency_from_file(\n", + " network,\n", + " ego=\"source\",\n", + " alter=\"target\",\n", + " undirected=undirected,\n", + " force_dense=False,\n", + " noselfloop=True,\n", + " binary=True,\n", + " header=0,\n", + ")" + ], + "outputs": [], + "execution_count": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The previous call to `build_adjacency_from_file` loads the data from the input folder, and\n", + "returns a `GraphData` object containing the:\n", + "\n", + "- `graph_list`: A list with a MultiGraph (or MultiDiGraph if `undirected=False`) NetworkX object\n", + "- `adjacency_tensor`: The adjacency matrix describing the graph in `A`\n", + "- `transposed_tensor`: The transpose of the adjacency matrix `B`\n", + "- `data_values`: The observed values for the two-edge joint distributions\n", + "- `nodes`: The list of nodes in the graph" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get some information about the data, we can call the `print_graph_stats` function from the \n", + "`input.stats` module." + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:15.924192Z", + "start_time": "2025-01-27T14:46:15.906110Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.input.stats import print_graph_stats\n", + "\n", + "# Extract the graph list\n", + "A = graph_data.graph_list\n", + "# Call the `print_graph_stats` function to print the basic\n", + "# statistics of the graph in the list `A`.\n", + "print_graph_stats(A)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of nodes = 31\n", + "Number of layers = 1\n", + "Number of edges and average degree in each layer:\n", + "E[0] = 100 / = 6.45\n", + "Sparsity [0] = 0.104\n", + "Reciprocity (networkX) = 0.000\n" + ] + } + ], + "execution_count": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Configurating the model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "To configure the `JointCRep` algorithm, we will use a configuration file. This approach allows for easy customization and reuse of settings. Let's start by defining the configuration dictionary:" + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:16.013020Z", + "start_time": "2025-01-27T14:46:16.003688Z" + } + }, + "cell_type": "code", + "source": [ + "config_dict = {\n", + " \"K\": 4,\n", + " \"assortative\": False,\n", + " \"end_file\": \"_JointCRep\",\n", + " \"eta0\": None,\n", + " \"files\": \"../data/input/theta.npz\",\n", + " \"fix_communities\": False,\n", + " \"fix_eta\": False,\n", + " \"fix_w\": False,\n", + " \"initialization\": 0,\n", + " \"out_folder\": \"outputs/\",\n", + " \"out_inference\": False,\n", + " \"rseed\": 0,\n", + " \"use_approximation\": False,\n", + "}" + ], + "outputs": [], + "execution_count": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "We can also change some of the default numerical parameters and stored them into variables." + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:16.106636Z", + "start_time": "2025-01-27T14:46:16.099526Z" + } + }, + "cell_type": "code", + "source": [ + "# Change other parameters that are not part of the configuration file\n", + "num_realizations = 50\n", + "plot_loglik = False" + ], + "outputs": [], + "execution_count": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now save the configuration file to the output folder. This step is optional but recommended for future reference." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:16.156938Z", + "start_time": "2025-01-27T14:46:16.142283Z" + } + }, + "source": [ + "import yaml\n", + "\n", + "# Define the evaluation folder\n", + "out_folder = Path(config_dict[\"out_folder\"])\n", + "\n", + "# Ensure the evaluation folder exists\n", + "out_folder.mkdir(parents=True, exist_ok=True)\n", + "\n", + "# Define the path for the evaluation configuration file\n", + "output_config_path = config_dict[\"out_folder\"] + \"/setting_JointCRep.yaml\"\n", + "\n", + "# Open the evaluation configuration file in write mode\n", + "with open(output_config_path, \"w\") as f:\n", + " # Write the contents of the `conf` dictionary to the file\n", + " yaml.dump(config_dict, f)" + ], + "outputs": [], + "execution_count": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "In this step, we initialize and execute the `JointCRep` model from the `probinet` package. The `fit` function applies the model to the input data using the configuration setting defined earlier. The algorithm iteratively refines its parameters to capture community structures and reciprocity patterns in the network. The inferred parameters are stored in the variable `parameters_jointcrep`, facilitating further analysis and evaluation." + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:18.219984Z", + "start_time": "2025-01-27T14:46:16.207904Z" + } + }, + "source": [ + "from probinet.models.jointcrep import JointCRep\n", + "\n", + "# Create an instance of the `JointCRep` class\n", + "model = JointCRep(num_realizations=num_realizations, plot_loglik=plot_loglik)" + ], + "outputs": [], + "execution_count": 7 + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "ExecuteTime": { + "end_time": "2025-01-27T14:46:46.463077Z", + "start_time": "2025-01-27T14:46:18.266295Z" + } + }, + "source": [ + "# Import the `time` module\n", + "import time\n", + "\n", + "# Import the `numpy` module\n", + "import numpy as np\n", + "\n", + "# Set the logger back to INFO\n", + "logging.getLogger().setLevel(logging.INFO)\n", + "\n", + "# Get the current time\n", + "time_start = time.time()\n", + "\n", + "# Run the `JointCRep` models using the graph_data\n", + "parameters_jointcrep = model.fit(graph_data, **config_dict)\n", + "\n", + "# Print the time elapsed since the start of the `JointCRep` algorithm\n", + "print(f\"\\nTime elapsed: {np.round(time.time() - time_start, 2)} seconds.\")" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Algorithm successfully converged after 311 iterations with a maximum log-likelihood of -139.9499.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Time elapsed: 28.18 seconds.\n" + ] + } + ], + "execution_count": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyzing the results\n", + "Now that the results are obtained and the parameters are estimated, we can visually explore the network by leveraging the obtained information." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Communities" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we utilize the `NetworkX` library to visualize the graph structure and its communities. The following code snippet defines attributes such as node size, colors, and layout to enhance the visual representation. The `node_size` is proportional to the degree of each node, and the `colors` dictionary assigns distinct colors based on nodes' communities. The layout of the nodes is determined using the spring layout algorithm." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:46.545635Z", + "start_time": "2025-01-27T14:46:46.509820Z" + } + }, + "source": [ + "import networkx as nx\n", + "\n", + "# Create a graph from the first adjacency matrix in the list A\n", + "graph = A[0]\n", + "\n", + "# Define the size of each node in the graph, proportional to its degree\n", + "node_size = [graph.degree[i] * 10 for i in list(graph.nodes())]\n", + "\n", + "# Define a dictionary of colors for different communities in the graph\n", + "colors = {0: \"indianred\", 1: \"mediumseagreen\", 2: \"lightskyblue\", 3: \"sandybrown\"}\n", + "\n", + "# Compute the positions of the nodes in the graph using the spring layout algorithm\n", + "# The spring layout positions the nodes using a force-directed algorithm,\n", + "# where nodes repel each other and edges act like springs.\n", + "# The `k` argument adjusts the optimal distance between nodes\n", + "# The `iterations` defines the number of iterations to perform\n", + "# The `seed` is used for initializing the random number generator\n", + "pos = nx.spring_layout(graph, k=0.05, iterations=100, seed=20)\n", + "\n", + "# Define the color of the edges in the graph\n", + "edge_color = \"darkgrey\"\n", + "\n", + "# Define the color of the nodes in the graph\n", + "node_color = \"#3b8bc2ff\"" + ], + "outputs": [], + "execution_count": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "As a next step, we employ the `normalize_nonzero_membership` function from the `probinet.utils.matrix_operations` module to normalize the out-going (`u`) and in-coming (`v`) mixed-memberships, to give a probability interpretation. They are then stored in the `thetas` dictionary. Furthermore, the code extracts hard-memberships by identifying the community to which each node predominantly belongs, which are then stored in the `communities` dictionary." + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:46.570360Z", + "start_time": "2025-01-27T14:46:46.564879Z" + } + }, + "source": [ + "from probinet.utils.matrix_operations import normalize_nonzero_membership\n", + "\n", + "# Normalize the out-going mixed-memberships from the inferred parameters\n", + "u = normalize_nonzero_membership(parameters_jointcrep[0])\n", + "\n", + "# Normalize the in-coming mixed-memberships from the inferred parameters\n", + "v = normalize_nonzero_membership(parameters_jointcrep[1])\n", + "\n", + "# Store the normalized mixed-memberships in a dictionary for easy access\n", + "thetas = {\"u\": u, \"v\": v}\n", + "\n", + "# Extract hard-memberships by identifying the community with\n", + "# the highest membership for each node. This is done by finding\n", + "# the index of the maximum value along axis 1 (i.e., across each row).\n", + "# The result is a dictionary where the keys are `u` and `v`\n", + "# (representing out-going and in-coming memberships respectively)\n", + "# and the values are arrays of community indices.\n", + "communities = {\"u\": np.argmax(u, axis=1), \"v\": np.argmax(v, axis=1)}" + ], + "outputs": [], + "execution_count": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's now visualize these partitions for a more intuitive understanding. The following code \n", + "snippet utilizes the `plot_hard_membership` function from the `probinet.visualization.plot` module\n", + " to generate a visualization of the hard-memberships within the network, offering a clear depiction of how nodes cluster into different communities." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:48.915469Z", + "start_time": "2025-01-27T14:46:46.611706Z" + } + }, + "source": [ + "from probinet.visualization.plot import plot_hard_membership\n", + "\n", + "# Call the `plot_hard_membership` function\n", + "# The function takes several arguments:\n", + "# - graph: the NetworkX graph object representingthe network\n", + "# - communities: the dictionary containing the hard-memberships of nodes\n", + "# - pos: the dictionary specifying the positions of nodes in the graph\n", + "# - node_size: the list specifying the size of each node; here proportional to\n", + "# its degree.\n", + "# - colors: the dictionary mapping community indices to colors\n", + "# - edge_color: the string specifying the color of the edges in the graph.\n", + "_ = plot_hard_membership(graph, communities, pos, node_size, colors, edge_color)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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loqK53tCL4nMs2ePDCyyzp9/cSekoqKi8pLRmEwY0nWGFgSM+floXlPJ7bosgYPCBgGoz1KDChWVJ0ENLF4zHG1taNIcYNPabGS+pptrY14eOZ/73P7ZNkHA+cYbGPPzX/yJqaioqLwkBEEg95130q5C5L7zznM+o5dHe74WnYY9wYUA6DTQXvD6tX+pqLwI1MDiNUNjMFD0ta+ldWzRT/80mufgpH1SKP3GN8j7whcQdmXcBL2evPfeo+wXfuHlnZiKiorKS8J58yZ6h+PIGTSD04nzxo0Xd2IvGKdJ4C/VaMkxPX47/Gy1lhyTWrFQUXkSVFWo1xBZlllNSgo+8oBQePT/wp/+aQq/8pWXdo4vkkQoRGByEgBrdXXaBnsqKioqryOR9XWmfuu3iG1upv7gkT+EITeXmr/7dzF+BpylZVlmPQz+uIxdL5BvVmcrVFSeBjWweI0Jzszg+vhjvN3dSNEoGpMJx6VL5L799ms7W6GioqKicjSJcBhPVxeujz4isroKgoCpqIjcd94h+8oVtC/Rr0JFReXVRQ0sPiPIkoSgSquqqKioqDxGchugZupVVFSeFjWwUFFRUVFRUVFRUVF5atQUtoqKioqKioqKiorKU6MGFioqKioqKioqKioqT40aWKioqKioqKioqKioPDVqYKGioqKioqKioqKi8tSogYWKioqKioqKioqKylOjBhYqKioqKioqKioqKk+NGlioqKioqKioqKioqDw1amChoqKioqKioqKiovLUqIGFioqKioqKioqKispTowYWKioqKioqKioqKipPjRpYqKioqKioqKioqKg8NWpgoaKioqKioqKioqLy1KiBhYqKioqKioqKiorKU6MGFioqKioqKioqKioqT40aWKioqKioqKioqKioPDVqYKGioqKioqKioqKi8tSogYWKioqKioqKioqKylOjBhYqKioqKioqKioqKk+NGlioqKioqKioqKioqDw1amChoqKioqKioqKiovLUqIGFioqKioqKioqKispTowYWKioqKioqKioqKipPjRpYqKioqKioqKioqKg8Nf9/EZ2q/kd4m0IAAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also utilize the `plot_soft_membership` function from `probinet.visualization.plot` to\n", + "visualize the node mixed-memberships." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:53.962379Z", + "start_time": "2025-01-27T14:46:48.942157Z" + } + }, + "source": [ + "from probinet.visualization.plot import plot_soft_membership\n", + "\n", + "# Call the `plot_soft_membership` function\n", + "_ = plot_soft_membership(graph, thetas, pos, node_size, colors, edge_color)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Network reconstruction\n", + "\n", + "Now, we assess the performance of the model in network reconstruction tasks. To this end, we can use the marginal and the conditional expected values, as well as the joint distributions, as scores for the estimation of the entries of the adjacency matrix. " + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:54.035801Z", + "start_time": "2025-01-27T14:46:54.026516Z" + } + }, + "source": [ + "from probinet.evaluation.expectation_computation import (\n", + " compute_marginal_and_conditional_expectation,\n", + ")\n", + "\n", + "# Extract the adjacency tensor from the graph data\n", + "B = graph_data.adjacency_tensor\n", + "\n", + "# Convert the sparse adjacency matrix `B` to a dense representation\n", + "Bdense = B.todense()\n", + "\n", + "# Unpack the latent variables from the results of the `JointCRep` models\n", + "# The `u` variable represents the out-going memberships of the\n", + "# nodes in the graph.\n", + "# The `v` variable represents the in-coming memberships of the\n", + "# nodes in the graph.\n", + "# The `w` variable represents the affinity of the communities\n", + "# The `eta` variable represents the pair-interaction coefficient\n", + "# The `maxL` is the maximum log-likelihood achieved during the fitting\n", + "u, v, w, eta, maxL = parameters_jointcrep\n", + "\n", + "# Compute the marginal and conditional expected values of the data\n", + "# These expected values are based on the inferred parameters and provide a\n", + "# measure of the model's fit to the data.\n", + "M_marginal, M_conditional = compute_marginal_and_conditional_expectation(\n", + " B=Bdense, U=u, V=v, W=w, eta=eta\n", + ")" + ], + "outputs": [], + "execution_count": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We plot the adjacency matrices containing marginal and conditional expected values obtained with the inferred parameters. " + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:46:57.259593Z", + "start_time": "2025-01-27T14:46:54.279867Z" + } + }, + "cell_type": "code", + "source": [ + "from probinet.visualization.plot import plot_adjacency\n", + "\n", + "# Call the `plot_adjacency` function\n", + "# This function generates a visualization of the adjacency matrix\n", + "# of the network, and takes several arguments:\n", + "# - Bdense: the dense representation of the adjacency matrix\n", + "# - M_marginal: the marginal expected values\n", + "# - M_conditional: tje conditional expected values\n", + "# - nodes: the list of nodes in the graph\n", + "_ = plot_adjacency(Bdense, M_marginal, M_conditional, graph_data.nodes)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdIAAAHzCAYAAAAkSe8nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACnuUlEQVR4nOzdeXxU1d3H8e8kZMjGksiOoIiVVSRsqQikggTQYpGnLogoaCGWsrnggwqpSFXUuqCRGJRFQYuyKyIqVvMUUZYQNoUgFCOLCmggTLbJ9vyBGYgkXO7NTTIz+bx93Vc7c+/vnJMh8J2cnDnXUVxcXCwAAAAAAAAAAFCmgOoeAAAAAAAAAAAA3oyJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzoOJdAAAAAAAAAAAzqNWdQ8AAAAA8EVt2rQp9bh58+b697//XU2jkUaMGKFNmzaVeu7TTz/VxRdfXE0jAgDAOm/KWTIWgMSKdAAAAKBCIiIi1KBBA0VERFxwzYwZM9SmTRu1adNGb775pi3jqFevnho0aKAGDRrY0h4AAN7AG3KWjAUgsSIdAAAAqJClS5eaWpH23Xff6Z133vE83rt3ry3jSEhI8Pz/367iAwDAV3lDzpKxACQm0gEAAFCGF154QStWrLiga4cOHapJkyZV7oD8yLPPPqv8/HzdfPPNWrJkidLS0qp7SAAAkX3+gpwFUFmYSAcAAMA5Pv30Uy1fvlyBgYH6y1/+omXLllX3kPzCli1btG7dOsXExOi2227TkiVLtG/fPhUXF8vhcFT38ACgRiP7fB85C6AyMZEOVIEpU6acs7IhKChI4eHhql+/vtq2bauoqCgNHjxYkZGRtvZ96NAhrVixQnXq1NHIkSNtbRsA4J+OHTsmh8OhBg0aaO3atfr9739f3UPyG08//bQCAgJ0//3365JLLpHD4VB2drYOHjyoli1bVvfwAKDGIvv8AzkLoDJxs1GgCgUFBXluUFK3bl1lZWXpwIED+vDDD/Xkk0+qT58+evrpp+V2u23r8/Dhw0pISLDtRmYAAP/31VdfeSYQvvrqK/Xs2bOaR+QfPvjgA+3YsUM33HCD2rZtq5CQEDVr1kyS+Ng5AFQzss/3kbMAKhsT6UAVioqK0hdffKEvvvhCGzZs0M6dO7Vhwwa9/PLL+v3vf6/8/HzNmzdPI0eOtHUyHQAAM7766itdffXVkqTU1FR17dq1mkfk+9xut55//nkFBQVp4sSJnucvv/xySfyADwDVjezzbeQs4Pt27dqlOXPmaNy4cerTp4/atGlToZv7njx5Uv/4xz907bXXqmPHjrr22mv1xBNPKDMz03KbTKQD1eyiiy5SbGys3njjDU2ZMkWSlJKSomeffbaaRwYAqKk2b96sHj166KefflJERISCg4Ore0g+b+HChTp06JBuu+02tWjRwvN869atJUl79+6trqEBAET2+TpyFvB9s2fP1nPPPadPPvlEP/30U4Xa+uWXX3TzzTdr4cKFCgwM1HXXXaewsDC9+eabuvnmm3XixAlL7TKRDniRUaNGafDgwZKkxYsX6+jRo55zLpdLy5Yt04QJE3T99dcrKipKnTt31g033KBnnnlGv/zyyzntjRgxQnfeeaek01u8lPw2r+RYvny559offvhBc+bM0d13363rrrtOV155pbp166bbbrtNCxcuZIU8ANQQBw8eVEREhMLDw0utzrPbq6++qsGDB6u4uLhS2u/bt69efvnlCrXx7rvv6g9/+EOFM/DEiRN69dVXFRoaqr/+9a+lzl3ISrmMjAy1adNGb7/9tqTTq+46duyopKSkCo0LAHAa2Vc9vCFnf5uxEjkLVJfOnTtr7NixSkxM1Pr16+V0Oi239eSTTyo9PV2xsbFau3atXnzxRa1evVojRozQd999p5kzZ1pql5uNAl4mLi5O77//vtxutz755BMNHz5ckrRy5UrNmDFDklSrVi2Fh4fr1KlT2rdvn/bt26cPPvhAixYtKvXb93r16qlevXo6efKkAgICzrmR6dmrLJ566il99NFHkqTatWsrJCREJ0+eVGpqqlJTU/Xxxx9r7ty5FfqHDADg/X67R+y///1vvfXWW+dcd8kll2jhwoWlnlu3bp3+9re/eR4HBgaqadOm+uMf/6i//e1vngw5deqU5s2bp0cffVQOh6PMcXzzzTcaOnSoAgMDlZqaalv+7NmzR0lJSdq8ebNOnDihBg0aqGfPnvrrX/9aKkMlaciQIXrppZe0ZMkSTx5bMXv2bGVmZmrcuHG66KKL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2rp1q7p06XLO+Y8++kh5eXmeG8Od7dChQ2rdurXh1yadXuW3cePGC7q2hMPh0LZt28o8t3fv3lJv8r/99ls+bg4ANvHn7DPb/tltS7qgbD2bL+bsbzNWImdRwzkcpw97GrOpHfN69+6tgIAAbdmy5ZxtE91utz777DMFBgYqJibGdNsXvvkXgErxyy+/6OOPP9bIkSP11FNPSZJ69Oih+++/33NNVFSUateurRMnTujhhx/2fCTv1KlTSkhI0EsvvaT69euX2f4ll1yioKAgnTp1Sh999FGZ15Tckfyzzz7T/Pnz5XafvsHEoUOHNGnSJG3evLnU3nwAAJzthx9+0MmTJy/oh+CoqChJpz9OXyIpKUnFxcW6//77NXDgwFLH9ddfr8aNG58zmZCWlub54fdCfui95557FBwcrL///e86efJkqXNHjhzRs88+qwYNGpT5EfFvvvnGM+6qVFhYqP3795f6eDk/4AOAd/D27DPb/tltX0j7v+VrOVtWxkrkLGo4h0NyBNh0VP5E+qJFizRw4MBzfuHXqFEj3XDDDcrPz9f06dNVUFDgOffMM8/ol19+0Y033lhqgv1CsSIdqEKpqam65pprJJ3easXlcikvL89z3ul06o477tB9991XatV5/fr1NW7cOD333HNavXq1Vq9erbp168rlcqmoqEg33nijAgMDtWLFinP6DA0N1Q033KCVK1dqwoQJqlOnjurWrStJeuihhzRw4ED16dNHffr00f/93/9p5syZeuaZZxQeHq7MzEwFBAToscceU1JS0jl3WwYAQDpzs7WSVXbn06JFC11xxRXasGGDhgwZoh9//FGLFi3SnXfeWe7+iS1btvTsWXp2nzfeeKOk0zcGK/mlcHlatWqlp556SpMnT9bgwYN18803q2nTpkpPT9e7774rt9utOXPmnPOL6V27dunEiRPq169fuW2XnGvevLn+/e9/G70EF+y7775TXl6e54f8jIwMHTt2rNwf8EeMGKFNmzbZ1j8AoHzenH1W2j+77d+2f+jQIfXr10833XSTZs6cWWZ7vpazv81Y6fw5S8YCle/zzz/X7NmzPY/z8/MlSbfccovnubFjx3o+2ZKRkaEDBw7o2LFj57T1yCOPaPv27froo480aNAgdezYUfv27dPevXt16aWXasqUKZbGyEQ6UIXy8/N1/PhxSVKtWrUUHh6upk2bqm3bturSpYsGDx6syMjIMmvHjBmjJk2a6I033tDevXtVVFSkjh076s9//rNuueUWPfzww+X2O336dDVu3FiffPKJDh8+rMOHD0s6c6dih8OhV155RUlJSXr//fd15MgRBQYGqk+fPrr77rt19dVXKykpyeZXAwDgL0omEy70Y9lDhw7VK6+8IrfbrZdffllFRUW68847y72+RYsW2rRpk06cOKH69eurqKhI+/fv96yc27dv3wWtHrv++ut12WWXKSkpSYsXL9bJkycVGRmpvn37auzYsWrRosU5NWvXrlXz5s3VvXv3c86VbMFWIiIiwnAMZvz2hmclKwfLuwFavXr1zhlTYGCgrWMCAJzmzdlntv26deuWavu37Zf83Gi0b7gv5WxZNxU9X86SsagRqnlrl19++aXM+/+d/VzJDg1GIiMjtWTJEiUkJGjdunX65JNP1KBBA40YMUITJkzwLDA1y1F8vjsQAgAAADbLzMxUv3799Oijj2rIkCGm6w8cOKARI0Zo/fr1OnHihGJiYpSamuq5wbYk9e3bVzfddJPGjx9veZxut1t9+/ZVXFycRowYYbkdu7z11lt6/PHHtXnzZstv/gEA1cObs+/stiWd0/6//vUvPfPMM56JKLuQs4B3cLlc6tq1qw7WiVWxw/imvxfCUZyvFqc+VkpKSrmfjPFF7JEOAACAKlW3bl3dc889mjt3rqys6Th7H9d9+/apdevWpSYS7LJy5UrVqlWrzP1cq8PGjRt16aWX8sM9APggb86+3+6P/tv2N23apBEjRtg6iS6Rs4DXsW1/9F8PP8TWLgAAAKhy9957r+69915LtXv37i11s7UL2Z/WiltuuaXUnozVZcuWLfrPf/6jdevWaezYsdU9HACARd6afWe3XVb7L7zwgm19nY2cBeBrmEgHAACAT5kwYYLn/6elpalt27bVOJrK99xzz+ngwYO68847FRcXV93DAQBUg8rMvrPbroz2vR05C/yqmvdI9wVMpAMAAMAnZWVl6f/+7//04osvnnPu3//+d9UPqJL861//qu4hAAC8RGVn3/na91fkLPArW7dk8c+tXfzzqwIAAIBf2759uwYMGKDY2Fh16tSpuocDAEClq+zsI1sB4PwcxVbucgEAAAAAAAAA8Gkul0tdu3bVwYg/qtgRZEubjuJ8tchYrZSUFIWH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oktS9+7d1atXLxUXF2vnzp2mx8lEOgAAAAAAAADUZA6bDxO2bt2qU6dOqWXLlmrfvv055wcMGCBJ+uyzzwzbcjqdF9RnRESEuUHK5ET6okWLNHToUHXs2FFjx44tdW7fvn2666671L17d11zzTWaNm2acnJyTA8IAAB/QGYCAGCMvAQAAHv27JGkMifRJalDhw6SpLS0NMO2OnXqpLp162rjxo3atGlTqXObN2/W+vXrdemll6pr166mx2lqIr1Ro0YaO3asbrnllnPOPfDAA2rVqpW++OILvf/++9qzZ49mz55tekAAAPgDMhMAAGPkJQAA3sHx681G7TrM+OGHHyRJTZo0KfN8yfNHjhwxbKtOnTp64okn5HA4dOedd2rYsGG67777NGzYMI0YMUJXXnmlXn/99QteuX42UxPpsbGxuu6668pc+n7w4EHdeOONcjqdioyMVN++fbV3717TAwIAwB+QmQAAGCMvAQDwXy6Xq9ThdrvLvC47O1uSFBwcXOb5kJAQSVJWVtYF9RsbG6vXXntN9evX19atW7VmzRpt3bpVYWFhuuaaa9S4cWMLX42Ne6TffffdWrlypXJzc3Xs2DF98sknuvbaa89b43a7z3lBAQDwd2Yzk7wEANRE5CUAAFWnMlakx8TEqGvXrp4jKSmpSr6WefPmadSoUerevbvee+89paam6r333tPvf/97vfTSSxo/fryldmvZNcA+ffrokUceUZcuXVRYWKjrrrtO//M//3PemqSkJCUkJNg1BAAAfILZzCQvAQA1EXkJAEDVcTgcksktWc7TmCQpOTlZ4eHhnqfL204lNDRUkpSbm1vm+ZJ7pISFhRl2vXHjRj399NPq0KGDZs2apYCA0+vI27Rpo5deekn/8z//o88//1zJycmKiYm58K9JNq1IP3nypEaNGqWbb75Z27Zt06ZNmxQSEqLJkyefty4uLk4pKSmeIzk52Y7hAADgtaxkJnkJAKhpyEsAAHxfeHh4qaO8ifSmTZtKkn788ccyz5c836xZM8M+V61aJUm67rrrPJPoJQIDA9W/f39J0pYtWy7siziLLSvSv//+e+Xl5enOO++Uw+GQ0+nUbbfdptGjR5+3zul0WtrYHQAAX2UlM8lLAEBNQ14CAFC1KmNF+oVq27atJOmbb74p8/zXX38t6fSqciM//fSTpNM3HS1LyfMnT540NUbJ5Ir0goIC5eXlqaCgQEVFRcrLy5Pb7dZll12m0NBQvf322yooKJDL5dK7776rdu3amR4QAAD+gMwEAMAYeQkAALp06aI6dero+++/1+7du885/9FHH0mS4f04JalBgwaSpF27dpV5fufOnZKkiy++2PQ4TU2kJyYmqlOnTnr11Vf12WefqVOnTrrnnnsUFhamxMRErV69Wr///e/Vr18/ZWZm6umnnzY9IAAA/AGZCQCAMfISAAAv4bD5MMHpdGr48OGSpOnTpys7O9tzbv78+UpLS1OPHj3UsWNHz/OLFi3SwIED9dxzz5Vq67rrrpMkvf/++/rss89KnVu3bp1Wr16tgIAAz3VmmNraZfz48eXe1bRr167617/+ZXoAAAD4IzITAABj5CUAAJCksWPH6ssvv1RqaqpiY2PVrVs3HTlyRNu3b1dkZKSefPLJUtdnZGTowIEDOnbsWKnnr7vuOg0cOFBr167Vvffeq44dO+riiy/WoUOHPKvU77vvPl122WWmx2jLHul2+/7zf5a6o2tlydjMHd1LePtrEdF9nKU6K1+X1b6ssPq6V+UYrfD27yfAX1zXtompvNz/k8tSPxnrplmqs+L62RtM1+z7uew7uxuZfO3lluqqSogz0HTNzu/N7/MnSf3bNTZd0++F/7PUV/crGpquycjKt9TXNwd+MV1jdVvIG3uY/2joE4nWboSY8c49lupwWouLQqusr96/M//9XpE6lO37N0dWTV5+8aylOituHtHXdM3hX3Is9dU8MsR0Te0g8xlmVYbLbbqmzZ2vW+tr5d9M1/hrXoaHW7sfQb8OjUzXkJfVg7yseapzj3RJql27tt58800lJSVp9erVWrdunerXr6+hQ4dq4sSJatKkyQV27dCLL76oZcuWaeXKlUpLS9OePXtUp04dxcTE6I477lCfPn1Mj0/y0ol0AAAAAAAAAEDVqO6JdEkKDg7WxIkTNXHiRMNrz/epNofDoT//+c/685//bGkc5TG1RzoAAAAAAAAAADWNqRXpbrdbjz/+uDZs2KCMjAw1btxYf/nLXzyz+yNGjFBqaqqCgoI8NWvXrlXjxuY/LgwAgK8iLwEAMEZeAgDgPbxhRbq3MzWRXlBQoIYNG2rBggVq0aKFtm/frtGjR6tJkybq1auXJOnBBx/UyJEjK2OsAAD4BPISAABj5CUAAPAlprZ2CQ0N1cSJE9WyZUs5HA517txZ0dHRSklJqazxAQDgc8hLAACMkZcAAHgRh82HH6rQHul5eXnasWOH2rRp43kuMTFRPXr00JAhQ7Ry5crz1rvdbrlcrlIHAAD+hrwEAMAYeQkAALyZqa1dzlZcXKxHH31Ul1xyiWJjYyVJ999/vy6//HIFBwfrq6++0qRJkxQWFqb+/fuX2UZSUpISEhKsDgEAAK9HXgIAYIy8BACgerFHujFLE+nFxcV67LHHdODAAS1YsEABAacXtkdFRXmu6d27t2699VatWbOm3Dc6cXFxGjVqlOexy+VSTEyMlSEBAOB1yEsAAIyRlwAAVD8m0o2ZnkgvLi7W9OnTtWPHDi1YsEB16tQp99qSN0DlcTqdcjqdZocAAIDXIy8BADBGXgIAAF9heo/0xx9/XFu3btW8efNUr149z/OZmZlKTk5WTk6OCgsL9eWXX2rx4sWej+UBAFCTkJcAABgjLwEA8A4Oh8PWwx+ZWpF++PBhvf3223I6nerbt6/n+cGDB2vSpElKSEjQ/v37JUnNmzfXlClTNGjQIHtHDACAlyMvAQAwRl4CAABfYmoivXnz5kpLSyv3/JIlSyo8IAAAfB15CQCAMfISAADv4ZCNe6SLFemogIju40zXZGzmjvMlqvK1qMq+rHxfWMX3E4Cm9YOrewiG/tKrpemai8NDK2Ek1e/ii0JM15zKKaiEkZRtysA2luoujQgzXZNfUGSpr+86NDRd48q39hr2aB5pumZ9v46W+gJQuXwhLyde08p0TY/JKy31dXjuMEt1VcVKXh5fPrYSRlI2f83LOk5r00kt6pt/30ZeAvAWTKQDAAAAAAAAQE3mkH0Lyf1zQbr5m40CAAAAAAAAAFCTsCIdAAAAAAAAAGowh8PGPdJt22vdu5hake52uzV16lT17dtXUVFRGjhwoJYuXVrqmiVLlmjAgAHq3Lmz+vbtq3Xr1tk6YAAAvB15CQCAMfISAADv4XA4bD38kakV6QUFBWrYsKEWLFigFi1aaPv27Ro9erSaNGmiXr166Z133tGCBQv0wgsvqF27dvr555+Vk5NTWWMHAMArkZcAABgjLwEAgC8xNZEeGhqqiRMneh537txZ0dHRSklJ0dVXX62XXnpJTz/9tNq3by9JatCgwXnbc7vdcrvdnscul8vMcAAA8ErkJQAAxshLAAC8h4ObjRqq0B7peXl52rFjh/74xz/qwIEDOn78uL755hvFx8eroKBAffr00ZQpUxQeHl5mfVJSkhISEioyBAAAvB55CQCAMfISAAB4M1N7pJ+tuLhYjz76qC655BLFxsbqxIkTkqQNGzZo6dKlWrlypQ4dOqQnn3yy3Dbi4uKUkpLiOZKTk60OBwAAr0ReAgBgjLwEAKB6sUe6MUsr0ouLi/XYY4/pwIEDWrBggQICAhQWFibp9JuXyMhIz/+///77y23H6XTK6XRaGQIAAF6PvAQAwBh5CQAAfIHpifTi4mJNnz5dO3bs0IIFC1SnTh1JUqtWrVS7dm3bBwgAgC8iLwEAMEZeAgDgHdgj3ZjprV0ef/xxbd26VfPmzVO9evU8zwcHB+vGG2/Ua6+9ppMnTyozM1Ovvfaa+vXrZ+uAAQDwBeQlAADGyEsAALyDw2Hn9i7V/dVUDlMT6YcPH9bbb7+tAwcOqG/fvoqKilJUVJTi4+MlSY888ogaNWqkfv36aeDAgWrWrJmmTJlSKQMHAMBbkZcAABgjLwEAgC8xtbVL8+bNlZaWVu750NBQzZw5s8KDAgDAl5GXAAAYIy8BAPAiDtm2krzYT1ekW7rZKMzL2JxQ3UPABYroPs5SnZU/Y74vqkdV/hkD3iTEGVjdQzDUrVmk6Zqm9YMrYSTVL9TCn1dY7ap7a5dyJNNSXczvGpquKSouttRXywahpmus/vDgDDS9Y6Ke+1MHS33lFxSZrsnJLzRd892xbNM1khQRFmS65vgpt6W+ggLN/4F1bFHP+CLUaL6Ql60bh5mu+S7p1koYSfWzkpeOKtxz4JapKyzV/fTOGNM15GVpxRZeDyvfGx2nfGi6RpI2Te9vuqbI2h+xMnPyTdc0iwix1hngx5hIBwAAAAAAAIAaLCDAIUeAPb9oLA5wyPzSD+9n/leBAAAAAAAAAADUIKYm0t1ut6ZOneq5EczAgQO1dOlSz/ldu3Zp2LBh6tKli/r166eVK1faPV4AALweeQkAgDHyEgAA7+Fw2Hv4I1NbuxQUFKhhw4ZasGCBWrRooe3bt2v06NFq0qSJOnXqpDFjxmj8+PG65ZZbtGvXLt199926+OKL1a1bt8oaPwAAXoe8BADAGHkJAID3cDgc9t1Dwk9n0k1NpIeGhmrixImex507d1Z0dLRSUlJUWFgop9OpYcOGSZKuuuoqxcbGaunSpbzRAQDUKOQlAADGyEsAAOBLKrRHel5ennbs2KE2bdqoqKjonDsiFxUVKS0trdx6t9stl8tV6gAAwN+QlwAAGCMvAQCoPmztYszUivSzFRcX69FHH9Ull1yi2NhYnTx5Ujk5OVq0aJFuvfVW7dixQ5988okuuuiicttISkpSQkKC1SEAAOD1yEsAAIyRlwAAwNtZmkgvLi7WY489pgMHDmjBggUKCAhQRESEEhMT9eyzz+rll19W69atNXToUG3fvr3cduLi4jRq1CjPY5fLpZiYGCtDAgDA65CXAAAYIy8BAKh+7JFuzPREenFxsaZPn64dO3ZowYIFqlOnjudc165dtXjxYs/jSZMmqXv37uW25XQ65XQ6zQ4BAACvR14CAGCMvAQAAL7C9ET6448/rq1bt+qNN95QvXr1Sp375ptvdPnll6uoqEjvvfeeNm3apBUrVtg2WAAAfAV5CQCAMfISAADvwIp0Y6Ym0g8fPqy3335bTqdTffv29Tw/ePBgPf7441q4cKE++eQTFRYWKioqSm+88YYaN25s+6ABAPBm5CUAAMbISwAAvIetNwn1z3l0cxPpzZs3P+9d0p966ik99dRTFR4UAAC+jLwEAMAYeQkAAHyJpZuNAv4sY3NClfUV0X1clfVVlV+Xt+O1QE2VmVNgqa5eaJDNIylfVp75MR7OyLHU16UNwyzVVRUrH6vMzMm31FfdEPN/xsM7N7fUV4670HTNwZ+zLfV1PNttuqZJnWBLfUWEmX8NU37IsNRX68bhpmuCagWYrunUsp7xRTZpcVFolfUFGCksKrZUVyuw6pbfZeWZ/7e0fhXmeVWykpfFxdb+jK30tWPOnZb6spKXl970T0t9bX9roukaq9/vdYLNT0NVZV5asWvmoCrppyLCLbzuqHnY2sWY+XfUAAAAAAAAAADUIPxKCgAAAAAAAABqMPZIN2Z6RfqMGTMUExOjLl26qHfv3nriiSfkdp/+2KzL5dIDDzygLl26qGfPnnrllVdsHzAAAL6AvAQAwBh5CQAAfIXpifTbb79dH374obZu3apVq1Zpz549ev311yWdfhN04sQJff7553rrrbe0ZMkSrVy50u4xAwDg9chLAACMkZcAAHgHhxyefdIrfPjpknTTE+mtW7dWaOiZmwEFBAQoPT1dOTk5+uCDDzRp0iTVrVtXrVq10h133KGlS5faOmAAAHwBeQkAgDHyEgAA71CytYtdhz+ydLPROXPmKCoqSldffbX27NmjO+64QwcOHFB+fr7atWvnua5du3ZKS0srtx232y2Xy1XqAADAX5CXAAAYIy8BAIAvsHSz0TFjxmjMmDHav3+/3nvvPTVs2FCHDh1SaGioatU602SdOnWUlZVVbjtJSUlKSEiwMgQAALweeQkAgDHyEgCA6leyLYtNjdnTjpextCK9ROvWrdW2bVtNmTJFoaGhysnJUUFBgee8y+VSWFhYufVxcXFKSUnxHMnJyRUZDgAAXom8BADAGHkJAAC8maUV6WcrKChQenq6WrVqpVq1amnPnj3q2LGjJGn37t264ooryq11Op1yOp0VHQIAAF6PvAQAwBh5CQBA9bB1b3P/XJBubkV6VlaWli1bpszMTBUXFystLU2JiYnq1auXQkJCdP3112vWrFk6deqUvvvuOy1atEg333xzZY0dAACvRF4CAGCMvAQAAL7E1Ip0h8Oh1atX65lnnpHb7VZkZKRiY2M1YcIESVJ8fLzi4+PVp08fBQcHa/jw4RoyZEhljBsAAK9FXgIAYIy8BADAe7BHujFTE+mhoaGaP39+uefDw8P1/PPPV3hQAAD4MvISAABj5CUAAN6DrV2MVXiPdHifiO7jTNdkbPbPu9t7+2vB616av74eOMPb/076mu+OZSk0+8LfoVzaINRSP7sPZ5quWbb7R0t9/e3qS03XRIRZ2w93z5FTpmuCg6zdp/3ShuXfHK886cezTddcYvHP+MDRLNM1TSOCLfX16d6jpmuuu6KRpb5aFRWbrjmSkWupr3qhQaZrmoRaew1RMUcycizV1Qsx/2e828K/M5L01Q8Zpms2HThhqa837+hiqc6X5LoLFeguvODrrf5bbyUvj2fnWeqrY7N6pmsCA6zNarQev8J0zfZnB1vqKzzY/BTFz6fMv4YX1altukaSsnILjC/6jYZ1rfXV56nPTNccW/O/lvoqsJCXVufIagWa//v1h1YNLfaGivDXvNxxyFpfc269ylId/AsT6QAAAAAAAABQg7G1izFrv2oHAAAAAAAAAKCGYEU6AAAAAAAAANRkNu6RXuyfC9LNr0ifMWOGYmJi1KVLF/Xu3VtPPPGE3G63JOnFF1/U4MGD1b59ez3xxBO2DxYAAF9BXgIAYIy8BAAAvsL0RPrtt9+uDz/8UFu3btWqVau0Z88evf7665KkSy65RA8++KD69u1r+0ABAPAl5CUAAMbISwAAvEPJHul2Hf7I9NYurVu3LvU4ICBA6enpkqSbbrpJkvThhx/aMDQAAHwXeQkAgDHyEgAA7+CwcWsXP51Ht7ZH+pw5c5SYmKjs7GzVr19fDz74oKXO3W6352N7kuRyuSy1AwCANyIvAQAwRl4CAABfYGkifcyYMRozZoz279+v9957Tw0bNrTUeVJSkhISEizVAgDg7chLAACMkZcAAFQ/O7dk8detXUzvkX621q1bq23btpoyZYql+ri4OKWkpHiO5OTkigwHAACvRF4CAGCMvAQAAN7M0or0sxUUFHj2sDPL6XTK6XRWdAgAAHg98hIAAGPkJQAA1YMV6cZMrUjPysrSsmXLlJmZqeLiYqWlpSkxMVG9evWSJOXn5ysvL0+FhYUqKipSXl6e8vPzK2XgAAB4K/ISAABj5CUAAPAlplakOxwOrV69Ws8884zcbrciIyMVGxurCRMmSJKmTZumFStWeK5ftGiRbrrpJs2cOdPeUQMA4MXISwAAjJGXAAB4D4fj9GFXW/7I1ER6aGio5s+fX+75mTNn8qYGAFDjkZcAABgjLwEA8B5s7WKswnukw/tkbOZO9SWq8rWI6D7OdI23jw+wG/8+2evShmEKDw+74Ouzcgss9dOueV3TNVMt1EjSgs3fma65rN6FvwZn63NFQ0t1VSUyLMh0zZGMHEt9tWpk/jVcvuOQpb7mbThouqZZWIilvvZkZJqu+fzbE5b6mtjzUvM1C7da6it1xgBLdTitWYS17ycrul0WUXV111jqqkYIdgYqxBl4wddXZV5atfVAhumakOYX/hqcbf/LN1mqqyrOWqZ2rJUkdZ++zlJfm/9+nekaq3n57ccfm67ZeWc3S31Zycu6TvPvUyTpiovqmK6591/W8vLT+/pYqsNpfpuXQAUwkQ4AAAAAAAAANRhbuxgz/6tbAAAAAAAAAABqENMr0mfMmKF169bp1KlTCgsL08CBAzV58mSdOnVKTz75pDZv3iyXy6WWLVtq/Pjx6tevX2WMGwAAr0ZeAgBgjLwEAMA7sEe6MdMr0m+//XZ9+OGH2rp1q1atWqU9e/bo9ddfV3Z2ttq3b693331XW7Zs0YQJE/TAAw9o3759lTFuAAC8GnkJAIAx8hIAAPgK0yvSW7duXepxQECA0tPT1aJFC91zzz2e5/v27atWrVpp27Ztuvzyyys+UgAAfAh5CQCAMfISAADvwB7pxizdbHTOnDlKTExUdna26tevrwcffPCca37++Wft379fbdq0Kbcdt9stt9vteexyuawMBwAAr0ReAgBgjLwEAAC+wNJE+pgxYzRmzBjt379f7733nho2bFjqvNvt1n333adBgwbpyiuvLLedpKQkJSQkWBkCAABej7wEAMAYeQkAQPULcDgUwJL08zK9R/rZWrdurbZt22rKlCme59xutyZMmKCQkBDNmDHjvPVxcXFKSUnxHMnJyRUZDgAAXom8BADAGHkJAED1cejM9i4VPiyOITc3V7NmzdKAAQN05ZVXqlevXnr44Yf1008/WWrv0KFDio+PV9++fdWxY0dFR0fr1ltv1euvv26pPUsr0s9WUFCg9PR0Saff5EycOFH5+flKTEyU0+k8b63T6TS8BgAAf0BeAgBgjLwEAKBmysvL01133aVt27apYcOG6tevnw4fPqzly5fr888/17vvvqsWLVpccHvJycmaOHGicnNz1b59e3Xu3FknTpzQ3r179c477+gvf/mL6TGamkjPysrS2rVr1b9/f9WpU0d79+5VYmKievXqpfz8fE2aNEk5OTlKSkriDQwAoMYiLwEAMEZeAgDgPRwOhxw2bclipZ3Zs2dr27ZtioqK0ty5cxUWFiZJmj9/vmbOnKlHHnlECxcuvKC29u/fr/HjxyssLEzz5s1Tly5dPOeKior09ddfmx6fZHIi3eFwaPXq1XrmmWfkdrsVGRmp2NhYTZgwQampqfr0009Vu3Zt/f73v/fUxMXF6d5777U0OAAAfBF5CQCAMfISAABIpz+F9tZbb0mS4uPjPZPokjRq1CitWLFCmzZt0q5du9SxY0fD9mbOnKm8vDy9/PLLpSbRJSkgIOC891w5H1MT6aGhoZo/f36Z53r06KG0tDRLgwAAwJ+QlwAAGCMvAQDwHgGO04ctTLazdetWnTp1Si1btlT79u3POT9gwAClpaXps88+M5xI/+GHH7R+/Xq1aNFCMTEx5gZioMJ7pKNmi+g+znRNxuaEShhJ9fP2r8vbx1eVrHzfSryG8H1hwd4f+yO7X2q65vvj2fYPxGZTP9xjuuYfg9qarqkTEmS6xqqhnS6u0joroi6tb7pmWFRL+wdSjtQZAyzVZeUVmK6pXSvAdM2RjFzTNZKUnpFluuaU2/zXJEmrvj5muibplk6W+kLN4Qt52aVVhOkaq3nZskGopTorIvr/w3RNxidTTdds/vt1pmusspyX65+xeSTls5KXVenT+/pYqiMvzyAv4e327Dn981JZk+iS1KFDB0m6oF+yb9y4UUVFRYqKilJBQYE+/vhjbd26VUVFRfrd736n66+/XvXq1bM0Tu9/hwAAAAAAAAAAqDTVuUf6Dz/8IElq0qRJmedLnj9y5IhhW/v375d0+pNvw4cP17Zt20qdf/HFFzVr1qxSW8ddKPO/agMAAAAAAAAA+A2Hw95DklwuV6nD7XaX2Xd29ulPTQUHB5d5PiQkRNLpG5UbOXnypCRp6dKl+u9//6vnnntOmzZt0tq1a3XjjTfqxIkTGjdunH766SezLxET6QAAAAAAAAAAe8XExKhr166eIykpqdL7LC4uliQVFBRo+vTp+uMf/6h69eqpVatWevbZZ3XllVfq1KlTevvtt023bXprlxkzZmjdunU6deqUwsLCNHDgQE2ePFlOp9NzzfHjx3X99deradOmWrVqlelBAQDg68hLAACMkZcAAHgPh9m7hBpITk5WeHi45/HZ+X620NDT9+PIzS37ngM5OTmSpLCwMMM+S9oKDQ3VoEGDzjk/dOhQ7dy5U5s2bTJs67dMr0i//fbb9eGHH2rr1q1atWqV9uzZo9dff73UNY8//rjatWtnejAAAPgL8hIAAGPkJQAA/is8PLzUUd5EetOmTSVJP/74Y5nnS55v1qyZYZ8l1zRr1qzMvdqbN28uSfrll1+Mv4DfMD2R3rp1a8/MviQFBAQoPT3d83jdunU6efKk/vSnP5keDAAA/oK8BADAGHkJAIB3CHDYe5jRtm1bSdI333xT5vmvv/5aktSmTRvDttq3by/pzF7pv1Xy/NnvPy6UpT3S58yZo6ioKF199dXas2eP7rjjDknSqVOnNHPmTE2fPv2C2nG73edsOg8AgL8gLwEAMEZeAgBQs3Xp0kV16tTR999/r927d59z/qOPPpIkXXvttYZtRUVFqX79+jp+/Lj++9//nnN+8+bNkmTp026WJtLHjBmj1NRUrVmzRrfddpsaNmwoSXr22Wd100036dJLL72gdpKSkkptOB8TE2NlOAAAeCXyEgAAY+QlAADVz+Fw2HqY4XQ6NXz4cEnS9OnTlZ2d7Tk3f/58paWlqUePHurYsaPn+UWLFmngwIF67rnnSrVVq1YtjRo1SsXFxXr88cdL/WJ9w4YNWrFihRwOh2677TbTr5Hpm42erXXr1mrbtq2mTJmicePGaevWrVq+fPkF18fFxWnUqFGexy6Xizc7AAC/Q14CAGCMvAQAoPo4HKcPu9oya+zYsfryyy+Vmpqq2NhYdevWTUeOHNH27dsVGRmpJ598stT1GRkZOnDggI4dO3ZOW/fcc482btyoDRs2aMCAAbrqqquUkZGh7du3q7CwUPfdd586depkeowVmkiXpIKCAqWnp+vLL7/UwYMH1bt3b0mnP1aXl5en6Ohovf/++2rUqNE5tU6ns9xN5gEA8CfkJQAAxshLAABqptq1a+vNN99UUlKSVq9erXXr1ql+/foaOnSoJk6cqCZNmlxwW0FBQZozZ44WLFigVatWaf369QoKClL37t01cuTIC9oipiymJtKzsrK0du1a9e/fX3Xq1NHevXuVmJioXr16adSoUbr55ps9165du1ZLlizR3LlzddFFF1kaHAAAvoi8BADAGHkJAID3CHA4FGDTkvRii+0EBwdr4sSJmjhxouG148eP1/jx48s9HxQUpNGjR2v06NGWxlIWUxPpDodDq1ev1jPPPCO3263IyEjFxsZqwoQJCgkJUXh4uOfaunXrqlatWqZ+WwAAgD8gLwEAMEZeAgAAX2JqIj00NFTz58+/oGuHDh2qoUOHWhoUAAC+jLwEAMAYeQkAgPeo7j3SfUGF90hHzZaxOaFK+onoPq5K+pGq7mvyFf742vNnDPiXlg1Cq3sIhv4xqG2V9PPkp3st1R38Jdd0TeLN5m/O4wu2fXfCUt21Dy0zXdOnXwdLfa2K+73pms/SjpquubbNuXtQX4iq/Dt5fYemVdaXv4q4+n5T1zuK89WiksaCyuULeZnxydQq6Wf34UxLddc+8p7pmh/fuMNSX97Ocl7eMs10TZ97hlvqi7w8g7ysOPISEhPpAAAAAAAAAFCjORwOOWxaSm5XO96GiXQAAAAAAAAAqMHY2sWY6Yn0GTNmaN26dTp16pTCwsI0cOBATZ48WU6nUyNGjFBqaqqCgoI8169du1aNGze2ddAAAHg78hIAAGPkJQAA8BUBZgtuv/12ffjhh9q6datWrVqlPXv26PXXX/ecf/DBB5Wamuo5eJMDAKiJyEsAAIyRlwAAeIcAh8PWwx+ZXpHeunXrUo8DAgKUnp5u24AAAPAH5CUAAMbISwAA4CtMr0iXpDlz5igqKkpXX3219uzZozvuOHMX6sTERPXo0UNDhgzRypUrz9uO2+2Wy+UqdQAA4C/ISwAAjJGXAABUP4fNhz+ydLPRMWPGaMyYMdq/f7/ee+89NWzYUJJ0//336/LLL1dwcLC++uorTZo0SWFhYerfv3+Z7SQlJSkhIcH66AEA8GLkJQAAxshLAADgCyytSC/RunVrtW3bVlOmTJEkRUVFqU6dOgoKClLv3r116623as2aNeXWx8XFKSUlxXMkJydXZDgAAHgl8hIAAGPkJQAA1cfhcNh6+CNLK9LPVlBQUO4edgEB55+ndzqdcjqdFR0CAABej7wEAMAYeQkAQPUIcJw+7FDsn/Po5lakZ2VladmyZcrMzFRxcbHS0tKUmJioXr16KTMzU8nJycrJyVFhYaG+/PJLLV68WLGxsZU1dgAAvBJ5CQCAMfISAAD4ElMr0h0Oh1avXq1nnnlGbrdbkZGRio2N1YQJE5STk6OEhATt379fktS8eXNNmTJFgwYNqpSBAwDgrchLAACMkZcAAHgPO7dkYWsXSaGhoZo/f36Z50JCQrRkyRJbBgUAgC8jLwEAMEZeAgAAX1LhPdIBsyK6jzNdk7E5oRJG4ruq8jXktQf8x3+PZlmqu6xRmM0jKd+pnHzTNWG1rb2dCbBrA8BKkn4823TN/177O0t9BVp4LY5l5lnqK9QZaLomLNjan/H0j9NM14y7+lJLfW2cdYvpmqMua6+hFde2aVRlfcG3ZHz5vKnrXS6Xron+uJJG4x0Ki4ot1Vn5t9Qq8vKM6178j+maTyb2stTXj2/cYbrGF/Iy4roZpmv2rXjIUl9H1r9ouiYlPcNSX1aQlyhPTchLh+P0YVdb/sjUHukAAAAAAAAAANQ0rEgHAAAAAAAAgJrMxj3S/XVJOhPpAAAAAAAAAFCDBUiyazcvf90CxfTXNWPGDMXExKhLly7q3bu3nnjiCbndbs/5JUuWaMCAAercubP69u2rdevW2TpgAAB8AXkJAIAx8hIAAPgK0xPpt99+uz788ENt3bpVq1at0p49e/T6669Lkt555x3NmzdPL7zwglJTU/Xuu++qTZs2tg8aAABvR14CAGCMvAQAwDs4ft3axa7DH5ne2qV169alHgcEBCg9PV2FhYV66aWX9PTTT6t9+/aSpAYNGtgzSgAAfAx5CQCAMfISAAD4Cktb1syZM0dRUVG6+uqrtWfPHt1xxx06cOCAjh8/rm+++UZ9+/ZVnz59NHXqVLlcrnLbcbvdcrlcpQ4AAPwFeQkAgDHyEgCA6uew+fBHlibSx4wZo9TUVK1Zs0a33XabGjZsqBMnTkiSNmzYoKVLl2rlypU6dOiQnnzyyXLbSUpKUteuXT1HTEyMpS8CAABvRF4CAGCMvAQAAL6gQjdRbd26tdq2baspU6YoLCxMkhQXF6fIyEhFRkYqLi5On332Wbn1cXFxSklJ8RzJyckVGQ4AAF6JvAQAwBh5CQBA9QlwOGw9/JHpPdJ/q6CgQOnp6WrVqpVq165tqtbpdMrpdFZ0CAAAeD3yEgAAY+QlAADVw+E4fdjVlj8ytSI9KytLy5YtU2ZmpoqLi5WWlqbExET16tVLwcHBuvHGG/Xaa6/p5MmTyszM1GuvvaZ+/fpV1tgBAPBK5CUAAMbISwAA4EtMrUh3OBxavXq1nnnmGbndbkVGRio2NlYTJkyQJD3yyCN6/PHH1a9fPzmdTvXt21dTpkyplIEDAOCtyEsAAIyRlwAAeA+HwyGHTUvJ7WrH25iaSA8NDdX8+fPPe37mzJkVHhQAAL6MvAQAwBh5CQAAfEmF90gHzMrYnFDdQziviO7jLNVZ+bqqsi8AKCgsqu4hGAoMML9ywU8XO1j68youLrbYm/kX0VnL2j3rrfwZz/rPfkt9/T22jemazJx8S33lF5p/7esHB1nqC0Dl8oVYIS/PaBIZarqmKldKVmVeRt42z1JfGeumma6xmpcWvizyEqgi7JFuzNq/6AAAAAAAAAAA1BCsSAcAAAAAAACAGizA4VCATUvJ7WrH25hekT5jxgzFxMSoS5cu6t27t5544gm53W5J0q5duzRs2DB16dJF/fr108qVK+0eLwAAPoG8BADAGHkJAIB3KNnaxa7DH5meSL/99tv14YcfauvWrVq1apX27Nmj119/XZmZmRozZoxuvPFGbd68Wc8//7xmzJihLVu2VMa4AQDwauQlAADGyEsAAOArTE+kt27dWqGhZ27mERAQoPT0dKWmpsrpdGrYsGEKDAzUVVddpdjYWC1dutTWAQMA4AvISwAAjJGXAAB4B4fDYevhjyztkT5nzhwlJiYqOztb9evX14MPPqjjx4+ruLi41HVFRUXau3dvue243W7Px/YkyeVyWRkOAABeibwEAMAYeQkAAHyBpYn0MWPGaMyYMdq/f7/ee+89NWzYUBdffLFycnK0aNEi3XrrrdqxY4c++eQTXXTRReW2k5SUpISEBMuDBwDAm5GXAAAYIy8BAKh+AbKwdcl52vJHFfq6WrdurbZt22rKlCmKiIhQYmKiVq9erV69eum5557T0KFDVb9+/XLr4+LilJKS4jmSk5MrMhwAALwSeQkAgDHyEgAAeDNLK9LPVlBQoPT0dElS165dtXjxYs+5SZMmqXv37uXWOp1OOZ3Oig4BAACvR14CAGCMvAQAoHrYube5v+6RbmpFelZWlpYtW6bMzEwVFxcrLS1NiYmJ6tWrlyTpm2++kdvtVm5urt59911t2rRJd911V6UMHAAAb0VeAgBgjLwEAAC+xNSKdIfDodWrV+uZZ56R2+1WZGSkYmNjNWHCBEnSwoUL9cknn6iwsFBRUVF644031Lhx40oZOAAA3oq8BADAGHkJAID3cDikAJsWkvvpgnRzE+mhoaGaP39+ueefeuopPfXUUxUeFAAAvoy8BADAGHkJAID3CLBxIt2udrxNhfdIr2kiuo+zVJexmbvH+4qq/LPyhe8Lq9/zVvjC6wHfYfZ711FcoBaVNJbKcjQzV1mFFx7lVzStY6mfwqJi0zWrvz5iqa8/XdncUp0VRzPzzBcVm38tJKlRvWDTNZHh5vf53f9TlukaSUo/ab4utl0TS31ZMbF36yrrq25IkKW6EXM+M13TvaO11zCpRSfTNSez803X1Au19lp4u2KLf4+t7PVZUFhkqa8CC//u5hdY66vlzebefzmK3D6Xl2YFWPzp30pedpn2kaW+tj8x0FKdFd8dM58RlzYMq4SRlG3hiC6ma3LchZb6uvvtVNM1/xrZzVJfVvyy+O4q68tqXkZcM9nmkZQv44tnTdeQl2f4a14WFlr7ui7+88umrq8JeVkTMZEOAAAAAAAAADUYNxs1ZupmowAAAAAAAAAA1DSsSAcAAAAAAACAGow90o1ZXpGem5ur/v37q1u3M/t9uVwuPfDAA+rSpYt69uypV155xZZBAgDgq8hLAACMkZcAAMDbWV6RPmvWLDVr1kwZGRme52bMmKETJ07o888/188//6xRo0apefPmGjJkiB1jBQDA55CXAAAYIy8BAKheDsfpw662/JGlFem7du3S+vXrNXr0aM9zOTk5+uCDDzRp0iTVrVtXrVq10h133KGlS5eW247b7ZbL5Sp1AADgL8hLAACMkZcAAFS/AIfD1sMfmV6RXlBQoGnTpik+Pl5FRUWe5w8cOKD8/Hy1a9fO81y7du2UlJRUbltJSUlKSEgwOwQAALweeQkAgDHyEgAA+ArTK9Lnzp2rdu3aqXv37qWez87OVmhoqGrVOjM3X6dOHWVlZZXbVlxcnFJSUjxHcnKy2eEAAOCVyEsAAIyRlwAAeIcAmw9/ZGpFenp6uhYvXqwVK1accy40NFQ5OTkqKCjwvNlxuVwKCwsrtz2n0ymn02lyyAAAeDfyEgAAY+QlAADwJaYm0lNSUnT8+HENGDBA0umP4WVlZSk6Olovv/yyatWqpT179qhjx46SpN27d+uKK66wf9QAAHgx8hIAAGPkJQAA3oObjRozNZE+aNAg9ezZ0/M4NTVVU6dO1apVqxQZGanrr79es2bN0vPPP6+ff/5ZixYt0sSJE20fNAAA3oy8BADAGHkJAAB8iamJ9JCQEIWEhHgeR0ZGyuFwqEmTJpKk+Ph4xcfHq0+fPgoODtbw4cM1ZMgQWwcMAIC3Iy8BADBGXgIA4D0CHA4F2LSU3K52vI2pifTfio6O1pYtWzyPw8PD9fzzz1d4UAAA+BPyEgAAY+QlAADVxyEbt3axpxmvU6GJ9JooY3NCdQ8BXiqi+zjTNVX5/WRlfJK1MVrtC4A5jeoGKzw8+IKvz8zJt9RP3ZAg0zV/urK5pb7y8gtN1zhrWbsnfKO6tS3VVZWgQPNf16UNQy31dYmFuqy8Akt9xT7/H9M1b4zqbqmvbLf576f7l++w1NfWx2NN11w+caWlvnRLJ9MlYbUDrfXlhxxVuEKqloW/x6frzNcEB1n7M25/TWdT1xe7c5SVbqkrn1FcXGypLjDA/PfW9icGWuqrKvPy0obl3+DVV1l9Lf4xqK3pGqt5edVDq03XfP3PwZb6Kig0/z1/8bDXLPWV8cWzpmsiej1kqS8ryMsz/DUvZf5HG0nkJU5jIh0AAAAAAAAAarAAx+nDrrb8kbVf+QAAAAAAAAAAUENYnkjPzc1V//791a1bN89zL774ogYPHqz27dvriSeesGWAAAD4MvISAABj5CUAANWr5Gajdh3+yPJE+qxZs9SsWbNSz11yySV68MEH1bdv3woPDAAAf0BeAgBgjLwEAADeztJE+q5du7R+/XqNHj261PM33XSTYmJiFB4ebsvgAADwZeQlAADGyEsAALyAQ3LYdMg/F6Sbv9loQUGBpk2bpvj4eBUVFVWoc7fbLbfb7Xnscrkq1B4AAN6CvAQAwBh5CQCAd+Bmo8ZMT6TPnTtX7dq1U/fu3bVx48YKdZ6UlKSEhIQKtQEAgDciLwEAMEZeAgAAX2FqIj09PV2LFy/WihUrbOk8Li5Oo0aN8jx2uVyKiYmxpW0AAKoLeQkAgDHyEgAA7+H49T+72vJHpibSU1JSdPz4cQ0YMEDS6Y/hZWVlKTo6WnPmzNFVV11lqnOn0ymn02mqBgAAb0deAgBgjLwEAAC+xNRE+qBBg9SzZ0/P49TUVE2dOlWrVq1SZGSk8vPzVVRUpMLCQhUVFSkvL08BAQEKCgqyfeAAAHgr8hIAAGPkJQAA3oM90o2ZmkgPCQlRSEiI53FkZKQcDoeaNGkiSZoyZUqpj+UtWrRIN910k2bOnGnTcAEA8H7kJQAAxshLAADgS0zfbPRs0dHR2rJli+fxzJkzeVMDAMBvkJcAABgjLwEAqD6sSDdWoYl0AGdkbE6o7iFUioju40zX+OtrAfi6uiHe/1H42kGB1T0ErxEebP5t2teHMi31FRRo/p3uFU3rWOrri4evtVRXVf7co7mluvYPrTFds2/WEEt9WVFUXGVdwcccOfSLuYKCXNWtnKF4DYfD+3/6Jy/PsPLn1fMfn1rqa9btnU3XtG4cbqmvqsyI2hbeIjb93SWW+oro/w/TNRnrn7HUlxXkJcpTE/LS4bAvA30gSi0JqO4BAAAAAAAAAADgzViRDgAAAAAAAAA1GFu7GLO8Ij03N1f9+/dXt27dJEk///yzHnjgAfXp00ddunTRkCFD9Omn1j4uBQCAvyAvAQAwRl4CAABvZ3kifdasWWrWrJnncXZ2ttq3b693331XW7Zs0YQJE/TAAw9o3759tgwUAABfRF4CAGCMvAQAoHqd3iPdvsOK3NxczZo1SwMGDNCVV16pXr166eGHH9ZPP/1Uoa/tu+++U6dOndSmTRuNHDnScjuWJtJ37dql9evXa/To0Z7nWrRooXvuuUdNmjRRQECA+vbtq1atWmnbtm2WBwcAgC8jLwEAMEZeAgCAvLw83XXXXZo9e7aysrLUr18/NW3aVMuXL9eQIUN08OBBy21PmzZNbre7wmM0vUd6QUGBpk2bpvj4eBUVFZV73c8//6z9+/erTZs25V7jdrtLfREul8vscAAA8ErkJQAAxshLAAC8Q4DDoQCrS8nLaMus2bNna9u2bYqKitLcuXMVFhYmSZo/f75mzpypRx55RAsXLjTd7pIlS7Rp0ybdeuuteuedd0zXn830RPrcuXPVrl07de/eXRs3bizzGrfbrfvuu0+DBg3SlVdeWW5bSUlJSkhIMDsEAAC8HnkJAIAx8hIAAO9QnTcbdbvdeuuttyRJ8fHxnkl0SRo1apRWrFihTZs2adeuXerYseMFt3v8+HE9++yzuuaaa3TDDTdU7UR6enq6Fi9erBUrVpR7jdvt1oQJExQSEqIZM2act724uDiNGjXK89jlcikmJsbMkAAA8DrkJQAAxshLAAAgSVu3btWpU6fUsmVLtW/f/pzzAwYMUFpamj777DNTE+lPPPGEcnNz9fe//10//vhjhcdpaiI9JSVFx48f14ABAySd/hheVlaWoqOjNWfOHLVr104TJ05Ufn6+EhMT5XQ6z9ue0+k0vAYAAF9DXgIAYIy8BADAe1TkJqFltWXGnj17JKnMSXRJ6tChgyQpLS3tgttMTk7WmjVrNGHCBF1yySVVP5E+aNAg9ezZ0/M4NTVVU6dO1apVqxQZGalJkyYpJydHSUlJvIEBANRY5CUAAMbISwAAIEk//PCDJKlJkyZlni95/siRIxfUXnZ2tqZPn65WrVqVupl5RZmaSA8JCVFISIjncWRkpBwOh5o0aaJNmzbp008/Ve3atfX73//ec01cXJzuvfde2wYMAIC3Iy8BADBGXgIA4D0ccihA9ixJd/zazm9v/F3ep8eys7MlScHBwWW2V/J+ISsr64L6f/HFF3X48GG9+eabtv4y3vTNRs8WHR2tLVu2SJJ69Ohhank9AAA1BXkJAIAx8hIAAP/y23uVjBs3TuPHj6/UPnfu3KmFCxdqyJAhio6OtrXtCk2kAwAAAAAAAAB8W2XskZ6cnKzw8HDP8+WtDg8NDZUk5ebmlnk+JydHkhQWFnbefgsKCjRt2jTVrVtX//u//2t22IaYSAdqiIzNCdU9hEoR0X2c6Rp/fS1Qmtk/Z5fLpWuiu1bSaFCZ8vILLdXVDgq0eSTly3WbH2Ow0/z4Olxc13QNSru352VVWldV3AVFpmv2/+QyvqgM4cHmf8TIyMq31FdBofmvq0urCEt9+asDr/yPqetP5+XjlTQaVCZfyEsrf6drBQaYrtk4rZ/pGpT2zTPXW6y0Wlc1Vuw8ZLpmSMfmlvrKzTf//V5QVGypr59P5ZmuuaJpHUt9+auakJcBjtOHXW1JUnh4eKmJ9PI0bdpUksq9IWjJ882aNTtvOz/++KN2796thg0bauLEiaXOZWZmSpK+/vprjRgxQpK0cOFCw7GdjYl0AAAAAAAAAEC1aNu2rSTpm2++KfP8119/LUlq06bNBbV37NgxHTt2rMxzmZmZ2rRpk4VRMpEOAAAAAAAAADVagMOhAJv2djHbTpcuXVSnTh19//332r17t9q1a1fq/EcffSRJuvbaa8/bzsUXX1zuPVY2btyoO++8U1dffbUWLFhganwlzH8G6le5ubnq37+/unXr5nluwoQJ6tWrl7p06aK+fftq9uzZVpsHAMAvkJcAABgjLwEAqLmcTqeGDx8uSZo+fbqys7M95+bPn6+0tDT16NFDHTt29Dy/aNEiDRw4UM8991yVjdPyivRZs2apWbNmysjI8Dz3t7/9Ta1atZLT6dSRI0f0l7/8Rc2bN9ef/vQnWwYLAICvIS8BADBGXgIAUL0q42ajZowdO1ZffvmlUlNTFRsbq27duunIkSPavn27IiMj9eSTT5a6PiMjQwcOHCh3C5fKYGlF+q5du7R+/XqNHj261PNt2rTx3H3V4XAoICBA6enpFR8lAAA+iLwEAMAYeQkAAGrXrq0333xTY8eOVUhIiNatW6cjR45o6NChWrFihVq0aFHdQzS/Ir2goEDTpk1TfHy8iorOvcPwY489phUrVig3N1fNmzfXTTfdVG5bbrdbbrfb89jlcpkdDgAAXom8BADAGHkJAIB3qM490ksEBwdr4sSJmjhxouG148eP1/jx4y+47ejo6HL3T79QpifS586dq3bt2ql79+7auHHjOecfe+wxxcfH6+uvv9a///1v1atXr9y2kpKSlJCQYHYIAAB4PfISAABj5CUAAN7BIRu3drGnGa9jamuX9PR0LV68WA899ND5Gw0I0JVXXqmwsDA9/fTT5V4XFxenlJQUz5GcnGxmOAAAeCXyEgAAY+QlAADwJaZWpKekpOj48eMaMGCApNMfw8vKylJ0dLTmzJmjq666qtT1BQUF593Dzul0eva8AwDAX5CXAAAYIy8BAPAeAbJ4M81y2vJHpibSBw0apJ49e3oep6amaurUqVq1apUKCwv10UcfqVevXgoJCdG2bdu0cOFCjRgxwvZBAwDgzchLAACMkZcAAMCXmJpIDwkJUUhIiOdxZGSkHA6HmjRposOHD+uNN97Qo48+qqKiIjVq1Eh33HGHxowZY/ugAQDwZuQlAADGyEsAALyHw+GQw6ZN0u1qx9uYvtno2aKjo7VlyxZJUvPmzfX222/bMigAAPwJeQkAgDHyEgAAeLMKTaQDgJ0iuo8zXZOxOaFK+qnqvqywMj7AH2xNP2Gp7urLL7J3IOex+8gp0zVRl9a3fyDwC+nHs03XXNIg1HTN9E/2mq6RpE8+2mm6psidZ6mvZpe3NF3z9dPXW+oL8HW+kJf/PZpluuaKpnUqYSTwBxH9/2G6JuOTqaZrvtr/s+kaSRp0++Pmi4qLLPV12aDBpmtSpsda6gu+y/HrYVdb/shf934HAAAAAAAAAMAWrEgHAAAAAAAAgBoswOFQgE17m9vVjrexvCI9NzdX/fv3V7du3Uo9v2TJEg0YMECdO3dW3759tW7dugoPEgAAX0VeAgBgjLwEAKB6OWw+/JHlFemzZs1Ss2bNlJGR4XnunXfe0YIFC/TCCy+oXbt2+vnnn5WTk2PLQAEA8EXkJQAAxshLAADg7SytSN+1a5fWr1+v0aNHe54rLCzUSy+9pEcffVTt27eXw+FQgwYN1KJFC9sGCwCALyEvAQAwRl4CAFD9HA57D39keiK9oKBA06ZNU3x8vIKCgjzPHzhwQMePH9c333yjvn37qk+fPpo6dapcLle5bbndbrlcrlIHAAD+gLwEAMAYeQkAAHyF6Yn0uXPnql27durevXup50+cOCFJ2rBhg5YuXaqVK1fq0KFDevLJJ8ttKykpSV27dvUcMTExZocDAIBXIi8BADBGXgIA4CUcDjlsOvx1SbqpPdLT09O1ePFirVix4pxzYWFhkqS4uDhFRkZ6/v/9999fbntxcXEaNWqU57HL5eLNDgDA55GXAAAYIy8BAIAvMTWRnpKSouPHj2vAgAGSTn8MLysrS9HR0Xr55ZdVu3ZtU507nU45nU5TNQAAeDvyEgAAY+QlAADeI0AWb6ZZTlv+yNRE+qBBg9SzZ0/P49TUVE2dOlWrVq1SZGSkbrzxRr322muem8G89tpr6tevn+2DBgDAm5GXAAAYIy8BAPAenm1ZbGrLH5n6BUFISIiaNGniOSIjI+VwONSkSRM5nU498sgjatSokfr166eBAweqWbNmmjJlSmWNHQAAr0ReAgBgjLwEAAC+xNSK9N+Kjo7Wli1bPI9DQ0M1c+bMCg8KAAB/Ql4CAGCMvAQAoPo4fj3sassfVWgiHYjoPs50TcbmhEoYCfxBVX1vWO3Hyvc7gMp3cURIdQ/B0Mm8/OoeAvzIqRzz30///Hyf6ZrFI7uZrpGk67PdpmvS9vxkqa9atfx1B07Afr6Ql9F3vWy6JuPjRyphJPAHh1eb/wTLlQ9/aLpm51ODTNdI0vuLppmuGXznk5b6ir6yqaU6AKUxkQ4AAAAAAAAANRh7pBtjCQcAAAAAAAAAAOfBinQAAAAAAAAAqMECZN+Ka39duW15Ij03N1eDBw9WRkaGtmzZoiNHjuiGG24odU1eXp769OmjV199tcIDBQDAF5GXAAAYIy8BAKhebO1izPJE+qxZs9SsWTNlZGRIkpo1a6bU1FTPebfbrd69e5/z5gcAgJqEvAQAwBh5CQAAvJ2llfa7du3S+vXrNXr06HKvWbdunYqLixUbG2t5cAAA+DLyEgAAY+QlAADVz2Hz4Y9Mr0gvKCjQtGnTFB8fr6KionKvW7ZsmQYPHqzatWuXe43b7Zbb7fY8drlcZocDAIBXIi8BADBGXgIAAF9heiJ97ty5ateunbp3766NGzeWec3hw4e1YcMGTZ48+bxtJSUlKSEhwewQAADweuQlAADGyEsAALyDw3H6sKstf2RqIj09PV2LFy/WihUrznvd8uXL1a5dO7Vt2/a818XFxWnUqFGexy6XSzExMWaGBACA1yEvAQAwRl4CAABfYmoiPSUlRcePH9eAAQMknf4YXlZWlqKjozVnzhxdddVVKioq0vLlyzVmzBjD9pxOp5xOp7WRAwDgpchLAACMkZcAAHiPADkUYNPu5na1421MTaQPGjRIPXv29DxOTU3V1KlTtWrVKkVGRkqSvvjiC2VkZOiPf/yjvSMFAMBHkJcAABgjLwEA8B5s7WLM1ER6SEiIQkJCPI8jIyPlcDjUpEkTz3NLly7VgAEDVKdOHftGCQCADyEvAQAwRl4CAABfYvpmo2eLjo7Wli1bSj03a9asCg0IAAB/Q14CAGCMvAQAoPo4fv3Prrb8UYUm0oGMzQnVPQTUcBHdx5musfp9a6XOyvhgD7OvvaO4QC0qaSyoXE3qBVf3EAy1b1I1KyndBUWW6oICzb/Rdfjp5zVz8wst1R09mWfzSMp3cWSI8UW/8fqsPaZrfjyVb7pGktaM7Wl80W+MXbrTUl/tmoRaqsMZDW5fYOp6R2GemlXOUFDJfCEvj304pUr6IS8rzl/zcuNj/U3XXD5xpekaSdo3a4j5ogYtLfX1r5cXm66Z/ecrLfXlr8hLSEykAwAAAAAAAECNxh7pxgKqewAAAAAAAAAAAHgzyxPpubm56t+/v7p16+Z5bteuXRo2bJi6dOmifv36aeXKlXaMEQAAn0VeAgBgjLwEAKB6Bchh6+GPLE+kz5o1S82andntJzMzU2PGjNGNN96ozZs36/nnn9eMGTPOuVkMAAA1CXkJAIAx8hIAgGrmOLO9S0UPP51HtzaRvmvXLq1fv16jR4/2PJeamiqn06lhw4YpMDBQV111lWJjY7V06VLbBgsAgC8hLwEAMEZeAgAAX2D6ZqMFBQWaNm2a4uPjVVR05k7XRUVFKi4uLnVtUVGR9u7dW25bbrdbbrfb89jlcpkdDgAAXom8BADAGHkJAIB34GajxkyvSJ87d67atWun7t27l3q+c+fOysnJ0aJFi5Sfn6+UlBR98skn533zkpSUpK5du3qOmJgY818BAABeiLwEAMAYeQkAAHyFqRXp6enpWrx4sVasWHHOuYiICCUmJurZZ5/Vyy+/rNatW2vo0KHavn17ue3FxcVp1KhRnscul4s3OwAAn0deAgBgjLwEAMB7OH79z662/JGpifSUlBQdP35cAwYMkHT6Y3hZWVmKjo7WnDlz1LVrVy1evNhz/aRJk85ZWXA2p9Mpp9NpcegAAHgn8hIAAGPkJQAA8CWmJtIHDRqknj17eh6npqZq6tSpWrVqlSIjI/XNN9/o8ssvV1FRkd577z1t2rSpzNUFAAD4M/ISAABj5CUAAN4jwHH6sKstf2RqIj0kJEQhISGex5GRkXI4HGrSpIkkaeHChfrkk09UWFioqKgovfHGG2rcuLG9IwYAwMuRlwAAGCMvAQDwHmztYszURPpvRUdHa8uWLZ7HTz31lJ566qkKDwoAAH9CXgIAYIy8BAAA3qxCE+kA4Isiuo+rsr4yNidYqqvKMQK+zl1YZKkuqFaAzSMp39HMPNM1jeoFm67xz3UfVcvqa+iowhf/l6x80zWFBYWma77Y8YPpGkm6J8v89/vc2zpb6uv62RtM14zv1dpSX/4qINDcv4UOVd2/nbCXL+RlYVGx6Zpageb7IS8rzhfysqjY/PdT8zvfqISRlC3iuhmmazLWTbPWV88HLNXhjJqQlw6HfX9Hq/LvelXyvT9VAAAAAAAAAACqECvSAQAAAAAAAKAGY490Y6xIBwAAAAAAAADgPExNpE+ZMkUdO3ZUVFSU50hNTfWcX7RokYYOHaqOHTtq7Nixtg8WAABfQF4CAGCMvAQAwHsEOOw9/JHprV2GDRumRx99tMxzjRo10tixY7Vhwwb9+OOPFR4cAAC+irwEAMAYeQkAgHdgaxdjtu6RHhsbK0navXs3b3QAACgHeQkAgDHyEgAAeBPTe6SvWrVKPXr00A033KB58+apqKjIcudut1sul6vUAQCAPyAvAQAwRl4CAOAdHA57D39kakX6iBEj9NBDD6levXrauXOnJk2apICAAI0cOdJS50lJSUpISLBUCwCAtyIvAQAwRl4CAABfYmpFeocOHRQZGanAwEB17txZo0eP1po1ayx3HhcXp5SUFM+RnJxsuS0AALwFeQkAgDHyEgAA7+Gw+fBHFdojPSDA9M4wpTidTjmdzgq1AQCAtyMvAQAwRl4CAABvZuqdypo1a+RyuVRcXKydO3fqtdde89wARpIKCgqUl5engoICFRUVKS8vT2632/ZBAwDgzchLAACMkZcAAHiPAIcU4HDYdFT3V1M5TK1If+uttxQfH6/CwkI1atRIw4YN09133+05n5iYWGpPuk6dOqlHjx5auHChfSMGAMDLkZcAABgjLwEAgC8xPZF+PuPHj9f48eMrNCAAAHwdeQkAgDHyEgAA72Hn3uZ+uiC9YnukA0B1y9icYHyRTSK6j6uSGqlqvy5/ZfY1dLlcuia6ayWNBpUpJCiwuodgqFHd2lXST1Ctiu0vDKm2xe+nFheF2jyS8p3IMr+1xfrpA0zXLN5x2HSNJF0WEWK6ZtLKry31tWZsT0t1OOPowjtNXX86L/9ZSaNBZfKFvHRWUY6RlxXnC3lpxbZXhpmu+d/V31jqK3VHI9M1l45daqmvjA3PWarDGTUiL5lJN0R6AAAAAAAAAABwHqxIBwAAAAAAAIAazPHrf3a15Y9MrUifMmWKOnbsqKioKM+RmpoqSXK73Zo6dar69u2rqKgoDRw4UEuXWvvICQAAvoy8BADAGHkJAAB8iekV6cOGDdOjjz56zvMFBQVq2LChFixYoBYtWmj79u0aPXq0mjRpol69etkyWAAAfAV5CQCAMfISAADv4JDksGkhuX+uR7dxj/TQ0FBNnDhRLVu2lMPhUOfOnRUdHa2UlBS7ugAAwOeRlwAAGCMvAQCAtzE9kb5q1Sr16NFDN9xwg+bNm6eioqIyr8vLy9OOHTvUpk2bcttyu91yuVylDgAA/AF5CQCAMfISAADv4bDp8FemtnYZMWKEHnroIdWrV087d+7UpEmTFBAQoJEjR5a6rri4WI8++qguueQSxcbGltteUlKSEhISLA0cAABvRV4CAGCMvAQAwIvYOQvup7Ppplakd+jQQZGRkQoMDFTnzp01evRorVmzptQ1xcXFeuyxx3TgwAHNnj1bAQHldxEXF6eUlBTPkZycbO2rAADAi5CXAAAYIy8BAIAvMX2z0bP99k1McXGxpk+frh07dmjBggWqU6fOeeudTqecTmdFhgAAgNcjLwEAMEZeAgBQfRy//mdXW/7I1Ir0NWvWyOVyqbi4WDt37tRrr71W6qN1jz/+uLZu3ap58+apXr16tg8WAABfQF4CAGCMvAQAAL7E1Ir0t956S/Hx8SosLFSjRo00bNgw3X333ZKkw4cP6+2335bT6VTfvn09NYMHD9bjjz9u76gBAPBi5CUAAMbISwAAvIfDcfqwqy1/ZHoivTzNmzdXWlpahQcEAICvIy8BADBGXgIAAF9SoT3SAaAmydicUN1D8BoR3cdZqrPyGlZlX76msKhYhUXFF3x9YIC1ZQEns/NN1+TlF1rqK7S2+bcm4cHW3s4UmXjtPDXF5mskqVG9YNM17oIi0zXOWqZ27fMoKDTfV61Aa32h4uqHVc0e0BN7t66SfiRpcMdmVdaXVZ+nHTNdY/XfjIOubPM1J9yW+pp63RWW6nyJP+ZlZLj5fwes/rtdlXlpZYzkJex0SYNQ0zWLR3arhJH4rh6PrzNd8+36TZb62vzmBNM1v2Rby8sel0VaqvMljl8Pu9qyIjc3V0lJSVqzZo2OHDmievXqqXfv3po0aZIaN258QW1kZmYqOTlZn332mbZt26ajR48qKChIl19+uf74xz/q9ttvV1BQkKXxMZEOAAAAAAAAADVZNc+k5+Xl6a677tK2bdvUsGFD9evXT4cPH9by5cv1+eef691331WLFi0M25k7d65effVVORwOtWvXTldddZV++eUXbd26VTt27NBHH32kuXPnKiQkxPQYmUgHAAAAAAAAAFSb2bNna9u2bYqKitLcuXMVFhYmSZo/f75mzpypRx55RAsXLjRsJzQ0VH/5y180fPhwNWt25lOP3333nUaNGqWUlBQlJibq/vvvNz1GPmMEAAAAAAAAADWYw+b/zHC73Z57p8THx3sm0SVp1KhRatOmjTZt2qRdu3YZthUXF6fJkyeXmkSXpEsvvVQPPPCAJGn16tWmxlfC1Ir0KVOmaPXq1aX2kZk3b56ioqIkyfO/Jdxuty677DK9//77lgYHAIAvIi8BADBGXgIAAEnaunWrTp06pZYtW6p9+/bnnB8wYIDS0tL02WefqWPHjpb7adu2rSTp6NGjlupNb+0ybNgwPfroo2WeS01NLfV48ODBuuGGGywNDAAAX0ZeAgBgjLwEAMA7OBynD7vaMmPPnj2SVOYkuiR16NBBkpSWllahcR08eFCS1LBhQ0v1lbZH+o4dO7R//37ddNNN5V7jdrvldp+5W67L5aqs4QAA4JXISwAAjJGXAAD4rx9++EGS1KRJkzLPlzx/5MiRCvXz5ptvSpL69etnqd70RPqqVau0atUqNWzYUP/zP/+jkSNHKiDg3K3Wly5dqj59+qhx48bltpWUlKSEhASzQwAAwOuRlwAAGCMvAQDwDo5fD7vaks79pbbT6ZTT6Tzn+uzsbElScHBwme2FhIRIkrKysiyP6V//+pc2bNigunXravTo0ZbaMDWRPmLECD300EOqV6+edu7cqUmTJikgIEAjR44sdV12drY++OADPf300+dtLy4uTqNGjfI8drlciomJMTMkAAC8DnkJAIAx8hIAAC9SCTPpv83hcePGafz48TZ1cuG2bNmiJ554Qg6HQ08++eR5fzF/PqYm0kv2o5Gkzp07a/To0Vq1atU5b3TWrl2rkJAQ/eEPfzhve+X9FgIAAF9GXgIAYIy8BADAvyUnJys8PNzzuLycDg0NlSTl5uaWeT4nJ0eSFBYW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R48eqq6utq3713/9V5WWluqPf/yjHn30UT355JPauHFj2H0/+eQTbdu2TVOmTHG876hRo/T+++8rNTVVI0eO1FVXXaV//Md/bHUfY4zmzZuna6+9tvk3YeGMsW1d0xvwb9u2TSUlJXr99dd15MgRLVy40LImOTlZZ8+eVVFRkerr67Vjxw5t3LixOWRCPafhzLuXY8GpJhgM6gc/+IHGjRunG2+80bFu8eLFmjRpkq677rqweznNe6g6p3kPVWM371ZrwmnevaylcGpCzbtT3RNPPKGdO3eqpKREEyZMUEJCgmWN0/yFM8a2a9Kqxm7ep02bpvXr1+udd97R008/rVWrVmnVqlW28xduTdt1F25dTU2N3njjDd199922Nf3791e/fv20dOlSBYNBffzxx1q9erUCgYCMMSotLdXKlSv11ltvye/3a/bs2bbH05kzZyzrrDjVWK3HcHu5Oe/GCrfnSfIyuvNS8paZXvIynLpQ527ykrwkL63z0i6P7I4pt3kpectM8pK8bEJeRmde2tXZzX175KVkvS7s5t3rWvKSmeTl//KSmXPmzCEvw6xpEut56fNF9ubGsWPHJEl9+vQJub3p+0ePHv3C+/ra174W9r7aiokL6U2uv/56DRw4UAUFBbb3O3jwoF577TXNmTPHU5+uXbvq7NmzamhoaP5eIBBQt27dbOtSUlLUo0cPde7cWVlZWfrmN7+pdevWhd13zZo1GjRokAYOHGh7v8rKSs2YMUNTpkzRBx98oPfee09dunRptYCNMXriiSdUVlamFStWKC4uLqwxhqpretyzZs1S79691bt3b82aNav5zylC1Vx++eV68cUX9fvf/14jR47Uc889p8mTJ6tXr16tHkvL59TNvId7LDjVBINB5efnq0uXLnryyScd67Zv367333/f9k+1QvUK99hoWec076FqrOa9S5culmvCbt69rKVwakLNe7i94uLidOONN6pbt25asGCBZY3d/IXbq+WatKuxO95vuOEG9e7dW/Hx8UpOTtZ3v/tdx/NCODWh1l24vdavX68uXbrolltusa3p3LmzVqxYoT179igrK0uPPfaYJk+erISEBEnnfxjr16+funXrpvz8fP3pT3+Sz+ezPJ6a/lw0VF1NTU3IubCree+99yzXY7i9wj3vxqJwzpPkZezkpeQtM73kpVWdU2aSl+Ql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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we visualize the reconstructed adjacency matrices as graphs. The `plot_graph` function displays the network structure, incorporating information about the marginal and conditional expectations as edge width." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "ExecuteTime": { + "end_time": "2025-01-27T14:47:01.311890Z", + "start_time": "2025-01-27T14:46:57.271671Z" + } + }, + "source": [ + "from probinet.visualization.plot import plot_graph\n", + "\n", + "# Call the `plot_graph` function\n", + "_ = plot_graph(graph, M_marginal, M_conditional, pos, node_size, node_color, edge_color)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 15 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the figures, we can notice how the conditional expected values provide a better reconstruction, which is sparser and has more reciprocal edges correctly identified." + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "In this step, we are going to evaluate how well the network has been reconstructed by \n", + "using joint probabilities. \n", + "\n", + "In our network, each pair of nodes `(i, j)` can have a connection in both directions, forming a pair `(A(ij), A(ji))`. This pair can have one of four states: `(0, 0)`, `(0, 1)`, `(1, 0)`, or `(1, 1)`. The state `(0, 0)` means there is no edge between nodes `i` and `j` in either direction. The state `(0, 1)` means there is an edge from node `j` to node `i`, but not the other way around. The state `(1, 0)` means there is an edge from node `i` to node `j`, but not the other way around. The state `(1, 1)` means there is an edge in both directions.\n", + "\n", + "We use joint probabilities to predict these states, effectively turning the task of predicting edges in the network into a classification problem. We then compare these predictions with the actual states to assess the quality of the network reconstruction." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:47:01.364398Z", + "start_time": "2025-01-27T14:47:01.359348Z" + } + }, + "source": [ + "from probinet.evaluation.expectation_computation import compute_M_joint\n", + "\n", + "# Compute the joint probability for every pair of edges in the network\n", + "# The joint probability is represented as a vector of probabilities\n", + "# p=[p00,p01,p10,p11].\n", + "p00, p01, p10, p11 = compute_M_joint(U=u, V=v, W=w, eta=eta)" + ], + "outputs": [], + "execution_count": 16 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:47:01.469913Z", + "start_time": "2025-01-27T14:47:01.448025Z" + } + }, + "source": [ + "# Define the total number of nodes in the graph\n", + "N = len(graph_data.nodes)\n", + "\n", + "# Generate indices for the upper triangular matrix\n", + "idx_upper = np.triu_indices(N, k=1)\n", + "\n", + "# Define the possible labels for pairs of edges\n", + "inf_labels = [(0, 0), (0, 1), (1, 0), (1, 1)]\n", + "\n", + "# Initialize lists to store the true and predicted labels\n", + "true_labels, pred_labels = [], []\n", + "\n", + "# Iterate over each pair of nodes in the upper triangular matrix\n", + "for i, j in zip(*idx_upper):\n", + " # Append the true label for the pair of edges to the `true_labels` list\n", + " # The true label is determined by looking up the pair of edge values in\n", + " # the `inf_labels` list.\n", + " true_labels.append(inf_labels.index((int(Bdense[0, i, j]), int(Bdense[0, j, i]))))\n", + "\n", + " # Compute the probabilities for each possible label for the pair of edges\n", + " # The probabilities are computed based on the joint probabilities\n", + " probs = [p00[0, i, j], p01[0, i, j], p10[0, i, j], p11[0, i, j]]\n", + "\n", + " # Normalize the probabilities so that they sum to 1\n", + " probs /= sum(probs)\n", + "\n", + " # Append the predicted label for the pair of edges to the`pred_labels` list\n", + " # The predicted label is the one with the highest probability\n", + " pred_labels.append(np.argmax(probs))" + ], + "outputs": [], + "execution_count": 17 + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "ExecuteTime": { + "end_time": "2025-01-27T14:47:02.229563Z", + "start_time": "2025-01-27T14:47:01.709253Z" + } + }, + "source": [ + "from probinet.visualization.plot import plot_precision_recall\n", + "import sklearn\n", + "\n", + "# Compute the confusion matrix between the true and predicted labels\n", + "# The confusion matrix is a table that is often used to describe the\n", + "# performance of a classification models.\n", + "# Each row of the matrix represents the instances in a predicted class,\n", + "# while each column represents the instances in an actual class.\n", + "# The function `confusion_matrix` from the `sklearn.metrics` module\n", + "# is used to compute the confusion matrix.\n", + "conf_matrix = sklearn.metrics.confusion_matrix(true_labels, pred_labels)\n", + "\n", + "# Call the `plot_precision_recall` function\n", + "# Precision identifies the proportion of correctly classified observed entries\n", + "# Recall (Sensitivity) indicates the proportion of predicted edges\n", + "# being correctly classified.\n", + "_ = plot_precision_recall(conf_matrix)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 18 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `JointCRep` algorithm is performing well in correctly identifying situations where there are no connections between nodes `(0, 0)` and where there are mutual connections `(1, 1)`. However, when the algorithm makes mistakes, it's usually because it predicts that there are no connections between nodes `(0, 0)`, when in reality there is a one-way connection either from node `i` to node `j` `(1, 0)` or from node `j` to node `i` `(0, 1)`. This suggests that the algorithm has a tendency to predict fewer connections than there actually are, resulting in a network that appears less connected or sparser than the real one.\n", + "\n", + "The recall matrix has the highest entries in the main diagonal, denoting good performance. Overall, in this case, we obtain higher intensities as for the precision, indicating the tendency of labelling the predicted edges with the right type." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Network sampling\n", + "\n", + "In this section, we examine the performance of `JointCRep` in generating samples that resemble the observed network. In particular, we use the inferred parameters and the observed average degree to generate five synthetic networks by employing the `ReciprocityMMSBM_joints` method. This function reflects the assumptions underlying the `JointCRep` algorithm." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:47:02.348239Z", + "start_time": "2025-01-27T14:47:02.342196Z" + } + }, + "source": [ + "# Create a list of degrees for each node in the graph\n", + "degrees = [graph.degree(n) for n in graph.nodes()]\n", + "\n", + "# Calculate the mean degree of the nodes in the graph\n", + "# This gives an average measure of connectivity in the network\n", + "k = np.mean(degrees)" + ], + "outputs": [], + "execution_count": 19 + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "ExecuteTime": { + "end_time": "2025-01-27T14:47:02.611628Z", + "start_time": "2025-01-27T14:47:02.450889Z" + } + }, + "source": [ + "# Turn off the logging\n", + "logging.getLogger().setLevel(logging.WARNING)\n", + "\n", + "from probinet.synthetic.reciprocity import ReciprocityMMSBM_joints\n", + "\n", + "# Set the number of communities\n", + "K = config_dict[\"K\"]\n", + "\n", + "# Initialize an empty list to store the generated samples\n", + "Bsampled = []\n", + "\n", + "# Set the seed for the random number generator to ensure reproducibility\n", + "np.random.seed(17)\n", + "\n", + "# Generate a random seed\n", + "rseed = np.random.randint(18)\n", + "\n", + "# Generate five samples with different random seeds\n", + "for i in range(5):\n", + " # Call the `ReciprocityMMSBM_joints` method from the\n", + " # `probinet.synthetic.syn_sbm` module.\n", + " # The function takes several arguments:\n", + " # - N: the total number of nodes in the graph\n", + " # - K: the number of communities\n", + " # - avg_degree: the desired average degree\n", + " # - show_details: the flag to control the verbosity of the evaluation\n", + " # - show_plots: the flag to plot the sampled networks\n", + " # - eta: the pair-interaction parameter\n", + " # - parameters: the list containing the parameters u, v, and w\n", + " # - seed: the random seed for the models\n", + " # - output_net: the flag to save the sampled networks and the parameters\n", + " syn = ReciprocityMMSBM_joints(\n", + " N=N,\n", + " K=K,\n", + " avg_degree=k,\n", + " show_details=True,\n", + " show_plots=False,\n", + " eta=eta,\n", + " parameters=[u, v, w],\n", + " seed=rseed,\n", + " output_net=False,\n", + " )\n", + "\n", + " # Append the adjacency matrix of the generated network\n", + " # to the 'Bsampled' list.\n", + " Bsampled.append(syn.layer_graphs[0].toarray())\n", + "\n", + " # Update the random seed for the next iteration.\n", + " rseed += np.random.randint(1, 18)" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:is_sparse parameter was not set. Defaulting to is_sparse=True\n", + "WARNING:root:label parameter was not set. Defaulting to label=_N_L_K_avgdegree_eta_seed\n", + "WARNING:root:perc_overlapping parameter was not set. Defaulting to perc_overlapping=0.2\n", + "WARNING:root:correlation_u_v parameter for overlapping communities was not set. Defaulting to corr=0.0\n", + "WARNING:root:alpha parameter of Dirichlet distribution was not set. Defaulting to alpha=[0.1, 0.1, 0.1, 0.1]\n", + "WARNING:root:structure parameter was not set. Defaulting to structure=['assortative']\n", + "WARNING:root:is_sparse parameter was not set. Defaulting to is_sparse=True\n", + "WARNING:root:label parameter was not set. Defaulting to label=_N_L_K_avgdegree_eta_seed\n", + "WARNING:root:perc_overlapping parameter was not set. Defaulting to perc_overlapping=0.2\n", + "WARNING:root:correlation_u_v parameter for overlapping communities was not set. Defaulting to corr=0.0\n", + "WARNING:root:alpha parameter of Dirichlet distribution was not set. Defaulting to alpha=[0.1, 0.1, 0.1, 0.1]\n", + "WARNING:root:structure parameter was not set. Defaulting to structure=['assortative']\n", + "WARNING:root:is_sparse parameter was not set. Defaulting to is_sparse=True\n", + "WARNING:root:label parameter was not set. Defaulting to label=_N_L_K_avgdegree_eta_seed\n", + "WARNING:root:perc_overlapping parameter was not set. Defaulting to perc_overlapping=0.2\n", + "WARNING:root:correlation_u_v parameter for overlapping communities was not set. Defaulting to corr=0.0\n", + "WARNING:root:alpha parameter of Dirichlet distribution was not set. Defaulting to alpha=[0.1, 0.1, 0.1, 0.1]\n", + "WARNING:root:structure parameter was not set. Defaulting to structure=['assortative']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of nodes = 31\n", + "Number of layers = 1\n", + "Number of edges and average degree in each layer:\n", + "E[0] = 91 / = 5.87\n", + "Sparsity [0] = 0.095\n", + "Reciprocity (networkX) = 0.000\n", + "Number of nodes = 30\n", + "Number of layers = 1\n", + "Number of edges and average degree in each layer:\n", + "E[0] = 104 / = 6.93\n", + "Sparsity [0] = 0.116\n", + "Reciprocity (networkX) = 0.000\n", + "Number of nodes = 30\n", + "Number of layers = 1\n", + "Number of edges and average degree in each layer:\n", + "E[0] = 106 / = 7.07\n", + "Sparsity [0] = 0.118\n", + "Reciprocity (networkX) = 0.000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:is_sparse parameter was not set. Defaulting to is_sparse=True\n", + "WARNING:root:label parameter was not set. Defaulting to label=_N_L_K_avgdegree_eta_seed\n", + "WARNING:root:perc_overlapping parameter was not set. Defaulting to perc_overlapping=0.2\n", + "WARNING:root:correlation_u_v parameter for overlapping communities was not set. Defaulting to corr=0.0\n", + "WARNING:root:alpha parameter of Dirichlet distribution was not set. Defaulting to alpha=[0.1, 0.1, 0.1, 0.1]\n", + "WARNING:root:structure parameter was not set. Defaulting to structure=['assortative']\n", + "WARNING:root:is_sparse parameter was not set. Defaulting to is_sparse=True\n", + "WARNING:root:label parameter was not set. Defaulting to label=_N_L_K_avgdegree_eta_seed\n", + "WARNING:root:perc_overlapping parameter was not set. Defaulting to perc_overlapping=0.2\n", + "WARNING:root:correlation_u_v parameter for overlapping communities was not set. Defaulting to corr=0.0\n", + "WARNING:root:alpha parameter of Dirichlet distribution was not set. Defaulting to alpha=[0.1, 0.1, 0.1, 0.1]\n", + "WARNING:root:structure parameter was not set. Defaulting to structure=['assortative']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of nodes = 31\n", + "Number of layers = 1\n", + "Number of edges and average degree in each layer:\n", + "E[0] = 103 / = 6.65\n", + "Sparsity [0] = 0.107\n", + "Reciprocity (networkX) = 0.000\n", + "Number of nodes = 30\n", + "Number of layers = 1\n", + "Number of edges and average degree in each layer:\n", + "E[0] = 99 / = 6.60\n", + "Sparsity [0] = 0.110\n", + "Reciprocity (networkX) = 0.000\n" + ] + } + ], + "execution_count": 20 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's now visualize the original network's adjacency matrix alongside the five generated samples using the `plot_adjacency_samples` function." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "ExecuteTime": { + "end_time": "2025-01-27T14:47:05.431144Z", + "start_time": "2025-01-27T14:47:02.840637Z" + } + }, + "source": [ + "from probinet.visualization.plot import plot_adjacency_samples\n", + "\n", + "# Call the `plot_adjacency_samples` function\n", + "# The `Bdense` is the adjacency matrix of the original network\n", + "# The `Bsampled` is a list of adjacency matrices of the generated\n", + "# samples.\n", + "_ = plot_adjacency_samples(Bdense, Bsampled)" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAC5gAAAIECAYAAADG2GB0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABQJ0lEQVR4nOzdeZRcBZk34F8nnQBJIzQQ8AwGYVgS2QRCExBwYxMRkW0EnAGR0RmGBv0GPgVGGNYRAQE1iKLoEURBdlBAD37gAAo2qyyGsAiJGNZ0SDoLJKS/P1IUaZKQ6qruvl1dz3NOzqlK31v3rbvUW/fW797b1N3d3R0AAAAAAAAAAAAAABresKILAAAAAAAAAAAAAABgcBAwBwAAAAAAAAAAAAAgiYA5AAAAAAAAAAAAAAAlAuYAAAAAAAAAAAAAACQRMAcAAAAAAAAAAAAAoETAHAAAAAAAAAAAAACAJALmAAAAAAAAAAAAAACUCJgDAAAAAAAAAAAAAJBEwBwAAAAAAAAAAAAAgBIBcwAAGAKOP/74jBs3LuPGjct3v/vdossBAHpBHweA+qSHA0D90scBoD7p4TBwmosuAOrF8ccfn+uuu26Zfxs2bFhaWlqy6qqrpqWlJRtssEE222yzbLHFFmlra0tzs00NgKFv6tSpueGGG/LAAw/k6aefzqxZs7JgwYKsssoqGTNmTNZbb72MHz8+W2yxRSZOnJhVV1216JIp0KxZs/LYY4/lkUceyaOPPppHH300zz//fPnv7e3tOfroowusEKCx6ONUat68efnTn/6Ue+65J3/5y1/yzDPPZObMmWlqasp73vOebLzxxmlra8t+++2XddZZp+hyAYY8PZxKLFq0KFOmTMn999+fyZMn5+mnn87f//73zJw5M2+88UZGjx6dtddeO5tuuml22WWX7LLLLhkxYkTRZQMMefo4fWH27NnZc8898/LLL5f/b999981ZZ51VYFUAQ5seTiX+9re/ZZdddun1eD/84Q/z4Q9/uB8qgt6TeoU+sGjRosyaNSuzZs1KkjzxxBO59dZbkyRjxozJAQcckM997nMZM2ZMIfWNGzeu/Ph3v/td3ve+9xVSBwBD06xZs/KNb3wj1113Xbq7u5f6++zZszN79uw888wzueOOO5Ikzc3N+fKXv5wvfelLA1wtg8Eee+yR5557bpnrCwADSx+nUq+88krOOOOM3HHHHZk3b94yh5k/f35eeuml3H333bnwwgvzhS98Ie3t7Rk5cuQAVwsw9Onh9MYvfvGLnHbaacv9+1u/bzz11FO58cYbM3bs2Jx++unZYYcdBrBKgMahj9OXzjnnnB7hcgD6jx4ONBoBc6jCaqutli222KLH/82fPz+zZs3Kyy+/nM7OzvL/v/zyy7nooovKB3D32GOPgS4XAPrNjBkzcthhh2XKlCk9/n/11VfP+uuvn1VWWSVz5szJ9OnTexzgXLhwYV544YWBLpdB4tlnny26BACij9M706dPzy233NLj/5qamjJ27NistdZaGT58eJ599tnyurJgwYL84Ac/yF/+8pdceOGFQuYAfUgPp7feGXxYaaWVst5662X11VfP8OHDM2PGjPz1r3/NggULkiTTpk3Lv/7rv+a8887zmwZAH9PH6Uv33XdffvnLXxZdBkBD0MOp1U477VTRcGussUY/VwKVEzCHKowbNy6XXHLJcv8+bdq03HPPPfnZz36WyZMnJ0lmzpyZY445Jscee6yz0gAYMk488cQeO9Ef+9jHctRRRy11IlaSvPjii7nzzjtz66235u677x7IMhmkVl111Wy22WbZfPPNs/nmm+fMM890pRWAAaSPU42mpqZsv/322X///bPjjjsudbD7T3/6U0499dQ89dRTSZL//d//zbe//e383//7f4soF2BI0sPprebm5my//fbZZZddst1222WTTTbJsGHDegzT1dWVq666Kt/+9rczb968LFy4MCeeeGK22mqrrLPOOgVVDjD06OP0lTfeeCNf//rX093dnTXWWCNjxozJE088UXRZAEOWHk6t3i1rCIOVgDn0g7Fjx2bs2LE58MADc9111+WUU07J/PnzkyTnnXdeNthgg+y2224FVwkAtXn44Ydz++23l59/9rOffdfbLa+zzjo54IADcsABB2TatGmZOnXqQJTJIHTuuedm8803z/rrr5+mpqby/59zzjkFVgXQWPRxemvYsGHZY489cswxx2SjjTZa7nDbbbddrrjiihx00EHlkPlPf/rTHH744VlrrbUGqlyAIUsPpxoHHXRQDjrooHcdpqWlJYcffng22WSTHHHEEenu7k5XV1euvPLKHHPMMQNUKcDQpo/Tl773ve/lr3/9a5Lka1/7Wq655pqCKwIYuvRwoFENW/EgQC323Xff/PjHP05z8+LzObq7u3PyySdn3rx5BVcGALW57bbbyo9XXnnlfPWrX6143LFjx2bHHXfsj7KoA3vvvXc22GCDHuFyAAaWPk5vbbbZZvnOd77zruHyt6y66qo54YQTys8XLFjQ4wcYAKqnh9Pfdtxxx0ycOLH8/E9/+lOB1QAMLfo4fWXKlCn50Y9+lCTZfvvt85nPfKbYggCGOD0caFSuYA4DYMKECTnmmGNy3nnnJUlmzJiRX/7ylznssMOWOfzzzz+fO++8Mx0dHZkyZUqmT5+eefPmZfTo0VlrrbWy9dZb5xOf+ER23nnn5U7z3nvvzaGHHrrU/++yyy7LHH7ffffNWWedtdT/P/3007nzzjtz//3358knn8xLL72U119/PS0tLXnve9+bCRMmZO+9987WW29dyawAYAh59tlny4832mijtLS09Onrz58/P3fffXf++Mc/5vHHH89zzz2X1157Lc3NzVl99dUzbty47Ljjjtl///0zevToFb7e8ccfn+uuuy5J0t7enqOPPjqLFi3Kb37zm1x//fWZMmVKXn755bS0tGSrrbbKYYcdlh122GGp13nwwQfz85//PPfff39eeumljBo1KhtuuGE+85nP5MADD1zqFtPv9PGPfzzPP/98kuTSSy/NxIkTM2vWrFx33XW55ZZbMm3atMyaNStjxozJ1ltvnQMPPDDbb799FXNwxebMmZObbropd9xxR5588sm8+uqraWpqypgxYzJhwoTstdde2Wmnnfpl2gAUSx/Xx/vbDjvskJVXXrl8R7dnnnmmsFoAhhI9XA8fCJtttlnuueeeJMnLL79caC0AQ4k+ro/3hUWLFuWkk07KggULMnLkyJxyyin9Oj0A9HA9HBqXgDkMkH/5l3/JD3/4w8yePTtJcuWVVy4zYN7e3p7bbrst3d3dS/3ttddey2uvvZann346V199dbbddtt8+9vf7rdbTO+333557LHHlvm3mTNnZubMmZk8eXIuv/zy7L777jnrrLMq+iIDwNAwZ86c8uO5c+f26Wv/6le/ysknn9xjGm9ZsGBB5s2bl+nTp+eOO+7IhRdemG984xv5+Mc/3qtpzJw5M8cee2zuuuuuHv/f2dmZ22+/PbfffnuOPfbYfOlLX0qy+KDtmWeemZ/97Gc9hn/ttdfywAMP5IEHHsgtt9ySH/zgB1lppZUqruOxxx7L0UcfXd65fsvzzz+f559/Pr/61a+y33775dRTT83IkSN79R7fzU033ZRvfvOby/yh+Lnnnstzzz2Xa6+9NjvttFPOOeecrLHGGn02bQCKp48vpo/3n+HDh2fVVVctB8yXtT4A0Ht6+GJ6eP968803y4/7OjgB0Mj08cX08dpcfvnleeihh5Ik//Zv/5YNNtigX6YDwNv08MX0cGg8734aCdBnRo0alU9+8pPl508//XRmzJix1HBPPPFEOVw+fPjwrL/++pkwYUK23377jB8/PiNGjCgPe9999+Xggw9OV1fXUq+z2mqrZaeddlrq7Kq2trby/y/5b5NNNlnqNSZPnlx+PGLEiGy00UZpa2vLxIkTs/HGG2f48OHlv//2t7/NEUcckYULF/ZirgBQz1ZfffXy46lTp+aFF17os9eeOnVqj53oNddcM1tuuWV22GGHbL311mltbS3/bebMmTnqqKPy//7f/6v49RcuXJj/+I//KO9Ejx07Ntttt10+8IEP9DjT+lvf+lZ+/etfJ0lOOeWU8k50a2trJkyYkK233jqrrLJKefg//vGPOfPMMyuuY/r06fnCF75Q3ol+//vfn+222y4bb7xxmpqaysNde+21Oe6447Jo0aKKX/vdXHjhhTnuuON67ESvu+66aWtryzbbbNNj2d5111353Oc+t8zvLQDUL31cH+9v8+fPz6uvvlp+7qA8QN/Qw/XwgdDR0VF+7O6lAH1HH9fHazV9+vScf/75SZL111+/HAQEoH/p4Xo4NCpXMIcBtM022+TKK68sP7///vuz22679Rhm5ZVXzgEHHJBPfOIT2W677ZY602vu3Lm5/vrrc95552X27NmZOnVqzj777Jx22mk9hhs/fnwuueSSJMm4cePK/3/WWWflfe97X0X1rrrqqvn0pz+dPfbYIx/84Ad7hNuTxWem/fznP8/3vve9vPHGG3nwwQdzySWX5N/+7d8qen0A6tuWW25Z3slcuHBhjjvuuHz3u9/tsZNbraampmyzzTbZd99985GPfCTrrLPOUsPcd999Ofvss/Pwww9n0aJFOfHEE3PbbbdVdGWtK664IjNnzszmm2+e0047LZtttln5b1OnTk17e3ueeOKJJMkFF1yQZPHdR9Zcc83893//d3bbbbfyDndXV1dOOumk3HzzzUmSq666KocffnhFVw0566yzMnPmzGy22WY544wzsummm5b/Nm3atJx88sn5wx/+kCT5zW9+k1/84hf53Oc+t8LXfTc333xzvvOd75Sf77333mlvb8/6669f/r+3bpF26qmnprOzM88880xOOumkXHjhhTVNG4DBQx/Xx/vb7373ux4/Amy11VYDOn2AoUoP18P72+WXX16+s+mIESNyyCGHDOj0AYYyfVwfr9Wpp55aDiGecsopfXp1VwCWTw/Xw/vCV7/61Tz00EN56aWXkiw+cWHDDTfM9ttvn/322y9rrrlmn08TauUK5jCAlmyOyeJG/U5XXnllzjzzzOy8887LvI3IqFGjcsghh+QnP/lJOfB9/fXXp7Ozs8/rvf322/Nf//Vf2XbbbZcKlyeLr5J+5JFHls+STpLLLrssCxYs6PNaABh8Pv3pT/c4S7mjoyMf//jHc+KJJ+Y3v/lNTWduH3bYYfnFL36Rf/qnf1rmTnSSbLvttrnsssvKYaXOzs7ccMMNFb3+zJkzM378+Fx66aU9dqKTZL311sukSZPKvW/q1Kn52te+llGjRuWyyy7LHnvs0eNs7paWlpx99tnlHdFFixblpptuqqiOzs7ObLzxxrn00kuX+p4wduzYXHzxxZk4cWL5/84///xl3rmkUq+99lpOPvnk8vNjjz025557bo+d6CQZNmxY9txzz1x++eUZPXp0kuS2227LfffdV/W0ARhc9PHF9PH+sXDhwnz/+98vP19zzTWzww47DNj0AYYyPXwxPbzvvPnmm5kxY0buuuuufOUrXylfzGbYsGE59dRT84//+I/9On2ARqKPL6aPV+fmm2/O7bffniTZZ5997GcDDCA9fDE9vDY33HBDnnvuucybNy/z5s3L9OnTc9ddd+Xcc8/Nxz72sVxwwQV58803+3y6UAsBcxhA7zxzbdasWUsNM2rUqIpea4sttsgnP/nJJMnrr79evpVJX6q0ll133TXbbrttkuTll1/OI4880ue1ADD4rLHGGjnppJN6/N/cuXNzzTXX5JhjjslHPvKR7LTTTjnqqKPyk5/8JJMnT674tSvtQSuttFK+8pWvlJ//7ne/q3gap512Wnkn8Z3WW2+9HjuwCxYsyJFHHpkNN9xwmcOPGDEi++23X/n5Aw88UHEdp5xyynLPLh8xYkTOOOOM8k797Nmzy2eEV+PKK6/M7NmzkyTbb7/9Cm+fueGGG+bII48sP//5z39e9bQBGFz08bfp433v4osvzpQpU8rPjzzyyGWeRA9A7+nhb9PDq7fffvtl3LhxGTduXDbddNPssMMOOeKII3LLLbckWfz7w6WXXpr999+/z6cN0Mj08bfp473z2muv5cwzz0yy+Gqnxx9/fJ+8LgCV0cPfpodXb8yYMdl6662z/fbbZ9NNN+1xzPz111/PRRddlC996Usu7MqgImAOA2i11Vbr8XzmzJk1vd4HP/jB8uOiQ91bbrll+XHRtQAwcPbff/9ccMEFy73918svv5zbbrstZ511VvbZZ5/svffe+dWvfpXu7u4+q2HJfvjoo49WNM7GG2/cY7xlWbK3NTU15YADDqh4+KeffrqiOsaPH18+SWt51ltvvey0007l57fddltFr70sN954Y/nxYYcdVtE4n/70p8uP77333qqnDcDgo48ve3h9vDZ33313Jk2aVH6+9dZb55BDDhmQaQM0Cj182cPr4X1jk002yT//8z+Xr4wHQN/Sx5c9vD7+7s4666y88sorSZLjjjsua6yxRp+8LgCV08OXPbwevnxNTU3Zcsstc8YZZ+TOO+/MXXfdlSuuuCI//elPc9111+W+++7Lt771ray77rrlce66666cccYZNU8b+kpz0QVAI1m0aFGP501NTe867P3335+HHnoof/3rXzN79uzMmzevxxePl156qfz4xRdf7PuCSxYsWJB77rknjzzySKZOnZqurq7Mnz+/Ry1Tp04dkFoAGHz23HPP7Lzzzrn66qtzww035PHHH1/usFOmTMmxxx6bG2+8Meedd95yz1Be0rRp03LPPffkiSeeyIwZMzJnzpwsXLhwmcO+9tprmTdvXo9blC3Lkju9y7PWWmuVH48dO3aFB2zHjBlTfvzW2dArsvPOO1c03Ic//OHyrS+rPZFr5syZeeqpp8rPlzwT/d2ss846ec973pNZs2bllVdeyYsvvrjc27MBUH/08cX08b7x9NNP5z//8z/Lt/FcbbXV8q1vfSvDhw/vt2kCNCo9fDE9vDrbbLNNORSxcOHCzJgxI88880wWLlyYKVOm5Gtf+1ouuuiiXHDBBfnABz7QZ9MFYDF9fDF9vDJ//OMfc+211yZJJkyYsMLQHwD9Rw9fTA+vzLrrrpurrrpquX8fOXJkPvWpT2XnnXfO4YcfnsceeyzJ4quvH3zwwRk/fnzV04a+ImAOA+idTfWdVzR/y/XXX58LLrgg06dPr/i1u7q6aqptWd58881ceuml+cEPfpDOzs5CawFgcGtpacnnP//5fP7zn8+MGTNy33335c9//nMeffTRPPzww5k7d26P4X//+9/nmGOOyY9+9KMMG7bsm+o8/fTT+Z//+Z/cfffdvTqze/bs2SvckV5yJ3l5lnyNNddcc4XDr7zyyuXH8+bNW+HwyeIzxns73IwZMzJ79uysuuqqFY37lqeeeqo8H5ubm3PMMcdUPO7rr79eftzZ2SlgDjDE6OP6eF+YPn16jjjiiPLd2lZZZZV8//vf73H1FQD6lh6uh1fr61//+lL/N3fu3Nx00005//zz09nZmWeffTaHHnporrjiiuXeGh2A6unj+nilr/Pf//3fSZIRI0bk1FNPfdeL2AHQ//RwPbyvrbbaapk0aVI+8YlP5PXXX093d3cuv/zynH766f0+bVgRAXMYQDNmzOjxfPXVV19qmNNPPz0/+9nPev3ab7zxRrVlLdPChQvz5S9/uarbjfR1LQDUlzXWWCO77757dt999ySLe8of/vCH/OhHP+pxK6m77747N954Yz7zmc8s9RodHR354he/WPEO6ZIq6UMjRozo1Wv2dvhKLeu7QCXDzZo1q9c70m+FvZLFy+Suu+7q1fhvqfQsdADqkz5eOX38ba+88ko+//nPl0+UHzlyZC688MJss802/TI9AJamh1dOD1+2UaNG5bOf/Wx22mmnHHTQQXnppZcya9asnHTSSfn5z3/e79MHaGT6eOUarY9/97vfzXPPPZck+cIXvlBxOA+AgaGHV67Renhv/cM//EP22muv8l1L7r777gGbNrwbAXMYQG/dyuItY8eO7fH817/+dY9w+cYbb5wDDjggW221VdZdd92suuqqWWmllcpnJV977bU54YQT+qXWH//4xz3C5VtvvXX22WefbLHFFvmHf/iHjB49OiuttFL579/97nczadKkfqkFgPrW3NycD3/4w/nwhz+c888/P9///vfLf/vlL3+51I50V1dXvvzlL5d3okePHp39998/O+20U9Zff/2stdZaWXnllTN8+PDyOOPGjRuQ99LXRo4cWdVw1ZzM9c6z5au1aNGiPnkdAOqDPr58+vhiM2fOzOGHH55nn302yeJ15vzzz8+OO+7Y59MCoHJ6+PLp4e9u3XXXzde+9rUce+yxSZL7778/TzzxRN0ub4B6pI8vXyP18enTp+cnP/lJkuR973tf/uM//qNP6gGg/+jhy9dIPbxa2223XTlg/vzzz+eNN96oeL5BfxEwhwH0wAMPlB83NTVlwoQJPf5+8cUXlx/vuuuuueCCC971zLA5c+b0fZFJ3nzzzVxyySXl5//8z/+ck0466V3H6a9aABhavvzlL+fWW28tB5D+/Oc/Z+HChWlufvtr6dVXX51XX301yeLbQf3yl7/M+uuvv9zX7Orq6s+S+1Wl/fOdw7W0tPR6Wkue2T1q1Kg8+OCDvX4NABqbPt6TPr54+R1xxBGZMmVKkmTYsGE5++yzs+uuuxZcGQBL0sN70sNXbNddd82IESOyYMGCJMlDDz1UtyEGgHqnj/fUSH185syZWbhwYZLkb3/7Wz74wQ9WPO51112X6667rvz80ksvzcSJE/u8RgCWTw/vqZF6eLXGjBnT4/nMmTOz9tprF1QNLDas6AKgUXR1deXmm28uP99oo43S2tpafv7qq69m8uTJ5ecnnHDCCm878uKLL/Z9oVl8pfW3bheyyiqr5LjjjlvhOP1VCwBDy7Bhw3pczXLBggU9blGVJH/4wx/Kjw899NB33YlO6rsH/e1vf+v1cM3NzVlttdV6Pa0111yz/Hju3Ll9duY2AI1DH++p0fv43Llz88UvfjGPPvpoksUn0p9xxhnZa6+9Cq4MgHfSw3tq9B5eiZVXXrnHbck7OzuLKwagwenjPenjANQLPbwnPXzF5s+f3+P5KqusUlAl8DYBcxggl156aY+zrA466KAef58+fXr5cWtra973vvet8DUfeuihiqbd1NRUftzd3b3C4ZesZcMNN6yoYVVaCwCMHj26x/Mlz9JOevahzTfffIWvV8896M9//nOvh9too42quhXW+PHjs/LKK5efP/zww71+DQDQx9/WyH389ddfz5FHHtnjTm0nn3xy9t9//wKrAuDd6OFva+Qe3htL/p6x5NXfABh4+vjbGqmPDx8+PKuvvnrF/5ZcL0aOHLncvwEwcPTwtzVSD6/WU089VX48cuRI++IMCgLmMAA6Ojpy4YUXlp+vtdZaOfDAA3sM89btrSo1derU3HfffRUNu2RA/PXXX1/h8L2t5Z577snf//73Xo0DQON66zZgSbLSSistddbxW7dfrtSSt3msN3fccccKbwe2aNGi3HrrreXnEyZMqGpaI0eOzHbbbVd+fv3111f1OgA0Nn38bY3axxcsWJBjjjkm99xzT/n/TjjhhBxyyCGF1QTAiunhb2vUHt4bjz32WI8rvK233noFVgOAPv62Rurjm2yySe69996K/22zzTblcffaa68ef6t2HgBQGz38bY3Uw6vR3d2dm2++ufx8q622Kq4YWIKAOfSza6+9Nv/6r/9aDm0PGzYsp512WlZaaaUew40ZM6b8uLOzM3/961/f9XXPPPPMiq5G/s7Xfu6553o1/JNPPpnZs2cvd9gFCxbkrLPOqqgOAIaW3//+95kxY0avxpk2bVr+93//t/x8u+2263GnjaRnH1ryqpjLcsstt6Sjo6NXNQwmc+bMycUXX/yuw1x99dWZNm1a+fm+++5b9fQ+//nPlx/fdNNNuffee6t+LQDqmz5eu0bs42+++WaOPfbY3HHHHeX/+z//5//0qA2A/qWH164Re3hvdHd35zvf+U75+ahRo3r8MA9A9fTx2unjABRBD6+dHv7uLr/88jzxxBPl57vuumuB1cDbBMyhH0ybNi1XXXVV9tlnn5xwwgmZP39++W/HHXdcdtlll6XGWXfddbPuuuuWn59xxhl54403lhpuwYIFOeWUU3r8mLsim266afnxL37xi2W+7pK23HLL8q1CXn/99XzjG99YZph9zpw5+cpXvpK//OUvFdcCwNBx0003ZZdddsk3v/nNPP300ysc/umnn84Xv/jFHn3xs5/97FLDLfmj5c9+9rMeO1JLuvPOO3PCCSdUUfngcvHFF+dXv/rVMv92zz335Mwzzyw/32GHHbLFFltUPa0dd9wxH/7wh5MsDogdddRR+e1vf7vC8aZNm5ZvfvObueiii6qeNgCDiz7eNxqpj3d3d+e//uu/8pvf/Kb8f0cddVT+/d//vabXBaB39PC+0Ug9/Mknn8zXv/71HlfOW57Zs2fnq1/9ao/fHw499NClLpgDQHX08b7RSH0cgMFBD+8bjdTDn3zyyZx44ol55pln3nW47u7u/PSnP83//M//lP9v7bXXXub6AkVoLroAqEdPPPFEjjjiiB7/9/rrr2fWrFl5+eWXl3nWWmtra04//fTstttuy33dQw89NN/4xjeSJHfddVf233//HHTQQdl4442zYMGCTJ48OVdffXWeeeaZDB8+PPvss0+uvfbaFdb7qU99KrfcckuSxV86dtppp4wfPz4tLS3lYbbffvsceuihSZKVV145Bx54YC677LIkyTXXXJNnnnkmBx54YN7//vdn7ty5+fOf/5yrrroqL7zwQkaNGpWPfexj+fWvf73CWgAYWubOnZsf//jH+fGPf5wPfOAD2XbbbbPZZptlzTXXzOjRozN37tw899xz+eMf/5g77rijfEePJNl9992X2Rf/6Z/+KT/60Y8yf/78zJkzJwcddFAOPvjgTJw4MaNGjcrf//733HbbbeUdwAMPPDBXXXXVgL3nvrTnnnvmlltuybHHHptbbrkle+65Z9ZZZ53MmDEjt99+e2644YYsWrQoyeIrhp1yyik1T/Occ87JgQcemKlTp2b27Nk5+uijs8UWW2S33XbLuHHj0tLSkvnz5+fVV1/N5MmT86c//SmPPvpokuSLX/xizdNPku9973vL3Clf8iS4iy66aJlnsd966609TsoDoHr6eG0arY/fcsstPW7ButJKK+Xhhx9e6vjI8owbNy5f/epXa6oBgMX08No0Wg9fuHBhrrrqqlx11VXZdNNNM3HixIwfPz5rrrlmRo0alfnz5+fvf/97Hnroofz2t7/NrFmzyuNuueWWTiYD6GP6eG0arY8DMHjo4bVptB6+cOHCXHPNNbnmmmuy2WabZfvtty/vi6+00kqZNWtWHn/88fz617/uEUIfOXJkzj///PKFYaFoAuZQhddeey133XVXRcOuvfbaOeCAA/K5z30ua6211rsO+y//8i+58847y689ZcqUnHbaaUsNN2zYsJxwwgkZPXp0RQHzXXfdNZ/+9Kdz4403lut/560/3vOe9/R4/p//+Z/p6OjI5MmTkyQPPvhgHnzwwaVee+TIkfnmN7+53LPoABi6hg8f3uP5X/7yl4rvarH33nv3OAt3Seuss05OPfXUHH/88enu7s7cuXNzySWX5JJLLllq2G233TYnnXRS3e5IH3zwwRkxYkRuvPHG3HbbbbntttuWOdxKK62U733ve1l//fVrnubqq6+eK664IkcffXTuv//+JMkjjzySRx55pObXrtSbb765wjuqvPnmm3nzzTeX+v9l3VUFgN7Tx2vXaH18yavtJItPtK/02EiSFfZ+ACqjh9eu0Xr4kh5//PE8/vjjFQ37sY99LGef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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 21 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The samples seem to resemble the observed network, and we can also notice the dense groups given by reciprocated edges. In addition to these qualitative results, Table D4 in [1] reports the topological properties of the observed data and the sampled networks, showing that `JointCRep` generates networks samples that on average are most similar to the observed data in terms of average degree, reciprocity and clustering coefficient." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For a better understanding of the structure of the package and its configuration, we invite the \n", + "reader to take a look at the tutorial on the [`MTCOV` algorithm](./MTCOV.ipynb). Moreover, to see\n", + " another example on how to use the `synthetic` module, please take a look at the tutorial on \n", + " [`CRep` algorithm](./CRep.ipynb)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This tutorial provides a comprehensive guide on using the `probinet` package to analyze a real-world network. In particular, it uses the `JointCRep` algorithm, which is a probabilistic generative method designed to perform inference in directed binary networks by jointly modelling pairs of edges and assuming communities and reciprocity as the main mechanisms for tie formation.\n", + "\n", + "The tutorial shows how to import a real-world data using the `probinet` package, how to configure the `JointCRep` algorithm, and how to run it on the input data. \n", + "\n", + "It also provides different examples for analyzing the results, such as visualizing the nodes' memberships, reconstructing the network with marginal, conditional, and joint distributions, as well as sampling synthetic data that resemble the observed network.\n" + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-01-27T14:47:05.443664Z", + "start_time": "2025-01-27T14:47:05.440600Z" + } + }, + "cell_type": "code", + "source": "", + "outputs": [], + "execution_count": null + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/tutorials/MTCOV.ipynb b/_sources/tutorials/MTCOV.ipynb new file mode 100644 index 0000000..fa7e843 --- /dev/null +++ b/_sources/tutorials/MTCOV.ipynb @@ -0,0 +1,754 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# A Beginner's Guide to the `MTCOV` Algorithm in the `probinet` Package\n", + "\n", + "In this tutorial, we demonstrate how to use the _Probabilistic Generative Models_ (`probinet`) package to\n", + " run the `MTCOV` algorithm on a sample dataset.\n", + "\n", + "The `MTCOV` (**M**ulti**t**ensor and **Cov**ariates) algorithm is a \n", + "probabilistic generative model designed to perform community detection and broader inference in \n", + "attributed multilayer networks, which are networks enriched with node and edge metadata {cite}`contisciani2020community`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Package Structure\n", + "Before explaining how to use the `MTCOV` algorithm, let's explore the structure of the `probinet` package, which is organized into several main modules.\n", + "\n", + "### 1. Input\n", + "The `input` module handles data input for subsequent use by the algorithms in the `model` module. It comprises the following submodules:\n", + "\n", + "- `loader`: Functions to load data from input files.\n", + "- `preprocessing`: Functions for data preprocessing, such as converting NetworkX graphs to sparse adjacency matrices.\n", + "- `stats`: Functions for computing statistics on the data.\n", + "\n", + "### 2. Models\n", + "The `models` module contains the implementation of various algorithms, including the following\n", + " submodules:\n", + "\n", + "- `crep`: Implementation of the `CRep` algorithm.\n", + "- `jointcrep`: Implementation of the `JointCRep` algorithm.\n", + "- `dyncrep`: Implementation of the `DynCRep` algorithm.\n", + "- `mtcov`: Implementation of the `MTCOV` algorithm.\n", + "- `acd`: Implementation of the `AnomalyCommunityDetection` algorithm.\n", + "- `base`: Base classes and utilities for the models.\n", + "- `constants`: Constants used across the models.\n", + "- `classes`: Classes used across the models.\n", + "\n", + "### 3. Evaluation\n", + "The `evaluation` module contains functions responsible for handling the outputs of the models. It\n", + "consists of the following submodules:\n", + "\n", + "- `community_detection`: Functions to evaluate the performance of community detection algorithms.\n", + "- `expectation_computation`: Functions for computing expectations and related metrics.\n", + "- `likelihood`: Functions for computing the likelihood of the model given the data.\n", + "- `link_prediction`: Functions for evaluating link prediction algorithms.\n", + "\n", + "### 4. Synthetic\n", + "The `synthetic` module contains functions to generate synthetic data. It consists of the following submodules:\n", + "\n", + "- `base`: Create a synthetic, directed, and weighted network (possibly multilayer) by a standard\n", + "mixed-membership stochastic block-model.\n", + "- `reciprocity`: Generate a directed, possibly weighted, network with reciprocity.\n", + "- `dynamic`: Create synthetic networks that change over time.\n", + "- `anomaly`: Generation of synthetic networks with anomalies.\n", + "- `multilayer`: Generate synthetic multilayer networks.\n", + "\n", + "An example of how to use the `reciprocity` submodule is shown in the tutorial on the `CRep` algorithm.\n", + "\n", + "### 5. Model Selection\n", + "The `model_selection` module contains functions for model selection and cross-validation. It consists of the following submodules:\n", + "\n", + "- `parameter_search`: Functions for searching model parameters.\n", + "- `cross_validation`: Functions for performing cross-validation.\n", + "- `mtcov_cross_validation`: Cross-validation specific to the `MTCOV` algorithm.\n", + "- `dyncrep_cross_validation`: Cross-validation specific to the `DynCRep` algorithm.\n", + "- `acd_cross_validation`: Cross-validation specific to the `ACD` algorithm.\n", + "- `crep_cross_validation`: Cross-validation specific to the `CRep` algorithm.\n", + "- `jointcrep_cross_validation`: Cross-validation specific to the `JointCRep` algorithm.\n", + "- `masking`: Functions for masking data during cross-validation.\n", + "- `labeling`: Functions for labeling data.\n", + "- `main`: Main entry points for running model selection.\n", + "\n", + "### 6. Utils\n", + "The `utils` module contains utility functions used across the package. It consists of the following submodules:\n", + "- `matrix_operations`: Functions for matrix operations.\n", + "- `tools`: General utility functions.\n", + "\n", + "### 7. Main\n", + "The `main` module contains the main entry points for running the algorithms.\n", + "\n", + "### 8. Data\n", + "The `data` module contains the data files used by the package. It consists of the following submodules:\n", + "\n", + "- `input`: Input data files.\n", + "- `model`: Configuration files for the models.\n", + "\n", + "### 9. Visualization\n", + "The `visualization` module contains functions for visualizing the results of the models. It\n", + "consists of the following submodule:\n", + "- `plot`: the main module used for plotting.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Having explored the package structure, let's see how to use it to run the `MTCOV` algorithm." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Configuration\n", + "Let's start by configuring the algorithm and the parameters needed. The pipeline works based on two types of parameters:\n", + "\n", + "**Numerical Parameters:** These are operational parameters that control the execution of the algorithm. They are not directly related to the model's theoretical framework but are crucial for its practical implementation. Examples include:\n", + "\n", + "- **Convergence tolerance (`convergence_tol`):** This is a threshold used to determine when the\n", + "algorithm has converged, i.e., when the changes in the model's likelihood or parameters between iterations are small enough to consider the model as having reached its final state.\n", + "\n", + "- **Maximum number of iterations (`max_iter`):** This is the maximum number of times the algorithm will update the model's parameters. If the model hasn't converged by this point, the algorithm will stop anyway.\n", + "\n", + "- **Number of realizations (`num_realizations`):** This refers to the number of times the entire\n", + "process (initialization and iterative updates) is repeated. The algorithm will then return the best realization, that is, for instance, the one with the highest likelihood upon convergence. This is done to account for the randomness in the initialization step and to ensure a more robust final model.\n", + "\n", + "These are set by default in the model's class definition, but they can be changed by the user.\n", + "\n", + "**Model parameters:** These are parameters that are part of the model's theoretical framework. They have a direct impact on the model's behavior and the results it produces. Examples include:\n", + "\n", + "- **Number of communities (`K`)**: This is a fundamental parameter of the algorithms presented in\n", + "this package. It determines the number of communities the algorithm will try to find in the network.\n", + "\n", + "- **Scaling parameter (`gamma`)**: This is a fundamental parameter of the `MTCOV` algorithm.\n", + "It controls the relative contribution of the two terms in the likelihood, which accounts for network topology and node covariates, respectively. When `gamma=0`, the inference is performed by analyzing the data purely in terms of the network topology. Vice versa, when `gamma=1`, the algorithm only uses the attribute information.\n", + "\n", + "\n", + "Notice that the data is not a parameter, but an input to the algorithm, hence, it is not included in the default configuration of the class nor in the configuration file. This will be shown later in the tutorial." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a first step, let's configure the logger to show the information about the execution of the algorithm." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:30:12.013300Z", + "start_time": "2024-10-25T15:30:12.005968Z" + } + }, + "source": [ + "# Import the logging module\n", + "import logging\n", + "\n", + "# Get the root logger and set its level to INFO\n", + "logging.getLogger().setLevel(logging.INFO)" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Importing the data\n", + "We can now import the data using the `probinet` package." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:31:15.689497Z", + "start_time": "2024-10-25T15:31:14.997223Z" + } + }, + "source": [ + "from pathlib import Path\n", + "from probinet.input.loader import build_adjacency_and_design_from_file\n", + "from probinet.models.classes import GraphData\n", + "\n", + "# Define the names of the columns in the input file that\n", + "# represent the source and target nodes of each edge.\n", + "ego = \"source\"\n", + "alter = \"target\"\n", + "egoX = \"Name\"\n", + "\n", + "# Set the `force_dense` flag to False\n", + "# This flag determines whether the adjacency matrices\n", + "# should be stored as dense matrices.\n", + "# If set to False, the adjacency matrices will be stored\n", + "# as sparse matrices, which is more memory-efficient\n", + "# for large networks with few edges.\n", + "force_dense = False\n", + "\n", + "# Get the absolute path of the root directory of the project\n", + "root_dir = Path.cwd().parent.parent.parent.resolve()\n", + "\n", + "# Define the path to the input folder\n", + "in_folder = str(root_dir / \"probinet/data/input/\")\n", + "\n", + "# Define the name of the network file\n", + "adj_name = \"multilayer_network.csv\"\n", + "\n", + "# Define the name of the covariates file\n", + "cov_name = \"X.csv\"\n", + "\n", + "# Define the attribute name\n", + "attr_name = \"Metadata\"\n", + "\n", + "# Flag to treat the network as undirected\n", + "undirected = False\n", + "\n", + "# Call the `build_adjacency_and_design_from_file` function to load the data from the input file\n", + "# The function takes several arguments:\n", + "# - in_folder: the path to the data\n", + "# - adj_name: the name of the file with the adjacency matrix\n", + "# - cov_name: the name of the file with the design matrix\n", + "# - ego: the name of the column that references the node in one extreme of the directed edge\n", + "# - alter: the name of the column that references the other node\n", + "# - attr_name: name of the attribute to consider in the analysis\n", + "# - undirected: the flag that signals if the network is undirected\n", + "# - force_dense: if set to True, the algorithm is forced to consider a dense adjacency tensor\n", + "# - noselfloop : if set to True, the algorithm removes the self-loops\n", + "gdata: GraphData = build_adjacency_and_design_from_file(\n", + " in_folder,\n", + " adj_name=adj_name,\n", + " cov_name=cov_name,\n", + " ego=ego,\n", + " alter=alter,\n", + " egoX=egoX,\n", + " attr_name=attr_name,\n", + " undirected=undirected,\n", + " force_dense=force_dense,\n", + " noselfloop=True,\n", + ")" + ], + "outputs": [], + "execution_count": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get some information about the data, we can call the `print_graph_stats` function from the \n", + "`input.stats` module." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "ExecuteTime": { + "end_time": "2024-10-25T15:31:45.167826Z", + "start_time": "2024-10-25T15:31:45.019445Z" + } + }, + "source": [ + "from probinet.input.stats import print_graph_stats\n", + "\n", + "# Extract the graph list from the `GraphData` object\n", + "A = gdata.graph_list\n", + "\n", + "# Call the `print_graph_stats` function to print the basic\n", + "# statistics of the graphs in the list `A`.\n", + "print_graph_stats(A)" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Number of nodes = 300\n", + "INFO:root:Number of layers = 4\n", + "INFO:root:Number of edges and average degree in each layer:\n", + "INFO:root:E[0] = 1294 - = 8.63\n", + "INFO:root:Sparsity [0] = 0.014\n", + "INFO:root:Reciprocity (networkX) = 0.028\n", + "INFO:root:E[1] = 1340 - = 8.93\n", + "INFO:root:Sparsity [1] = 0.015\n", + "INFO:root:Reciprocity (networkX) = 0.021\n", + "INFO:root:E[2] = 724 - = 4.83\n", + "INFO:root:Sparsity [2] = 0.008\n", + "INFO:root:Reciprocity (networkX) = 0.030\n", + "INFO:root:E[3] = 742 - = 4.95\n", + "INFO:root:Sparsity [3] = 0.008\n", + "INFO:root:Reciprocity (networkX) = 0.003\n" + ] + } + ], + "execution_count": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's now show the adjacency matrix of one of the four layers." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:32:01.070753Z", + "start_time": "2024-10-25T15:32:01.060678Z" + } + }, + "source": [ + "import networkx as nx\n", + "\n", + "# Create a graph from the first adjacency matrix in the list A\n", + "graph = A[0]\n", + "\n", + "# Get the adjacency matrix\n", + "adjacency_matrix = nx.adjacency_matrix(graph)" + ], + "outputs": [], + "execution_count": 6 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:32:05.555444Z", + "start_time": "2024-10-25T15:32:04.427713Z" + } + }, + "source": [ + "# Import the `pyplot` module from `matplotlib` for creating\n", + "# static, animated, and interactive visualizations in Python.\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Display the reshaped adjacency matrix as an image\n", + "# The `imshow` function from the `pyplot` module is used to\n", + "# display data as an image.\n", + "# The `cmap` argument specifies the colormap to use for the image\n", + "# The `interpolation` argument specifies the interpolation method\n", + "# to use when resizing the image.\n", + "plt.imshow(adjacency_matrix.toarray(), cmap=\"Greys\", interpolation=\"none\")\n", + "\n", + "# Add a color bar to the plot for reference\n", + "# The colors in the color bar correspond to the values in the image:\n", + "# black for 1, meaning a connection, and white for 0, meaning no connection.\n", + "plt.colorbar()\n", + "plt.show()" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see in the matrix, the network is not fully connected, i.e., there are nodes that are not \n", + "connected to any other node. This is a common characteristic of real-world networks. More \n", + "importantly, we can see that the network has two main clusters of nodes, which are represented by the two regions more densely connected. These are the communities that the `MTCOV` algorithm will try to detect." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the Model\n", + "Finally, we are ready to run the `MTCOV` model! The way this works is in a two-step process:
\n", + "1. Initialize the `MTCOV` model by creating an instance of the `MTCOV` class.\n", + "2. Execute the `fit` method on the created instance to run the algorithm." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:32:11.347566Z", + "start_time": "2024-10-25T15:32:10.606914Z" + } + }, + "source": [ + "# Import the `MTCOV` class from the `probinet.models.mtcov` module\n", + "# This class is used to create an instance of the `MTCOV` algorithm\n", + "from probinet.models.mtcov import MTCOV\n", + "\n", + "# Create an instance of the `MTCOV` class\n", + "# The `MTCOV` class takes no arguments, unless the user wants\n", + "# to change the default of the numerical parameters.\n", + "model = MTCOV()\n", + "\n", + "# Print all the attributes of the `MTCOV` instance\n", + "# The `__dict__` attribute of an object is a dictionary containing\n", + "# the object's attributes.\n", + "# These correspond to the numerical parameters\n", + "print(model.__dict__)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'inf': 10000000000.0, 'err_max': 1e-07, 'err': 0.1, 'num_realizations': 1, 'convergence_tol': 0.0001, 'decision': 10, 'max_iter': 500, 'plot_loglik': False, 'flag_conv': 'log', 'attributes_to_save_names': ['u_f', 'v_f', 'w_f', 'eta_f', 'final_it', 'maxL', 'maxPSL', 'beta_f', 'nodes', 'pibr', 'mupr'], 'u_f': array([], dtype=float64), 'v_f': array([], dtype=float64), 'w_f': array([], dtype=float64), 'use_unit_uniform': False, 'theta': {}, 'normalize_rows': False, 'nodes': [], 'rng': RandomState(MT19937) at 0x781E78162A40, 'beta_hat': array([], dtype=float64), 'best_r': 0, 'final_it': 0}\n" + ] + } + ], + "execution_count": 8 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Model created! Now, we can run the model using the `fit` method. As mentioned before, this method\n", + " takes as input the data, and model parameters." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:32:26.372086Z", + "start_time": "2024-10-25T15:32:24.782458Z" + } + }, + "source": [ + "# Import the `time` module\n", + "import time\n", + "\n", + "# Import the `numpy` module\n", + "import numpy as np\n", + "\n", + "# Define the output folder\n", + "out_folder = \"tutorial_outputs/MTCOV/\"\n", + "\n", + "# Get the current time\n", + "time_start = time.time()\n", + "\n", + "# Run the `MTCOV` model\n", + "# The `fit` method of the `MTCOV` class takes several arguments:\n", + "# - gdata: the data to be analyzed\n", + "# - out_inference: if set to True, the algorithm saves the final state of the models\n", + "# - out_folder: the folder where the output files will be saved\n", + "# - end_file: the ending of the file name\n", + "\n", + "_ = model.fit(\n", + " gdata,\n", + " out_inference=True,\n", + " out_folder=out_folder,\n", + " end_file=\"_MTCOV\",\n", + ")\n", + "\n", + "# Print the time elapsed since the start of the `MTCOV` algorithm\n", + "print(f\"\\nTime elapsed: {np.round(time.time() - time_start, 2)} seconds.\")" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:gamma = 0.5\n", + "INFO:root:Inferred parameters saved in: /home/dtheuerkauf/software-workshop/prob-gen-model-for-nets/doc/source/tutorials/tutorial_outputs/MTCOV/theta_MTCOV.npz\n", + "INFO:root:To load: theta=np.load(filename), then e.g. theta[\"u\"]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Time elapsed: 1.58 seconds.\n" + ] + } + ], + "execution_count": 9 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Done! The final state of the model is not returned, but it is saved to the output folder." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analyzing the results\n", + "Next, we will examine the outcomes produced by the model. To do this, it is necessary to load the\n", + " contents from the file `theta_MTCOV.npz`, generated by the `fit` method." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-25T15:32:31.842417Z", + "start_time": "2024-10-25T15:32:31.837219Z" + } + }, + "source": [ + "# Define the path to the file containing the results of the `MTCOV` models\n", + "filename = out_folder + \"/theta_MTCOV.npz\"\n", + "\n", + "# Load the contents of the file into a dictionary\n", + "theta = np.load(filename)" + ], + "outputs": [], + "execution_count": 10 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once this is done, we can unpack the latent variables." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-12T15:54:54.078103Z", + "start_time": "2024-08-12T15:54:54.073469Z" + } + }, + "source": [ + "# Unpack the latent variables from the results of the `MTCOV` models\n", + "# The `u` variable represents the out-going memberships of the\n", + "# nodes in the graph.\n", + "# The `v` variable represents the in-coming memberships of the\n", + "# nodes in the graph.\n", + "# The `w` variable represents the affinity of the communities\n", + "# for each layer.\n", + "# The `beta` variable represents the relationships between\n", + "# communities and covariates.\n", + "u, v, w, beta = theta[\"u\"], theta[\"v\"], theta[\"w\"], theta[\"beta\"]" + ], + "outputs": [], + "execution_count": 11 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As outlined in the main reference {cite}`contisciani2020community`, `MTCOV` assumes a mixed-membership community structure, which \n", + "means that \n", + "every node can belong to more than one community with a different strength. The variables `u` and\n", + " `v` are _NxK_ membership matrices that represent the out-going and in-coming node memberships, \n", + " respectively. In this specific demonstration, it's important to recall that we configured the \n", + " model parameter `K`, representing the number of communities, to be 2. Consequently, by examining the values of `u` for each node, we expect to obtain vector of length two, where the first entry is the probability of node _i_ to belong to community 1 and the second one represents the probability to belong to community 2." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-12T15:54:55.097097Z", + "start_time": "2024-08-12T15:54:55.091319Z" + } + }, + "source": [ + "# Iterate over the first 10 nodes in the graph\n", + "for idx, values in enumerate(u[:10]):\n", + " # Print the probability that the node belongs to the two communities\n", + " print(\n", + " f\"The probability that the node {idx} belongs to the two communities is: {values}\"\n", + " )" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The probability that the node 0 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 1 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 2 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 3 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 4 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 5 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 6 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 7 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 8 belongs to the two communities is: [1. 0.]\n", + "The probability that the node 9 belongs to the two communities is: [1. 0.]\n" + ] + } + ], + "execution_count": 12 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To visualize the hard-memberships for the out-going case, we can assign each node to the \n", + "community with the highest probability in `u`. We can then print the community assignments for the first 10 nodes." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "ExecuteTime": { + "end_time": "2024-08-12T15:54:56.386907Z", + "start_time": "2024-08-12T15:54:56.382781Z" + } + }, + "source": [ + "# Calculate the hard-memberships for the out-going case\n", + "u_hard = np.argmax(u, axis=1)\n", + "\n", + "# Get the indices of nodes in community 1 and community 2\n", + "community1_nodes = np.where(u_hard == 0)[0] # Community 1 corresponds to index 0\n", + "community2_nodes = np.where(u_hard == 1)[0] # Community 2 corresponds to index 1\n", + "\n", + "# Print some nodes from community 1\n", + "print(\"Some nodes in community 1:\")\n", + "print(community1_nodes[:10])\n", + "\n", + "# Print some nodes from community 2\n", + "print(\"\\nSome nodes in community 2:\")\n", + "print(community2_nodes[0:10])" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Some nodes in community 1:\n", + "[0 1 2 3 4 5 6 7 8 9]\n", + "\n", + "Some nodes in community 2:\n", + "[150 151 152 153 154 155 156 157 158 159]\n" + ] + } + ], + "execution_count": 13 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have learned this way to assign each node to a community, using the results given by the \n", + "`MTCOV` algorithm. For a more graphical approach, we invite the reader to take a look at the tutorial on the \n", + "[`JointCRep` algorithm](./JointCRep.ipynb), where we show how to plot the communities in the \n", + "network." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to investigate the node memberships, we can interpret the relationships between the \n", + "inferred communities and the node covariate through the variable `beta`. As outlined in the main\n", + " reference, \n", + "`beta` is a _KxZ_ dimensional matrix, where _Z_ denotes the total number of different categories \n", + "of the node attribute. In this example, the attribute Metadata has 2 categories. Then, every row \n", + "_k_ of the beta matrix denotes how much information of the different categories is used to create\n", + " the _k_-th community. Also, this variable is normalized such that every row sums to 1." + ] + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-12T15:54:58.139296Z", + "start_time": "2024-08-12T15:54:58.001888Z" + } + }, + "source": [ + "plt.imshow(beta, cmap=\"Greys\", interpolation=\"none\", vmin=0, vmax=1)\n", + "\n", + "plt.xticks([0, 1], [\"Metadata 0\", \"Metadata 1\"])\n", + "plt.yticks([0, 1], [\"Community 0\", \"Community 1\"])\n", + "\n", + "plt.colorbar()\n", + "plt.show()" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGiCAYAAAAba+fDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsz0lEQVR4nO3de3RU5b3/8c8EyAQIk3BNAEcDHm6RaxOJEcXgCo0t5oCHc6DKaSAiVgWLpB4up0IQL1SollKjiOWmLSXHuxUMCyOXVYlEwKyDNSAB06RKApRDEqIxMbN/f/jLnDMmwIRJCLOf92ut+SN79t7PM+Ms5uP3++zZDsuyLAEAANhESFtPAAAAoCURbgAAgK0QbgAAgK0QbgAAgK0QbgAAgK0QbgAAgK0QbgAAgK0QbgAAgK0QbgAAgK0QbgAAgK0QbgAAQKvZs2ePUlNT1adPHzkcDr355psXPWbXrl36wQ9+IKfTqX/6p3/Sxo0bmzUm4QYAALSa6upqjRgxQllZWX7t//nnn2vChAkaN26cCgoK9NBDD+mee+7R9u3b/R7TwY0zAQDA5eBwOPTGG29o0qRJ591nwYIF2rp1qz755BPvtp/85Cc6e/ascnJy/BqnfaATRdvyeDz68ssv1aVLFzkcjraeDgCgmSzLUlVVlfr06aOQkNZrqNTU1Ki2tjbg81iW1ej7xul0yul0BnxuScrLy1NycrLPtpSUFD300EN+n4NwE+S+/PJLud3utp4GACBApaWluuqqq1rl3DU1NerYsWOLnCs8PFznzp3z2ZaZmamlS5e2yPnLysoUFRXlsy0qKkqVlZX6+uuv/XodhJsg16VLF0nS9ddfr/bt+c8Je1q3bl1bTwFoNefOndPo0aO9/563hpao2DQ4d+6cSktL5XK5vNtaqmrTUvg2DHINpcH27dsTbmBbrfmPPnCluFxLCwIZp2GZrsvl8gk3LSk6Olrl5eU+28rLy+VyufyuPvFtCACAIRwOR8AhqrWvQ0pMTNS2bdt8tu3YsUOJiYl+n4NLwQEAMERDuAnk0Vznzp1TQUGBCgoKJH13qXdBQYFKSkokSYsWLVJaWpp3//vuu0/Hjx/X/PnzdfjwYT333HP6r//6L82bN8/vMancAABgiJCQkIDbUh6Pp1nH7N+/X+PGjfP+nZGRIUmaPn26Nm7cqBMnTniDjiT169dPW7du1bx58/Tb3/5WV111lX7/+98rJSXF7zEJNwAAoNUkJSVdsJXV1K8PJyUl6eOPP77kMQk3AAAYoiXW3AQDwg0AAIYwJdywoBgAANgKlRsAAAxhSuWGcAMAgCFMCTe0pQAAgK1QuQEAwBCmVG4INwAAGKIlfsQvGNCWAgAAtkLlBgAAQ9CWAgAAtkK4AQAAtmJKuGHNDQAAsBUqNwAAGMKUyg3hBgAAQ5gSbmhLAQAAW6FyAwCAIRwOh0JCLr2u4fF4WnA2rYdwAwCAIQJtSwVLS4u2FAAAsBUqNwAAGMKUyg3hBgAAQ5gSbmhLAQAAW6FyAwCAIUyp3BBuAAAwBOEGAADYSkhISEC/cxMs7P8KAQCAUajcAABgCNpSAADAVkwJN7SlAACArVC5AQDAEKZUbgg3AAAYwpRwQ1sKAADYCpUbAAAMYUrlhnADAIAh+BE/AACAIETlBgAAQ9CWAgAAtkK4AQAAtmJKuGHNDQAAsBUqNwAAGCRYqi+BINwAAGCIQC8FtyyrBWfTemhLAQAAW6FyAwCAIUxZUEy4AQDAEKaEG9pSAADAVqjcAABgCFMWFBNuAAAwBG0pAACAIETlBgAAQ9CWAgAAtmJKW4pwAwCAIUwJN6y5AQAAtkLlBgAAQ7DmBgAA2AptKQAAgCBE5QYAAEPQlgIAALZCWwoAACAIUbkBAMAQDocjoLaUx+Npwdm0HsINAACGoC0FAAAQhKjcAABgCFMqN4QbAAAMEeil4IEcezkFxywBAEDAGio3gTwuRVZWlmJiYhQWFqaEhATl5+dfcP9Vq1Zp0KBB6tixo9xut+bNm6eamhq/xyPcAACAVpOdna2MjAxlZmbq4MGDGjFihFJSUnTy5Mkm99+8ebMWLlyozMxMFRYWat26dcrOztZ//ud/+j0m4QYAAEM0tKUCeTTXM888o1mzZik9PV2xsbFas2aNOnXqpPXr1ze5/969ezVmzBjdddddiomJ0Q9/+EPdeeedF632+LzOZs8SAAAEpZZqS1VWVvo8vvnmmybHq62t1YEDB5ScnOzdFhISouTkZOXl5TV5zI033qgDBw54w8zx48e1bds2/fjHP/b7dRJuAABAs7jdbkVERHgfy5cvb3K/06dPq76+XlFRUT7bo6KiVFZW1uQxd911l5YtW6abbrpJHTp00LXXXqukpKRmtaW4WgoAAEO01KXgpaWlcrlc3u1OpzPguTXYtWuXnnzyST333HNKSEhQUVGR5s6dq8cee0yLFy/26xyEGwAADNFSl4K7XC6fcHM+PXr0ULt27VReXu6zvby8XNHR0U0es3jxYv30pz/VPffcI0kaNmyYqqurde+99+qXv/ylX/OnLQUAAFpFaGio4uLilJub693m8XiUm5urxMTEJo/56quvGgWYdu3aSZIsy/JrXCo3AAAYoi1+oTgjI0PTp09XfHy8Ro8erVWrVqm6ulrp6emSpLS0NPXt29e7bic1NVXPPPOMRo0a5W1LLV68WKmpqd6QczGEGwAADNEWv1A8depUnTp1SkuWLFFZWZlGjhypnJwc7yLjkpISn/M+8sgjcjgceuSRR/TFF1+oZ8+eSk1N1RNPPOH3mA7L3xoPrkiVlZWKiIhQYmKi2rcnq8KeNm/e3NZTAFpNVVWVYmNjVVFR4dc6lkvR8F1x6623BvRd8e233+r9999v1bm2BL4NAQAwBDfOBAAAtkK4AQAAtuJwOAJacxMs4YZLwQEAgK1QuQEAwBC0pQAAgK20xaXgbSE4ZnkFcDgcevPNN9t6GgAA4CKaHW7Kysr04IMPqn///nI6nXK73UpNTfX5aWU7OnHihH70ox9JkoqLi+VwOFRQUBDweWtqajR79mx1795d4eHhmjx5cqN7cAAA0BIa2lKBPIJBs9pSxcXFGjNmjCIjI7Vy5UoNGzZMdXV12r59u2bPnq3Dhw+31jzb3Plu8BWoefPmaevWrXrllVcUERGhOXPm6F/+5V/0wQcftMp4AABz0ZZqwgMPPCCHw6H8/HxNnjxZAwcO1HXXXaeMjAx9+OGH3v1KSko0ceJEhYeHy+VyacqUKT7ViKVLl2rkyJFav369rr76aoWHh+uBBx5QfX29VqxYoejoaPXq1avRTy07HA698MILuv3229WpUycNGTJEeXl5KioqUlJSkjp37qwbb7xRx44d8x4zY8YMTZo0yec8Dz30kJKSkrx/JyUl6ec//7nmz5+vbt26KTo6WkuXLm00dkNbql+/fpKkUaNGyeFwKCkpSXv27FGHDh1UVlbWaKybb765yfezoqJC69at0zPPPKNbb71VcXFx2rBhg/bu3evzfgIAAP/5HW7OnDmjnJwczZ49W507d270fGRkpKTv7vY5ceJEnTlzRrt379aOHTt0/PhxTZ061Wf/Y8eO6d1331VOTo7+9Kc/ad26dZowYYL+/ve/a/fu3Xrqqaf0yCOPaN++fT7HPfbYY0pLS1NBQYEGDx6su+66Sz/72c+0aNEi7d+/X5Zlac6cOc1+IzZt2qTOnTtr3759WrFihZYtW6YdO3Y0uW9+fr4k6b333tOJEyf0+uuva+zYserfv79efvll7351dXX64x//qLvvvrvJ8xw4cEB1dXVKTk72bhs8eLCuvvpq5eXlNXnMN998o8rKSp8HAAD+MKUt5Xe4KSoqkmVZGjx48AX3y83N1aFDh7R582bFxcUpISFBL730knbv3q2PPvrIu5/H49H69esVGxur1NRUjRs3TkeOHNGqVas0aNAgpaena9CgQdq5c6fP+dPT0zVlyhQNHDhQCxYsUHFxsaZNm6aUlBQNGTJEc+fO1a5du5r3LkgaPny4MjMzNWDAAKWlpSk+Pv6864h69uwpSerevbuio6PVrVs3SdLMmTO1YcMG735//vOfVVNToylTpjR5nrKyMoWGhnqDYYOoqKhGFaAGy5cvV0REhPfhdrub+1IBAIYi3HyPv/fXLCwslNvt9vnSjY2NVWRkpAoLC73bYmJi1KVLF+/fUVFRio2N9ennRUVF6eTJkz7nHz58uM/zkjRs2DCfbTU1Nc2uaPzf80pS7969G419MTNmzFBRUZG3pbRx40ZNmTKlyUrXpVq0aJEqKiq8j9LS0hY7NwAAduD3guIBAwbI4XC02KLhDh06+PztcDia3ObxeM57XEOCbGpbw3EhISGNglldXZ1f8/n+2BfTq1cvpaamasOGDerXr5/efffdC1aRoqOjVVtbq7Nnz/pUb8rLy8+7gNnpdMrpdDZrXgAASOb8iJ/flZtu3bopJSVFWVlZqq6ubvT82bNnJUlDhgxRaWmpT0Xh008/1dmzZxUbGxv4jJupZ8+eOnHihM+2QC/hDg0NlSTV19c3eu6ee+5Rdna21q5dq2uvvVZjxow573ni4uLUoUMHn/bXkSNHVFJSosTExIDmCADA99GWakJWVpbq6+s1evRovfbaazp69KgKCwu1evVq75dxcnKyhg0bpmnTpungwYPKz89XWlqabrnlFsXHx7fKi7iQW2+9Vfv379dLL72ko0ePKjMzU5988klA5+zVq5c6duyonJwclZeXq6KiwvtcSkqKXC6XHn/8caWnp1/wPBEREZo5c6YyMjK0c+dOHThwQOnp6UpMTNQNN9wQ0BwBAPg+wk0T+vfvr4MHD2rcuHH6xS9+oaFDh2r8+PHKzc3V888/L+m7N+6tt95S165dNXbsWCUnJ6t///7Kzs5ulRdwMSkpKVq8eLHmz5+v66+/XlVVVUpLSwvonO3bt9fq1av1wgsvqE+fPpo4caL3uZCQEM2YMUP19fV+jfOb3/xGt99+uyZPnqyxY8cqOjpar7/+ekDzAwDAZA7L35XC8NvMmTN16tQpvf32260+VmVlpSIiIpSYmKj27blVGOxp8+bNbT0FoNVUVVUpNjZWFRUVcrlcrTJGw3fFHXfc0WiNaXPU1dXpjTfeaNW5tgS+DVtQRUWF9zL4yxFsAABoDlMWFBNuWtDEiROVn5+v++67T+PHj2/r6QAAYCTCTQu6lB8PBADgcqFyAwAAbIUbZwIAAAQhKjcAABiCthQAALCdYAkogaAtBQAAbIXKDQAAhqAtBQAAbIVwAwAAbMWUcMOaGwAAYCtUbgAAMIQplRvCDQAAhjAl3NCWAgAAtkLlBgAAQ5hSuSHcAABgCFPCDW0pAABgK1RuAAAwhCmVG8INAACGMCXc0JYCAAC2QuUGAABDmFK5IdwAAGAIwg0AALAVU8INa24AAICtULkBAMAQplRuCDcAABjClHBDWwoAANgKlRsAAAxhSuWGcAMAgCFMCTe0pQAAgK1QuQEAwBCmVG4INwAAGCRYAkogaEsBAABboXIDAIAhaEsBAABbIdwAAABbMSXcsOYGAADYCpUbAAAMYUrlhnADAIAhTAk3tKUAAICtULkBAMAQISEhCgm59LpGIMdeToQbAAAMQVsKAAAgCFG5AQDAEFRuAACArTSEm0AelyIrK0sxMTEKCwtTQkKC8vPzL7j/2bNnNXv2bPXu3VtOp1MDBw7Utm3b/B6Pyg0AAIZoi8pNdna2MjIytGbNGiUkJGjVqlVKSUnRkSNH1KtXr0b719bWavz48erVq5deffVV9e3bV3/7298UGRnp95iEGwAA0GqeeeYZzZo1S+np6ZKkNWvWaOvWrVq/fr0WLlzYaP/169frzJkz2rt3rzp06CBJiomJadaYtKUAADBES7WlKisrfR7ffPNNk+PV1tbqwIEDSk5O9m4LCQlRcnKy8vLymjzm7bffVmJiombPnq2oqCgNHTpUTz75pOrr6/1+nYQbAAAM0VLhxu12KyIiwvtYvnx5k+OdPn1a9fX1ioqK8tkeFRWlsrKyJo85fvy4Xn31VdXX12vbtm1avHixnn76aT3++ON+v07aUgAAoFlKS0vlcrm8fzudzhY7t8fjUa9evbR27Vq1a9dOcXFx+uKLL7Ry5UplZmb6dQ7CDQAAhmipBcUul8sn3JxPjx491K5dO5WXl/tsLy8vV3R0dJPH9O7dWx06dFC7du2824YMGaKysjLV1tYqNDT0ouPSlgIAwBCX+1Lw0NBQxcXFKTc317vN4/EoNzdXiYmJTR4zZswYFRUVyePxeLd99tln6t27t1/BRiLcAACAVpSRkaEXX3xRmzZtUmFhoe6//35VV1d7r55KS0vTokWLvPvff//9OnPmjObOnavPPvtMW7du1ZNPPqnZs2f7PSZtKQAADNEWv3MzdepUnTp1SkuWLFFZWZlGjhypnJwc7yLjkpISnxtyut1ubd++XfPmzdPw4cPVt29fzZ07VwsWLPB7TMINAACGaKvbL8yZM0dz5sxp8rldu3Y12paYmKgPP/zwksaSaEsBAACboXIDAIAhHA6HTwvoUo4PBoQbAAAMYcpdwQk3AAAYwpRww5obAABgK1RuAAAwhCmVG8INAACGMCXc0JYCAAC2QuUGAABDmFK5IdwAAGAIU8INbSkAAGArVG4AADCEKZUbwg0AAIYwJdzQlgIAALZC5QYAAEOYUrkh3AAAYIiQkJCA7goeyLGXE+EGAABDmFK5CY4IBgAA4CcqNwAAGMKUyg3hBgAAQ5gSbmhLAQAAW6FyAwCAIUyp3BBuAAAwhCnhhrYUAACwFSo3AAAYJFiqL4Eg3AAAYAjaUgAAAEGIyg0AAIYwpXJDuAEAwBCEGwSVnJwcuVyutp4G0CqC5R9U4Epnyl3Bg2OWAAAAfqJyAwCAIWhLAQAAWzEl3NCWAgAAtkLlBgAAQ5hSuSHcAABgCK6WAgAACEJUbgAAMARtKQAAYCumhBvaUgAAwFao3AAAYAhTKjeEGwAADEG4AQAAtsKl4AAAAEGIyg0AAIagLQUAAGwnWAJKIGhLAQAAW6FyAwCAIWhLAQAAW+FqKQAAgCBE5QYAAEPQlgIAALZiSrihLQUAAGyFyg0AAIYwpXJDuAEAwBCEGwAAYCtcCg4AABCEqNwAAGAI2lIAAMBWTAk3tKUAAICtULkBAMAQplRuCDcAABiCq6UAAACCEOEGAABDNLSlAnlciqysLMXExCgsLEwJCQnKz8/367gtW7bI4XBo0qRJzRqPcAMAgCHaItxkZ2crIyNDmZmZOnjwoEaMGKGUlBSdPHnygscVFxfr4Ycf1s0339zsMQk3AACgWSorK30e33zzzXn3feaZZzRr1iylp6crNjZWa9asUadOnbR+/frzHlNfX69p06bp0UcfVf/+/Zs9P8INAACGaKnKjdvtVkREhPexfPnyJserra3VgQMHlJyc7N0WEhKi5ORk5eXlnXeey5YtU69evTRz5sxLep1cLQUAgCFa6lLw0tJSuVwu73an09nk/qdPn1Z9fb2ioqJ8tkdFRenw4cNNHvOXv/xF69atU0FBwSXPk3ADAIAhHA5HQJdzN4Qbl8vlE25aSlVVlX7605/qxRdfVI8ePS75PIQbAADQKnr06KF27dqpvLzcZ3t5ebmio6Mb7X/s2DEVFxcrNTXVu83j8UiS2rdvryNHjujaa6+96LisuQEAwBCX+2qp0NBQxcXFKTc317vN4/EoNzdXiYmJjfYfPHiwDh06pIKCAu/jn//5nzVu3DgVFBTI7Xb7NS6VGwAADNEWt1/IyMjQ9OnTFR8fr9GjR2vVqlWqrq5Wenq6JCktLU19+/bV8uXLFRYWpqFDh/ocHxkZKUmNtl8I4QYAALSaqVOn6tSpU1qyZInKyso0cuRI5eTkeBcZl5SUtPhtHRyWZVktekZcVpWVlYqIiFBFRUWrLO4CrgTBcrM+IBCt+e94w3fFm2++qc6dO1/yeaqrqzVp0qQr/juHyg0AAIbgxpkAAABBiMoNAACGaIsFxW2Byg0AALAVwg0AALAV2lIAABjClLYU4QYAAEMQbgAAgK2YEm5YcwMAAGyFyg0AAIYwpXJDuAEAwBCmhBvaUgAAwFao3AAAYAhTKjeEGwAADGFKuKEtBQAAbIVwAwAAbIW2FAAAhqAtBQAAEISo3AAAYAhTKjeEGwAADEG4AQAAthMsASUQrLkBAAC2QuUGAABD0JYCAAC2Ykq4oS0FAABshcoNAACGoHIDAAAQhAg3AADAVmhLAQBgCFPaUoQbAAAMYUq4oS0FAABshcoNAACGMKVyQ7gBAMAQhBsAAGArpoQb1twAAABboXIDAIAhTKncEG4AADCEKeGGthQAALAVKjcAABiCyg0AAEAQItwAAABboS0FAIAhTGlLEW4AADCEKeGGtpSfHA6H3nzzzbaeBgAAuIhmh5uysjI9+OCD6t+/v5xOp9xut1JTU5Wbm9sa87tinDhxQj/60Y8kScXFxXI4HCooKAj4vGvXrlVSUpJcLpccDofOnj0b8DkBAGhKQ+UmkEcwaFZbqri4WGPGjFFkZKRWrlypYcOGqa6uTtu3b9fs2bN1+PDh1ppnm4uOjm6V83711Ve67bbbdNttt2nRokWtMgYAABJtqSY98MADcjgcys/P1+TJkzVw4EBdd911ysjI0Icffujdr6SkRBMnTlR4eLhcLpemTJmi8vJy7/NLly7VyJEjtX79el199dUKDw/XAw88oPr6eq1YsULR0dHq1auXnnjiCZ/xHQ6HXnjhBd1+++3q1KmThgwZory8PBUVFSkpKUmdO3fWjTfeqGPHjnmPmTFjhiZNmuRznoceekhJSUnev5OSkvTzn/9c8+fPV7du3RQdHa2lS5c2GruhLdWvXz9J0qhRo+RwOJSUlKQ9e/aoQ4cOKisrazTWzTfffN739KGHHtLChQt1ww03nHcfAABagimVG7/DzZkzZ5STk6PZs2erc+fOjZ6PjIyUJHk8Hk2cOFFnzpzR7t27tWPHDh0/flxTp0712f/YsWN69913lZOToz/96U9at26dJkyYoL///e/avXu3nnrqKT3yyCPat2+fz3GPPfaY0tLSVFBQoMGDB+uuu+7Sz372My1atEj79++XZVmaM2dOs9+ITZs2qXPnztq3b59WrFihZcuWaceOHU3um5+fL0l67733dOLECb3++usaO3as+vfvr5dfftm7X11dnf74xz/q7rvvbvZ8zuebb75RZWWlzwMAAPwvv8NNUVGRLMvS4MGDL7hfbm6uDh06pM2bNysuLk4JCQl66aWXtHv3bn300Ufe/Twej9avX6/Y2FilpqZq3LhxOnLkiFatWqVBgwYpPT1dgwYN0s6dO33On56erilTpmjgwIFasGCBiouLNW3aNKWkpGjIkCGaO3eudu3a1bx3QdLw4cOVmZmpAQMGKC0tTfHx8eddR9SzZ09JUvfu3RUdHa1u3bpJkmbOnKkNGzZ49/vzn/+smpoaTZkypdnzOZ/ly5crIiLC+3C73S12bgCAvVG5+R7Lsvzar7CwUG632+dLNzY2VpGRkSosLPRui4mJUZcuXbx/R0VFKTY2ViEhIT7bTp486XP+4cOH+zwvScOGDfPZVlNT0+yKxv89ryT17t270dgXM2PGDBUVFXlbdBs3btSUKVOarHRdqkWLFqmiosL7KC0tbbFzAwBgB34vKB4wYIAcDkeLLRru0KGDz98Oh6PJbR6P57zHNSTIprY1HBcSEtIomNXV1fk1n++PfTG9evVSamqqNmzYoH79+undd9+9pCrShTidTjmdzhY9JwAAduJ35aZbt25KSUlRVlaWqqurGz3fcAnzkCFDVFpa6lNR+PTTT3X27FnFxsYGPuNm6tmzp06cOOGzLdBLuENDQyVJ9fX1jZ675557lJ2drbVr1+raa6/VmDFjAhoLAICWZPeWlNTMq6WysrJUX1+v0aNH67XXXtPRo0dVWFio1atXKzExUZKUnJysYcOGadq0aTp48KDy8/OVlpamW265RfHx8a3yIi7k1ltv1f79+/XSSy/p6NGjyszM1CeffBLQOXv16qWOHTsqJydH5eXlqqio8D6XkpIil8ulxx9/XOnp6Rc9V1lZmQoKClRUVCRJOnTokAoKCnTmzJmA5ggAwPex5qYJ/fv318GDBzVu3Dj94he/0NChQzV+/Hjl5ubq+eefl/TdG/fWW2+pa9euGjt2rJKTk9W/f39lZ2e3ygu4mJSUFC1evFjz58/X9ddfr6qqKqWlpQV0zvbt22v16tV64YUX1KdPH02cONH7XEhIiGbMmKH6+nq/xlmzZo1GjRqlWbNmSZLGjh2rUaNG6e233w5ojgAAmMph+btSGH6bOXOmTp06dVkCSmVlpSIiIlRRUSGXy9Xq4wFtIVj+bxEIRGv+O97wXfHxxx/7XMzTXFVVVRo1atQV/53DjTNbUEVFhfcyeCovAIArjSm/UEy4aUETJ05Ufn6+7rvvPo0fP76tpwMAgJEINy2opS/7BgCgJVG5AQAAtmJKuGnW1VIAAABXOsINAACwFdpSAAAYwpS2FOEGAABDmBJuaEsBAIBWlZWVpZiYGIWFhSkhIUH5+fnn3ffFF1/UzTffrK5du6pr165KTk6+4P5NIdwAAIBWk52drYyMDGVmZurgwYMaMWKEUlJSdPLkySb337Vrl+68807t3LlTeXl5crvd+uEPf6gvvvjC7zG5/UKQ4/YLMEGwlMKBQFyO2y/89a9/Dfj2C9ddd51KS0t95up0OuV0Ops8JiEhQddff72effZZSZLH45Hb7daDDz6ohQsXXnTM+vp6de3aVc8++6zf94akcgMAAJrF7XYrIiLC+1i+fHmT+9XW1urAgQNKTk72bgsJCVFycrLy8vL8Guurr75SXV2dunXr5vf8WFAMAIAhWmpBcVOVm6acPn1a9fX1ioqK8tkeFRWlw4cP+zXmggUL1KdPH5+AdDGEGwAADNFS4cblcl2WpRC/+tWvtGXLFu3atUthYWF+H0e4AQAAraJHjx5q166dysvLfbaXl5crOjr6gsf++te/1q9+9Su99957Gj58eLPGZc0NAABoFaGhoYqLi1Nubq53m8fjUW5urhITE8973IoVK/TYY48pJydH8fHxzR6Xyg0AAIZoix/xy8jI0PTp0xUfH6/Ro0dr1apVqq6uVnp6uiQpLS1Nffv29S5Kfuqpp7RkyRJt3rxZMTExKisrkySFh4crPDzcrzEJNwAAGKItws3UqVN16tQpLVmyRGVlZRo5cqRycnK8i4xLSkoUEvK/jaTnn39etbW1+td//Vef82RmZmrp0qX+zZPfuQlu/M4NTMDv3MAEl+N3bo4cORLw79wMGjToiv/OoXIDAIAhuLcUAABAECLcAAAAW6EtBQCAIUxpSxFuAAAwhCnhhrYUAACwFcINAACwFdpSAAAYgrYUAABAEKJyAwCAIUyp3BBuAAAwhCnhhrYUAACwFcINAACwFdpSAAAYJFhaS4Eg3AAAYAjW3AAAAAQhwg0AALAV2lIAABiCthQAAEAQonIDAIAhqNwAAAAEIcINAACwFdpSAAAYgrYUAABAEKJyAwCAIajcAAAABCHCDQAAsBXaUgAAGIK2FAAAQBAi3AAAAFuhLQUAgCFoSwEAAAQhwg0AALAV2lIAABiCthQAAEAQItwAAABboS0FAIAhaEsBAAAEIcINAACwFdpSAAAYgrYUAABAECLcAAAAWyHcAAAAW2HNDQAAhmDNDQAAQBAi3AAAAFuhLQUAgCFoSwEAAAQhwg0AALAV2lIAABiCthQAAEAQItwAAABboS0FAIAhaEsBAAAEIcINAACwFdpSAAAYgrYUAABAECLcAAAAW6EtBQCAIWhLAQAABCHCDQAAsBXaUgAAGIK2FAAAQBAi3AAAYIiGyk0gj0uRlZWlmJgYhYWFKSEhQfn5+Rfc/5VXXtHgwYMVFhamYcOGadu2bc0aj3ADAABaTXZ2tjIyMpSZmamDBw9qxIgRSklJ0cmTJ5vcf+/evbrzzjs1c+ZMffzxx5o0aZImTZqkTz75xO8xHZZlWS31AnD5VVRUKDIyUqWlpXK5XG09HaBVREREtPUUgFZ39uzZVvusV1ZWKiIiIuDvisrKSrnd7kbncTqdcjqdTR6TkJCg66+/Xs8++6wkyePxyO1268EHH9TChQsb7T916lRVV1frnXfe8W674YYbNHLkSK1Zs8avebKgOMhVVVVJktxudxvPBAAQiKqqqlYLN6GhoYqOjm6R74rw8PBG58nMzNTSpUsb7VtbW6sDBw5o0aJF3m0hISFKTk5WXl5ek+fPy8tTRkaGz7aUlBS9+eabfs+RcBPk+vTpo9LSUnXp0iVoVrEHu/P9nwtgF3zGLy/LslRVVaU+ffq02hhhYWH6/PPPVVtbG/C5LMtq9H1zvqrN6dOnVV9fr6ioKJ/tUVFROnz4cJPHlJWVNbl/WVmZ33Mk3AS5kJAQXXXVVW09DSO5XC7+4Yet8Rm/fC5H6zUsLExhYWGtPs6VgAXFAACgVfTo0UPt2rVTeXm5z/by8nJFR0c3eUx0dHSz9m8K4QYAALSK0NBQxcXFKTc317vN4/EoNzdXiYmJTR6TmJjos78k7dix47z7N4W2FNBMTqdTmZmZ5+0xA8GOzzhaUkZGhqZPn674+HiNHj1aq1atUnV1tdLT0yVJaWlp6tu3r5YvXy5Jmjt3rm655RY9/fTTmjBhgrZs2aL9+/dr7dq1fo/JpeAAAKBVPfvss1q5cqXKyso0cuRIrV69WgkJCZKkpKQkxcTEaOPGjd79X3nlFT3yyCMqLi7WgAEDtGLFCv34xz/2ezzCDQAAsBXW3AAAAFsh3AAAAFsh3AAAAFsh3ACXoLi4WA6HQwUFBW09FaBV8BlHMCPc4Io1Y8YMORwO3XfffY2emz17thwOh2bMmOH3+Xbt2iWHw6GzZ8+23CSbYcaMGZo0aVKLnOvMmTOaNm2aXC6XIiMjNXPmTJ07d65Fzo3Lh8/4+T3xxBO68cYb1alTJ0VGRrbIOWEOwg2uaG63W1u2bNHXX3/t3VZTU6PNmzfr6quvbsOZta1p06bpr3/9q3bs2KF33nlHe/bs0b333tvW08Il4DPetNraWv3bv/2b7r///raeCoIQ4QZXtB/84Adyu916/fXXvdtef/11XX311Ro1apTPvh6PR8uXL1e/fv3UsWNHjRgxQq+++qqk70rs48aNkyR17drV5/+Ic3JydNNNNykyMlLdu3fX7bffrmPHjvmcOz8/X6NGjVJYWJji4+P18ccf+zxfX1+vmTNnesceNGiQfvvb33qfX7p0qTZt2qS33npLDodDDodDu3btkiQtWLBAAwcOVKdOndS/f38tXrxYdXV1531PCgsLlZOTo9///vdKSEjQTTfdpN/97nfasmWLvvzyy+a9wWhzfMab9uijj2revHkaNmyY/28m8P/xC8W44t19993asGGDpk2bJklav3690tPTvf9wNli+fLn+8Ic/aM2aNRowYID27Nmjf//3f1fPnj1100036bXXXtPkyZN15MgRuVwudezYUZJUXV2tjIwMDR8+XOfOndOSJUt0xx13qKCgQCEhITp37pxuv/12jR8/Xn/4wx/0+eefa+7cuT5jezweXXXVVXrllVfUvXt37d27V/fee6969+6tKVOm6OGHH1ZhYaEqKyu1YcMGSVK3bt0kSV26dNHGjRvVp08fHTp0SLNmzVKXLl00f/78Jt+PvLw8RUZGKj4+3rstOTlZISEh2rdvn+64444Wed9x+fAZB1qYBVyhpk+fbk2cONE6efKk5XQ6reLiYqu4uNgKCwuzTp06ZU2cONGaPn26ZVmWVVNTY3Xq1Mnau3evzzlmzpxp3XnnnZZlWdbOnTstSdb//M//XHDcU6dOWZKsQ4cOWZZlWS+88ILVvXt36+uvv/bu8/zzz1uSrI8//vi855k9e7Y1efLkRq/nYlauXGnFxcWd9/knnnjCGjhwYKPtPXv2tJ577rmLnh9XDj7jF7dhwwYrIiLCr32BBlRucMXr2bOnJkyYoI0bN8qyLE2YMEE9evTw2aeoqEhfffWVxo8f77O9tra2UWn/+44ePaolS5Zo3759On36tDwejySppKREQ4cOVWFhoYYPH66wsDDvMU3dwC0rK0vr169XSUmJvv76a9XW1mrkyJEXfX3Z2dlavXq1jh07pnPnzunbb7+Vy+W66HGwDz7jQMsi3CAo3H333ZozZ46k7/6B/b6GK4W2bt2qvn37+jx3sZv/paam6pprrtGLL76oPn36yOPxaOjQoaqtrfV7flu2bNHDDz+sp59+WomJierSpYtWrlypffv2XfC4vLw8TZs2TY8++qhSUlIUERGhLVu26Omnnz7vMdHR0Tp58qTPtm+//VZnzpxRdHS033PGlYXPONByCDcICrfddptqa2vlcDiUkpLS6PnY2Fg5nU6VlJTolltuafIcoaGhkr5bGNngH//4h44cOaIXX3xRN998syTpL3/5i89xQ4YM0csvv6yamhrv/9l++OGHPvt88MEHuvHGG/XAAw94t31/wWZoaKjP2JK0d+9eXXPNNfrlL3/p3fa3v/2t6Tfh/0tMTNTZs2d14MABxcXFSZLef/99eTwe743oEHz4jAMth6ulEBTatWunwsJCffrpp2rXrl2j57t06aKHH35Y8+bN06ZNm3Ts2DEdPHhQv/vd77Rp0yZJ0jXXXCOHw6F33nlHp06d0rlz59S1a1d1795da9euVVFRkd5//31lZGT4nPuuu+6Sw+HQrFmz9Omnn2rbtm369a9/7bPPgAEDtH//fm3fvl2fffaZFi9erI8++shnn5iYGP33f/+3jhw5otOnT6uurk4DBgxQSUmJtmzZomPHjmn16tV64403LvheDBkyRLfddptmzZql/Px8ffDBB5ozZ45+8pOfqE+fPpfy9uIKwGfcV0lJiQoKClRSUqL6+noVFBSooKCA33OCf9p60Q9wPhdbnPh/F1talmV5PB5r1apV1qBBg6wOHTpYPXv2tFJSUqzdu3d791m2bJkVHR1tORwO77E7duywhgwZYjmdTmv48OHWrl27LEnWG2+84T0uLy/PGjFihBUaGmqNHDnSeu2113wWW9bU1FgzZsywIiIirMjISOv++++3Fi5caI0YMcJ7jpMnT1rjx4+3wsPDLUnWzp07LcuyrP/4j/+wunfvboWHh1tTp061fvOb31x0AeU//vEP684777TCw8Mtl8tlpaenW1VVVX68q7iS8Bm/8HsjqdGj4ZzAhTgsy7LaKFcBAAC0ONpSAADAVgg3AADAVgg3AADAVgg3AADAVgg3AADAVgg3AADAVgg3AADAVgg3AADAVgg3AADAVgg3AADAVgg3AADAVv4fTYA+T+vXcBcAAAAASUVORK5CYII=" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 14 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Through this plot, we can infer that community 0 is mainly related to nodes with Metadata 0, while community 1 groups together primarily nodes with attribute Metadata 1." + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Summary\n", + "\n", + "This tutorial provides a comprehensive guide on using the `probinet` package. Specifically, it focuses on the `MTCOV` algorithm, which is a probabilistic generative model used for network analysis, designed to detect communities within a multilayer network where node attributes are considered.\n", + "\n", + "The tutorial explains the structure of the `probinet` package, which is organized into several main modules, such as `input`, `models`, `evaluation`, `synthetic`, `model_selection`, and `utils`. It also demonstrates how to configure and run the `MTCOV` algorithm on the input data imported using the `probinet` package.\n", + "\n", + "Furthermore, it shows how to analyze the results produced by the model. It explains how to load the inferred parameters from a file, unpack the latent variables, and calculate the out-going hard-memberships. It also shows how to interpret the relationships between communities and attribute categories. \n", + "\n" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "" + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,md" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/_sources/tutorials/Unknown_structure.ipynb b/_sources/tutorials/Unknown_structure.ipynb new file mode 100644 index 0000000..ac355bf --- /dev/null +++ b/_sources/tutorials/Unknown_structure.ipynb @@ -0,0 +1,936 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "597223fc5ec1ad0", + "metadata": {}, + "source": [ + "# Analyzing Network Data with Unknown Community Structure\n", + "\n", + "In this tutorial, we'll walk you through the process of analyzing network data when you suspect a community structure exists but aren't sure what kind. We'll explore what to do if the inferred latent variables aren't informative and how to improve results by better initializing parameters. A key concept in this tutorial is the assortative and disassortative structure of networks.\n", + "\n", + " \n", + "\n", + "> **_Quick Recap:_** \n", + "> - **Assortative Structure**: In an assortative network, nodes tend to connect to other nodes that are similar to them. For example, in a social network, people might be more likely to connect with others who share similar interests or characteristics.\n", + " > - **Disassortative Structure**: In a disassortative network, nodes tend to connect to other nodes that are different from them. For example, in a biological network, certain types of proteins might be more likely to interact with proteins that have different functions." + ] + }, + { + "cell_type": "markdown", + "id": "7cc5ff2913c1c7a4", + "metadata": {}, + "source": [ + "## Inferring the Communities with No Prior Information About the Structure of the Data\n", + "\n", + "In this section, we'll learn how to infer community structures without knowing if the network is assortative or disassortative.\n", + "\n", + "First, we load the network data using the `build_adjacency_from_file` function from the `probinet\n", + ".input.loader` module. This function builds both the graph object and the adjacency matrix (showing node connections) from a file." + ] + }, + { + "cell_type": "code", + "id": "e890db59d3b31125", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:51.934469Z", + "start_time": "2024-11-08T20:09:50.937888Z" + } + }, + "source": [ + "from probinet.input.loader import build_adjacency_from_file\n", + "\n", + "# Define the file path\n", + "file_path = \"inputs/network_A_200_1_3_25_10.csv\"\n", + "\n", + "# Load the graph object from the file\n", + "gdata = build_adjacency_from_file(\n", + " file_path,\n", + " ego=\"source\",\n", + " alter=\"target\",\n", + " sep=\" \",\n", + " undirected=True,\n", + " binary=False,\n", + ")\n", + "# Print the names of the coordinates in the namedtuple gdata\n", + "print(gdata._fields)" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('graph_list', 'adjacency_tensor', 'transposed_tensor', 'data_values', 'nodes', 'design_matrix')\n" + ] + } + ], + "execution_count": 1 + }, + { + "cell_type": "markdown", + "id": "d8f7561e6db9ce6a", + "metadata": {}, + "source": [ + "Now that we have the data, let's print some basic statistics about the graph." + ] + }, + { + "cell_type": "code", + "id": "4291a7046c1206b7", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:52.636306Z", + "start_time": "2024-11-08T20:09:52.163083Z" + } + }, + "source": [ + "from probinet.input.stats import print_graph_stats\n", + "\n", + "# Import the logging module\n", + "import logging\n", + "\n", + "# Get the root logger and set its level to INFO\n", + "logging.getLogger().setLevel(logging.INFO)\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Set the logging level for matplotlib to WARNING\n", + "logging.getLogger(plt.__name__).setLevel(logging.WARNING)\n", + "\n", + "# Call the `print_graph_stats` function to print the basic\n", + "# statistics of the graphs in the list `A`.\n", + "print_graph_stats(gdata.graph_list)" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:Number of nodes = 200\n", + "INFO:root:Number of layers = 1\n", + "INFO:root:Number of edges and average degree in each layer:\n", + "INFO:root:E[0] = 2314 / = 23.14\n", + "INFO:root:M[0] = 2542 - = 25.420\n", + "INFO:root:Sparsity [0] = 0.058\n", + "INFO:root:Reciprocity (networkX) = 0.000\n" + ] + } + ], + "execution_count": 2 + }, + { + "cell_type": "markdown", + "id": "1e1d4355cd1280a3", + "metadata": {}, + "source": "The graph has 200 nodes and one layer, with approximately 2300 edges. The average degree (the number of connections per node) is about 23. The network is undirected, therefore reciprocity is meaningless." + }, + { + "cell_type": "markdown", + "id": "4a209425d4578409", + "metadata": {}, + "source": [ + "Now that we have an overview of the network, we can infer its community structure. We'll use the \n", + "MTCOV {cite}`contisciani2020community` class from the `pgm.model.mtcov` module. Before running \n", + "the algorithm, we adjust some \n", + "key parameters, such as the number of realizations and the maximum iterations." + ] + }, + { + "cell_type": "code", + "id": "b9715a5f47ba0c", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:53.143530Z", + "start_time": "2024-11-08T20:09:52.651867Z" + } + }, + "source": [ + "from probinet.models.mtcov import MTCOV\n", + "\n", + "# Define the number of realizations\n", + "NUM_REAL = 10\n", + "MAX_ITER = 500\n", + "DECISION = 15\n", + "\n", + "# Create an instance of the `MTCOV` class\n", + "mtcov_unbiased = MTCOV(num_realizations=NUM_REAL, max_iter=MAX_ITER, decision=DECISION)" + ], + "outputs": [], + "execution_count": 3 + }, + { + "cell_type": "markdown", + "id": "3e96a636ae179d7f", + "metadata": {}, + "source": [ + "Next, we run the algorithm by passing the data to the fit method of the MTCOV class. This \n", + "method requires both the **structural data** (the connections between nodes) and a **design matrix**\n", + " `X`, which contains attributes of the nodes that can help infer community structure. In our case,\n", + " since we don’t have any node attributes, we pass a matrix of zeros." + ] + }, + { + "cell_type": "code", + "id": "2f5c194950342d35", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:53.157876Z", + "start_time": "2024-11-08T20:09:53.154210Z" + } + }, + "source": [ + "import numpy as np\n", + "\n", + "# Generate dummy data for the design matrix (zeros).\n", + "X = np.zeros((len(gdata.nodes), 2))" + ], + "outputs": [], + "execution_count": 4 + }, + { + "cell_type": "markdown", + "id": "d0c18dcfb261ad77", + "metadata": {}, + "source": [ + "The algorithm also requires a `GraphData` object, which contains the structural data and the \n", + "design matrix. We have already imported part of it. Now we need to replace the design matrix with\n", + " a dummy one (the output given by the `build_adjacency_from_file` function contains a design \n", + " matrix that is set to None)." + ] + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:53.211312Z", + "start_time": "2024-11-08T20:09:53.206672Z" + } + }, + "cell_type": "code", + "source": [ + "# Print the design matrix of the `GraphData` object\n", + "print(gdata.design_matrix)" + ], + "id": "2159448a1c874f15", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "execution_count": 5 + }, + { + "cell_type": "code", + "id": "66affc425da2da43", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:53.270053Z", + "start_time": "2024-11-08T20:09:53.266395Z" + } + }, + "source": [ + "# Replace the design matrix with the dummy data\n", + "gdata = gdata._replace(design_matrix=X)" + ], + "outputs": [], + "execution_count": 6 + }, + { + "cell_type": "markdown", + "id": "bbd10268be88d1ba", + "metadata": {}, + "source": [ + "We fix the number of communities to 3 and set the gamma parameter to 0, effectively ignoring any information in the design matrix." + ] + }, + { + "cell_type": "code", + "id": "ed9d8e02ce047666", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:53.318981Z", + "start_time": "2024-11-08T20:09:53.315863Z" + } + }, + "source": [ + "# Define the number of communities and the gamma parameter\n", + "K = 3\n", + "GAMMA = 0" + ], + "outputs": [], + "execution_count": 7 + }, + { + "cell_type": "markdown", + "id": "30998a88533046d4", + "metadata": {}, + "source": [ + "Since we have no prior knowledge of the network's structure, we run the algorithm without any bias. To achieve this, we set the assortative parameter to False. This tells the algorithm not to enforce an assortative structure for the network, but it does not prevent inferring such structure if it is the optimal. " + ] + }, + { + "cell_type": "code", + "id": "af05f195cf3ee249", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:09:53.367611Z", + "start_time": "2024-11-08T20:09:53.363863Z" + } + }, + "source": [ + "# Define the assortative parameter\n", + "ASSORTATIVE = False" + ], + "outputs": [], + "execution_count": 8 + }, + { + "cell_type": "code", + "id": "98e6aa4e942bb309", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:11.390877Z", + "start_time": "2024-11-08T20:09:53.422720Z" + } + }, + "source": [ + "# Run the `MTCOV` model\n", + "mtcov_unbiased.fit(\n", + " gdata,\n", + " gamma=GAMMA,\n", + " K=3,\n", + " nodes=gdata.nodes,\n", + " out_inference=False,\n", + " initialization=0,\n", + " assortative=ASSORTATIVE,\n", + " undirected=True,\n", + ");" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:gamma = 0\n", + "WARNING:root:Solution failed to converge in 500 EM steps!\n", + "WARNING:root:Parameters won't be saved for this realization! If you have provided a number of realizations equal to one, please increase it.\n" + ] + } + ], + "execution_count": 9 + }, + { + "cell_type": "markdown", + "id": "34daabf74caf84a0", + "metadata": {}, + "source": "After running the algorithm, we can examine the inferred latent variables by plotting them." + }, + { + "cell_type": "code", + "id": "e738aaca0494dfde", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:11.430789Z", + "start_time": "2024-11-08T20:10:11.422971Z" + } + }, + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "def plot_matrices(u, v, w):\n", + " fig, ax = plt.subplots(1, 3, figsize=(11, 3))\n", + "\n", + " # Plot u\n", + " plot0 = ax[0].matshow(u, aspect=\"auto\", cmap=\"Blues\", vmin=0, vmax=1)\n", + " fig.colorbar(\n", + " plot0,\n", + " ax=ax[0],\n", + " ticks=np.arange(0, 1.1, 0.25),\n", + " )\n", + " ax[0].axis(\"off\")\n", + " ax[0].set_title(r\"$U$\", fontsize=15)\n", + "\n", + " # Plot v\n", + " plot1 = ax[1].matshow(v, aspect=\"auto\", cmap=\"Blues\", vmin=0, vmax=1)\n", + " fig.colorbar(\n", + " plot1,\n", + " ax=ax[1],\n", + " ticks=np.arange(0, 1.1, 0.25),\n", + " )\n", + " ax[1].axis(\"off\")\n", + " ax[1].set_title(r\"$V$\", fontsize=15)\n", + "\n", + " # Plot w\n", + " try:\n", + " plot2 = ax[2].matshow(w[0], aspect=\"auto\", cmap=\"Blues\")\n", + " except TypeError:\n", + " w = np.diag(w.flatten()).reshape((1, 3, 3))\n", + " plot2 = ax[2].matshow(w[0], aspect=\"auto\", cmap=\"Blues\")\n", + " fig.colorbar(\n", + " plot2,\n", + " ax=ax[2],\n", + " ticks=np.arange(\n", + " np.round(np.min(w[0]), 2), np.round(np.max(w[0]), 2) + 0.15, 0.15\n", + " ),\n", + " )\n", + " ax[2].axis(\"off\")\n", + " ax[2].set_title(r\"$W$\", fontsize=15)" + ], + "outputs": [], + "execution_count": 10 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:12.195969Z", + "start_time": "2024-11-08T20:10:11.476671Z" + } + }, + "cell_type": "code", + "source": [ + "plot_matrices(\n", + " mtcov_unbiased.u,\n", + " mtcov_unbiased.v,\n", + " mtcov_unbiased.w,\n", + ")" + ], + "id": "15ed58d86caacf1b", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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fElScXGxSkpKtHTpUk2fPv2k8b///e/1q1/9SldddZUk6fbbb9frr7+u//zP/9Rzzz3Xon2GYruxuznnHLtDY17NoaNulxA1/t+POPvd5P+OHhD+hzw2zxRxkBQ2MstCZlnILAuZBSDm2cmsf71dU1MTtDkhIUEJCQknDa+vr1dlZaVmzJgR2Ob1epWbm6uKioqQX3HkyBElJiYGbevQoYNWr17d4n2GwuoCgIuabuq18wIAt5FZAEwSTl5lZGQoOTk58Jo7d27Ife7Zs0cNDQ1KS0sL2p6WliafzxfyM3l5eZo/f74+++wzNTY26rXXXtOLL76oXbt2tXifodi+YpfYLs72TmPdw69vcruEqPHE1UPcLsFoTGtyDpllIbMsZFZkyCwAJglnKua2bduUlJQU2B7qal1LPfXUU5oyZYrOO+88eTweDRgwQPn5+Vq6dGmrfYcURmP3z+qa0w86Q9w2MsPtEqLGP77c7XYJUWNEv/BX22MhAueQWRYyy0JmWcgsALEunMVTkpKSghq75qSkpCguLk7V1cFT+6urq5Wenh7yM927d9fLL7+sw4cPa+/everZs6emT5+u/v37t3ifodhu7O64pL/tnca63rc973YJUeP1WWPdLsFoLB3uHDLLQmZZyKzIkFkATOLE4w7i4+M1fPhwlZWVady4cZKkxsZGlZWVaerUqaf8bGJionr16qWjR4/qz3/+s376059GvM8T2W7s7vvLBts7jXVbf/dTt0uIGvf+z3q3S4gaCzMuCPszPOzXOWSWhcyykFkWMgtArHPqAeUFBQWaPHmyRowYoezsbBUVFamuri6wouWkSZPUq1evwH16a9as0Y4dO5SVlaUdO3Zo1qxZamxs1LRp02zv0w7bjd2Wap4JhZOdn8Yy6pHg7LdzyCyEQmZFhswCYBKnHlA+fvx47d69WzNnzpTP51NWVpZKS0sDi59s3bpVXq+1RuXhw4f14IMP6vPPP1fnzp111VVX6fe//726dOlie5922G7sxlzY3fZOY131gcNulxA1tuw94nYJRuN+FeeQWRYyy0JmRYbMAmASpx5QLklTp05tdppkeXl50M/f+973tH796WeMnGqfdthu7DrF82SEJmnJiacfdIZY++U+t0swGme/nUNmWcgsC5kVGTILgEmcumIXrWw3dgBaH/erADAJmQXAJE7dYxet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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 11 + }, + { + "cell_type": "markdown", + "id": "4afd8ef2251d9976", + "metadata": {}, + "source": [ + "The `u` and `v` matrices represent node memberships for outgoing and incoming communities, respectively. Here, they are identical since the network is undirected. The plot shows that the top nodes predominantly belong to the third community, while the bottom nodes are mainly part of the first. The nodes in the middle exhibit instead mixed memberships across these groups. Looking at the affinity matrix `w`, we observe that the strongest connections are between nodes in the second community, although this community is small and shows high mixed membership levels. However, we can also notice that nodes in the first community interact exclusively with nodes in the third, hinting at a disassortative structure." + ] + }, + { + "cell_type": "markdown", + "id": "77d8ea84-c92e-48b1-888d-3683bc2ba954", + "metadata": {}, + "source": [ + "Even though there is some indication of a disassortative structure, it is not clear, and the \n", + "mixed membership values make interpretation challenging. This may be due to the algorithm getting\n", + " trapped in a local minimum. In this case, we ran the algorithm with a random initialization of \n", + " the latent variables, and with no bias toward any specific structure. This raises the question: can we improve the approach? The answer is yes. For example, if we suspect a disassortative structure, we could introduce a bias in the model to guide it in that direction.\n", + "\n", + "To do this, we generate new matrices for `u`, `v`, `beta`, and `w` (the latent variables normally\n", + " inferred by the model) and \n", + "save them to a file.\n", + " To bias the algorithm towards a disassortative structure, we set the diagonal of the `w` matrix to a small value." + ] + }, + { + "cell_type": "code", + "id": "2af0764a-74bb-4fc2-b894-e01308f72e5f", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:12.227080Z", + "start_time": "2024-11-08T20:10:12.219706Z" + } + }, + "source": [ + "# Fix the random seed for reproducibility\n", + "np.random.seed(1)\n", + "N = len(gdata.nodes)\n", + "# Generate initial guesses for u and v\n", + "initial_u = np.random.random_sample((N, K))\n", + "initial_v = np.random.random_sample((N, K))\n", + "# Generate random sample for w of size KxK\n", + "initial_w = np.random.random_sample((1, K, K))\n", + "# Make the diagonal almost zero by multiplying it by a small number\n", + "np.fill_diagonal(initial_w[0], 0.01)\n", + "# Generate a dummy beta\n", + "initial_beta = np.zeros((K, 2))" + ], + "outputs": [], + "execution_count": 12 + }, + { + "cell_type": "code", + "id": "535638ac-648b-4829-9cd2-5aed3a2e4bc6", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:12.275226Z", + "start_time": "2024-11-08T20:10:12.267045Z" + } + }, + "source": [ + "from pathlib import Path\n", + "\n", + "# Define the output file path\n", + "outfile = Path(\"outputs/theta_for_init.npz\")\n", + "\n", + "# Save the variables to a .npz file\n", + "np.savez_compressed(\n", + " outfile, u=initial_u, v=initial_v, w=initial_w, beta=initial_beta, nodes=gdata.nodes\n", + ")" + ], + "outputs": [], + "execution_count": 13 + }, + { + "cell_type": "markdown", + "id": "bfa90757-f3ea-4ccd-ba67-851c6b7cef35", + "metadata": {}, + "source": [ + "Now we’re ready to run the algorithm! In addition to setting key parameters, we can also specify the file path where the initial guesses for the latent variables are stored." + ] + }, + { + "cell_type": "code", + "id": "dc4b47de-b0ee-4200-8670-0bb82268a765", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:32.219557Z", + "start_time": "2024-11-08T20:10:12.318904Z" + } + }, + "source": [ + "# Instantiate the `MTCOV` class\n", + "mtcov_disassortative = MTCOV(\n", + " num_realizations=NUM_REAL, max_iter=MAX_ITER, decision=DECISION\n", + ")\n", + "\n", + "# Define the assortative parameter\n", + "ASSORTATIVE = False\n", + "\n", + "# Run the `MTCOV` model\n", + "mtcov_disassortative.fit(\n", + " gdata,\n", + " gamma=GAMMA,\n", + " K=K,\n", + " nodes=gdata.nodes,\n", + " out_inference=False,\n", + " assortative=ASSORTATIVE,\n", + " undirected=True,\n", + " initialization=1,\n", + " files=outfile,\n", + ");" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:gamma = 0\n", + "WARNING:root:Solution failed to converge in 500 EM steps!\n", + "WARNING:root:Parameters won't be saved for this realization! If you have provided a number of realizations equal to one, please increase it.\n" + ] + } + ], + "execution_count": 14 + }, + { + "cell_type": "markdown", + "id": "721cceeb-4f45-4890-95a1-516099dc5d0a", + "metadata": {}, + "source": [ + "Let’s visualize the results by plotting the latent variables.\n", + "\n" + ] + }, + { + "cell_type": "code", + "id": "ac3fad13-f00e-42ad-83de-cc45feb24a25", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:32.994965Z", + "start_time": "2024-11-08T20:10:32.272538Z" + } + }, + "source": [ + "plot_matrices(\n", + " mtcov_disassortative.u,\n", + " mtcov_disassortative.v,\n", + " mtcov_disassortative.w,\n", + ")" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 15 + }, + { + "cell_type": "markdown", + "id": "94e0bee8-baea-480c-9eba-443e59ef4bb8", + "metadata": {}, + "source": [ + "Good news! The algorithm successfully escaped the local minimum and found a more informative set of latent variables. The `w` matrix now shows a clear disassortative structure, with diagonal values close to zero, indicating weak intra-community connections. Moreover, the `u` and `v` matrices reveal a distinct assignment of nodes into the three communities." + ] + }, + { + "cell_type": "markdown", + "id": "56ae48a0-74cf-4c0d-aa1b-fe32c9f6643c", + "metadata": {}, + "source": [ + "To complete the analysis, we show what would happen if we force the model to look for an assortative community structure. This can be done simply by setting the assortative flag to True." + ] + }, + { + "cell_type": "code", + "id": "1d69244e5f71460e", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:43.035367Z", + "start_time": "2024-11-08T20:10:33.037267Z" + } + }, + "source": [ + "# Instantiate the `MTCOV` class\n", + "mtcov_assortative = MTCOV(\n", + " num_realizations=NUM_REAL, max_iter=MAX_ITER, decision=DECISION\n", + ")\n", + "\n", + "# Define the assortative parameter\n", + "ASSORTATIVE = True\n", + "\n", + "# Run the `MTCOV` model\n", + "mtcov_assortative.fit(\n", + " gdata,\n", + " gamma=GAMMA,\n", + " K=K,\n", + " nodes=gdata.nodes,\n", + " out_inference=False,\n", + " initialization=0,\n", + " assortative=ASSORTATIVE,\n", + " undirected=True,\n", + ");" + ], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:root:gamma = 0\n", + "WARNING:root:Solution failed to converge in 500 EM steps!\n", + "WARNING:root:Parameters won't be saved for this realization! If you have provided a number of realizations equal to one, please increase it.\n" + ] + } + ], + "execution_count": 16 + }, + { + "cell_type": "code", + "id": "16079330d4d30e09", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:44.037803Z", + "start_time": "2024-11-08T20:10:43.084159Z" + } + }, + "source": [ + "plot_matrices(\n", + " mtcov_assortative.u,\n", + " mtcov_assortative.v,\n", + " mtcov_assortative.w,\n", + ")" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 17 + }, + { + "cell_type": "markdown", + "id": "cd6c31c63b0e3c7d", + "metadata": {}, + "source": [ + "The affinity matrix `w` display the constrained assortative structure, while the node memberships present a mixed partition that is difficult to interpret from this visualization alone." + ] + }, + { + "cell_type": "markdown", + "id": "3dcd8ecd2ad55099", + "metadata": {}, + "source": [ + "So far the analysis has been done visually, but we can also quantify the quality of the inferred community structure using various metrics.\n", + "For example, we could compare the log-likelihood of different models to identify the one with the lowest (best) value. \n", + "\n", + "Alternatively, we could use reconstruction metrics, such as the L1 loss and AUC, to compare the input adjacency matrix against the inferred matrices.\n", + "For this option, we need to construct the matrices from the inferred latent variables. This can be done using the `compute_mean_lambda0` function from the `pgm.evaluation.expectation_computation` module, which calculates the matrix `M` based from the latent variables `u`, `v`, and `w`. The following cell demonstrates how to compute and visualize these matrices.\n" + ] + }, + { + "cell_type": "code", + "id": "44c7d8f69b2ec689", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:45.373238Z", + "start_time": "2024-11-08T20:10:44.070418Z" + } + }, + "source": [ + "import networkx as nx\n", + "from probinet.evaluation.expectation_computation import compute_mean_lambda0\n", + "\n", + "\n", + "def plot_matrix(ax, matrix, title):\n", + " plot = ax.matshow(matrix, aspect=\"auto\", cmap=\"Blues\")\n", + " fig.colorbar(\n", + " plot,\n", + " ax=ax,\n", + " ticks=np.arange(\n", + " np.round(np.min(matrix), 1), np.round(np.max(matrix), 1) + 0.2, 0.2\n", + " ),\n", + " )\n", + " ax.axis(\"off\")\n", + " ax.set_title(title, fontsize=15)\n", + "\n", + "\n", + "# Plotting the matrices\n", + "fig, ax = plt.subplots(1, 4, figsize=(20, 5))\n", + "\n", + "# Plot matrix A\n", + "adjacency_matrix = nx.to_scipy_sparse_array(gdata.graph_list[0])\n", + "adjacency_matrix = adjacency_matrix.toarray()\n", + "plot_matrix(ax[0], adjacency_matrix, \"A\")\n", + "\n", + "# Plot matrix M from mtcov_unbiased\n", + "M_unbiased = compute_mean_lambda0(mtcov_unbiased.u, mtcov_unbiased.v, mtcov_unbiased.w)[\n", + " 0\n", + "]\n", + "plot_matrix(ax[1], M_unbiased, \"M (unbiased)\")\n", + "\n", + "# Plot matrix M from mtcov_disassortative\n", + "M_disassortative = compute_mean_lambda0(\n", + " mtcov_disassortative.u, mtcov_disassortative.v, mtcov_disassortative.w\n", + ")[0]\n", + "plot_matrix(ax[2], M_disassortative, \"M (disassortative)\")\n", + "\n", + "# Plot matrix M from mtcov_assortative\n", + "M_assortative = compute_mean_lambda0(\n", + " mtcov_assortative.u, mtcov_assortative.v, mtcov_assortative.w\n", + ")[0]\n", + "plot_matrix(ax[3], M_assortative, \"M (assortative)\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAB7EAAAHqCAYAAABiLLrGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd5wV1dnHf3d775Wt9N5BQKRYsWCwoREblkRjibGkWPKiKRoToyaxxSSWxN6NBsEG2EEQUHpnl11ge++78/7xPM/cO7P37r27e7cAz/fz0eXOnDnnOc85U87M+Z3HYRiGAUVRFEVRFEVRFEVRFEVRFEVRFEVRFEXpBwT0tQGKoiiKoiiKoiiKoiiKoiiKoiiKoiiKIuhHbEVRFEVRFEVRFEVRFEVRFEVRFEVRFKXfoB+xFUVRFEVRFEVRFEVRFEVRFEVRFEVRlH6DfsRWFEVRFEVRFEVRFEVRFEVRFEVRFEVR+g36EVtRFEVRFEVRFEVRFEVRFEVRFEVRFEXpN+hHbEVRFEVRFEVRFEVRFEVRFEVRFEVRFKXfoB+xFUVRFEVRFEVRFEVRFEVRFEVRFEVRlH6DfsRWFEVRFEVRFEVRFEVRFEVRFEVRFEVR+g36EVtRFEVRFEVRFEVRFEVRFEVRFEVRFEXpN+hHbEXpgDVr1sDhcMDhcOA3v/lNX5ujKIqiKD4j9y+Hw4GvvvrKY7pXX33VTJebm9vpcioqKpCYmIiFCxd2w9qus3LlSjgcDixevLhTx+Xm5sLhcPSMUb2Iu3Z7++234XA48Oqrr/aNUYqiKEcp/f3e6u7etm/fPjgcDsydO7fTdig9xz333AOHw4Fnn32218t+5JFH4HA4sGbNml4vW1EU5Uijv9/7lc6j92BFObLQj9iK0gH/+c9/zH+/8MILfWiJoiiKonSdju5hzz//fLfy/v3vf4/y8nIsWbKkW/ko/mPBggUYP3487rzzTjQ3N/e1OYqiKEclem89eli8eDEcDgdWrlzptzznzp0Lh8OBffv2+S1Pf3HttdciNTUVt99+e1+boiiKckSh937/o/dgRVG8oR+xFcUDzc3NePnllwEAaWlp2LFjB1avXt3HVimKoiiK7wQGBmLs2LF45ZVX0NLS0m5/aWkpli1bhkmTJnUp/4MHD+Jvf/sbzj77bIwZM6a75vYqH3/8MbZu3drXZvQIDocDv/rVr7B7927885//7GtzFEVRjiqOtHtrRkYGtm7din//+9/dzkvxHzfeeCO2bt2Kc889t9fLDg8Px89+9jN89tlneP/993u9fEVRlCONI+3er3SM3oMV5chCP2IrigeWLVuGkpISzJw5E9dffz0AqzJbURRFUY4ELrnkEpSUlGD58uXt9r3yyitobm7GpZde2qW8n376aTQ2NuLyyy/vrpm9zuDBgzFixIi+NqPHWLBgAaKjo/Hkk0/2tSmKoihHHUfSvTU4OBgjRoxAdna2X/JT/ENSUhJGjBiB2NjYPin/kksugcPhwBNPPNEn5SuKohxpHEn3fqVj9B6sKEcW+hFbUTwgy8Bceuml5kOIPJQoiqIoypHCokWL4HA43C5v9vzzzyMqKgoLFizodL6GYeBf//oXoqOjcdZZZ7Xb721ZMHexwp599lk4HA7cc889yMvLw6JFi5CcnIzw8HBMmTIF7777boc2HTx4EIsXL0ZqairCw8MxadIkj8ozTzGx//e//+Gqq67CyJEjERMTg8jISIwfPx733XcfGhsb3ea1dOlSnHrqqcjIyEBoaCgGDBiAE044Affee6/b9MuWLcNZZ52F5ORkhIaGYtCgQbj11ltRWlrqNn1ZWRluvPFGDBgwAGFhYRg1ahT+8pe/wDAMj74IDw/HOeecg++++05XklEURfEzfXVvBYD6+nrcddddGDhwIMLCwjB48GAsWbIETU1NbtN3FBPb1/tXRUUF/va3v2HevHnIyclBaGgoEhMTcfrpp+PDDz90W25NTQ3uv/9+jB8/HrGxsYiKisLgwYOxcOHCdh8AiouL8atf/QqjRo1CVFQUYmNjMWzYMFx++eVuY0Zu2bIFl1xyCdLT0xESEoKMjAxcfvnl2L59e7u0K1euhMPhwOLFi3Ho0CFcc801yMzMRFBQkBmX8rnnngMAnHjiiZbYp7IMaWfqL/5etWoVAGDgwIGWPAV38TjHjRsHh8OBbdu2ufVpaWkpQkJCkJqa2k4JuHr1aixcuND0SWZmJq655hrk5eW5zSsrKwsnnHACli5disLCQrdpFEVRFCd9de/Xe7DegxXlWEc/YiuKGyorK/Hf//4XISEhuPDCCzFw4EAcf/zxKCkpwbJly/raPEVRFEXxmaysLMyePRv//e9/UVNTY27fs2cPvvrqK5x77rmIiIjodL5btmzB3r17MX36dISFhfnTZOzbtw9Tp07FmjVrcPLJJ2PixIlYt24dzjnnHHzwwQdujykrK8P06dOxbNkyzJ07F7NmzcL333+PK664Avfcc4/PZV999dV44403kJCQgDPOOAOzZs1Cfn4+7rrrLpx55plobW21pH/sscdw1llnYcWKFRgyZAjOP/98jBkzBvv373db7q9+9SucccYZ+OijjzB8+HD84Ac/QFBQEB5++GFMmzYNhw8ftqQvLy/HCSecgMceewyGYWDBggXIyMjA7bffjp/+9Kcd1kU+WPzvf//zuf6KoiiKd/rq3trU1IR58+bhvvvuQ2VlJc466yyMHDkSf/rTn3DBBRd0OLnJTmfuX19//TV++tOfYseOHRg+fDjOPfdcDB8+HB988AHmzZuHp59+2pK+tbUVp5xyCu68804UFhZi7ty5OOuss5CWloalS5fipZdeMtNWV1dj2rRpeOCBB1BTU4NTTz0Vp512GuLj4/Hyyy9j6dKllrw//vhjTJkyBS+++CLS09Nx/vnnIyUlBf/5z38wZcoUfPbZZ27rW1xcjKlTp+J///sfZsyYgTPOOAMRERG44oorMHjwYADAvHnzcMUVV5j/RUVFdbr+UVFRuOKKK5CamgoAOP/88y15dsQll1wCwHPM1ddeew3Nzc246KKLEBQUZG5//PHHcfzxx+PNN99ETk4OzjnnHCQmJuJf//oXpkyZ4jF8yty5c9Ha2qrvOBRFUXygr+79eg/We7CiHPMYiqK045///KcBwFiwYIG57fHHHzcAGAsXLuw7wxRFURTFRwAYgYGBhmEYxj/+8Q8DgPHcc8+Z+3/zm98YAIzly5cbBw8eNAAYOTk5Puf/xBNPGACMO++80+3+K664wgBgrFixwqN99vKeeeYZA4ABwLjtttuM1tZWc9/DDz9sADBmzZplOWbFihXmMaeeeqpRU1Nj7luzZo0RFRVlBAQEGOvWrbMcl5OTY7h7FH777beNuro6y7aqqipj/vz57XxoGIaRnZ1tOBwO45tvvrFsb2tra1f3V1991QBgjBkzxti5c6cl7f/93/8ZAIyLLrrIcsx1111nADBOP/10o7a21ty+evVqIyoqqsN2+/777w0AxuzZs93uVxRFUTpHX99b//CHPxgAjIkTJxolJSXm9p07dxoDBgww74eu7N271wBgzJkzx7K9M/ev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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 18 + }, + { + "cell_type": "markdown", + "id": "42a66c13c111a61f", + "metadata": {}, + "source": [ + "The first matrix shows the adjacency matrix `A`, capturing the connections between nodes. \n", + "The other matrices display the inferred matrices `M` (representing the expected values) for the three cases we explored. We \n", + "can now summarize the models' performance with the log-likelihood, the L1 loss, and the AUC." + ] + }, + { + "cell_type": "code", + "id": "3d16c004ffe07c1e", + "metadata": { + "ExecuteTime": { + "end_time": "2024-11-08T20:10:45.482179Z", + "start_time": "2024-11-08T20:10:45.439572Z" + } + }, + "source": [ + "import pandas as pd\n", + "from probinet.evaluation.likelihood import log_likelihood_given_model\n", + "from probinet.evaluation.expectation_computation import compute_L1loss\n", + "from probinet.evaluation.link_prediction import compute_link_prediction_AUC\n", + "\n", + "# Calculate the metrics\n", + "results = {\n", + " \"Matrix\": [\"M (unbiased)\", \"M (disassortative)\", \"M (assortative)\"],\n", + " \"Log-likelihood\": [\n", + " log_likelihood_given_model(mtcov_unbiased, gdata.adjacency_tensor),\n", + " log_likelihood_given_model(mtcov_disassortative, gdata.adjacency_tensor),\n", + " log_likelihood_given_model(mtcov_assortative, gdata.adjacency_tensor),\n", + " ],\n", + " \"L1 Loss\": [\n", + " compute_L1loss(adjacency_matrix, M_unbiased),\n", + " compute_L1loss(adjacency_matrix, M_disassortative),\n", + " compute_L1loss(adjacency_matrix, M_assortative),\n", + " ],\n", + " \"AUC\": [\n", + " compute_link_prediction_AUC(adjacency_matrix, M_unbiased),\n", + " compute_link_prediction_AUC(adjacency_matrix, M_disassortative),\n", + " compute_link_prediction_AUC(adjacency_matrix, M_assortative),\n", + " ],\n", + "}\n", + "\n", + "# Create a DataFrame\n", + "df_results = pd.DataFrame(results)\n", + "\n", + "# Round the numbers to three decimal places\n", + "df_results = df_results.round(3)\n", + "\n", + "df_results" + ], + "outputs": [ + { + "data": { + "text/plain": [ + " Matrix Log-likelihood L1 Loss AUC\n", + "0 M (unbiased) -14226.442 0.213 0.684\n", + "1 M (disassortative) -13653.129 0.211 0.699\n", + "2 M (assortative) -14924.255 0.219 0.629" + ], + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MatrixLog-likelihoodL1 LossAUC
0M (unbiased)-14226.4420.2130.684
1M (disassortative)-13653.1290.2110.699
2M (assortative)-14924.2550.2190.629
\n", + "
" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 19 + }, + { + "cell_type": "markdown", + "id": "7c2560c6e5ca953e", + "metadata": {}, + "source": [ + "As shown in the table, the model biased towards a disassortative structure performs the best, \n", + "achieving the lowest log-likelihood, the lowest L1 loss, and the highest AUC. However, the differences compared to the unbiased model are minimal, indicating that the parameters inferred in the unbiased model were close to optimal. Conversely, the model biased towards an assortative structure performs the worst." + ] + }, + { + "cell_type": "markdown", + "id": "c5fafe1fe335f087", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this tutorial, we explored how to infer community structures in network data without prior \n", + "knowledge of whether the network is assortative or disassortative. Initially, we ran the \n", + "algorithm with random initialization and no bias, which resulted in unclear latent \n", + "variables. By adjusting the parameters and providing a better initialization, we guided the \n", + "algorithm out of a local minimum, successfully revealing a stronger community structure. \n", + "We also quantified the quality of the inferred structures by comparing the models' log-likelihood and their perfomance in reconstruction. For the latter option, we calculated the L1 loss and the AUC between the adjacency matrix and the inferred \n", + " ones.\n" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "f7b2a86e2c38542e" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..7ebbd6d --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/check-solid.svg b/_static/check-solid.svg new file mode 100644 index 0000000..92fad4b --- /dev/null +++ b/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js new file mode 100644 index 0000000..54b3c46 --- /dev/null +++ b/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/_static/copybutton.css b/_static/copybutton.css new file mode 100644 index 0000000..f1916ec --- /dev/null +++ b/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 0000000..2ea7ff3 --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js new file mode 100644 index 0000000..dbe1aaa --- /dev/null +++ b/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..0398ebb --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..dab586c --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/full-logo.png b/_static/full-logo.png new file mode 100644 index 0000000..8c47293 Binary files /dev/null and b/_static/full-logo.png differ diff --git a/_static/images/logo_binder.svg b/_static/images/logo_binder.svg new file mode 100644 index 0000000..45fecf7 --- /dev/null +++ b/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/_static/images/logo_colab.png b/_static/images/logo_colab.png new file mode 100644 index 0000000..b7560ec Binary files /dev/null and b/_static/images/logo_colab.png differ diff --git a/_static/images/logo_deepnote.svg b/_static/images/logo_deepnote.svg new file mode 100644 index 0000000..fa77ebf --- /dev/null +++ b/_static/images/logo_deepnote.svg @@ -0,0 +1 @@ + diff --git a/_static/images/logo_jupyterhub.svg b/_static/images/logo_jupyterhub.svg new file mode 100644 index 0000000..60cfe9f --- /dev/null +++ b/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/_static/in-line.png b/_static/in-line.png new file mode 100644 index 0000000..366dbe3 Binary files /dev/null and b/_static/in-line.png differ diff --git a/_static/input_and_output_for_algorithms.png b/_static/input_and_output_for_algorithms.png new file mode 100644 index 0000000..78c0415 Binary files /dev/null and b/_static/input_and_output_for_algorithms.png differ diff --git a/_static/language_data.js b/_static/language_data.js new file mode 100644 index 0000000..c7fe6c6 --- /dev/null +++ b/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/locales/ar/LC_MESSAGES/booktheme.mo b/_static/locales/ar/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..15541a6 Binary files /dev/null and b/_static/locales/ar/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ar/LC_MESSAGES/booktheme.po b/_static/locales/ar/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..34d404c --- /dev/null +++ b/_static/locales/ar/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "Theme by the" +msgstr "موضوع بواسطة" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "Contents" +msgstr "محتويات" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "By" +msgstr "بواسطة" + +msgid "repository" +msgstr "مخزن" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "suggest edit" +msgstr "أقترح تحرير" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "By the" +msgstr "بواسطة" + +msgid "next page" +msgstr "الصفحة التالية" diff --git a/_static/locales/bg/LC_MESSAGES/booktheme.mo b/_static/locales/bg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..da95120 Binary files /dev/null and b/_static/locales/bg/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/bg/LC_MESSAGES/booktheme.po b/_static/locales/bg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..7420c19 --- /dev/null +++ b/_static/locales/bg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "open issue" +msgstr "отворен брой" + +msgid "Contents" +msgstr "Съдържание" + +msgid "previous page" +msgstr "предишна страница" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "By" +msgstr "От" + +msgid "repository" +msgstr "хранилище" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "suggest edit" +msgstr "предложи редактиране" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Следваща страница" diff --git a/_static/locales/bn/LC_MESSAGES/booktheme.mo b/_static/locales/bn/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..6b96639 Binary files /dev/null and b/_static/locales/bn/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/bn/LC_MESSAGES/booktheme.po b/_static/locales/bn/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..63a07c3 --- /dev/null +++ b/_static/locales/bn/LC_MESSAGES/booktheme.po @@ -0,0 +1,63 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "পিডিএফ প্রিন্ট করুন" + +msgid "Theme by the" +msgstr "থিম দ্বারা" + +msgid "Download source file" +msgstr "উত্স ফাইল ডাউনলোড করুন" + +msgid "open issue" +msgstr "খোলা সমস্যা" + +msgid "previous page" +msgstr "আগের পৃষ্ঠা" + +msgid "Download notebook file" +msgstr "নোটবুক ফাইল ডাউনলোড করুন" + +msgid "Copyright" +msgstr "কপিরাইট" + +msgid "Download this page" +msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" + +msgid "Source repository" +msgstr "উত্স সংগ্রহস্থল" + +msgid "By" +msgstr "দ্বারা" + +msgid "Last updated on" +msgstr "সর্বশেষ আপডেট" + +msgid "Toggle navigation" +msgstr "নেভিগেশন টগল করুন" + +msgid "Sphinx Book Theme" +msgstr "স্পিনিক্স বুক থিম" + +msgid "Open an issue" +msgstr "একটি সমস্যা খুলুন" + +msgid "Launch" +msgstr "শুরু করা" + +msgid "Edit this page" +msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" + +msgid "By the" +msgstr "দ্বারা" + +msgid "next page" +msgstr "পরবর্তী পৃষ্ঠা" diff --git a/_static/locales/ca/LC_MESSAGES/booktheme.mo b/_static/locales/ca/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..a4dd30e Binary files /dev/null and b/_static/locales/ca/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ca/LC_MESSAGES/booktheme.po b/_static/locales/ca/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..8fb358b --- /dev/null +++ b/_static/locales/ca/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimeix a PDF" + +msgid "Theme by the" +msgstr "Tema del" + +msgid "Download source file" +msgstr "Baixeu el fitxer font" + +msgid "open issue" +msgstr "número obert" + +msgid "previous page" +msgstr "Pàgina anterior" + +msgid "Download notebook file" +msgstr "Descarregar fitxer de quadern" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "Descarregueu aquesta pàgina" + +msgid "Source repository" +msgstr "Dipòsit de fonts" + +msgid "By" +msgstr "Per" + +msgid "Last updated on" +msgstr "Darrera actualització el" + +msgid "Toggle navigation" +msgstr "Commuta la navegació" + +msgid "Sphinx Book Theme" +msgstr "Tema del llibre Esfinx" + +msgid "suggest edit" +msgstr "suggerir edició" + +msgid "Open an issue" +msgstr "Obriu un número" + +msgid "Launch" +msgstr "Llançament" + +msgid "Edit this page" +msgstr "Editeu aquesta pàgina" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "pàgina següent" diff --git a/_static/locales/cs/LC_MESSAGES/booktheme.mo b/_static/locales/cs/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..c39e01a Binary files /dev/null and b/_static/locales/cs/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/cs/LC_MESSAGES/booktheme.po b/_static/locales/cs/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c6ef469 --- /dev/null +++ b/_static/locales/cs/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "Contents" +msgstr "Obsah" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "By" +msgstr "Podle" + +msgid "repository" +msgstr "úložiště" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "suggest edit" +msgstr "navrhnout úpravy" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "By the" +msgstr "Podle" + +msgid "next page" +msgstr "další strana" diff --git a/_static/locales/da/LC_MESSAGES/booktheme.mo b/_static/locales/da/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..f43157d Binary files /dev/null and b/_static/locales/da/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/da/LC_MESSAGES/booktheme.po b/_static/locales/da/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..306a38e --- /dev/null +++ b/_static/locales/da/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Udskriv til PDF" + +msgid "Theme by the" +msgstr "Tema af" + +msgid "Download source file" +msgstr "Download kildefil" + +msgid "open issue" +msgstr "åbent nummer" + +msgid "Contents" +msgstr "Indhold" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download notebook file" +msgstr "Download notesbog-fil" + +msgid "Copyright" +msgstr "ophavsret" + +msgid "Download this page" +msgstr "Download denne side" + +msgid "Source repository" +msgstr "Kildelager" + +msgid "By" +msgstr "Ved" + +msgid "repository" +msgstr "lager" + +msgid "Last updated on" +msgstr "Sidst opdateret den" + +msgid "Toggle navigation" +msgstr "Skift navigation" + +msgid "Sphinx Book Theme" +msgstr "Sphinx bogtema" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Open an issue" +msgstr "Åbn et problem" + +msgid "Launch" +msgstr "Start" + +msgid "Fullscreen mode" +msgstr "Fuldskærmstilstand" + +msgid "Edit this page" +msgstr "Rediger denne side" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "Næste side" diff --git a/_static/locales/de/LC_MESSAGES/booktheme.mo b/_static/locales/de/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..648b565 Binary files /dev/null and b/_static/locales/de/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/de/LC_MESSAGES/booktheme.po b/_static/locales/de/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..4925360 --- /dev/null +++ b/_static/locales/de/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "Theme by the" +msgstr "Thema von der" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "Contents" +msgstr "Inhalt" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "By" +msgstr "Durch" + +msgid "repository" +msgstr "Repository" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "Launch" +msgstr "Starten" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "By the" +msgstr "Bis zum" + +msgid "next page" +msgstr "Nächste Seite" diff --git a/_static/locales/el/LC_MESSAGES/booktheme.mo b/_static/locales/el/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..fca6e93 Binary files /dev/null and b/_static/locales/el/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/el/LC_MESSAGES/booktheme.po b/_static/locales/el/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..3e01acb --- /dev/null +++ b/_static/locales/el/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Εκτύπωση σε PDF" + +msgid "Theme by the" +msgstr "Θέμα από το" + +msgid "Download source file" +msgstr "Λήψη αρχείου προέλευσης" + +msgid "open issue" +msgstr "ανοιχτό ζήτημα" + +msgid "Contents" +msgstr "Περιεχόμενα" + +msgid "previous page" +msgstr "προηγούμενη σελίδα" + +msgid "Download notebook file" +msgstr "Λήψη αρχείου σημειωματάριου" + +msgid "Copyright" +msgstr "Πνευματική ιδιοκτησία" + +msgid "Download this page" +msgstr "Λήψη αυτής της σελίδας" + +msgid "Source repository" +msgstr "Αποθήκη πηγής" + +msgid "By" +msgstr "Με" + +msgid "repository" +msgstr "αποθήκη" + +msgid "Last updated on" +msgstr "Τελευταία ενημέρωση στις" + +msgid "Toggle navigation" +msgstr "Εναλλαγή πλοήγησης" + +msgid "Sphinx Book Theme" +msgstr "Θέμα βιβλίου Sphinx" + +msgid "suggest edit" +msgstr "προτείνω επεξεργασία" + +msgid "Open an issue" +msgstr "Ανοίξτε ένα ζήτημα" + +msgid "Launch" +msgstr "Εκτόξευση" + +msgid "Fullscreen mode" +msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" + +msgid "Edit this page" +msgstr "Επεξεργαστείτε αυτήν τη σελίδα" + +msgid "By the" +msgstr "Από το" + +msgid "next page" +msgstr "επόμενη σελίδα" diff --git a/_static/locales/eo/LC_MESSAGES/booktheme.mo b/_static/locales/eo/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..d1072bb Binary files /dev/null and b/_static/locales/eo/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/eo/LC_MESSAGES/booktheme.po b/_static/locales/eo/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..f7ed226 --- /dev/null +++ b/_static/locales/eo/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "Theme by the" +msgstr "Temo de la" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "open issue" +msgstr "malferma numero" + +msgid "Contents" +msgstr "Enhavo" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "deponejo" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "suggest edit" +msgstr "sugesti redaktadon" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "sekva paĝo" diff --git a/_static/locales/es/LC_MESSAGES/booktheme.mo b/_static/locales/es/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..ba2ee4d Binary files /dev/null and b/_static/locales/es/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/es/LC_MESSAGES/booktheme.po b/_static/locales/es/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..5e0029e --- /dev/null +++ b/_static/locales/es/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "Theme by the" +msgstr "Tema por el" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "Contents" +msgstr "Contenido" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "By" +msgstr "Por" + +msgid "repository" +msgstr "repositorio" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "suggest edit" +msgstr "sugerir editar" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "By the" +msgstr "Por el" + +msgid "next page" +msgstr "siguiente página" diff --git a/_static/locales/et/LC_MESSAGES/booktheme.mo b/_static/locales/et/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..983b823 Binary files /dev/null and b/_static/locales/et/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/et/LC_MESSAGES/booktheme.po b/_static/locales/et/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..8680982 --- /dev/null +++ b/_static/locales/et/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "Theme by the" +msgstr "Teema" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "Contents" +msgstr "Sisu" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "By" +msgstr "Kõrval" + +msgid "repository" +msgstr "hoidla" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "suggest edit" +msgstr "soovita muuta" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "By the" +msgstr "Autor" + +msgid "next page" +msgstr "järgmine leht" diff --git a/_static/locales/fi/LC_MESSAGES/booktheme.mo b/_static/locales/fi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..d8ac054 Binary files /dev/null and b/_static/locales/fi/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/fi/LC_MESSAGES/booktheme.po b/_static/locales/fi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..34dac21 --- /dev/null +++ b/_static/locales/fi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "Theme by the" +msgstr "Teeman tekijä" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "Contents" +msgstr "Sisällys" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "By" +msgstr "Tekijä" + +msgid "repository" +msgstr "arkisto" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "suggest edit" +msgstr "ehdottaa muokkausta" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "By the" +msgstr "Mukaan" + +msgid "next page" +msgstr "seuraava sivu" diff --git a/_static/locales/fr/LC_MESSAGES/booktheme.mo b/_static/locales/fr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..f663d39 Binary files /dev/null and b/_static/locales/fr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/fr/LC_MESSAGES/booktheme.po b/_static/locales/fr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..8991a1b --- /dev/null +++ b/_static/locales/fr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "Theme by the" +msgstr "Thème par le" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "Contents" +msgstr "Contenu" + +msgid "previous page" +msgstr "page précédente" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "By" +msgstr "Par" + +msgid "repository" +msgstr "dépôt" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "suggest edit" +msgstr "suggestion de modification" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "Launch" +msgstr "lancement" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "By the" +msgstr "Par le" + +msgid "next page" +msgstr "page suivante" diff --git a/_static/locales/hr/LC_MESSAGES/booktheme.mo b/_static/locales/hr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..eca4a1a Binary files /dev/null and b/_static/locales/hr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/hr/LC_MESSAGES/booktheme.po b/_static/locales/hr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..42c4233 --- /dev/null +++ b/_static/locales/hr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Ispis u PDF" + +msgid "Theme by the" +msgstr "Tema autora" + +msgid "Download source file" +msgstr "Preuzmi izvornu datoteku" + +msgid "open issue" +msgstr "otvoreno izdanje" + +msgid "Contents" +msgstr "Sadržaj" + +msgid "previous page" +msgstr "Prethodna stranica" + +msgid "Download notebook file" +msgstr "Preuzmi datoteku bilježnice" + +msgid "Copyright" +msgstr "Autorska prava" + +msgid "Download this page" +msgstr "Preuzmite ovu stranicu" + +msgid "Source repository" +msgstr "Izvorno spremište" + +msgid "By" +msgstr "Po" + +msgid "repository" +msgstr "spremište" + +msgid "Last updated on" +msgstr "Posljednje ažuriranje:" + +msgid "Toggle navigation" +msgstr "Uključi / isključi navigaciju" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "suggest edit" +msgstr "predloži uređivanje" + +msgid "Open an issue" +msgstr "Otvorite izdanje" + +msgid "Launch" +msgstr "Pokrenite" + +msgid "Fullscreen mode" +msgstr "Način preko cijelog zaslona" + +msgid "Edit this page" +msgstr "Uredite ovu stranicu" + +msgid "By the" +msgstr "Od strane" + +msgid "next page" +msgstr "sljedeća stranica" diff --git a/_static/locales/id/LC_MESSAGES/booktheme.mo b/_static/locales/id/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..d07a06a Binary files /dev/null and b/_static/locales/id/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/id/LC_MESSAGES/booktheme.po b/_static/locales/id/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..b8d8d89 --- /dev/null +++ b/_static/locales/id/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "Contents" +msgstr "Isi" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By" +msgstr "Oleh" + +msgid "repository" +msgstr "gudang" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "suggest edit" +msgstr "menyarankan edit" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "halaman selanjutnya" diff --git a/_static/locales/it/LC_MESSAGES/booktheme.mo b/_static/locales/it/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..53ba476 Binary files /dev/null and b/_static/locales/it/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/it/LC_MESSAGES/booktheme.po b/_static/locales/it/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..36fca59 --- /dev/null +++ b/_static/locales/it/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Stampa in PDF" + +msgid "Theme by the" +msgstr "Tema di" + +msgid "Download source file" +msgstr "Scarica il file sorgente" + +msgid "open issue" +msgstr "questione aperta" + +msgid "Contents" +msgstr "Contenuti" + +msgid "previous page" +msgstr "pagina precedente" + +msgid "Download notebook file" +msgstr "Scarica il file del taccuino" + +msgid "Copyright" +msgstr "Diritto d'autore" + +msgid "Download this page" +msgstr "Scarica questa pagina" + +msgid "Source repository" +msgstr "Repository di origine" + +msgid "By" +msgstr "Di" + +msgid "repository" +msgstr "repository" + +msgid "Last updated on" +msgstr "Ultimo aggiornamento il" + +msgid "Toggle navigation" +msgstr "Attiva / disattiva la navigazione" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro della Sfinge" + +msgid "suggest edit" +msgstr "suggerisci modifica" + +msgid "Open an issue" +msgstr "Apri un problema" + +msgid "Launch" +msgstr "Lanciare" + +msgid "Fullscreen mode" +msgstr "Modalità schermo intero" + +msgid "Edit this page" +msgstr "Modifica questa pagina" + +msgid "By the" +msgstr "Dal" + +msgid "next page" +msgstr "pagina successiva" diff --git a/_static/locales/iw/LC_MESSAGES/booktheme.mo b/_static/locales/iw/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..a45c657 Binary files /dev/null and b/_static/locales/iw/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/iw/LC_MESSAGES/booktheme.po b/_static/locales/iw/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..dede9cb --- /dev/null +++ b/_static/locales/iw/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: iw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "Theme by the" +msgstr "נושא מאת" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "Contents" +msgstr "תוכן" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "By" +msgstr "על ידי" + +msgid "repository" +msgstr "מאגר" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "suggest edit" +msgstr "מציע לערוך" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "By the" +msgstr "דרך" + +msgid "next page" +msgstr "עמוד הבא" diff --git a/_static/locales/ja/LC_MESSAGES/booktheme.mo b/_static/locales/ja/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..1cefd29 Binary files /dev/null and b/_static/locales/ja/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ja/LC_MESSAGES/booktheme.po b/_static/locales/ja/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2615f0d --- /dev/null +++ b/_static/locales/ja/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDFに印刷" + +msgid "Theme by the" +msgstr "のテーマ" + +msgid "Download source file" +msgstr "ソースファイルをダウンロード" + +msgid "open issue" +msgstr "未解決の問題" + +msgid "Contents" +msgstr "目次" + +msgid "previous page" +msgstr "前のページ" + +msgid "Download notebook file" +msgstr "ノートブックファイルをダウンロード" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "このページをダウンロード" + +msgid "Source repository" +msgstr "ソースリポジトリ" + +msgid "By" +msgstr "著者" + +msgid "repository" +msgstr "リポジトリ" + +msgid "Last updated on" +msgstr "最終更新日" + +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替え" + +msgid "Sphinx Book Theme" +msgstr "スフィンクスの本のテーマ" + +msgid "suggest edit" +msgstr "編集を提案する" + +msgid "Open an issue" +msgstr "問題を報告" + +msgid "Launch" +msgstr "起動" + +msgid "Fullscreen mode" +msgstr "全画面モード" + +msgid "Edit this page" +msgstr "このページを編集" + +msgid "By the" +msgstr "によって" + +msgid "next page" +msgstr "次のページ" diff --git a/_static/locales/ko/LC_MESSAGES/booktheme.mo b/_static/locales/ko/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..06c7ec9 Binary files /dev/null and b/_static/locales/ko/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ko/LC_MESSAGES/booktheme.po b/_static/locales/ko/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c9e13a4 --- /dev/null +++ b/_static/locales/ko/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "Theme by the" +msgstr "테마별" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "open issue" +msgstr "열린 문제" + +msgid "Contents" +msgstr "내용" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Copyright" +msgstr "저작권" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "By" +msgstr "으로" + +msgid "repository" +msgstr "저장소" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "suggest edit" +msgstr "편집 제안" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "Launch" +msgstr "시작하다" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "By the" +msgstr "에 의해" + +msgid "next page" +msgstr "다음 페이지" diff --git a/_static/locales/lt/LC_MESSAGES/booktheme.mo b/_static/locales/lt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..4468ba0 Binary files /dev/null and b/_static/locales/lt/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/lt/LC_MESSAGES/booktheme.po b/_static/locales/lt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..35eabd9 --- /dev/null +++ b/_static/locales/lt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "Theme by the" +msgstr "Tema" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "Contents" +msgstr "Turinys" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "By" +msgstr "Iki" + +msgid "repository" +msgstr "saugykla" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "By the" +msgstr "Prie" + +msgid "next page" +msgstr "Kitas puslapis" diff --git a/_static/locales/lv/LC_MESSAGES/booktheme.mo b/_static/locales/lv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..74aa4d8 Binary files /dev/null and b/_static/locales/lv/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/lv/LC_MESSAGES/booktheme.po b/_static/locales/lv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..ee1bd08 --- /dev/null +++ b/_static/locales/lv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "Theme by the" +msgstr "Autora tēma" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "Contents" +msgstr "Saturs" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "By" +msgstr "Autors" + +msgid "repository" +msgstr "krātuve" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "suggest edit" +msgstr "ieteikt rediģēt" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "By the" +msgstr "Ar" + +msgid "next page" +msgstr "nākamā lapaspuse" diff --git a/_static/locales/ml/LC_MESSAGES/booktheme.mo b/_static/locales/ml/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..2736e8f Binary files /dev/null and b/_static/locales/ml/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ml/LC_MESSAGES/booktheme.po b/_static/locales/ml/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..d471277 --- /dev/null +++ b/_static/locales/ml/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "Theme by the" +msgstr "പ്രമേയം" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "By the" +msgstr "എഴുതിയത്" + +msgid "next page" +msgstr "അടുത്ത പേജ്" diff --git a/_static/locales/mr/LC_MESSAGES/booktheme.mo b/_static/locales/mr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..fe53010 Binary files /dev/null and b/_static/locales/mr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/mr/LC_MESSAGES/booktheme.po b/_static/locales/mr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..f3694ac --- /dev/null +++ b/_static/locales/mr/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "Theme by the" +msgstr "द्वारा थीम" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "By" +msgstr "द्वारा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "suggest edit" +msgstr "संपादन सुचवा" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "By the" +msgstr "द्वारा" + +msgid "next page" +msgstr "पुढील पृष्ठ" diff --git a/_static/locales/ms/LC_MESSAGES/booktheme.mo b/_static/locales/ms/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..f02603f Binary files /dev/null and b/_static/locales/ms/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ms/LC_MESSAGES/booktheme.po b/_static/locales/ms/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..65b7c60 --- /dev/null +++ b/_static/locales/ms/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By" +msgstr "Oleh" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "suggest edit" +msgstr "cadangkan edit" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "muka surat seterusnya" diff --git a/_static/locales/nl/LC_MESSAGES/booktheme.mo b/_static/locales/nl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..e59e7ec Binary files /dev/null and b/_static/locales/nl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/nl/LC_MESSAGES/booktheme.po b/_static/locales/nl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..71bd1cd --- /dev/null +++ b/_static/locales/nl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "Theme by the" +msgstr "Thema door de" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "open issue" +msgstr "open probleem" + +msgid "Contents" +msgstr "Inhoud" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "By" +msgstr "Door" + +msgid "repository" +msgstr "repository" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "suggest edit" +msgstr "suggereren bewerken" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "Launch" +msgstr "Lancering" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "By the" +msgstr "Door de" + +msgid "next page" +msgstr "volgende bladzijde" diff --git a/_static/locales/no/LC_MESSAGES/booktheme.mo b/_static/locales/no/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..6cd15c8 Binary files /dev/null and b/_static/locales/no/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/no/LC_MESSAGES/booktheme.po b/_static/locales/no/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..b21346a --- /dev/null +++ b/_static/locales/no/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: no\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Skriv ut til PDF" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Download source file" +msgstr "Last ned kildefilen" + +msgid "open issue" +msgstr "åpent nummer" + +msgid "Contents" +msgstr "Innhold" + +msgid "previous page" +msgstr "forrige side" + +msgid "Download notebook file" +msgstr "Last ned notatbokfilen" + +msgid "Copyright" +msgstr "opphavsrett" + +msgid "Download this page" +msgstr "Last ned denne siden" + +msgid "Source repository" +msgstr "Kildedepot" + +msgid "By" +msgstr "Av" + +msgid "repository" +msgstr "oppbevaringssted" + +msgid "Last updated on" +msgstr "Sist oppdatert den" + +msgid "Toggle navigation" +msgstr "Bytt navigasjon" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "suggest edit" +msgstr "foreslå redigering" + +msgid "Open an issue" +msgstr "Åpne et problem" + +msgid "Launch" +msgstr "Start" + +msgid "Fullscreen mode" +msgstr "Fullskjerm-modus" + +msgid "Edit this page" +msgstr "Rediger denne siden" + +msgid "By the" +msgstr "Ved" + +msgid "next page" +msgstr "neste side" diff --git a/_static/locales/pl/LC_MESSAGES/booktheme.mo b/_static/locales/pl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..9ebb584 Binary files /dev/null and b/_static/locales/pl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/pl/LC_MESSAGES/booktheme.po b/_static/locales/pl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..1b7233f --- /dev/null +++ b/_static/locales/pl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "Theme by the" +msgstr "Motyw autorstwa" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "Contents" +msgstr "Zawartość" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "By" +msgstr "Przez" + +msgid "repository" +msgstr "magazyn" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "suggest edit" +msgstr "zaproponuj edycję" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "By the" +msgstr "Przez" + +msgid "next page" +msgstr "Następna strona" diff --git a/_static/locales/pt/LC_MESSAGES/booktheme.mo b/_static/locales/pt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..d0ddb87 Binary files /dev/null and b/_static/locales/pt/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/pt/LC_MESSAGES/booktheme.po b/_static/locales/pt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..1b27314 --- /dev/null +++ b/_static/locales/pt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "Theme by the" +msgstr "Tema por" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "open issue" +msgstr "questão aberta" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "previous page" +msgstr "página anterior" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "repositório" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "suggest edit" +msgstr "sugerir edição" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "By the" +msgstr "Pelo" + +msgid "next page" +msgstr "próxima página" diff --git a/_static/locales/ro/LC_MESSAGES/booktheme.mo b/_static/locales/ro/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..3c36ab1 Binary files /dev/null and b/_static/locales/ro/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ro/LC_MESSAGES/booktheme.po b/_static/locales/ro/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..1783ad2 --- /dev/null +++ b/_static/locales/ro/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "Theme by the" +msgstr "Tema de" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "Contents" +msgstr "Cuprins" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "By" +msgstr "De" + +msgid "repository" +msgstr "repertoriu" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "suggest edit" +msgstr "sugerează editare" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "Launch" +msgstr "Lansa" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "By the" +msgstr "Langa" + +msgid "next page" +msgstr "pagina următoare" diff --git a/_static/locales/ru/LC_MESSAGES/booktheme.mo b/_static/locales/ru/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..6b8ca41 Binary files /dev/null and b/_static/locales/ru/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ru/LC_MESSAGES/booktheme.po b/_static/locales/ru/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..b1176b7 --- /dev/null +++ b/_static/locales/ru/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "Contents" +msgstr "Содержание" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "By" +msgstr "По" + +msgid "repository" +msgstr "хранилище" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "suggest edit" +msgstr "предложить редактировать" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "Launch" +msgstr "Запуск" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "By the" +msgstr "Посредством" + +msgid "next page" +msgstr "Следующая страница" diff --git a/_static/locales/sk/LC_MESSAGES/booktheme.mo b/_static/locales/sk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..59bd0dd Binary files /dev/null and b/_static/locales/sk/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sk/LC_MESSAGES/booktheme.po b/_static/locales/sk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..6501288 --- /dev/null +++ b/_static/locales/sk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "Contents" +msgstr "Obsah" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "By" +msgstr "Autor:" + +msgid "repository" +msgstr "Úložisko" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "suggest edit" +msgstr "navrhnúť úpravu" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "By the" +msgstr "Podľa" + +msgid "next page" +msgstr "ďalšia strana" diff --git a/_static/locales/sl/LC_MESSAGES/booktheme.mo b/_static/locales/sl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..87bf26d Binary files /dev/null and b/_static/locales/sl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sl/LC_MESSAGES/booktheme.po b/_static/locales/sl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..3c7e3a8 --- /dev/null +++ b/_static/locales/sl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "Theme by the" +msgstr "Tema avtorja" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "Contents" +msgstr "Vsebina" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "By" +msgstr "Avtor" + +msgid "repository" +msgstr "odlagališče" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "suggest edit" +msgstr "predlagajte urejanje" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "By the" +msgstr "Avtor" + +msgid "next page" +msgstr "Naslednja stran" diff --git a/_static/locales/sr/LC_MESSAGES/booktheme.mo b/_static/locales/sr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..ec740f4 Binary files /dev/null and b/_static/locales/sr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sr/LC_MESSAGES/booktheme.po b/_static/locales/sr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..773b8ad --- /dev/null +++ b/_static/locales/sr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "Theme by the" +msgstr "Тхеме би" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "open issue" +msgstr "отворено издање" + +msgid "Contents" +msgstr "Садржај" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "By" +msgstr "Од стране" + +msgid "repository" +msgstr "спремиште" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "suggest edit" +msgstr "предложи уређивање" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "By the" +msgstr "Од" + +msgid "next page" +msgstr "Следећа страна" diff --git a/_static/locales/sv/LC_MESSAGES/booktheme.mo b/_static/locales/sv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..b07dc76 Binary files /dev/null and b/_static/locales/sv/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/sv/LC_MESSAGES/booktheme.po b/_static/locales/sv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..bcac54c --- /dev/null +++ b/_static/locales/sv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Skriv ut till PDF" + +msgid "Theme by the" +msgstr "Tema av" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "open issue" +msgstr "öppna problemrapport" + +msgid "Contents" +msgstr "Innehåll" + +msgid "previous page" +msgstr "föregående sida" + +msgid "Download notebook file" +msgstr "Ladda ner notebook-fil" + +msgid "Copyright" +msgstr "Upphovsrätt" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" + +msgid "Source repository" +msgstr "Källkodsrepositorium" + +msgid "By" +msgstr "Av" + +msgid "repository" +msgstr "repositorium" + +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Boktema" + +msgid "suggest edit" +msgstr "föreslå ändring" + +msgid "Open an issue" +msgstr "Öppna en problemrapport" + +msgid "Launch" +msgstr "Öppna" + +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" + +msgid "Edit this page" +msgstr "Redigera den här sidan" + +msgid "By the" +msgstr "Av den" + +msgid "next page" +msgstr "nästa sida" diff --git a/_static/locales/ta/LC_MESSAGES/booktheme.mo b/_static/locales/ta/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..29f52e1 Binary files /dev/null and b/_static/locales/ta/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ta/LC_MESSAGES/booktheme.po b/_static/locales/ta/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..b48bdfa --- /dev/null +++ b/_static/locales/ta/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "Theme by the" +msgstr "வழங்கிய தீம்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "By the" +msgstr "மூலம்" + +msgid "next page" +msgstr "அடுத்த பக்கம்" diff --git a/_static/locales/te/LC_MESSAGES/booktheme.mo b/_static/locales/te/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..0a5f4b4 Binary files /dev/null and b/_static/locales/te/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/te/LC_MESSAGES/booktheme.po b/_static/locales/te/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..952278f --- /dev/null +++ b/_static/locales/te/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "Theme by the" +msgstr "ద్వారా థీమ్" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "By" +msgstr "ద్వారా" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "By the" +msgstr "ద్వారా" + +msgid "next page" +msgstr "తరువాతి పేజీ" diff --git a/_static/locales/tg/LC_MESSAGES/booktheme.mo b/_static/locales/tg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..b21c6c6 Binary files /dev/null and b/_static/locales/tg/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tg/LC_MESSAGES/booktheme.po b/_static/locales/tg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c33dc42 --- /dev/null +++ b/_static/locales/tg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "Theme by the" +msgstr "Мавзӯъи аз" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "By" +msgstr "Бо" + +msgid "repository" +msgstr "анбор" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "suggest edit" +msgstr "пешниҳод вироиш" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "By the" +msgstr "Бо" + +msgid "next page" +msgstr "саҳифаи оянда" diff --git a/_static/locales/th/LC_MESSAGES/booktheme.mo b/_static/locales/th/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..abede98 Binary files /dev/null and b/_static/locales/th/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/th/LC_MESSAGES/booktheme.po b/_static/locales/th/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..9d24294 --- /dev/null +++ b/_static/locales/th/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "Theme by the" +msgstr "ธีมโดย" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "By" +msgstr "โดย" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "suggest edit" +msgstr "แนะนำแก้ไข" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "Launch" +msgstr "เปิด" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "By the" +msgstr "โดย" + +msgid "next page" +msgstr "หน้าต่อไป" diff --git a/_static/locales/tl/LC_MESSAGES/booktheme.mo b/_static/locales/tl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..8df1b73 Binary files /dev/null and b/_static/locales/tl/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tl/LC_MESSAGES/booktheme.po b/_static/locales/tl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..20e0d07 --- /dev/null +++ b/_static/locales/tl/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "Theme by the" +msgstr "Tema ng" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "By" +msgstr "Ni" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "suggest edit" +msgstr "iminumungkahi i-edit" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "By the" +msgstr "Sa pamamagitan ng" + +msgid "next page" +msgstr "Susunod na pahina" diff --git a/_static/locales/tr/LC_MESSAGES/booktheme.mo b/_static/locales/tr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..029ae18 Binary files /dev/null and b/_static/locales/tr/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/tr/LC_MESSAGES/booktheme.po b/_static/locales/tr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..a77eb02 --- /dev/null +++ b/_static/locales/tr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "Theme by the" +msgstr "Tarafından tema" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "open issue" +msgstr "Açık konu" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "By" +msgstr "Tarafından" + +msgid "repository" +msgstr "depo" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "suggest edit" +msgstr "düzenleme öner" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "By the" +msgstr "Tarafından" + +msgid "next page" +msgstr "sonraki Sayfa" diff --git a/_static/locales/uk/LC_MESSAGES/booktheme.mo b/_static/locales/uk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..16ab789 Binary files /dev/null and b/_static/locales/uk/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/uk/LC_MESSAGES/booktheme.po b/_static/locales/uk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..993dd07 --- /dev/null +++ b/_static/locales/uk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "Друк у форматі PDF" + +msgid "Theme by the" +msgstr "Тема від" + +msgid "Download source file" +msgstr "Завантажити вихідний файл" + +msgid "open issue" +msgstr "відкритий випуск" + +msgid "Contents" +msgstr "Зміст" + +msgid "previous page" +msgstr "Попередня сторінка" + +msgid "Download notebook file" +msgstr "Завантажте файл блокнота" + +msgid "Copyright" +msgstr "Авторське право" + +msgid "Download this page" +msgstr "Завантажте цю сторінку" + +msgid "Source repository" +msgstr "Джерело сховища" + +msgid "By" +msgstr "Автор" + +msgid "repository" +msgstr "сховище" + +msgid "Last updated on" +msgstr "Останнє оновлення:" + +msgid "Toggle navigation" +msgstr "Переключити навігацію" + +msgid "Sphinx Book Theme" +msgstr "Тема книги \"Сфінкс\"" + +msgid "suggest edit" +msgstr "запропонувати редагувати" + +msgid "Open an issue" +msgstr "Відкрийте випуск" + +msgid "Launch" +msgstr "Запуск" + +msgid "Fullscreen mode" +msgstr "Повноекранний режим" + +msgid "Edit this page" +msgstr "Редагувати цю сторінку" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Наступна сторінка" diff --git a/_static/locales/ur/LC_MESSAGES/booktheme.mo b/_static/locales/ur/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..de8c84b Binary files /dev/null and b/_static/locales/ur/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/ur/LC_MESSAGES/booktheme.po b/_static/locales/ur/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2f77426 --- /dev/null +++ b/_static/locales/ur/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "By" +msgstr "بذریعہ" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "By the" +msgstr "کی طرف" + +msgid "next page" +msgstr "اگلا صفحہ" diff --git a/_static/locales/vi/LC_MESSAGES/booktheme.mo b/_static/locales/vi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..2bb3255 Binary files /dev/null and b/_static/locales/vi/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/vi/LC_MESSAGES/booktheme.po b/_static/locales/vi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..33159f3 --- /dev/null +++ b/_static/locales/vi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: vi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "In sang PDF" + +msgid "Theme by the" +msgstr "Chủ đề của" + +msgid "Download source file" +msgstr "Tải xuống tệp nguồn" + +msgid "open issue" +msgstr "vấn đề mở" + +msgid "Contents" +msgstr "Nội dung" + +msgid "previous page" +msgstr "trang trước" + +msgid "Download notebook file" +msgstr "Tải xuống tệp sổ tay" + +msgid "Copyright" +msgstr "Bản quyền" + +msgid "Download this page" +msgstr "Tải xuống trang này" + +msgid "Source repository" +msgstr "Kho nguồn" + +msgid "By" +msgstr "Bởi" + +msgid "repository" +msgstr "kho" + +msgid "Last updated on" +msgstr "Cập nhật lần cuối vào" + +msgid "Toggle navigation" +msgstr "Chuyển đổi điều hướng thành" + +msgid "Sphinx Book Theme" +msgstr "Chủ đề sách nhân sư" + +msgid "suggest edit" +msgstr "đề nghị chỉnh sửa" + +msgid "Open an issue" +msgstr "Mở một vấn đề" + +msgid "Launch" +msgstr "Phóng" + +msgid "Fullscreen mode" +msgstr "Chế độ toàn màn hình" + +msgid "Edit this page" +msgstr "chỉnh sửa trang này" + +msgid "By the" +msgstr "Bằng" + +msgid "next page" +msgstr "Trang tiếp theo" diff --git a/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo b/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..0e3235d Binary files /dev/null and b/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/zh_CN/LC_MESSAGES/booktheme.po b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2e519ef --- /dev/null +++ b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Theme by the" +msgstr "主题作者:" + +msgid "Download source file" +msgstr "下载源文件" + +msgid "open issue" +msgstr "创建议题" + +msgid "Contents" +msgstr "目录" + +msgid "previous page" +msgstr "上一页" + +msgid "Download notebook file" +msgstr "下载笔记本文件" + +msgid "Copyright" +msgstr "版权" + +msgid "Download this page" +msgstr "下载此页面" + +msgid "Source repository" +msgstr "源码库" + +msgid "By" +msgstr "作者:" + +msgid "repository" +msgstr "仓库" + +msgid "Last updated on" +msgstr "上次更新时间:" + +msgid "Toggle navigation" +msgstr "显示或隐藏导航栏" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 主题" + +msgid "suggest edit" +msgstr "提出修改建议" + +msgid "Open an issue" +msgstr "创建议题" + +msgid "Launch" +msgstr "启动" + +msgid "Fullscreen mode" +msgstr "全屏模式" + +msgid "Edit this page" +msgstr "编辑此页面" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一页" diff --git a/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo b/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000..9116fa9 Binary files /dev/null and b/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo differ diff --git a/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..beecb07 --- /dev/null +++ b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Theme by the" +msgstr "佈景主題作者:" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "open issue" +msgstr "公開的問題" + +msgid "Contents" +msgstr "目錄" + +msgid "previous page" +msgstr "上一頁" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "By" +msgstr "作者:" + +msgid "repository" +msgstr "儲存庫" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "suggest edit" +msgstr "提出修改建議" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "Launch" +msgstr "啟動" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一頁" diff --git a/_static/logo-probinet.svg b/_static/logo-probinet.svg new file mode 100644 index 0000000..0a47b00 --- /dev/null +++ b/_static/logo-probinet.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + { + { + + + + + + + + + + + + + ProbINet + + diff --git a/_static/logo-without-title.png b/_static/logo-without-title.png new file mode 100644 index 0000000..95ca206 Binary files /dev/null and b/_static/logo-without-title.png differ diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000..d96755f Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css new file mode 100644 index 0000000..3356631 --- /dev/null +++ b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css @@ -0,0 +1,2342 @@ +/* Variables */ +:root { + --mystnb-source-bg-color: #f7f7f7; + --mystnb-stdout-bg-color: #fcfcfc; + --mystnb-stderr-bg-color: #fdd; + --mystnb-traceback-bg-color: #fcfcfc; + --mystnb-source-border-color: #ccc; + --mystnb-source-margin-color: green; + --mystnb-stdout-border-color: #f7f7f7; + --mystnb-stderr-border-color: #f7f7f7; + --mystnb-traceback-border-color: #ffd6d6; + --mystnb-hide-prompt-opacity: 70%; + --mystnb-source-border-radius: .4em; + --mystnb-source-border-width: 1px; +} + +/* Whole cell */ +div.container.cell { + padding-left: 0; + margin-bottom: 1em; +} + +/* Removing all background formatting so we can control at the div level */ +.cell_input div.highlight, +.cell_output pre, +.cell_input pre, +.cell_output .output { + border: none; + box-shadow: none; +} + +.cell_output .output pre, +.cell_input pre { + margin: 0px; +} + +/* Input cells */ +div.cell div.cell_input, +div.cell details.above-input>summary { + padding-left: 0em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + background-color: var(--mystnb-source-bg-color); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; + border-radius: var(--mystnb-source-border-radius); +} + +div.cell_input>div, +div.cell_output div.output>div.highlight { + margin: 0em !important; + border: none !important; +} + +/* All cell outputs */ +.cell_output { + padding-left: 1em; + padding-right: 0em; + margin-top: 1em; +} + +/* Text outputs from cells */ +.cell_output .output.text_plain, +.cell_output .output.traceback, +.cell_output .output.stream, +.cell_output .output.stderr { + margin-top: 1em; + margin-bottom: 0em; + box-shadow: none; +} + +.cell_output .output.text_plain, +.cell_output .output.stream { + background: var(--mystnb-stdout-bg-color); + border: 1px solid var(--mystnb-stdout-border-color); +} + +.cell_output .output.stderr { + background: var(--mystnb-stderr-bg-color); + border: 1px solid var(--mystnb-stderr-border-color); +} + +.cell_output .output.traceback { + background: var(--mystnb-traceback-bg-color); + border: 1px solid var(--mystnb-traceback-border-color); +} + +/* Collapsible cell content */ +div.cell details.above-input div.cell_input { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; +} + +div.cell div.cell_input.above-output-prompt { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +div.cell details.above-input>summary { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; + padding-left: 1em; + margin-bottom: 0; +} + +div.cell details.above-output>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.below-input>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-top: none; + border-bottom-left-radius: var(--mystnb-source-border-radius); + border-bottom-right-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.hide>summary>span { + opacity: var(--mystnb-hide-prompt-opacity); +} + +div.cell details.hide[open]>summary>span.collapsed { + display: none; +} + +div.cell details.hide:not([open])>summary>span.expanded { + display: none; +} + +@keyframes collapsed-fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} +div.cell details.hide[open]>summary~* { + -moz-animation: collapsed-fade-in 0.3s ease-in-out; + -webkit-animation: collapsed-fade-in 0.3s ease-in-out; + animation: collapsed-fade-in 0.3s ease-in-out; +} + +/* Math align to the left */ +.cell_output .MathJax_Display { + text-align: left !important; +} + +/* Pandas tables. Pulled from the Jupyter / nbsphinx CSS */ +div.cell_output table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 1em; + table-layout: fixed; +} + +div.cell_output thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} + +div.cell_output tr, +div.cell_output th, +div.cell_output td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +div.cell_output th { + font-weight: bold; +} + +div.cell_output tbody tr:nth-child(odd) { + background: #f5f5f5; +} + +div.cell_output tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + +/** source code line numbers **/ +span.linenos { + opacity: 0.5; +} + +/* Inline text from `paste` operation */ + +span.pasted-text { + font-weight: bold; +} + +span.pasted-inline img { + max-height: 2em; +} + +tbody span.pasted-inline img { + max-height: none; +} + +/* Font colors for translated ANSI escape sequences +Color values are copied from Jupyter Notebook +https://github.com/jupyter/notebook/blob/52581f8eda9b319eb0390ac77fe5903c38f81e3e/notebook/static/notebook/less/ansicolors.less#L14-L21 +Background colors from +https://nbsphinx.readthedocs.io/en/latest/code-cells.html#ANSI-Colors +*/ +div.highlight .-Color-Bold { + font-weight: bold; +} + +div.highlight .-Color[class*=-Black] { + color: #3E424D +} + +div.highlight .-Color[class*=-Red] { + color: #E75C58 +} + +div.highlight .-Color[class*=-Green] { + color: #00A250 +} + +div.highlight .-Color[class*=-Yellow] { + color: #DDB62B +} + +div.highlight .-Color[class*=-Blue] { + color: #208FFB +} + +div.highlight .-Color[class*=-Magenta] { + color: #D160C4 +} + +div.highlight .-Color[class*=-Cyan] { + color: #60C6C8 +} + +div.highlight .-Color[class*=-White] { + color: #C5C1B4 +} + +div.highlight .-Color[class*=-BGBlack] { + background-color: #3E424D +} + +div.highlight .-Color[class*=-BGRed] { + background-color: #E75C58 +} + +div.highlight .-Color[class*=-BGGreen] { + background-color: #00A250 +} + +div.highlight .-Color[class*=-BGYellow] { + background-color: #DDB62B +} + +div.highlight .-Color[class*=-BGBlue] { + background-color: #208FFB +} + +div.highlight .-Color[class*=-BGMagenta] { + background-color: #D160C4 +} + +div.highlight .-Color[class*=-BGCyan] { + background-color: #60C6C8 +} + +div.highlight .-Color[class*=-BGWhite] { + background-color: #C5C1B4 +} + +/* Font colors for 8-bit ANSI */ + +div.highlight .-Color[class*=-C0] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC0] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C1] { + color: #800000 +} + +div.highlight .-Color[class*=-BGC1] { + background-color: #800000 +} + +div.highlight .-Color[class*=-C2] { + color: #008000 +} + +div.highlight .-Color[class*=-BGC2] { + background-color: #008000 +} + +div.highlight .-Color[class*=-C3] { + color: #808000 +} + +div.highlight .-Color[class*=-BGC3] { + background-color: #808000 +} + +div.highlight .-Color[class*=-C4] { + color: #000080 +} + +div.highlight .-Color[class*=-BGC4] { + background-color: #000080 +} + +div.highlight .-Color[class*=-C5] { + color: #800080 +} + +div.highlight .-Color[class*=-BGC5] { + background-color: #800080 +} + +div.highlight .-Color[class*=-C6] { + color: #008080 +} + +div.highlight .-Color[class*=-BGC6] { + background-color: #008080 +} + +div.highlight .-Color[class*=-C7] { + color: #C0C0C0 +} + +div.highlight .-Color[class*=-BGC7] { + background-color: #C0C0C0 +} + +div.highlight .-Color[class*=-C8] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC8] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C9] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC9] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C10] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC10] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C11] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC11] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C12] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC12] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C13] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC13] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C14] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC14] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C15] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC15] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C16] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC16] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C17] { + color: #00005F +} + +div.highlight .-Color[class*=-BGC17] { + background-color: #00005F +} + +div.highlight .-Color[class*=-C18] { + color: #000087 +} + +div.highlight .-Color[class*=-BGC18] { + background-color: #000087 +} + +div.highlight .-Color[class*=-C19] { + color: #0000AF +} + +div.highlight .-Color[class*=-BGC19] { + background-color: #0000AF +} + +div.highlight .-Color[class*=-C20] { + color: #0000D7 +} + +div.highlight .-Color[class*=-BGC20] { + background-color: #0000D7 +} + +div.highlight .-Color[class*=-C21] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC21] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C22] { + color: #005F00 +} + +div.highlight .-Color[class*=-BGC22] { + background-color: #005F00 +} + +div.highlight .-Color[class*=-C23] { + color: #005F5F +} + +div.highlight .-Color[class*=-BGC23] { + background-color: #005F5F +} + +div.highlight .-Color[class*=-C24] { + color: #005F87 +} + +div.highlight .-Color[class*=-BGC24] { + background-color: #005F87 +} + +div.highlight .-Color[class*=-C25] { + color: #005FAF +} + +div.highlight .-Color[class*=-BGC25] { + background-color: #005FAF +} + +div.highlight .-Color[class*=-C26] { + color: #005FD7 +} + +div.highlight .-Color[class*=-BGC26] { + background-color: #005FD7 +} + +div.highlight .-Color[class*=-C27] { + color: #005FFF +} + +div.highlight .-Color[class*=-BGC27] { + background-color: #005FFF +} + +div.highlight .-Color[class*=-C28] { + color: #008700 +} + +div.highlight .-Color[class*=-BGC28] { + background-color: #008700 +} + +div.highlight .-Color[class*=-C29] { + color: #00875F +} + +div.highlight .-Color[class*=-BGC29] { + background-color: #00875F +} + +div.highlight .-Color[class*=-C30] { + color: #008787 +} + +div.highlight .-Color[class*=-BGC30] { + background-color: #008787 +} + +div.highlight .-Color[class*=-C31] { + color: #0087AF +} + +div.highlight .-Color[class*=-BGC31] { + background-color: #0087AF +} + +div.highlight .-Color[class*=-C32] { + color: #0087D7 +} + +div.highlight .-Color[class*=-BGC32] { + background-color: #0087D7 +} + +div.highlight .-Color[class*=-C33] { + color: #0087FF +} + +div.highlight .-Color[class*=-BGC33] { + background-color: #0087FF +} + +div.highlight .-Color[class*=-C34] { + color: #00AF00 +} + +div.highlight .-Color[class*=-BGC34] { + background-color: #00AF00 +} + +div.highlight .-Color[class*=-C35] { + color: #00AF5F +} + +div.highlight .-Color[class*=-BGC35] { + background-color: #00AF5F +} + +div.highlight .-Color[class*=-C36] { + color: #00AF87 +} + +div.highlight .-Color[class*=-BGC36] { + background-color: #00AF87 +} + +div.highlight .-Color[class*=-C37] { + color: #00AFAF +} + +div.highlight .-Color[class*=-BGC37] { + background-color: #00AFAF +} + +div.highlight .-Color[class*=-C38] { + color: #00AFD7 +} + +div.highlight .-Color[class*=-BGC38] { + background-color: #00AFD7 +} + +div.highlight .-Color[class*=-C39] { + color: #00AFFF +} + +div.highlight .-Color[class*=-BGC39] { + background-color: #00AFFF +} + +div.highlight .-Color[class*=-C40] { + color: #00D700 +} + +div.highlight .-Color[class*=-BGC40] { + background-color: #00D700 +} + +div.highlight .-Color[class*=-C41] { + color: #00D75F +} + +div.highlight .-Color[class*=-BGC41] { + background-color: #00D75F +} + +div.highlight .-Color[class*=-C42] { + color: #00D787 +} + +div.highlight .-Color[class*=-BGC42] { + background-color: #00D787 +} + +div.highlight .-Color[class*=-C43] { + color: #00D7AF +} + +div.highlight .-Color[class*=-BGC43] { + background-color: #00D7AF +} + +div.highlight .-Color[class*=-C44] { + color: #00D7D7 +} + +div.highlight .-Color[class*=-BGC44] { + background-color: #00D7D7 +} + +div.highlight .-Color[class*=-C45] { + color: #00D7FF +} + +div.highlight .-Color[class*=-BGC45] { + background-color: #00D7FF +} + +div.highlight .-Color[class*=-C46] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC46] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C47] { + color: #00FF5F +} + +div.highlight .-Color[class*=-BGC47] { + background-color: #00FF5F +} + +div.highlight .-Color[class*=-C48] { + color: #00FF87 +} + +div.highlight .-Color[class*=-BGC48] { + background-color: #00FF87 +} + +div.highlight .-Color[class*=-C49] { + color: #00FFAF +} + +div.highlight .-Color[class*=-BGC49] { + background-color: #00FFAF +} + +div.highlight .-Color[class*=-C50] { + color: #00FFD7 +} + +div.highlight .-Color[class*=-BGC50] { + background-color: #00FFD7 +} + +div.highlight .-Color[class*=-C51] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC51] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C52] { + color: #5F0000 +} + +div.highlight .-Color[class*=-BGC52] { + background-color: #5F0000 +} + +div.highlight .-Color[class*=-C53] { + color: #5F005F +} + +div.highlight .-Color[class*=-BGC53] { + background-color: #5F005F +} + +div.highlight .-Color[class*=-C54] { + color: #5F0087 +} + +div.highlight .-Color[class*=-BGC54] { + background-color: #5F0087 +} + +div.highlight .-Color[class*=-C55] { + color: #5F00AF +} + +div.highlight .-Color[class*=-BGC55] { + background-color: #5F00AF +} + +div.highlight .-Color[class*=-C56] { + color: #5F00D7 +} + +div.highlight .-Color[class*=-BGC56] { + background-color: #5F00D7 +} + +div.highlight .-Color[class*=-C57] { + color: #5F00FF +} + +div.highlight .-Color[class*=-BGC57] { + background-color: #5F00FF +} + +div.highlight .-Color[class*=-C58] { + color: #5F5F00 +} + +div.highlight .-Color[class*=-BGC58] { + background-color: #5F5F00 +} + +div.highlight .-Color[class*=-C59] { + color: #5F5F5F +} + +div.highlight .-Color[class*=-BGC59] { + background-color: #5F5F5F +} + +div.highlight .-Color[class*=-C60] { + color: #5F5F87 +} + +div.highlight .-Color[class*=-BGC60] { + background-color: #5F5F87 +} + +div.highlight .-Color[class*=-C61] { + color: #5F5FAF +} + +div.highlight .-Color[class*=-BGC61] { + background-color: #5F5FAF +} + +div.highlight .-Color[class*=-C62] { + color: #5F5FD7 +} + +div.highlight .-Color[class*=-BGC62] { + background-color: #5F5FD7 +} + +div.highlight .-Color[class*=-C63] { + color: #5F5FFF +} + +div.highlight .-Color[class*=-BGC63] { + background-color: #5F5FFF +} + +div.highlight .-Color[class*=-C64] { + color: #5F8700 +} + +div.highlight .-Color[class*=-BGC64] { + background-color: #5F8700 +} + +div.highlight .-Color[class*=-C65] { + color: #5F875F +} + +div.highlight .-Color[class*=-BGC65] { + background-color: #5F875F +} + +div.highlight .-Color[class*=-C66] { + color: #5F8787 +} + +div.highlight .-Color[class*=-BGC66] { + background-color: #5F8787 +} + +div.highlight .-Color[class*=-C67] { + color: #5F87AF +} + +div.highlight .-Color[class*=-BGC67] { + background-color: #5F87AF +} + +div.highlight .-Color[class*=-C68] { + color: #5F87D7 +} + +div.highlight .-Color[class*=-BGC68] { + background-color: #5F87D7 +} + +div.highlight .-Color[class*=-C69] { + color: #5F87FF +} + +div.highlight .-Color[class*=-BGC69] { + background-color: #5F87FF +} + +div.highlight .-Color[class*=-C70] { + color: #5FAF00 +} + +div.highlight .-Color[class*=-BGC70] { + background-color: #5FAF00 +} + +div.highlight .-Color[class*=-C71] { + color: #5FAF5F +} + +div.highlight .-Color[class*=-BGC71] { + background-color: #5FAF5F +} + +div.highlight .-Color[class*=-C72] { + color: #5FAF87 +} + +div.highlight .-Color[class*=-BGC72] { + background-color: #5FAF87 +} + +div.highlight .-Color[class*=-C73] { + color: #5FAFAF +} + +div.highlight .-Color[class*=-BGC73] { + background-color: #5FAFAF +} + +div.highlight .-Color[class*=-C74] { + color: #5FAFD7 +} + +div.highlight .-Color[class*=-BGC74] { + background-color: #5FAFD7 +} + +div.highlight .-Color[class*=-C75] { + color: #5FAFFF +} + +div.highlight .-Color[class*=-BGC75] { + background-color: #5FAFFF +} + +div.highlight .-Color[class*=-C76] { + color: #5FD700 +} + +div.highlight .-Color[class*=-BGC76] { + background-color: #5FD700 +} + +div.highlight .-Color[class*=-C77] { + color: #5FD75F +} + +div.highlight .-Color[class*=-BGC77] { + background-color: #5FD75F +} + +div.highlight .-Color[class*=-C78] { + color: #5FD787 +} + +div.highlight .-Color[class*=-BGC78] { + background-color: #5FD787 +} + +div.highlight .-Color[class*=-C79] { + color: #5FD7AF +} + +div.highlight .-Color[class*=-BGC79] { + background-color: #5FD7AF +} + +div.highlight .-Color[class*=-C80] { + color: #5FD7D7 +} + +div.highlight .-Color[class*=-BGC80] { + background-color: #5FD7D7 +} + +div.highlight .-Color[class*=-C81] { + color: #5FD7FF +} + +div.highlight .-Color[class*=-BGC81] { + background-color: #5FD7FF +} + +div.highlight .-Color[class*=-C82] { + color: #5FFF00 +} + +div.highlight .-Color[class*=-BGC82] { + background-color: #5FFF00 +} + +div.highlight .-Color[class*=-C83] { + color: #5FFF5F +} + +div.highlight .-Color[class*=-BGC83] { + background-color: #5FFF5F +} + +div.highlight .-Color[class*=-C84] { + color: #5FFF87 +} + +div.highlight .-Color[class*=-BGC84] { + background-color: #5FFF87 +} + +div.highlight .-Color[class*=-C85] { + color: #5FFFAF +} + +div.highlight .-Color[class*=-BGC85] { + background-color: #5FFFAF +} + +div.highlight .-Color[class*=-C86] { + color: #5FFFD7 +} + +div.highlight .-Color[class*=-BGC86] { + background-color: #5FFFD7 +} + +div.highlight .-Color[class*=-C87] { + color: #5FFFFF +} + +div.highlight .-Color[class*=-BGC87] { + background-color: #5FFFFF +} + +div.highlight .-Color[class*=-C88] { + color: #870000 +} + +div.highlight .-Color[class*=-BGC88] { + background-color: #870000 +} + +div.highlight .-Color[class*=-C89] { + color: #87005F +} + +div.highlight .-Color[class*=-BGC89] { + background-color: #87005F +} + +div.highlight .-Color[class*=-C90] { + color: #870087 +} + +div.highlight .-Color[class*=-BGC90] { + background-color: #870087 +} + +div.highlight .-Color[class*=-C91] { + color: #8700AF +} + +div.highlight .-Color[class*=-BGC91] { + background-color: #8700AF +} + +div.highlight .-Color[class*=-C92] { + color: #8700D7 +} + +div.highlight .-Color[class*=-BGC92] { + background-color: #8700D7 +} + +div.highlight .-Color[class*=-C93] { + color: #8700FF +} + +div.highlight .-Color[class*=-BGC93] { + background-color: #8700FF +} + +div.highlight .-Color[class*=-C94] { + color: #875F00 +} + +div.highlight .-Color[class*=-BGC94] { + background-color: #875F00 +} + +div.highlight .-Color[class*=-C95] { + color: #875F5F +} + +div.highlight .-Color[class*=-BGC95] { + background-color: #875F5F +} + +div.highlight .-Color[class*=-C96] { + color: #875F87 +} + +div.highlight .-Color[class*=-BGC96] { + background-color: #875F87 +} + +div.highlight .-Color[class*=-C97] { + color: #875FAF +} + +div.highlight .-Color[class*=-BGC97] { + background-color: #875FAF +} + +div.highlight .-Color[class*=-C98] { + color: #875FD7 +} + +div.highlight .-Color[class*=-BGC98] { + background-color: #875FD7 +} + +div.highlight .-Color[class*=-C99] { + color: #875FFF +} + +div.highlight .-Color[class*=-BGC99] { + background-color: #875FFF +} + +div.highlight .-Color[class*=-C100] { + color: #878700 +} + +div.highlight .-Color[class*=-BGC100] { + background-color: #878700 +} + +div.highlight .-Color[class*=-C101] { + color: #87875F +} + +div.highlight .-Color[class*=-BGC101] { + background-color: #87875F +} + +div.highlight .-Color[class*=-C102] { + color: #878787 +} + +div.highlight .-Color[class*=-BGC102] { + background-color: #878787 +} + +div.highlight .-Color[class*=-C103] { + color: #8787AF +} + +div.highlight .-Color[class*=-BGC103] { + background-color: #8787AF +} + +div.highlight .-Color[class*=-C104] { + color: #8787D7 +} + +div.highlight .-Color[class*=-BGC104] { + background-color: #8787D7 +} + +div.highlight .-Color[class*=-C105] { + color: #8787FF +} + +div.highlight .-Color[class*=-BGC105] { + background-color: #8787FF +} + +div.highlight .-Color[class*=-C106] { + color: #87AF00 +} + +div.highlight .-Color[class*=-BGC106] { + background-color: #87AF00 +} + +div.highlight .-Color[class*=-C107] { + color: #87AF5F +} + +div.highlight .-Color[class*=-BGC107] { + background-color: #87AF5F +} + +div.highlight .-Color[class*=-C108] { + color: #87AF87 +} + +div.highlight .-Color[class*=-BGC108] { + background-color: #87AF87 +} + +div.highlight .-Color[class*=-C109] { + color: #87AFAF +} + +div.highlight .-Color[class*=-BGC109] { + background-color: #87AFAF +} + +div.highlight .-Color[class*=-C110] { + color: #87AFD7 +} + +div.highlight .-Color[class*=-BGC110] { + background-color: #87AFD7 +} + +div.highlight .-Color[class*=-C111] { + color: #87AFFF +} + +div.highlight .-Color[class*=-BGC111] { + background-color: #87AFFF +} + +div.highlight .-Color[class*=-C112] { + color: #87D700 +} + +div.highlight .-Color[class*=-BGC112] { + background-color: #87D700 +} + +div.highlight .-Color[class*=-C113] { + color: #87D75F +} + +div.highlight .-Color[class*=-BGC113] { + background-color: #87D75F +} + +div.highlight .-Color[class*=-C114] { + color: #87D787 +} + +div.highlight .-Color[class*=-BGC114] { + background-color: #87D787 +} + +div.highlight .-Color[class*=-C115] { + color: #87D7AF +} + +div.highlight .-Color[class*=-BGC115] { + background-color: #87D7AF +} + +div.highlight .-Color[class*=-C116] { + color: #87D7D7 +} + +div.highlight .-Color[class*=-BGC116] { + background-color: #87D7D7 +} + +div.highlight .-Color[class*=-C117] { + color: #87D7FF +} + +div.highlight .-Color[class*=-BGC117] { + background-color: #87D7FF +} + +div.highlight .-Color[class*=-C118] { + color: #87FF00 +} + +div.highlight .-Color[class*=-BGC118] { + background-color: #87FF00 +} + +div.highlight .-Color[class*=-C119] { + color: #87FF5F +} + +div.highlight .-Color[class*=-BGC119] { + background-color: #87FF5F +} + +div.highlight .-Color[class*=-C120] { + color: #87FF87 +} + +div.highlight .-Color[class*=-BGC120] { + background-color: #87FF87 +} + +div.highlight .-Color[class*=-C121] { + color: #87FFAF +} + +div.highlight .-Color[class*=-BGC121] { + background-color: #87FFAF +} + +div.highlight .-Color[class*=-C122] { + color: #87FFD7 +} + +div.highlight .-Color[class*=-BGC122] { + background-color: #87FFD7 +} + +div.highlight .-Color[class*=-C123] { + color: #87FFFF +} + +div.highlight .-Color[class*=-BGC123] { + background-color: #87FFFF +} + +div.highlight .-Color[class*=-C124] { + color: #AF0000 +} + +div.highlight .-Color[class*=-BGC124] { + background-color: #AF0000 +} + +div.highlight .-Color[class*=-C125] { + color: #AF005F +} + +div.highlight .-Color[class*=-BGC125] { + background-color: #AF005F +} + +div.highlight .-Color[class*=-C126] { + color: #AF0087 +} + +div.highlight .-Color[class*=-BGC126] { + background-color: #AF0087 +} + +div.highlight .-Color[class*=-C127] { + color: #AF00AF +} + +div.highlight .-Color[class*=-BGC127] { + background-color: #AF00AF +} + +div.highlight .-Color[class*=-C128] { + color: #AF00D7 +} + +div.highlight .-Color[class*=-BGC128] { + background-color: #AF00D7 +} + +div.highlight .-Color[class*=-C129] { + color: #AF00FF +} + +div.highlight .-Color[class*=-BGC129] { + background-color: #AF00FF +} + +div.highlight .-Color[class*=-C130] { + color: #AF5F00 +} + +div.highlight .-Color[class*=-BGC130] { + background-color: #AF5F00 +} + +div.highlight .-Color[class*=-C131] { + color: #AF5F5F +} + +div.highlight .-Color[class*=-BGC131] { + background-color: #AF5F5F +} + +div.highlight .-Color[class*=-C132] { + color: #AF5F87 +} + +div.highlight .-Color[class*=-BGC132] { + background-color: #AF5F87 +} + +div.highlight .-Color[class*=-C133] { + color: #AF5FAF +} + +div.highlight .-Color[class*=-BGC133] { + background-color: #AF5FAF +} + +div.highlight .-Color[class*=-C134] { + color: #AF5FD7 +} + +div.highlight .-Color[class*=-BGC134] { + background-color: #AF5FD7 +} + +div.highlight .-Color[class*=-C135] { + color: #AF5FFF +} + +div.highlight .-Color[class*=-BGC135] { + background-color: #AF5FFF +} + +div.highlight .-Color[class*=-C136] { + color: #AF8700 +} + +div.highlight .-Color[class*=-BGC136] { + background-color: #AF8700 +} + +div.highlight .-Color[class*=-C137] { + color: #AF875F +} + +div.highlight .-Color[class*=-BGC137] { + background-color: #AF875F +} + +div.highlight .-Color[class*=-C138] { + color: #AF8787 +} + +div.highlight .-Color[class*=-BGC138] { + background-color: #AF8787 +} + +div.highlight .-Color[class*=-C139] { + color: #AF87AF +} + +div.highlight .-Color[class*=-BGC139] { + background-color: #AF87AF +} + +div.highlight .-Color[class*=-C140] { + color: #AF87D7 +} + +div.highlight .-Color[class*=-BGC140] { + background-color: #AF87D7 +} + +div.highlight .-Color[class*=-C141] { + color: #AF87FF +} + +div.highlight .-Color[class*=-BGC141] { + background-color: #AF87FF +} + +div.highlight .-Color[class*=-C142] { + color: #AFAF00 +} + +div.highlight .-Color[class*=-BGC142] { + background-color: #AFAF00 +} + +div.highlight .-Color[class*=-C143] { + color: #AFAF5F +} + +div.highlight .-Color[class*=-BGC143] { + background-color: #AFAF5F +} + +div.highlight .-Color[class*=-C144] { + color: #AFAF87 +} + +div.highlight .-Color[class*=-BGC144] { + background-color: #AFAF87 +} + +div.highlight .-Color[class*=-C145] { + color: #AFAFAF +} + +div.highlight .-Color[class*=-BGC145] { + background-color: #AFAFAF +} + +div.highlight .-Color[class*=-C146] { + color: #AFAFD7 +} + +div.highlight .-Color[class*=-BGC146] { + background-color: #AFAFD7 +} + +div.highlight .-Color[class*=-C147] { + color: #AFAFFF +} + +div.highlight .-Color[class*=-BGC147] { + background-color: #AFAFFF +} + +div.highlight .-Color[class*=-C148] { + color: #AFD700 +} + +div.highlight .-Color[class*=-BGC148] { + background-color: #AFD700 +} + +div.highlight .-Color[class*=-C149] { + color: #AFD75F +} + +div.highlight .-Color[class*=-BGC149] { + background-color: #AFD75F +} + +div.highlight .-Color[class*=-C150] { + color: #AFD787 +} + +div.highlight .-Color[class*=-BGC150] { + background-color: #AFD787 +} + +div.highlight .-Color[class*=-C151] { + color: #AFD7AF +} + +div.highlight .-Color[class*=-BGC151] { + background-color: #AFD7AF +} + +div.highlight .-Color[class*=-C152] { + color: #AFD7D7 +} + +div.highlight .-Color[class*=-BGC152] { + background-color: #AFD7D7 +} + +div.highlight .-Color[class*=-C153] { + color: #AFD7FF +} + +div.highlight .-Color[class*=-BGC153] { + background-color: #AFD7FF +} + +div.highlight .-Color[class*=-C154] { + color: #AFFF00 +} + +div.highlight .-Color[class*=-BGC154] { + background-color: #AFFF00 +} + +div.highlight .-Color[class*=-C155] { + color: #AFFF5F +} + +div.highlight .-Color[class*=-BGC155] { + background-color: #AFFF5F +} + +div.highlight .-Color[class*=-C156] { + color: #AFFF87 +} + +div.highlight .-Color[class*=-BGC156] { + background-color: #AFFF87 +} + +div.highlight .-Color[class*=-C157] { + color: #AFFFAF +} + +div.highlight .-Color[class*=-BGC157] { + background-color: #AFFFAF +} + +div.highlight .-Color[class*=-C158] { + color: #AFFFD7 +} + +div.highlight .-Color[class*=-BGC158] { + background-color: #AFFFD7 +} + +div.highlight .-Color[class*=-C159] { + color: #AFFFFF +} + +div.highlight .-Color[class*=-BGC159] { + background-color: #AFFFFF +} + +div.highlight .-Color[class*=-C160] { + color: #D70000 +} + +div.highlight .-Color[class*=-BGC160] { + background-color: #D70000 +} + +div.highlight .-Color[class*=-C161] { + color: #D7005F +} + +div.highlight .-Color[class*=-BGC161] { + background-color: #D7005F +} + +div.highlight .-Color[class*=-C162] { + color: #D70087 +} + +div.highlight .-Color[class*=-BGC162] { + background-color: #D70087 +} + +div.highlight .-Color[class*=-C163] { + color: #D700AF +} + +div.highlight .-Color[class*=-BGC163] { + background-color: #D700AF +} + +div.highlight .-Color[class*=-C164] { + color: #D700D7 +} + +div.highlight .-Color[class*=-BGC164] { + background-color: #D700D7 +} + +div.highlight .-Color[class*=-C165] { + color: #D700FF +} + +div.highlight .-Color[class*=-BGC165] { + background-color: #D700FF +} + +div.highlight .-Color[class*=-C166] { + color: #D75F00 +} + +div.highlight .-Color[class*=-BGC166] { + background-color: #D75F00 +} + +div.highlight .-Color[class*=-C167] { + color: #D75F5F +} + +div.highlight .-Color[class*=-BGC167] { + background-color: #D75F5F +} + +div.highlight .-Color[class*=-C168] { + color: #D75F87 +} + +div.highlight .-Color[class*=-BGC168] { + background-color: #D75F87 +} + +div.highlight .-Color[class*=-C169] { + color: #D75FAF +} + +div.highlight .-Color[class*=-BGC169] { + background-color: #D75FAF +} + +div.highlight .-Color[class*=-C170] { + color: #D75FD7 +} + +div.highlight .-Color[class*=-BGC170] { + background-color: #D75FD7 +} + +div.highlight .-Color[class*=-C171] { + color: #D75FFF +} + +div.highlight .-Color[class*=-BGC171] { + background-color: #D75FFF +} + +div.highlight .-Color[class*=-C172] { + color: #D78700 +} + +div.highlight .-Color[class*=-BGC172] { + background-color: #D78700 +} + +div.highlight .-Color[class*=-C173] { + color: #D7875F +} + +div.highlight .-Color[class*=-BGC173] { + background-color: #D7875F +} + +div.highlight .-Color[class*=-C174] { + color: #D78787 +} + +div.highlight .-Color[class*=-BGC174] { + background-color: #D78787 +} + +div.highlight .-Color[class*=-C175] { + color: #D787AF +} + +div.highlight .-Color[class*=-BGC175] { + background-color: #D787AF +} + +div.highlight .-Color[class*=-C176] { + color: #D787D7 +} + +div.highlight .-Color[class*=-BGC176] { + background-color: #D787D7 +} + +div.highlight .-Color[class*=-C177] { + color: #D787FF +} + +div.highlight .-Color[class*=-BGC177] { + background-color: #D787FF +} + +div.highlight .-Color[class*=-C178] { + color: #D7AF00 +} + +div.highlight .-Color[class*=-BGC178] { + background-color: #D7AF00 +} + +div.highlight .-Color[class*=-C179] { + color: #D7AF5F +} + +div.highlight .-Color[class*=-BGC179] { + background-color: #D7AF5F +} + +div.highlight .-Color[class*=-C180] { + color: #D7AF87 +} + +div.highlight .-Color[class*=-BGC180] { + background-color: #D7AF87 +} + +div.highlight .-Color[class*=-C181] { + color: #D7AFAF +} + +div.highlight .-Color[class*=-BGC181] { + background-color: #D7AFAF +} + +div.highlight .-Color[class*=-C182] { + color: #D7AFD7 +} + +div.highlight .-Color[class*=-BGC182] { + background-color: #D7AFD7 +} + +div.highlight .-Color[class*=-C183] { + color: #D7AFFF +} + +div.highlight .-Color[class*=-BGC183] { + background-color: #D7AFFF +} + +div.highlight .-Color[class*=-C184] { + color: #D7D700 +} + +div.highlight .-Color[class*=-BGC184] { + background-color: #D7D700 +} + +div.highlight .-Color[class*=-C185] { + color: #D7D75F +} + +div.highlight .-Color[class*=-BGC185] { + background-color: #D7D75F +} + +div.highlight .-Color[class*=-C186] { + color: #D7D787 +} + +div.highlight .-Color[class*=-BGC186] { + background-color: #D7D787 +} + +div.highlight .-Color[class*=-C187] { + color: #D7D7AF +} + +div.highlight .-Color[class*=-BGC187] { + background-color: #D7D7AF +} + +div.highlight .-Color[class*=-C188] { + color: #D7D7D7 +} + +div.highlight .-Color[class*=-BGC188] { + background-color: #D7D7D7 +} + +div.highlight .-Color[class*=-C189] { + color: #D7D7FF +} + +div.highlight .-Color[class*=-BGC189] { + background-color: #D7D7FF +} + +div.highlight .-Color[class*=-C190] { + color: #D7FF00 +} + +div.highlight .-Color[class*=-BGC190] { + background-color: #D7FF00 +} + +div.highlight .-Color[class*=-C191] { + color: #D7FF5F +} + +div.highlight .-Color[class*=-BGC191] { + background-color: #D7FF5F +} + +div.highlight .-Color[class*=-C192] { + color: #D7FF87 +} + +div.highlight .-Color[class*=-BGC192] { + background-color: #D7FF87 +} + +div.highlight .-Color[class*=-C193] { + color: #D7FFAF +} + +div.highlight .-Color[class*=-BGC193] { + background-color: #D7FFAF +} + +div.highlight .-Color[class*=-C194] { + color: #D7FFD7 +} + +div.highlight .-Color[class*=-BGC194] { + background-color: #D7FFD7 +} + +div.highlight .-Color[class*=-C195] { + color: #D7FFFF +} + +div.highlight .-Color[class*=-BGC195] { + background-color: #D7FFFF +} + +div.highlight .-Color[class*=-C196] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC196] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C197] { + color: #FF005F +} + +div.highlight .-Color[class*=-BGC197] { + background-color: #FF005F +} + +div.highlight .-Color[class*=-C198] { + color: #FF0087 +} + +div.highlight .-Color[class*=-BGC198] { + background-color: #FF0087 +} + +div.highlight .-Color[class*=-C199] { + color: #FF00AF +} + +div.highlight .-Color[class*=-BGC199] { + background-color: #FF00AF +} + +div.highlight .-Color[class*=-C200] { + color: #FF00D7 +} + +div.highlight .-Color[class*=-BGC200] { + background-color: #FF00D7 +} + +div.highlight .-Color[class*=-C201] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC201] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C202] { + color: #FF5F00 +} + +div.highlight .-Color[class*=-BGC202] { + background-color: #FF5F00 +} + +div.highlight .-Color[class*=-C203] { + color: #FF5F5F +} + +div.highlight .-Color[class*=-BGC203] { + background-color: #FF5F5F +} + +div.highlight .-Color[class*=-C204] { + color: #FF5F87 +} + +div.highlight .-Color[class*=-BGC204] { + background-color: #FF5F87 +} + +div.highlight .-Color[class*=-C205] { + color: #FF5FAF +} + +div.highlight .-Color[class*=-BGC205] { + background-color: #FF5FAF +} + +div.highlight .-Color[class*=-C206] { + color: #FF5FD7 +} + +div.highlight .-Color[class*=-BGC206] { + background-color: #FF5FD7 +} + +div.highlight .-Color[class*=-C207] { + color: #FF5FFF +} + +div.highlight .-Color[class*=-BGC207] { + background-color: #FF5FFF +} + +div.highlight .-Color[class*=-C208] { + color: #FF8700 +} + +div.highlight .-Color[class*=-BGC208] { + background-color: #FF8700 +} + +div.highlight .-Color[class*=-C209] { + color: #FF875F +} + +div.highlight .-Color[class*=-BGC209] { + background-color: #FF875F +} + +div.highlight .-Color[class*=-C210] { + color: #FF8787 +} + +div.highlight .-Color[class*=-BGC210] { + background-color: #FF8787 +} + +div.highlight .-Color[class*=-C211] { + color: #FF87AF +} + +div.highlight .-Color[class*=-BGC211] { + background-color: #FF87AF +} + +div.highlight .-Color[class*=-C212] { + color: #FF87D7 +} + +div.highlight .-Color[class*=-BGC212] { + background-color: #FF87D7 +} + +div.highlight .-Color[class*=-C213] { + color: #FF87FF +} + +div.highlight .-Color[class*=-BGC213] { + background-color: #FF87FF +} + +div.highlight .-Color[class*=-C214] { + color: #FFAF00 +} + +div.highlight .-Color[class*=-BGC214] { + background-color: #FFAF00 +} + +div.highlight .-Color[class*=-C215] { + color: #FFAF5F +} + +div.highlight .-Color[class*=-BGC215] { + background-color: #FFAF5F +} + +div.highlight .-Color[class*=-C216] { + color: #FFAF87 +} + +div.highlight .-Color[class*=-BGC216] { + background-color: #FFAF87 +} + +div.highlight .-Color[class*=-C217] { + color: #FFAFAF +} + +div.highlight .-Color[class*=-BGC217] { + background-color: #FFAFAF +} + +div.highlight .-Color[class*=-C218] { + color: #FFAFD7 +} + +div.highlight .-Color[class*=-BGC218] { + background-color: #FFAFD7 +} + +div.highlight .-Color[class*=-C219] { + color: #FFAFFF +} + +div.highlight .-Color[class*=-BGC219] { + background-color: #FFAFFF +} + +div.highlight .-Color[class*=-C220] { + color: #FFD700 +} + +div.highlight .-Color[class*=-BGC220] { + background-color: #FFD700 +} + +div.highlight .-Color[class*=-C221] { + color: #FFD75F +} + +div.highlight .-Color[class*=-BGC221] { + background-color: #FFD75F +} + +div.highlight .-Color[class*=-C222] { + color: #FFD787 +} + +div.highlight .-Color[class*=-BGC222] { + background-color: #FFD787 +} + +div.highlight .-Color[class*=-C223] { + color: #FFD7AF +} + +div.highlight .-Color[class*=-BGC223] { + background-color: #FFD7AF +} + +div.highlight .-Color[class*=-C224] { + color: #FFD7D7 +} + +div.highlight .-Color[class*=-BGC224] { + background-color: #FFD7D7 +} + +div.highlight .-Color[class*=-C225] { + color: #FFD7FF +} + +div.highlight .-Color[class*=-BGC225] { + background-color: #FFD7FF +} + +div.highlight .-Color[class*=-C226] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC226] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C227] { + color: #FFFF5F +} + +div.highlight .-Color[class*=-BGC227] { + background-color: #FFFF5F +} + +div.highlight .-Color[class*=-C228] { + color: #FFFF87 +} + +div.highlight .-Color[class*=-BGC228] { + background-color: #FFFF87 +} + +div.highlight .-Color[class*=-C229] { + color: #FFFFAF +} + +div.highlight .-Color[class*=-BGC229] { + background-color: #FFFFAF +} + +div.highlight .-Color[class*=-C230] { + color: #FFFFD7 +} + +div.highlight .-Color[class*=-BGC230] { + background-color: #FFFFD7 +} + +div.highlight .-Color[class*=-C231] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC231] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C232] { + color: #080808 +} + +div.highlight .-Color[class*=-BGC232] { + background-color: #080808 +} + +div.highlight .-Color[class*=-C233] { + color: #121212 +} + +div.highlight .-Color[class*=-BGC233] { + background-color: #121212 +} + +div.highlight .-Color[class*=-C234] { + color: #1C1C1C +} + +div.highlight .-Color[class*=-BGC234] { + background-color: #1C1C1C +} + +div.highlight .-Color[class*=-C235] { + color: #262626 +} + +div.highlight .-Color[class*=-BGC235] { + background-color: #262626 +} + +div.highlight .-Color[class*=-C236] { + color: #303030 +} + +div.highlight .-Color[class*=-BGC236] { + background-color: #303030 +} + +div.highlight .-Color[class*=-C237] { + color: #3A3A3A +} + +div.highlight .-Color[class*=-BGC237] { + background-color: #3A3A3A +} + +div.highlight .-Color[class*=-C238] { + color: #444444 +} + +div.highlight .-Color[class*=-BGC238] { + background-color: #444444 +} + +div.highlight .-Color[class*=-C239] { + color: #4E4E4E +} + +div.highlight .-Color[class*=-BGC239] { + background-color: #4E4E4E +} + +div.highlight .-Color[class*=-C240] { + color: #585858 +} + +div.highlight .-Color[class*=-BGC240] { + background-color: #585858 +} + +div.highlight .-Color[class*=-C241] { + color: #626262 +} + +div.highlight .-Color[class*=-BGC241] { + background-color: #626262 +} + +div.highlight .-Color[class*=-C242] { + color: #6C6C6C +} + +div.highlight .-Color[class*=-BGC242] { + background-color: #6C6C6C +} + +div.highlight .-Color[class*=-C243] { + color: #767676 +} + +div.highlight .-Color[class*=-BGC243] { + background-color: #767676 +} + +div.highlight .-Color[class*=-C244] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC244] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C245] { + color: #8A8A8A +} + +div.highlight .-Color[class*=-BGC245] { + background-color: #8A8A8A +} + +div.highlight .-Color[class*=-C246] { + color: #949494 +} + +div.highlight .-Color[class*=-BGC246] { + background-color: #949494 +} + +div.highlight .-Color[class*=-C247] { + color: #9E9E9E +} + +div.highlight .-Color[class*=-BGC247] { + background-color: #9E9E9E +} + +div.highlight .-Color[class*=-C248] { + color: #A8A8A8 +} + +div.highlight .-Color[class*=-BGC248] { + background-color: #A8A8A8 +} + +div.highlight .-Color[class*=-C249] { + color: #B2B2B2 +} + +div.highlight .-Color[class*=-BGC249] { + background-color: #B2B2B2 +} + +div.highlight .-Color[class*=-C250] { + color: #BCBCBC +} + +div.highlight .-Color[class*=-BGC250] { + background-color: #BCBCBC +} + +div.highlight .-Color[class*=-C251] { + color: #C6C6C6 +} + +div.highlight .-Color[class*=-BGC251] { + background-color: #C6C6C6 +} + +div.highlight .-Color[class*=-C252] { + color: #D0D0D0 +} + +div.highlight .-Color[class*=-BGC252] { + background-color: #D0D0D0 +} + +div.highlight .-Color[class*=-C253] { + color: #DADADA +} + +div.highlight .-Color[class*=-BGC253] { + background-color: #DADADA +} + +div.highlight .-Color[class*=-C254] { + color: #E4E4E4 +} + +div.highlight .-Color[class*=-BGC254] { + background-color: #E4E4E4 +} + +div.highlight .-Color[class*=-C255] { + color: #EEEEEE +} + +div.highlight .-Color[class*=-BGC255] { + background-color: #EEEEEE +} diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000..7107cec Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..012e6a0 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #fae4c2 } +html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } +html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #a12236 } /* Error */ +html[data-theme="light"] .highlight .k { color: #6730c5 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #7f4707 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ +html[data-theme="light"] .highlight .o { color: #00622f } /* Operator */ +html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #005b82 } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #005b82 } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #005b82 } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #6730c5 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #6730c5 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #6730c5 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #6730c5 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #6730c5 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #7f4707 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #7f4707 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #7f4707 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #00622f } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #7f4707 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #005b82 } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #005b82 } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #7f4707 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #00622f } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #6730c5 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #005b82 } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #7f4707 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #005b82 } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #005b82 } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #a12236 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #6730c5 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #7f4707 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #7f4707 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #7f4707 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #7f4707 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #7f4707 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #00622f } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #00622f } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #00622f } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #00622f } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #00622f } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #00622f } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #00622f } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #00622f } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #00622f } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #00622f } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #a12236 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #00622f } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #005b82 } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #7f4707 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #005b82 } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #a12236 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #a12236 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #a12236 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #7f4707 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #7f4707 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } +html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ +html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/sbt-webpack-macros.html b/_static/sbt-webpack-macros.html new file mode 100644 index 0000000..6cbf559 --- /dev/null +++ b/_static/sbt-webpack-macros.html @@ -0,0 +1,11 @@ + +{% macro head_pre_bootstrap() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} diff --git a/_static/scripts/bootstrap.js b/_static/scripts/bootstrap.js new file mode 100644 index 0000000..c8178de --- /dev/null +++ b/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>li,Collapse:()=>Ei,Dropdown:()=>Ki,Modal:()=>Ln,Offcanvas:()=>Kn,Popover:()=>bs,ScrollSpy:()=>Ls,Tab:()=>Js,Toast:()=>po,Tooltip:()=>fs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];S(s)&&x(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function B(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=X(T,O,C),k=f;i.modifiersData[a]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:I(e.placement),variation:Z(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var nt={passive:!0};const st={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function vt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=Ft(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ye=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>Mt(t))).join(","):null},we={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Fe=".bs.carousel",He=".data-api",Be="ArrowLeft",We="ArrowRight",ze="next",Re="prev",qe="left",Ve="right",Ye=`slide${Fe}`,Ke=`slid${Fe}`,Qe=`keydown${Fe}`,Xe=`mouseenter${Fe}`,Ue=`mouseleave${Fe}`,Ge=`dragstart${Fe}`,Je=`load${Fe}${He}`,Ze=`click${Fe}${He}`,ti="carousel",ei="active",ii=".active",ni=".carousel-item",si=ii+ni,oi={[Be]:Ve,[We]:qe},ri={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ai={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class li extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===ti&&this.cycle()}static get Default(){return ri}static get DefaultType(){return ai}static get NAME(){return"carousel"}next(){this._slide(ze)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(Re)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ke,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ke,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ze:Re;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&fe.on(this._element,Qe,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Xe,(()=>this.pause())),fe.on(this._element,Ue,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Ge,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(qe)),rightCallback:()=>this._slide(this._directionToOrder(Ve)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=oi[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=we.findOne(ii,this._indicatorsElement);e.classList.remove(ei),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(ei),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ze,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Ye).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(ei),i.classList.remove(ei,c,l),this._isSliding=!1,r(Ke)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(si,this._element)}_getItems(){return we.find(ni,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===qe?Re:ze:t===qe?ze:Re}_orderToDirection(t){return Kt()?t===Re?qe:Ve:t===Re?Ve:qe}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}fe.on(document,Ze,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(ti))return;t.preventDefault();const i=li.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Je,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)li.getOrCreateInstance(e)})),Qt(li);const ci=".bs.collapse",hi=`show${ci}`,di=`shown${ci}`,ui=`hide${ci}`,fi=`hidden${ci}`,pi=`click${ci}.data-api`,mi="show",gi="collapse",_i="collapsing",bi=`:scope .${gi} .${gi}`,vi='[data-bs-toggle="collapse"]',yi={parent:null,toggle:!0},wi={parent:"(null|element)",toggle:"boolean"};class Ei extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(vi);for(const t of i){const e=we.getSelectorFromElement(t),i=we.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return yi}static get DefaultType(){return wi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Ei.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,hi).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(gi),this._element.classList.add(_i),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi,mi),this._element.style[e]="",fe.trigger(this._element,di)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,ui).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(_i),this._element.classList.remove(gi,mi);for(const t of this._triggerArray){const e=we.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi),fe.trigger(this._element,fi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(mi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(vi);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(bi,this._config.parent);return we.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Ei.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,pi,vi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))Ei.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(Ei);const Ai="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",Mi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ji=`${Mi}.${Pi}`,Fi=".dropdown-menu",Hi=Kt()?"top-end":"top-start",Bi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",zi=Kt()?"bottom-start":"bottom-end",Ri=Kt()?"left-start":"right-start",qi=Kt()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Yi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Ki extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Fi)[0]||we.prev(this._element,Fi)[0]||we.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Yi}static get NAME(){return Ai}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),fe.trigger(this._element,Di,t)}}hide(){if(Wt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!fe.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ai.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Bi:Hi:e?zi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ki.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=we.find(ji);for(const i of e){const e=Ki.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Mi)?this:we.prev(this,Mi)[0]||we.next(this,Mi)[0]||we.findOne(Mi,t.delegateTarget.parentNode),o=Ki.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Ii,Mi,Ki.dataApiKeydownHandler),fe.on(document,Ii,Fi,Ki.dataApiKeydownHandler),fe.on(document,$i,Ki.clearMenus),fe.on(document,Ni,Ki.clearMenus),fe.on(document,$i,Mi,(function(t){t.preventDefault(),Ki.getOrCreateInstance(this).toggle()})),Qt(Ki);const Qi="backdrop",Xi="show",Ui=`mousedown.bs.${Qi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Qi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Xi),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Xi),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Ui,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,tn),fe.on(document,en,(t=>this._handleFocusin(t))),fe.on(document,nn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,(e=>e+t)),this._setElementAttributes(ln,hn,(e=>e+t)),this._setElementAttributes(cn,dn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,En=`keydown.dismiss${fn}`,An=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,fn),fe.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(Cn),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,bn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,En,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,vn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,wn,(t=>{fe.one(this._element,yn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,gn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback((()=>{this._element.classList.remove(On),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,An,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,_n,(t=>{t.defaultPrevented||fe.one(e,gn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)})),Ee(Ln),Qt(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",Mn=".offcanvas.show",jn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Bn=`hidePrevented${Sn}`,Wn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Yn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Kn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Yn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,jn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),fe.trigger(this._element,Fn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),fe.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Bn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){fe.on(this._element,qn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Bn))}))}static jQueryInterface(t){return this.each((function(){const e=Kn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}fe.on(document,Rn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Wn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Mn);i&&i!==e&&Kn.getInstance(i).hide(),Kn.getOrCreateInstance(e).toggle(this)})),fe.on(window,$n,(()=>{for(const t of we.find(Mn))Kn.getOrCreateInstance(t).show()})),fe.on(window,zn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Kn.getOrCreateInstance(t).hide()})),Ee(Kn),Qt(Kn);const Qn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Xn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Jn={allowList:Qn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ds={allowList:Qn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},us={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class fs extends ve{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return ds}static get DefaultType(){return us}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),fe.off(this._element.closest(rs),as,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=hs[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Xt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=_e.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".popover-header",ms=".popover-body",gs={...fs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},_s={...fs.DefaultType,content:"(null|string|element|function)"};class bs extends fs{static get Default(){return gs}static get DefaultType(){return _s}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ps]:this._getTitle(),[ms]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=bs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(bs);const vs=".bs.scrollspy",ys=`activate${vs}`,ws=`click${vs}`,Es=`load${vs}.data-api`,As="active",Ts="[href]",Cs=".nav-link",Os=`${Cs}, .nav-item > ${Cs}, .list-group-item`,xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ks={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ls extends ve{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return xs}static get DefaultType(){return ks}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(fe.off(this._config.target,ws),fe.on(this._config.target,ws,Ts,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=we.find(Ts,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(As),this._activateParents(t),fe.trigger(this._element,ys,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(As);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,Os))t.classList.add(As)}_clearActiveClass(t){t.classList.remove(As);const e=we.find(`${Ts}.${As}`,t);for(const t of e)t.classList.remove(As)}static jQueryInterface(t){return this.each((function(){const e=Ls.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(window,Es,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ls.getOrCreateInstance(t)})),Qt(Ls);const Ss=".bs.tab",Ds=`hide${Ss}`,$s=`hidden${Ss}`,Is=`show${Ss}`,Ns=`shown${Ss}`,Ps=`click${Ss}`,Ms=`keydown${Ss}`,js=`load${Ss}`,Fs="ArrowLeft",Hs="ArrowRight",Bs="ArrowUp",Ws="ArrowDown",zs="Home",Rs="End",qs="active",Vs="fade",Ys="show",Ks=".dropdown-toggle",Qs=`:not(${Ks})`,Xs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Us=`.nav-link${Qs}, .list-group-item${Qs}, [role="tab"]${Qs}, ${Xs}`,Gs=`.${qs}[data-bs-toggle="tab"], .${qs}[data-bs-toggle="pill"], .${qs}[data-bs-toggle="list"]`;class Js extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ms,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?fe.trigger(e,Ds,{relatedTarget:t}):null;fe.trigger(t,Is,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(qs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ns,{relatedTarget:e})):t.classList.add(Ys)}),t,t.classList.contains(Vs)))}_deactivate(t,e){t&&(t.classList.remove(qs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,$s,{relatedTarget:e})):t.classList.remove(Ys)}),t,t.classList.contains(Vs)))}_keydown(t){if(![Fs,Hs,Bs,Ws,zs,Rs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([zs,Rs].includes(t.key))i=e[t.key===zs?0:e.length-1];else{const n=[Hs,Ws].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Js.getOrCreateInstance(i).show())}_getChildren(){return we.find(Us,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=we.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ks,qs),n(".dropdown-menu",Ys),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(qs)}_getInnerElement(t){return t.matches(Us)?t:we.findOne(Us,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Js.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ps,Xs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Js.getOrCreateInstance(this).show()})),fe.on(window,js,(()=>{for(const t of we.find(Gs))Js.getOrCreateInstance(t)})),Qt(Js);const Zs=".bs.toast",to=`mouseover${Zs}`,eo=`mouseout${Zs}`,io=`focusin${Zs}`,no=`focusout${Zs}`,so=`hide${Zs}`,oo=`hidden${Zs}`,ro=`show${Zs}`,ao=`shown${Zs}`,lo="hide",co="show",ho="showing",uo={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class po extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return uo}static get NAME(){return"toast"}show(){fe.trigger(this._element,ro).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(lo),qt(this._element),this._element.classList.add(co,ho),this._queueCallback((()=>{this._element.classList.remove(ho),fe.trigger(this._element,ao),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,so).defaultPrevented||(this._element.classList.add(ho),this._queueCallback((()=>{this._element.classList.add(lo),this._element.classList.remove(ho,co),fe.trigger(this._element,oo)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(co),super.dispose()}isShown(){return this._element.classList.contains(co)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){fe.on(this._element,to,(t=>this._onInteraction(t,!0))),fe.on(this._element,eo,(t=>this._onInteraction(t,!1))),fe.on(this._element,io,(t=>this._onInteraction(t,!0))),fe.on(this._element,no,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=po.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function mo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(po),Qt(po),mo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new fs(t,{delay:{show:500,hide:100}})}))})),mo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),mo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))})),window.bootstrap=i})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/_static/scripts/bootstrap.js.LICENSE.txt b/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 0000000..28755c2 --- /dev/null +++ b/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/_static/scripts/bootstrap.js.map b/_static/scripts/bootstrap.js.map new file mode 100644 index 0000000..4a3502a --- /dev/null +++ b/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both