From 644b624d2d73a9fedae23124224009f6e38ca575 Mon Sep 17 00:00:00 2001 From: Sok Ponlork Date: Thu, 29 Jan 2026 14:31:48 +0700 Subject: [PATCH] DSP Project first push, date: 29/01/2026 --- .DS_Store | Bin 0 -> 14340 bytes .RData | Bin 0 -> 49 bytes .Rhistory | 3 + .dockerignore | 8 + .env | 21 + .htaccess | 8 + Dockerfile | 43 + admin/app_log.php | 119 + admin/dashboard.php | 171 + admin/manage_aboutus.php | 216 ++ admin/manage_announcements.php | 260 ++ admin/manage_classifications.php | 269 ++ admin/manage_contactus.php | 213 ++ admin/manage_datasources.php | 195 ++ admin/manage_faq.php | 218 ++ admin/manage_permissions_admin.php | 310 ++ admin/manage_slides.php | 258 ++ admin/manage_users.php | 782 +++++ admin/r_in_jupyter.php | 162 + api/run_r_script.php | 203 ++ assets/.DS_Store | Bin 0 -> 6148 bytes assets/diagrams/data_ecosystem.mmd | 54 + assets/images/niph_dsp_data_ecosystem.png | Bin 0 -> 554328 bytes assets/images/niphlogo.ico | Bin 0 -> 270398 bytes assets/images/niphlogo.png | Bin 0 -> 138218 bytes browse_datasources.php | 247 ++ classes/Aboutus.php | 127 + classes/Announcement.php | 213 ++ classes/Classifications.php | 293 ++ classes/Contactus.php | 172 + classes/DataSource.php | 1489 +++++++++ classes/Faq.php | 138 + classes/OAuth.php | 257 ++ classes/Permission.php | 144 + classes/PermissionManager.php | 45 + classes/Slide.php | 188 ++ classes/User.php | 386 +++ composer.json | 25 + composer.lock | 1688 ++++++++++ config.php | 35 + data_hybrid/browse_datasources.php | 341 ++ data_hybrid/dashboard.php | 213 ++ data_hybrid/download.php | 111 + data_hybrid/manage_my_datasources.php | 537 +++ data_hybrid/manage_permissions.php | 252 ++ data_hybrid/my_downloads.php | 134 + data_hybrid/my_permissions.php | 140 + data_hybrid/r_in_jupyter.php | 162 + data_owner/dashboard.php | 214 ++ data_owner/manage_my_datasources.php | 542 +++ data_owner/manage_permissions.php | 252 ++ data_owner/my_analytics.php | 140 + data_owner/run_r_scripts.php | 166 + data_user/browse_datasources.php | 341 ++ data_user/dashboard.php | 166 + data_user/download.php | 109 + data_user/indexTesting.php | 58 + data_user/my_downloads.php | 134 + data_user/my_permissions.php | 150 + data_user/process_request_permission.php | 147 + data_user/r_in_jupyter.php | 161 + db/migrations/20241103_oauth_tables.sql | 83 + .../20250114_add_permission_proof_path.sql | 2 + db/niph_dsps.sql | 782 +++++ docker-compose.yml | 78 + docker/app-entrypoint.sh | 12 + docker/custom.ini | 2 + docker/jupyter/jupyter_server_config.py | 45 + docker/jupyterhub/Dockerfile | 9 + docker/jupyterhub/jupyterhub_config.py | 144 + includes/auth.php | 88 + includes/footer_admin.php | 8 + includes/footer_contributor.php | 8 + includes/footer_owner.php | 8 + includes/footer_public.php | 67 + includes/footer_user.php | 8 + includes/header_admin.php | 163 + includes/header_contributor.php | 150 + includes/header_owner.php | 150 + includes/header_public.php | 107 + includes/header_user.php | 149 + includes/jupyter_config_reference.php | 63 + includes/jupyter_helpers.php | 203 ++ includes/nav_admin.php | 119 + includes/nav_contributor.php | 109 + includes/nav_owner.php | 108 + includes/nav_public.php | 85 + includes/nav_user.php | 108 + index.php | 562 ++++ install_config.php | 467 +++ logout.php | 25 + logs/.gitkeep | 1 + logs/app.log | 282 ++ nginx.conf | 64 + note.md | 1 + oauth/authorize.php | 110 + oauth/token.php | 125 + oauth/userinfo.php | 86 + phpunit.xml.dist | 18 + process_contact.php | 43 + process_login.php | 76 + process_register.php | 82 + profile.php | 240 ++ .../data_summary-checkpoint.R | 18 + r_scripts/category_frequency.R | 79 + r_scripts/data_summary.R | 18 + r_scripts/descriptive_stats.R | 83 + scripts/seed_jupyterhub_client.php | 59 + scripts/trigger_workspace_sync.php | 88 + tests/Helpers/JupyterHelpersTest.php | 38 + tests/bootstrap.php | 22 + uploads/.DS_Store | Bin 0 -> 8196 bytes uploads/announcements/.gitkeep | 0 .../announcement_69134047cbce0.png | Bin 0 -> 445574 bytes .../announcement_6914b1463821d.png | Bin 0 -> 714024 bytes .../announcement_6914b29f6aeac.png | Bin 0 -> 778564 bytes .../niph_dsp_data_ecosystem.png | Bin 0 -> 554328 bytes uploads/datasources/.gitkeep | 0 .../datasources/datasource_68eef48bbe249.pdf | Bin 0 -> 1114031 bytes .../datasources/datasource_69031cab35897.csv | 1001 ++++++ .../datasources/datasource_6913347f4448d.pdf | Bin 0 -> 420855 bytes .../datasources/datasource_6914abacc0d2d.pdf | Bin 0 -> 496249 bytes .../datasources/datasource_6914abacc1819.pdf | Bin 0 -> 496249 bytes .../datasources/datasource_6914abacc20c2.pdf | Bin 0 -> 130987 bytes .../datasources/datasource_6914acd4457ed.pdf | Bin 0 -> 1052438 bytes .../datasources/datasource_6914acd4469c3.pdf | Bin 0 -> 1052438 bytes .../datasources/datasource_6914acd447794.pdf | Bin 0 -> 140763 bytes .../datasource_69368a828843c_individual.dta | Bin 0 -> 5464990 bytes .../datasource_6936917a7503c_household.dta | Bin 0 -> 4207218 bytes ...asource_69369f61b1b4d_household-wide-3.dta | Bin 0 -> 4031848 bytes ...ealth-lifestyle-and-care-seeking-datas.dta | Bin 0 -> 5464990 bytes ...datasource_69427e9be4fe3_questionnaire.pdf | Bin 0 -> 366062 bytes uploads/jupyter_workspace/.gitignore | 3 + uploads/jupyter_workspace/.htaccess | 7 + .../111_2b244e290a8ec4dd.pdf | Bin 0 -> 88304 bytes .../111_4ad1f733bf0af41f.pdf | Bin 0 -> 88304 bytes .../112_1cef429f1cfbdb18.pdf | Bin 0 -> 84571 bytes .../112_512d70a7d311c167.pdf | Bin 0 -> 1084310 bytes .../112_614088e027f0a120.pdf | Bin 0 -> 84571 bytes .../112_6514768a50170927.pdf | Bin 0 -> 1084310 bytes .../112_c0168e06927f56d2.pdf | Bin 0 -> 84571 bytes .../112_d7472874e6a14767.pdf | Bin 0 -> 1084310 bytes .../113_3cb551f388e44388.pdf | Bin 0 -> 307963 bytes .../113_83cb17260b3b684e.pdf | Bin 0 -> 307963 bytes .../113_fb5b39c491bf59f2.pdf | Bin 0 -> 307963 bytes .../114_a3aca9fce7e79ad0.pdf | Bin 0 -> 84571 bytes .../114_ebba3b0b3f0eda6f.pdf | Bin 0 -> 84571 bytes .../115_40a1f6d150fefbdc.pdf | Bin 0 -> 1084310 bytes .../116_9309c1f48740b5ea.pdf | Bin 0 -> 420855 bytes .../117_bdf6dffc75b365dd.pdf | Bin 0 -> 84571 bytes .../122_6608c4133a837b01.pdf | Bin 0 -> 105126 bytes .../122_8bd46bc453d755ed.pdf | Bin 0 -> 105126 bytes .../122_ba6ed4e43df5bdf3.pdf | Bin 0 -> 105126 bytes .../122_e4a1393aaa5bf8d3.pdf | Bin 0 -> 105126 bytes .../permission_proofs/2_09fd4e13e8321d91.pdf | Bin 0 -> 596460 bytes .../permission_proofs/2_1a75981da8e5f636.pdf | Bin 0 -> 163070 bytes .../permission_proofs/2_1d9f0eb42a4b3c7a.pdf | Bin 0 -> 596460 bytes .../permission_proofs/2_66ca7e3b59134941.pdf | Bin 0 -> 88304 bytes .../permission_proofs/2_80c4dd7ee257b1cf.pdf | Bin 0 -> 163070 bytes .../permission_proofs/2_8651d2182ab05914.pdf | Bin 0 -> 443893 bytes .../permission_proofs/2_9d96d3bcd4a2ec74.pdf | Bin 0 -> 596460 bytes .../permission_proofs/3_21d0fe450b003394.pdf | Bin 0 -> 307963 bytes .../permission_proofs/3_403222c3bba8372c.pdf | 143 + .../permission_proofs/3_9dae3103f90ba5db.pdf | 143 + uploads/policy/policy.pdf | Bin 0 -> 359757 bytes uploads/slides/.DS_Store | Bin 0 -> 6148 bytes uploads/slides/.gitkeep | 0 uploads/slides/slide_689aae8993e8c.jpg | Bin 0 -> 172772 bytes uploads/slides/slide_68f5da6a43a8a.jpg | Bin 0 -> 62588 bytes uploads/slides/slide_68f5da6a43a8d.jpg | Bin 0 -> 7384506 bytes uploads/slides/slide_6904393484fbf.jpg | Bin 0 -> 172772 bytes uploads/slides/slide_69043941bc921.jpg | Bin 0 -> 62588 bytes uploads/slides/slide_6904394af324f.jpg | Bin 0 -> 172772 bytes user_guide.php | 352 ++ vendor/autoload.php | 25 + vendor/bin/php-parse | 119 + vendor/bin/phpunit | 122 + vendor/composer/ClassLoader.php | 579 ++++ vendor/composer/InstalledVersions.php | 359 ++ vendor/composer/LICENSE | 19 + vendor/composer/autoload_classmap.php | 1196 +++++++ vendor/composer/autoload_files.php | 13 + vendor/composer/autoload_namespaces.php | 9 + vendor/composer/autoload_psr4.php | 11 + vendor/composer/autoload_real.php | 48 + vendor/composer/autoload_static.php | 1237 +++++++ vendor/composer/installed.json | 1780 ++++++++++ vendor/composer/installed.php | 257 ++ vendor/myclabs/deep-copy/LICENSE | 20 + vendor/myclabs/deep-copy/README.md | 406 +++ vendor/myclabs/deep-copy/composer.json | 43 + .../deep-copy/src/DeepCopy/DeepCopy.php | 328 ++ .../src/DeepCopy/Exception/CloneException.php | 9 + .../DeepCopy/Exception/PropertyException.php | 9 + .../src/DeepCopy/Filter/ChainableFilter.php | 24 + .../Doctrine/DoctrineCollectionFilter.php | 35 + .../DoctrineEmptyCollectionFilter.php | 30 + .../Filter/Doctrine/DoctrineProxyFilter.php | 22 + .../deep-copy/src/DeepCopy/Filter/Filter.php | 18 + .../src/DeepCopy/Filter/KeepFilter.php | 16 + .../src/DeepCopy/Filter/ReplaceFilter.php | 41 + .../src/DeepCopy/Filter/SetNullFilter.php | 26 + .../Matcher/Doctrine/DoctrineProxyMatcher.php | 22 + .../src/DeepCopy/Matcher/Matcher.php | 14 + .../src/DeepCopy/Matcher/PropertyMatcher.php | 39 + .../DeepCopy/Matcher/PropertyNameMatcher.php | 32 + .../DeepCopy/Matcher/PropertyTypeMatcher.php | 54 + .../DeepCopy/Reflection/ReflectionHelper.php | 78 + .../TypeFilter/Date/DateIntervalFilter.php | 33 + .../TypeFilter/Date/DatePeriodFilter.php | 42 + .../src/DeepCopy/TypeFilter/ReplaceFilter.php | 30 + .../DeepCopy/TypeFilter/ShallowCopyFilter.php | 17 + .../TypeFilter/Spl/ArrayObjectFilter.php | 36 + .../TypeFilter/Spl/SplDoublyLinkedList.php | 10 + .../Spl/SplDoublyLinkedListFilter.php | 51 + .../src/DeepCopy/TypeFilter/TypeFilter.php | 13 + .../src/DeepCopy/TypeMatcher/TypeMatcher.php | 29 + .../deep-copy/src/DeepCopy/deep_copy.php | 20 + vendor/nikic/php-parser/LICENSE | 29 + vendor/nikic/php-parser/README.md | 233 ++ vendor/nikic/php-parser/bin/php-parse | 206 ++ vendor/nikic/php-parser/composer.json | 43 + .../php-parser/lib/PhpParser/Builder.php | 12 + .../lib/PhpParser/Builder/ClassConst.php | 150 + .../lib/PhpParser/Builder/Class_.php | 151 + .../lib/PhpParser/Builder/Declaration.php | 50 + .../lib/PhpParser/Builder/EnumCase.php | 86 + .../lib/PhpParser/Builder/Enum_.php | 116 + .../lib/PhpParser/Builder/FunctionLike.php | 73 + .../lib/PhpParser/Builder/Function_.php | 67 + .../lib/PhpParser/Builder/Interface_.php | 94 + .../lib/PhpParser/Builder/Method.php | 147 + .../lib/PhpParser/Builder/Namespace_.php | 45 + .../lib/PhpParser/Builder/Param.php | 171 + .../lib/PhpParser/Builder/Property.php | 223 ++ .../lib/PhpParser/Builder/TraitUse.php | 65 + .../PhpParser/Builder/TraitUseAdaptation.php | 145 + .../lib/PhpParser/Builder/Trait_.php | 83 + .../php-parser/lib/PhpParser/Builder/Use_.php | 49 + .../lib/PhpParser/BuilderFactory.php | 375 +++ .../lib/PhpParser/BuilderHelpers.php | 338 ++ .../php-parser/lib/PhpParser/Comment.php | 209 ++ .../php-parser/lib/PhpParser/Comment/Doc.php | 6 + .../ConstExprEvaluationException.php | 6 + .../lib/PhpParser/ConstExprEvaluator.php | 237 ++ .../nikic/php-parser/lib/PhpParser/Error.php | 173 + .../php-parser/lib/PhpParser/ErrorHandler.php | 12 + .../lib/PhpParser/ErrorHandler/Collecting.php | 43 + .../lib/PhpParser/ErrorHandler/Throwing.php | 17 + .../lib/PhpParser/Internal/DiffElem.php | 31 + .../lib/PhpParser/Internal/Differ.php | 178 + .../Internal/PrintableNewAnonClassNode.php | 71 + .../lib/PhpParser/Internal/TokenPolyfill.php | 237 ++ .../lib/PhpParser/Internal/TokenStream.php | 282 ++ .../php-parser/lib/PhpParser/JsonDecoder.php | 108 + .../nikic/php-parser/lib/PhpParser/Lexer.php | 116 + .../lib/PhpParser/Lexer/Emulative.php | 230 ++ .../AsymmetricVisibilityTokenEmulator.php | 93 + .../Lexer/TokenEmulator/AttributeEmulator.php | 49 + .../Lexer/TokenEmulator/EnumTokenEmulator.php | 26 + .../TokenEmulator/ExplicitOctalEmulator.php | 45 + .../Lexer/TokenEmulator/KeywordEmulator.php | 60 + .../TokenEmulator/MatchTokenEmulator.php | 19 + .../TokenEmulator/NullsafeTokenEmulator.php | 60 + .../TokenEmulator/PipeOperatorEmulator.php | 45 + .../TokenEmulator/PropertyTokenEmulator.php | 19 + .../ReadonlyFunctionTokenEmulator.php | 31 + .../TokenEmulator/ReadonlyTokenEmulator.php | 31 + .../Lexer/TokenEmulator/ReverseEmulator.php | 37 + .../Lexer/TokenEmulator/TokenEmulator.php | 30 + .../Lexer/TokenEmulator/VoidCastEmulator.php | 98 + .../php-parser/lib/PhpParser/Modifiers.php | 85 + .../php-parser/lib/PhpParser/NameContext.php | 284 ++ .../nikic/php-parser/lib/PhpParser/Node.php | 150 + .../php-parser/lib/PhpParser/Node/Arg.php | 44 + .../lib/PhpParser/Node/ArrayItem.php | 43 + .../lib/PhpParser/Node/Attribute.php | 33 + .../lib/PhpParser/Node/AttributeGroup.php | 27 + .../lib/PhpParser/Node/ClosureUse.php | 36 + .../lib/PhpParser/Node/ComplexType.php | 13 + .../php-parser/lib/PhpParser/Node/Const_.php | 36 + .../lib/PhpParser/Node/DeclareItem.php | 37 + .../php-parser/lib/PhpParser/Node/Expr.php | 8 + .../lib/PhpParser/Node/Expr/ArrayDimFetch.php | 33 + .../lib/PhpParser/Node/Expr/ArrayItem.php | 15 + .../lib/PhpParser/Node/Expr/Array_.php | 34 + .../lib/PhpParser/Node/Expr/ArrowFunction.php | 84 + .../lib/PhpParser/Node/Expr/Assign.php | 33 + .../lib/PhpParser/Node/Expr/AssignOp.php | 29 + .../Node/Expr/AssignOp/BitwiseAnd.php | 11 + .../Node/Expr/AssignOp/BitwiseOr.php | 11 + .../Node/Expr/AssignOp/BitwiseXor.php | 11 + .../PhpParser/Node/Expr/AssignOp/Coalesce.php | 11 + .../PhpParser/Node/Expr/AssignOp/Concat.php | 11 + .../lib/PhpParser/Node/Expr/AssignOp/Div.php | 11 + .../PhpParser/Node/Expr/AssignOp/Minus.php | 11 + .../lib/PhpParser/Node/Expr/AssignOp/Mod.php | 11 + .../lib/PhpParser/Node/Expr/AssignOp/Mul.php | 11 + .../lib/PhpParser/Node/Expr/AssignOp/Plus.php | 11 + .../lib/PhpParser/Node/Expr/AssignOp/Pow.php | 11 + .../Node/Expr/AssignOp/ShiftLeft.php | 11 + .../Node/Expr/AssignOp/ShiftRight.php | 11 + .../lib/PhpParser/Node/Expr/AssignRef.php | 33 + .../lib/PhpParser/Node/Expr/BinaryOp.php | 37 + .../Node/Expr/BinaryOp/BitwiseAnd.php | 15 + .../Node/Expr/BinaryOp/BitwiseOr.php | 15 + .../Node/Expr/BinaryOp/BitwiseXor.php | 15 + .../Node/Expr/BinaryOp/BooleanAnd.php | 15 + .../Node/Expr/BinaryOp/BooleanOr.php | 15 + .../PhpParser/Node/Expr/BinaryOp/Coalesce.php | 15 + .../PhpParser/Node/Expr/BinaryOp/Concat.php | 15 + .../lib/PhpParser/Node/Expr/BinaryOp/Div.php | 15 + .../PhpParser/Node/Expr/BinaryOp/Equal.php | 15 + .../PhpParser/Node/Expr/BinaryOp/Greater.php | 15 + .../Node/Expr/BinaryOp/GreaterOrEqual.php | 15 + .../Node/Expr/BinaryOp/Identical.php | 15 + .../Node/Expr/BinaryOp/LogicalAnd.php | 15 + .../Node/Expr/BinaryOp/LogicalOr.php | 15 + .../Node/Expr/BinaryOp/LogicalXor.php | 15 + .../PhpParser/Node/Expr/BinaryOp/Minus.php | 15 + .../lib/PhpParser/Node/Expr/BinaryOp/Mod.php | 15 + .../lib/PhpParser/Node/Expr/BinaryOp/Mul.php | 15 + .../PhpParser/Node/Expr/BinaryOp/NotEqual.php | 15 + .../Node/Expr/BinaryOp/NotIdentical.php | 15 + .../lib/PhpParser/Node/Expr/BinaryOp/Pipe.php | 15 + .../lib/PhpParser/Node/Expr/BinaryOp/Plus.php | 15 + .../lib/PhpParser/Node/Expr/BinaryOp/Pow.php | 15 + .../Node/Expr/BinaryOp/ShiftLeft.php | 15 + .../Node/Expr/BinaryOp/ShiftRight.php | 15 + .../PhpParser/Node/Expr/BinaryOp/Smaller.php | 15 + .../Node/Expr/BinaryOp/SmallerOrEqual.php | 15 + .../Node/Expr/BinaryOp/Spaceship.php | 15 + .../lib/PhpParser/Node/Expr/BitwiseNot.php | 29 + .../lib/PhpParser/Node/Expr/BooleanNot.php | 29 + .../lib/PhpParser/Node/Expr/CallLike.php | 60 + .../lib/PhpParser/Node/Expr/Cast.php | 25 + .../lib/PhpParser/Node/Expr/Cast/Array_.php | 11 + .../lib/PhpParser/Node/Expr/Cast/Bool_.php | 15 + .../lib/PhpParser/Node/Expr/Cast/Double.php | 16 + .../lib/PhpParser/Node/Expr/Cast/Int_.php | 15 + .../lib/PhpParser/Node/Expr/Cast/Object_.php | 11 + .../lib/PhpParser/Node/Expr/Cast/String_.php | 15 + .../lib/PhpParser/Node/Expr/Cast/Unset_.php | 11 + .../lib/PhpParser/Node/Expr/Cast/Void_.php | 11 + .../PhpParser/Node/Expr/ClassConstFetch.php | 36 + .../lib/PhpParser/Node/Expr/Clone_.php | 29 + .../lib/PhpParser/Node/Expr/Closure.php | 86 + .../lib/PhpParser/Node/Expr/ClosureUse.php | 15 + .../lib/PhpParser/Node/Expr/ConstFetch.php | 30 + .../lib/PhpParser/Node/Expr/Empty_.php | 29 + .../lib/PhpParser/Node/Expr/Error.php | 30 + .../lib/PhpParser/Node/Expr/ErrorSuppress.php | 29 + .../lib/PhpParser/Node/Expr/Eval_.php | 29 + .../lib/PhpParser/Node/Expr/Exit_.php | 33 + .../lib/PhpParser/Node/Expr/FuncCall.php | 38 + .../lib/PhpParser/Node/Expr/Include_.php | 38 + .../lib/PhpParser/Node/Expr/Instanceof_.php | 35 + .../lib/PhpParser/Node/Expr/Isset_.php | 29 + .../lib/PhpParser/Node/Expr/List_.php | 34 + .../lib/PhpParser/Node/Expr/Match_.php | 32 + .../lib/PhpParser/Node/Expr/MethodCall.php | 45 + .../lib/PhpParser/Node/Expr/New_.php | 40 + .../Node/Expr/NullsafeMethodCall.php | 45 + .../Node/Expr/NullsafePropertyFetch.php | 35 + .../lib/PhpParser/Node/Expr/PostDec.php | 29 + .../lib/PhpParser/Node/Expr/PostInc.php | 29 + .../lib/PhpParser/Node/Expr/PreDec.php | 29 + .../lib/PhpParser/Node/Expr/PreInc.php | 29 + .../lib/PhpParser/Node/Expr/Print_.php | 29 + .../lib/PhpParser/Node/Expr/PropertyFetch.php | 35 + .../lib/PhpParser/Node/Expr/ShellExec.php | 30 + .../lib/PhpParser/Node/Expr/StaticCall.php | 45 + .../Node/Expr/StaticPropertyFetch.php | 36 + .../lib/PhpParser/Node/Expr/Ternary.php | 37 + .../lib/PhpParser/Node/Expr/Throw_.php | 29 + .../lib/PhpParser/Node/Expr/UnaryMinus.php | 29 + .../lib/PhpParser/Node/Expr/UnaryPlus.php | 29 + .../lib/PhpParser/Node/Expr/Variable.php | 29 + .../lib/PhpParser/Node/Expr/YieldFrom.php | 29 + .../lib/PhpParser/Node/Expr/Yield_.php | 33 + .../lib/PhpParser/Node/FunctionLike.php | 40 + .../lib/PhpParser/Node/Identifier.php | 85 + .../PhpParser/Node/InterpolatedStringPart.php | 32 + .../lib/PhpParser/Node/IntersectionType.php | 27 + .../lib/PhpParser/Node/MatchArm.php | 29 + .../php-parser/lib/PhpParser/Node/Name.php | 278 ++ .../PhpParser/Node/Name/FullyQualified.php | 49 + .../lib/PhpParser/Node/Name/Relative.php | 49 + .../lib/PhpParser/Node/NullableType.php | 29 + .../php-parser/lib/PhpParser/Node/Param.php | 123 + .../lib/PhpParser/Node/PropertyHook.php | 105 + .../lib/PhpParser/Node/PropertyItem.php | 37 + .../php-parser/lib/PhpParser/Node/Scalar.php | 6 + .../lib/PhpParser/Node/Scalar/DNumber.php | 15 + .../lib/PhpParser/Node/Scalar/Encapsed.php | 15 + .../Node/Scalar/EncapsedStringPart.php | 17 + .../lib/PhpParser/Node/Scalar/Float_.php | 78 + .../lib/PhpParser/Node/Scalar/Int_.php | 82 + .../Node/Scalar/InterpolatedString.php | 34 + .../lib/PhpParser/Node/Scalar/LNumber.php | 15 + .../lib/PhpParser/Node/Scalar/MagicConst.php | 27 + .../Node/Scalar/MagicConst/Class_.php | 15 + .../PhpParser/Node/Scalar/MagicConst/Dir.php | 15 + .../PhpParser/Node/Scalar/MagicConst/File.php | 15 + .../Node/Scalar/MagicConst/Function_.php | 15 + .../PhpParser/Node/Scalar/MagicConst/Line.php | 15 + .../Node/Scalar/MagicConst/Method.php | 15 + .../Node/Scalar/MagicConst/Namespace_.php | 15 + .../Node/Scalar/MagicConst/Property.php | 15 + .../Node/Scalar/MagicConst/Trait_.php | 15 + .../lib/PhpParser/Node/Scalar/String_.php | 161 + .../lib/PhpParser/Node/StaticVar.php | 39 + .../php-parser/lib/PhpParser/Node/Stmt.php | 8 + .../lib/PhpParser/Node/Stmt/Block.php | 29 + .../lib/PhpParser/Node/Stmt/Break_.php | 29 + .../lib/PhpParser/Node/Stmt/Case_.php | 33 + .../lib/PhpParser/Node/Stmt/Catch_.php | 40 + .../lib/PhpParser/Node/Stmt/ClassConst.php | 77 + .../lib/PhpParser/Node/Stmt/ClassLike.php | 109 + .../lib/PhpParser/Node/Stmt/ClassMethod.php | 154 + .../lib/PhpParser/Node/Stmt/Class_.php | 94 + .../lib/PhpParser/Node/Stmt/Const_.php | 37 + .../lib/PhpParser/Node/Stmt/Continue_.php | 29 + .../PhpParser/Node/Stmt/DeclareDeclare.php | 17 + .../lib/PhpParser/Node/Stmt/Declare_.php | 34 + .../lib/PhpParser/Node/Stmt/Do_.php | 33 + .../lib/PhpParser/Node/Stmt/Echo_.php | 29 + .../lib/PhpParser/Node/Stmt/ElseIf_.php | 33 + .../lib/PhpParser/Node/Stmt/Else_.php | 29 + .../lib/PhpParser/Node/Stmt/EnumCase.php | 36 + .../lib/PhpParser/Node/Stmt/Enum_.php | 44 + .../lib/PhpParser/Node/Stmt/Expression.php | 32 + .../lib/PhpParser/Node/Stmt/Finally_.php | 29 + .../lib/PhpParser/Node/Stmt/For_.php | 47 + .../lib/PhpParser/Node/Stmt/Foreach_.php | 50 + .../lib/PhpParser/Node/Stmt/Function_.php | 81 + .../lib/PhpParser/Node/Stmt/Global_.php | 29 + .../lib/PhpParser/Node/Stmt/Goto_.php | 30 + .../lib/PhpParser/Node/Stmt/GroupUse.php | 41 + .../lib/PhpParser/Node/Stmt/HaltCompiler.php | 29 + .../lib/PhpParser/Node/Stmt/If_.php | 46 + .../lib/PhpParser/Node/Stmt/InlineHTML.php | 29 + .../lib/PhpParser/Node/Stmt/Interface_.php | 40 + .../lib/PhpParser/Node/Stmt/Label.php | 30 + .../lib/PhpParser/Node/Stmt/Namespace_.php | 37 + .../lib/PhpParser/Node/Stmt/Nop.php | 16 + .../lib/PhpParser/Node/Stmt/Property.php | 121 + .../PhpParser/Node/Stmt/PropertyProperty.php | 17 + .../lib/PhpParser/Node/Stmt/Return_.php | 29 + .../lib/PhpParser/Node/Stmt/StaticVar.php | 15 + .../lib/PhpParser/Node/Stmt/Static_.php | 30 + .../lib/PhpParser/Node/Stmt/Switch_.php | 33 + .../lib/PhpParser/Node/Stmt/TraitUse.php | 33 + .../Node/Stmt/TraitUseAdaptation.php | 12 + .../Node/Stmt/TraitUseAdaptation/Alias.php | 37 + .../Stmt/TraitUseAdaptation/Precedence.php | 33 + .../lib/PhpParser/Node/Stmt/Trait_.php | 34 + .../lib/PhpParser/Node/Stmt/TryCatch.php | 37 + .../lib/PhpParser/Node/Stmt/Unset_.php | 29 + .../lib/PhpParser/Node/Stmt/UseUse.php | 17 + .../lib/PhpParser/Node/Stmt/Use_.php | 47 + .../lib/PhpParser/Node/Stmt/While_.php | 33 + .../lib/PhpParser/Node/UnionType.php | 27 + .../php-parser/lib/PhpParser/Node/UseItem.php | 55 + .../lib/PhpParser/Node/VarLikeIdentifier.php | 16 + .../PhpParser/Node/VariadicPlaceholder.php | 27 + .../php-parser/lib/PhpParser/NodeAbstract.php | 181 + .../php-parser/lib/PhpParser/NodeDumper.php | 299 ++ .../php-parser/lib/PhpParser/NodeFinder.php | 90 + .../lib/PhpParser/NodeTraverser.php | 287 ++ .../lib/PhpParser/NodeTraverserInterface.php | 26 + .../php-parser/lib/PhpParser/NodeVisitor.php | 124 + .../PhpParser/NodeVisitor/CloningVisitor.php | 19 + .../NodeVisitor/CommentAnnotatingVisitor.php | 82 + .../PhpParser/NodeVisitor/FindingVisitor.php | 47 + .../NodeVisitor/FirstFindingVisitor.php | 49 + .../PhpParser/NodeVisitor/NameResolver.php | 269 ++ .../NodeVisitor/NodeConnectingVisitor.php | 73 + .../NodeVisitor/ParentConnectingVisitor.php | 51 + .../lib/PhpParser/NodeVisitorAbstract.php | 24 + .../nikic/php-parser/lib/PhpParser/Parser.php | 24 + .../php-parser/lib/PhpParser/Parser/Php7.php | 2914 +++++++++++++++++ .../php-parser/lib/PhpParser/Parser/Php8.php | 2909 ++++++++++++++++ .../lib/PhpParser/ParserAbstract.php | 1321 ++++++++ .../lib/PhpParser/ParserFactory.php | 42 + .../php-parser/lib/PhpParser/PhpVersion.php | 171 + .../lib/PhpParser/PrettyPrinter.php | 51 + .../lib/PhpParser/PrettyPrinter/Standard.php | 1223 +++++++ .../lib/PhpParser/PrettyPrinterAbstract.php | 1699 ++++++++++ .../nikic/php-parser/lib/PhpParser/Token.php | 18 + .../lib/PhpParser/compatibility_tokens.php | 71 + vendor/phar-io/manifest/.github/FUNDING.yml | 3 + .../phar-io/manifest/.github/workflows/ci.yml | 86 + .../phar-io/manifest/.php-cs-fixer.dist.php | 223 ++ vendor/phar-io/manifest/CHANGELOG.md | 45 + vendor/phar-io/manifest/LICENSE | 31 + vendor/phar-io/manifest/README.md | 178 + vendor/phar-io/manifest/composer.json | 43 + vendor/phar-io/manifest/composer.lock | 76 + vendor/phar-io/manifest/manifest.xsd | 116 + .../manifest/src/ManifestDocumentMapper.php | 151 + .../phar-io/manifest/src/ManifestLoader.php | 47 + .../manifest/src/ManifestSerializer.php | 172 + .../exceptions/ElementCollectionException.php | 16 + .../manifest/src/exceptions/Exception.php | 16 + .../InvalidApplicationNameException.php | 17 + .../src/exceptions/InvalidEmailException.php | 16 + .../src/exceptions/InvalidUrlException.php | 16 + .../exceptions/ManifestDocumentException.php | 16 + .../ManifestDocumentLoadingException.php | 47 + .../ManifestDocumentMapperException.php | 16 + .../exceptions/ManifestElementException.php | 16 + .../exceptions/ManifestLoaderException.php | 14 + .../exceptions/NoEmailAddressException.php | 16 + .../manifest/src/values/Application.php | 17 + .../manifest/src/values/ApplicationName.php | 41 + vendor/phar-io/manifest/src/values/Author.php | 57 + .../manifest/src/values/AuthorCollection.php | 40 + .../src/values/AuthorCollectionIterator.php | 47 + .../manifest/src/values/BundledComponent.php | 34 + .../src/values/BundledComponentCollection.php | 40 + .../BundledComponentCollectionIterator.php | 47 + .../src/values/CopyrightInformation.php | 32 + vendor/phar-io/manifest/src/values/Email.php | 35 + .../phar-io/manifest/src/values/Extension.php | 47 + .../phar-io/manifest/src/values/Library.php | 17 + .../phar-io/manifest/src/values/License.php | 32 + .../phar-io/manifest/src/values/Manifest.php | 93 + .../src/values/PhpExtensionRequirement.php | 24 + .../src/values/PhpVersionRequirement.php | 26 + .../manifest/src/values/Requirement.php | 14 + .../src/values/RequirementCollection.php | 40 + .../values/RequirementCollectionIterator.php | 47 + vendor/phar-io/manifest/src/values/Type.php | 42 + vendor/phar-io/manifest/src/values/Url.php | 38 + .../manifest/src/xml/AuthorElement.php | 25 + .../src/xml/AuthorElementCollection.php | 19 + .../manifest/src/xml/BundlesElement.php | 19 + .../manifest/src/xml/ComponentElement.php | 21 + .../src/xml/ComponentElementCollection.php | 19 + .../manifest/src/xml/ContainsElement.php | 31 + .../manifest/src/xml/CopyrightElement.php | 25 + .../manifest/src/xml/ElementCollection.php | 68 + .../phar-io/manifest/src/xml/ExtElement.php | 17 + .../manifest/src/xml/ExtElementCollection.php | 19 + .../manifest/src/xml/ExtensionElement.php | 21 + .../manifest/src/xml/LicenseElement.php | 21 + .../manifest/src/xml/ManifestDocument.php | 115 + .../manifest/src/xml/ManifestElement.php | 72 + .../phar-io/manifest/src/xml/PhpElement.php | 27 + .../manifest/src/xml/RequiresElement.php | 19 + .../PhpdocSingleLineVarFixer.php | 72 + .../manifest/tools/php-cs-fixer.d/header.txt | 6 + vendor/phar-io/version/CHANGELOG.md | 142 + vendor/phar-io/version/LICENSE | 29 + vendor/phar-io/version/README.md | 61 + vendor/phar-io/version/composer.json | 34 + vendor/phar-io/version/src/BuildMetaData.php | 28 + .../phar-io/version/src/PreReleaseSuffix.php | 82 + vendor/phar-io/version/src/Version.php | 208 ++ .../version/src/VersionConstraintParser.php | 115 + .../version/src/VersionConstraintValue.php | 88 + vendor/phar-io/version/src/VersionNumber.php | 28 + .../constraints/AbstractVersionConstraint.php | 23 + .../constraints/AndVersionConstraintGroup.php | 34 + .../src/constraints/AnyVersionConstraint.php | 20 + .../constraints/ExactVersionConstraint.php | 22 + .../GreaterThanOrEqualToVersionConstraint.php | 26 + .../constraints/OrVersionConstraintGroup.php | 35 + ...SpecificMajorAndMinorVersionConstraint.php | 33 + .../SpecificMajorVersionConstraint.php | 25 + .../src/constraints/VersionConstraint.php | 16 + .../version/src/exceptions/Exception.php | 15 + .../InvalidPreReleaseSuffixException.php | 5 + .../exceptions/InvalidVersionException.php | 5 + .../exceptions/NoBuildMetaDataException.php | 5 + .../NoPreReleaseSuffixException.php | 5 + .../UnsupportedVersionConstraintException.php | 13 + .../php-code-coverage/ChangeLog-10.1.md | 132 + vendor/phpunit/php-code-coverage/LICENSE | 29 + vendor/phpunit/php-code-coverage/README.md | 55 + vendor/phpunit/php-code-coverage/SECURITY.md | 30 + .../phpunit/php-code-coverage/composer.json | 69 + .../php-code-coverage/src/CodeCoverage.php | 631 ++++ .../src/Data/ProcessedCodeCoverageData.php | 278 ++ .../src/Data/RawCodeCoverageData.php | 281 ++ .../php-code-coverage/src/Driver/Driver.php | 128 + .../src/Driver/PcovDriver.php | 80 + .../php-code-coverage/src/Driver/Selector.php | 62 + .../src/Driver/XdebugDriver.php | 162 + ...chAndPathCoverageNotSupportedException.php | 16 + ...DeadCodeDetectionNotSupportedException.php | 16 + .../DirectoryCouldNotBeCreatedException.php | 17 + .../src/Exception/Exception.php | 16 + .../FileCouldNotBeWrittenException.php | 16 + .../Exception/InvalidArgumentException.php | 14 + ...NoCodeCoverageDriverAvailableException.php | 20 + ...hPathCoverageSupportAvailableException.php | 20 + .../src/Exception/ParserException.php | 16 + .../PathExistsButIsNotDirectoryException.php | 22 + .../Exception/PcovNotAvailableException.php | 21 + .../src/Exception/ReflectionException.php | 16 + .../ReportAlreadyFinalizedException.php | 20 + ...ticAnalysisCacheNotConfiguredException.php | 16 + .../src/Exception/TestIdMissingException.php | 20 + .../UnintentionallyCoveredCodeException.php | 49 + .../WriteOperationFailedException.php | 22 + .../Exception/XdebugNotAvailableException.php | 21 + .../Exception/XdebugNotEnabledException.php | 21 + .../src/Exception/XmlException.php | 16 + .../phpunit/php-code-coverage/src/Filter.php | 128 + .../src/Node/AbstractNode.php | 250 ++ .../php-code-coverage/src/Node/Builder.php | 269 ++ .../php-code-coverage/src/Node/CrapIndex.php | 43 + .../php-code-coverage/src/Node/Directory.php | 370 +++ .../php-code-coverage/src/Node/File.php | 688 ++++ .../php-code-coverage/src/Node/Iterator.php | 87 + .../php-code-coverage/src/Report/Clover.php | 258 ++ .../src/Report/Cobertura.php | 309 ++ .../php-code-coverage/src/Report/Crap4j.php | 153 + .../src/Report/Html/Colors.php | 66 + .../src/Report/Html/CustomCssFile.php | 50 + .../src/Report/Html/Facade.php | 153 + .../src/Report/Html/Renderer.php | 286 ++ .../src/Report/Html/Renderer/Dashboard.php | 298 ++ .../src/Report/Html/Renderer/Directory.php | 123 + .../src/Report/Html/Renderer/File.php | 1130 +++++++ .../Html/Renderer/Template/branches.html.dist | 9 + .../Renderer/Template/coverage_bar.html.dist | 5 + .../Template/coverage_bar_branch.html.dist | 5 + .../Renderer/Template/css/bootstrap.min.css | 7 + .../Html/Renderer/Template/css/custom.css | 0 .../Html/Renderer/Template/css/nv.d3.min.css | 1 + .../Html/Renderer/Template/css/octicons.css | 5 + .../Html/Renderer/Template/css/style.css | 158 + .../Renderer/Template/dashboard.html.dist | 281 ++ .../Template/dashboard_branch.html.dist | 281 ++ .../Renderer/Template/directory.html.dist | 60 + .../Template/directory_branch.html.dist | 62 + .../Template/directory_item.html.dist | 13 + .../Template/directory_item_branch.html.dist | 19 + .../Html/Renderer/Template/file.html.dist | 65 + .../Renderer/Template/file_branch.html.dist | 67 + .../Renderer/Template/file_item.html.dist | 14 + .../Template/file_item_branch.html.dist | 20 + .../Renderer/Template/icons/file-code.svg | 1 + .../Template/icons/file-directory.svg | 1 + .../Renderer/Template/js/bootstrap.min.js | 7 + .../Html/Renderer/Template/js/d3.min.js | 5 + .../Report/Html/Renderer/Template/js/file.js | 62 + .../Html/Renderer/Template/js/jquery.min.js | 2 + .../Html/Renderer/Template/js/nv.d3.min.js | 8 + .../Html/Renderer/Template/js/popper.min.js | 5 + .../Html/Renderer/Template/line.html.dist | 1 + .../Html/Renderer/Template/lines.html.dist | 5 + .../Renderer/Template/method_item.html.dist | 12 + .../Template/method_item_branch.html.dist | 18 + .../Html/Renderer/Template/paths.html.dist | 9 + .../php-code-coverage/src/Report/PHP.php | 41 + .../php-code-coverage/src/Report/Text.php | 315 ++ .../src/Report/Thresholds.php | 56 + .../src/Report/Xml/BuildInformation.php | 79 + .../src/Report/Xml/Coverage.php | 63 + .../src/Report/Xml/Directory.php | 17 + .../src/Report/Xml/Facade.php | 304 ++ .../php-code-coverage/src/Report/Xml/File.php | 80 + .../src/Report/Xml/Method.php | 58 + .../php-code-coverage/src/Report/Xml/Node.php | 86 + .../src/Report/Xml/Project.php | 90 + .../src/Report/Xml/Report.php | 99 + .../src/Report/Xml/Source.php | 41 + .../src/Report/Xml/Tests.php | 44 + .../src/Report/Xml/Totals.php | 123 + .../php-code-coverage/src/Report/Xml/Unit.php | 75 + .../src/StaticAnalysis/CacheWarmer.php | 32 + .../StaticAnalysis/CachingFileAnalyser.php | 182 + .../StaticAnalysis/CodeUnitFindingVisitor.php | 360 ++ .../ExecutableLinesFindingVisitor.php | 413 +++ .../src/StaticAnalysis/FileAnalyser.php | 60 + .../IgnoredLinesFindingVisitor.php | 121 + .../StaticAnalysis/ParsingFileAnalyser.php | 247 ++ .../php-code-coverage/src/TestSize/Known.php | 26 + .../php-code-coverage/src/TestSize/Large.php | 34 + .../php-code-coverage/src/TestSize/Medium.php | 34 + .../php-code-coverage/src/TestSize/Small.php | 34 + .../src/TestSize/TestSize.php | 78 + .../src/TestSize/Unknown.php | 29 + .../src/TestStatus/Failure.php | 29 + .../src/TestStatus/Known.php | 24 + .../src/TestStatus/Success.php | 29 + .../src/TestStatus/TestStatus.php | 65 + .../src/TestStatus/Unknown.php | 29 + .../php-code-coverage/src/Util/Filesystem.php | 37 + .../php-code-coverage/src/Util/Percentage.php | 59 + .../phpunit/php-code-coverage/src/Version.php | 27 + vendor/phpunit/php-file-iterator/ChangeLog.md | 174 + vendor/phpunit/php-file-iterator/LICENSE | 29 + vendor/phpunit/php-file-iterator/README.md | 17 + vendor/phpunit/php-file-iterator/SECURITY.md | 30 + .../phpunit/php-file-iterator/composer.json | 46 + .../php-file-iterator/src/ExcludeIterator.php | 80 + .../phpunit/php-file-iterator/src/Facade.php | 52 + .../phpunit/php-file-iterator/src/Factory.php | 106 + .../php-file-iterator/src/Iterator.php | 114 + .../phpunit/php-invoker/.psalm/baseline.xml | 8 + vendor/phpunit/php-invoker/.psalm/config.xml | 15 + vendor/phpunit/php-invoker/ChangeLog.md | 55 + vendor/phpunit/php-invoker/LICENSE | 29 + vendor/phpunit/php-invoker/README.md | 20 + vendor/phpunit/php-invoker/SECURITY.md | 9 + vendor/phpunit/php-invoker/composer.json | 54 + vendor/phpunit/php-invoker/src/Invoker.php | 67 + .../php-invoker/src/exceptions/Exception.php | 16 + ...cessControlExtensionNotLoadedException.php | 16 + .../src/exceptions/TimeoutException.php | 16 + vendor/phpunit/php-text-template/ChangeLog.md | 57 + vendor/phpunit/php-text-template/LICENSE | 29 + vendor/phpunit/php-text-template/README.md | 17 + vendor/phpunit/php-text-template/SECURITY.md | 30 + .../phpunit/php-text-template/composer.json | 45 + .../php-text-template/src/Template.php | 108 + .../src/exceptions/Exception.php | 16 + .../exceptions/InvalidArgumentException.php | 14 + .../src/exceptions/RuntimeException.php | 16 + vendor/phpunit/php-timer/ChangeLog.md | 145 + vendor/phpunit/php-timer/LICENSE | 29 + vendor/phpunit/php-timer/README.md | 106 + vendor/phpunit/php-timer/SECURITY.md | 9 + vendor/phpunit/php-timer/composer.json | 45 + vendor/phpunit/php-timer/src/Duration.php | 90 + .../php-timer/src/ResourceUsageFormatter.php | 73 + vendor/phpunit/php-timer/src/Timer.php | 40 + .../php-timer/src/exceptions/Exception.php | 16 + .../src/exceptions/NoActiveTimerException.php | 16 + ...nceStartOfRequestNotAvailableException.php | 16 + vendor/phpunit/phpunit/ChangeLog-10.5.md | 559 ++++ vendor/phpunit/phpunit/DEPRECATIONS.md | 92 + vendor/phpunit/phpunit/LICENSE | 29 + vendor/phpunit/phpunit/README.md | 34 + vendor/phpunit/phpunit/SECURITY.md | 33 + vendor/phpunit/phpunit/composer.json | 95 + vendor/phpunit/phpunit/composer.lock | 1590 +++++++++ vendor/phpunit/phpunit/phpunit | 104 + vendor/phpunit/phpunit/phpunit.xsd | 327 ++ vendor/phpunit/phpunit/schema/10.0.xsd | 284 ++ vendor/phpunit/phpunit/schema/10.1.xsd | 312 ++ vendor/phpunit/phpunit/schema/10.2.xsd | 319 ++ vendor/phpunit/phpunit/schema/10.3.xsd | 321 ++ vendor/phpunit/phpunit/schema/10.4.xsd | 322 ++ vendor/phpunit/phpunit/schema/8.5.xsd | 319 ++ vendor/phpunit/phpunit/schema/9.0.xsd | 315 ++ vendor/phpunit/phpunit/schema/9.1.xsd | 317 ++ vendor/phpunit/phpunit/schema/9.2.xsd | 317 ++ vendor/phpunit/phpunit/schema/9.3.xsd | 327 ++ vendor/phpunit/phpunit/schema/9.4.xsd | 328 ++ vendor/phpunit/phpunit/schema/9.5.xsd | 330 ++ .../Event/Dispatcher/CollectingDispatcher.php | 39 + .../Event/Dispatcher/DeferringDispatcher.php | 60 + .../src/Event/Dispatcher/DirectDispatcher.php | 139 + .../src/Event/Dispatcher/Dispatcher.php | 23 + .../Dispatcher/SubscribableDispatcher.php | 25 + .../src/Event/Emitter/DispatchingEmitter.php | 1320 ++++++++ .../phpunit/src/Event/Emitter/Emitter.php | 335 ++ .../src/Event/Events/Application/Finished.php | 49 + .../Events/Application/FinishedSubscriber.php | 20 + .../src/Event/Events/Application/Started.php | 50 + .../Events/Application/StartedSubscriber.php | 20 + .../phpunit/src/Event/Events/Event.php | 20 + .../src/Event/Events/EventCollection.php | 62 + .../Event/Events/EventCollectionIterator.php | 57 + .../Events/Test/Assertion/AssertionFailed.php | 76 + .../Assertion/AssertionFailedSubscriber.php | 22 + .../Test/Assertion/AssertionSucceeded.php | 76 + .../AssertionSucceededSubscriber.php | 22 + .../Events/Test/ComparatorRegistered.php | 59 + .../Test/ComparatorRegisteredSubscriber.php | 20 + .../HookMethod/AfterLastTestMethodCalled.php | 68 + .../AfterLastTestMethodCalledSubscriber.php | 20 + .../HookMethod/AfterLastTestMethodErrored.php | 84 + .../AfterLastTestMethodErroredSubscriber.php | 20 + .../AfterLastTestMethodFinished.php | 82 + .../AfterLastTestMethodFinishedSubscriber.php | 20 + .../Test/HookMethod/AfterTestMethodCalled.php | 68 + .../AfterTestMethodCalledSubscriber.php | 20 + .../HookMethod/AfterTestMethodErrored.php | 84 + .../AfterTestMethodErroredSubscriber.php | 20 + .../HookMethod/AfterTestMethodFinished.php | 82 + .../AfterTestMethodFinishedSubscriber.php | 20 + .../BeforeFirstTestMethodCalled.php | 68 + .../BeforeFirstTestMethodCalledSubscriber.php | 20 + .../BeforeFirstTestMethodErrored.php | 84 + ...BeforeFirstTestMethodErroredSubscriber.php | 20 + .../BeforeFirstTestMethodFinished.php | 82 + ...eforeFirstTestMethodFinishedSubscriber.php | 20 + .../HookMethod/BeforeTestMethodCalled.php | 68 + .../BeforeTestMethodCalledSubscriber.php | 20 + .../HookMethod/BeforeTestMethodErrored.php | 84 + .../BeforeTestMethodErroredSubscriber.php | 20 + .../HookMethod/BeforeTestMethodFinished.php | 82 + .../BeforeTestMethodFinishedSubscriber.php | 20 + .../Test/HookMethod/PostConditionCalled.php | 68 + .../PostConditionCalledSubscriber.php | 20 + .../Test/HookMethod/PostConditionErrored.php | 84 + .../PostConditionErroredSubscriber.php | 20 + .../Test/HookMethod/PostConditionFinished.php | 82 + .../PostConditionFinishedSubscriber.php | 20 + .../Test/HookMethod/PreConditionCalled.php | 68 + .../PreConditionCalledSubscriber.php | 20 + .../Test/HookMethod/PreConditionErrored.php | 84 + .../PreConditionErroredSubscriber.php | 20 + .../Test/HookMethod/PreConditionFinished.php | 82 + .../PreConditionFinishedSubscriber.php | 20 + .../Events/Test/Issue/ConsideredRisky.php | 70 + .../Test/Issue/ConsideredRiskySubscriber.php | 20 + .../Test/Issue/DeprecationTriggered.php | 139 + .../Issue/DeprecationTriggeredSubscriber.php | 20 + .../Events/Test/Issue/ErrorTriggered.php | 115 + .../Test/Issue/ErrorTriggeredSubscriber.php | 20 + .../Events/Test/Issue/NoticeTriggered.php | 130 + .../Test/Issue/NoticeTriggeredSubscriber.php | 20 + .../Test/Issue/PhpDeprecationTriggered.php | 139 + .../PhpDeprecationTriggeredSubscriber.php | 20 + .../Events/Test/Issue/PhpNoticeTriggered.php | 130 + .../Issue/PhpNoticeTriggeredSubscriber.php | 20 + .../Events/Test/Issue/PhpWarningTriggered.php | 130 + .../Issue/PhpWarningTriggeredSubscriber.php | 20 + .../Issue/PhpunitDeprecationTriggered.php | 75 + .../PhpunitDeprecationTriggeredSubscriber.php | 20 + .../Test/Issue/PhpunitErrorTriggered.php | 76 + .../Issue/PhpunitErrorTriggeredSubscriber.php | 20 + .../Test/Issue/PhpunitWarningTriggered.php | 75 + .../PhpunitWarningTriggeredSubscriber.php | 20 + .../Events/Test/Issue/WarningTriggered.php | 130 + .../Test/Issue/WarningTriggeredSubscriber.php | 20 + .../Lifecycle/DataProviderMethodCalled.php | 60 + .../DataProviderMethodCalledSubscriber.php | 20 + .../Lifecycle/DataProviderMethodFinished.php | 76 + .../DataProviderMethodFinishedSubscriber.php | 20 + .../Event/Events/Test/Lifecycle/Finished.php | 57 + .../Test/Lifecycle/FinishedSubscriber.php | 20 + .../Test/Lifecycle/PreparationFailed.php | 50 + .../Lifecycle/PreparationFailedSubscriber.php | 20 + .../Test/Lifecycle/PreparationStarted.php | 50 + .../PreparationStartedSubscriber.php | 20 + .../Event/Events/Test/Lifecycle/Prepared.php | 50 + .../Test/Lifecycle/PreparedSubscriber.php | 20 + .../src/Event/Events/Test/Outcome/Errored.php | 67 + .../Events/Test/Outcome/ErroredSubscriber.php | 20 + .../src/Event/Events/Test/Outcome/Failed.php | 90 + .../Events/Test/Outcome/FailedSubscriber.php | 20 + .../Events/Test/Outcome/MarkedIncomplete.php | 67 + .../Outcome/MarkedIncompleteSubscriber.php | 20 + .../src/Event/Events/Test/Outcome/Passed.php | 50 + .../Events/Test/Outcome/PassedSubscriber.php | 20 + .../src/Event/Events/Test/Outcome/Skipped.php | 65 + .../Events/Test/Outcome/SkippedSubscriber.php | 20 + .../Events/Test/PrintedUnexpectedOutput.php | 61 + .../PrintedUnexpectedOutputSubscriber.php | 20 + .../Test/TestDouble/MockObjectCreated.php | 59 + .../MockObjectCreatedSubscriber.php | 20 + .../MockObjectForAbstractClassCreated.php | 59 + ...bjectForAbstractClassCreatedSubscriber.php | 20 + ...jectForIntersectionOfInterfacesCreated.php | 60 + ...ersectionOfInterfacesCreatedSubscriber.php | 20 + .../TestDouble/MockObjectForTraitCreated.php | 59 + .../MockObjectForTraitCreatedSubscriber.php | 20 + .../TestDouble/MockObjectFromWsdlCreated.php | 109 + .../MockObjectFromWsdlCreatedSubscriber.php | 20 + .../TestDouble/PartialMockObjectCreated.php | 73 + .../PartialMockObjectCreatedSubscriber.php | 20 + .../Test/TestDouble/TestProxyCreated.php | 66 + .../TestDouble/TestProxyCreatedSubscriber.php | 20 + .../Test/TestDouble/TestStubCreated.php | 59 + .../TestDouble/TestStubCreatedSubscriber.php | 20 + ...StubForIntersectionOfInterfacesCreated.php | 60 + ...ersectionOfInterfacesCreatedSubscriber.php | 20 + .../Events/TestRunner/BootstrapFinished.php | 49 + .../BootstrapFinishedSubscriber.php | 20 + .../Event/Events/TestRunner/Configured.php | 44 + .../TestRunner/ConfiguredSubscriber.php | 20 + .../TestRunner/DeprecationTriggered.php | 49 + .../DeprecationTriggeredSubscriber.php | 20 + .../Events/TestRunner/EventFacadeSealed.php | 38 + .../EventFacadeSealedSubscriber.php | 20 + .../Events/TestRunner/ExecutionAborted.php | 38 + .../TestRunner/ExecutionAbortedSubscriber.php | 20 + .../Events/TestRunner/ExecutionFinished.php | 38 + .../ExecutionFinishedSubscriber.php | 20 + .../Events/TestRunner/ExecutionStarted.php | 51 + .../TestRunner/ExecutionStartedSubscriber.php | 20 + .../TestRunner/ExtensionBootstrapped.php | 74 + .../ExtensionBootstrappedSubscriber.php | 20 + .../TestRunner/ExtensionLoadedFromPhar.php | 64 + .../ExtensionLoadedFromPharSubscriber.php | 20 + .../src/Event/Events/TestRunner/Finished.php | 38 + .../Events/TestRunner/FinishedSubscriber.php | 20 + .../TestRunner/GarbageCollectionDisabled.php | 38 + .../GarbageCollectionDisabledSubscriber.php | 20 + .../TestRunner/GarbageCollectionEnabled.php | 38 + .../GarbageCollectionEnabledSubscriber.php | 20 + .../TestRunner/GarbageCollectionTriggered.php | 38 + .../GarbageCollectionTriggeredSubscriber.php | 20 + .../src/Event/Events/TestRunner/Started.php | 38 + .../Events/TestRunner/StartedSubscriber.php | 20 + .../Events/TestRunner/WarningTriggered.php | 49 + .../TestRunner/WarningTriggeredSubscriber.php | 20 + .../src/Event/Events/TestSuite/Filtered.php | 50 + .../Events/TestSuite/FilteredSubscriber.php | 20 + .../src/Event/Events/TestSuite/Finished.php | 51 + .../Events/TestSuite/FinishedSubscriber.php | 20 + .../src/Event/Events/TestSuite/Loaded.php | 50 + .../Events/TestSuite/LoadedSubscriber.php | 20 + .../src/Event/Events/TestSuite/Skipped.php | 57 + .../Events/TestSuite/SkippedSubscriber.php | 20 + .../src/Event/Events/TestSuite/Sorted.php | 59 + .../Events/TestSuite/SortedSubscriber.php | 20 + .../src/Event/Events/TestSuite/Started.php | 51 + .../Events/TestSuite/StartedSubscriber.php | 20 + .../EventAlreadyAssignedException.php | 19 + .../EventFacadeIsSealedException.php | 19 + .../phpunit/src/Event/Exception/Exception.php | 14 + .../Exception/InvalidArgumentException.php | 17 + .../Event/Exception/InvalidEventException.php | 19 + .../Exception/InvalidSubscriberException.php | 19 + .../phpunit/src/Event/Exception/MapError.php | 19 + ...hanOneDataSetFromDataProviderException.php | 20 + .../NoComparisonFailureException.php | 20 + .../NoDataSetFromDataProviderException.php | 20 + .../NoPreviousThrowableException.php | 19 + .../NoTestCaseObjectOnCallStackException.php | 26 + .../src/Event/Exception/RuntimeException.php | 17 + ...bscriberTypeAlreadyRegisteredException.php | 19 + .../Event/Exception/UnknownEventException.php | 19 + .../Exception/UnknownEventTypeException.php | 19 + .../Exception/UnknownSubscriberException.php | 19 + .../UnknownSubscriberTypeException.php | 19 + vendor/phpunit/phpunit/src/Event/Facade.php | 274 ++ .../phpunit/phpunit/src/Event/Subscriber.php | 17 + vendor/phpunit/phpunit/src/Event/Tracer.php | 20 + vendor/phpunit/phpunit/src/Event/TypeMap.php | 192 ++ .../phpunit/src/Event/Value/ClassMethod.php | 54 + .../src/Event/Value/ComparisonFailure.php | 44 + .../Event/Value/ComparisonFailureBuilder.php | 70 + .../Event/Value/Runtime/OperatingSystem.php | 40 + .../phpunit/src/Event/Value/Runtime/PHP.php | 105 + .../src/Event/Value/Runtime/PHPUnit.php | 39 + .../src/Event/Value/Runtime/Runtime.php | 59 + .../src/Event/Value/Telemetry/Duration.php | 148 + .../Telemetry/GarbageCollectorStatus.php | 180 + .../GarbageCollectorStatusProvider.php | 20 + .../src/Event/Value/Telemetry/HRTime.php | 106 + .../src/Event/Value/Telemetry/Info.php | 85 + .../src/Event/Value/Telemetry/MemoryMeter.php | 22 + .../src/Event/Value/Telemetry/MemoryUsage.php | 40 + .../Php81GarbageCollectorStatusProvider.php | 42 + .../Php83GarbageCollectorStatusProvider.php | 40 + .../src/Event/Value/Telemetry/Snapshot.php | 51 + .../src/Event/Value/Telemetry/StopWatch.php | 20 + .../src/Event/Value/Telemetry/System.php | 39 + .../Value/Telemetry/SystemMemoryMeter.php | 31 + .../Event/Value/Telemetry/SystemStopWatch.php | 29 + .../Telemetry/SystemStopWatchWithOffset.php | 46 + .../phpunit/src/Event/Value/Test/Phpt.php | 42 + .../phpunit/src/Event/Value/Test/Test.php | 65 + .../src/Event/Value/Test/TestCollection.php | 60 + .../Value/Test/TestCollectionIterator.php | 57 + .../Test/TestData/DataFromDataProvider.php | 55 + .../Test/TestData/DataFromTestDependency.php | 31 + .../Event/Value/Test/TestData/TestData.php | 46 + .../Test/TestData/TestDataCollection.php | 104 + .../TestData/TestDataCollectionIterator.php | 57 + .../phpunit/src/Event/Value/Test/TestDox.php | 43 + .../src/Event/Value/Test/TestDoxBuilder.php | 53 + .../src/Event/Value/Test/TestMethod.php | 155 + .../Event/Value/Test/TestMethodBuilder.php | 99 + .../src/Event/Value/TestSuite/TestSuite.php | 79 + .../Value/TestSuite/TestSuiteBuilder.php | 112 + .../Value/TestSuite/TestSuiteForTestClass.php | 65 + ...TestSuiteForTestMethodWithDataProvider.php | 81 + .../Value/TestSuite/TestSuiteWithName.php | 26 + .../phpunit/src/Event/Value/Throwable.php | 103 + .../src/Event/Value/ThrowableBuilder.php | 44 + vendor/phpunit/phpunit/src/Exception.php | 16 + .../phpunit/phpunit/src/Framework/Assert.php | 2332 +++++++++++++ .../src/Framework/Assert/Functions.php | 2707 +++++++++++++++ .../src/Framework/Attributes/After.php | 22 + .../src/Framework/Attributes/AfterClass.php | 22 + .../Framework/Attributes/BackupGlobals.php | 33 + .../Attributes/BackupStaticProperties.php | 33 + .../src/Framework/Attributes/Before.php | 22 + .../src/Framework/Attributes/BeforeClass.php | 22 + .../Attributes/CodeCoverageIgnore.php | 24 + .../src/Framework/Attributes/CoversClass.php | 42 + .../Framework/Attributes/CoversFunction.php | 42 + .../Framework/Attributes/CoversNothing.php | 22 + .../src/Framework/Attributes/DataProvider.php | 42 + .../Attributes/DataProviderExternal.php | 57 + .../src/Framework/Attributes/Depends.php | 42 + .../Framework/Attributes/DependsExternal.php | 57 + .../DependsExternalUsingDeepClone.php | 57 + .../DependsExternalUsingShallowClone.php | 57 + .../Framework/Attributes/DependsOnClass.php | 42 + .../DependsOnClassUsingDeepClone.php | 42 + .../DependsOnClassUsingShallowClone.php | 42 + .../Attributes/DependsUsingDeepClone.php | 42 + .../Attributes/DependsUsingShallowClone.php | 42 + .../Attributes/DoesNotPerformAssertions.php | 22 + .../ExcludeGlobalVariableFromBackup.php | 42 + .../ExcludeStaticPropertyFromBackup.php | 57 + .../src/Framework/Attributes/Group.php | 42 + .../Attributes/IgnoreClassForCodeCoverage.php | 44 + .../Attributes/IgnoreDeprecations.php | 22 + .../IgnoreFunctionForCodeCoverage.php | 44 + .../IgnoreMethodForCodeCoverage.php | 59 + .../src/Framework/Attributes/Large.php | 22 + .../src/Framework/Attributes/Medium.php | 22 + .../Framework/Attributes/PostCondition.php | 22 + .../src/Framework/Attributes/PreCondition.php | 22 + .../Attributes/PreserveGlobalState.php | 33 + .../Framework/Attributes/RequiresFunction.php | 42 + .../Framework/Attributes/RequiresMethod.php | 57 + .../Attributes/RequiresOperatingSystem.php | 42 + .../RequiresOperatingSystemFamily.php | 42 + .../src/Framework/Attributes/RequiresPhp.php | 42 + .../Attributes/RequiresPhpExtension.php | 57 + .../Framework/Attributes/RequiresPhpunit.php | 42 + .../Framework/Attributes/RequiresSetting.php | 57 + .../Attributes/RunClassInSeparateProcess.php | 22 + .../Attributes/RunInSeparateProcess.php | 22 + .../RunTestsInSeparateProcesses.php | 22 + .../src/Framework/Attributes/Small.php | 22 + .../phpunit/src/Framework/Attributes/Test.php | 22 + .../src/Framework/Attributes/TestDox.php | 42 + .../src/Framework/Attributes/TestWith.php | 33 + .../src/Framework/Attributes/TestWithJson.php | 42 + .../src/Framework/Attributes/Ticket.php | 42 + .../src/Framework/Attributes/UsesClass.php | 42 + .../src/Framework/Attributes/UsesFunction.php | 42 + .../Attributes/WithoutErrorHandler.php | 22 + .../Framework/Constraint/Boolean/IsFalse.php | 33 + .../Framework/Constraint/Boolean/IsTrue.php | 33 + .../src/Framework/Constraint/Callback.php | 73 + .../Constraint/Cardinality/Count.php | 126 + .../Constraint/Cardinality/GreaterThan.php | 42 + .../Constraint/Cardinality/IsEmpty.php | 66 + .../Constraint/Cardinality/LessThan.php | 42 + .../Constraint/Cardinality/SameSize.php | 29 + .../src/Framework/Constraint/Constraint.php | 264 ++ .../Framework/Constraint/Equality/IsEqual.php | 120 + .../Equality/IsEqualCanonicalizing.php | 103 + .../Equality/IsEqualIgnoringCase.php | 104 + .../Constraint/Equality/IsEqualWithDelta.php | 92 + .../Constraint/Exception/Exception.php | 81 + .../Constraint/Exception/ExceptionCode.php | 57 + .../ExceptionMessageIsOrContains.php | 69 + ...ceptionMessageMatchesRegularExpression.php | 73 + .../Constraint/Filesystem/DirectoryExists.php | 50 + .../Constraint/Filesystem/FileExists.php | 50 + .../Constraint/Filesystem/IsReadable.php | 50 + .../Constraint/Filesystem/IsWritable.php | 50 + .../src/Framework/Constraint/IsAnything.php | 51 + .../src/Framework/Constraint/IsIdentical.php | 123 + .../src/Framework/Constraint/JsonMatches.php | 97 + .../Framework/Constraint/Math/IsFinite.php | 35 + .../Framework/Constraint/Math/IsInfinite.php | 35 + .../src/Framework/Constraint/Math/IsNan.php | 35 + .../Constraint/Object/ObjectEquals.php | 142 + .../Constraint/Object/ObjectHasProperty.php | 80 + .../Constraint/Operator/BinaryOperator.php | 132 + .../Constraint/Operator/LogicalAnd.php | 54 + .../Constraint/Operator/LogicalNot.php | 141 + .../Constraint/Operator/LogicalOr.php | 54 + .../Constraint/Operator/LogicalXor.php | 66 + .../Constraint/Operator/Operator.php | 55 + .../Constraint/Operator/UnaryOperator.php | 128 + .../Framework/Constraint/String/IsJson.php | 91 + .../Constraint/String/RegularExpression.php | 46 + .../Constraint/String/StringContains.php | 160 + .../Constraint/String/StringEndsWith.php | 50 + .../StringEqualsStringIgnoringLineEndings.php | 57 + .../String/StringMatchesFormatDescription.php | 117 + .../Constraint/String/StringStartsWith.php | 50 + .../Constraint/Traversable/ArrayHasKey.php | 64 + .../Constraint/Traversable/IsList.php | 51 + .../Traversable/TraversableContains.php | 55 + .../Traversable/TraversableContainsEqual.php | 38 + .../TraversableContainsIdentical.php | 37 + .../Traversable/TraversableContainsOnly.php | 75 + .../Constraint/Type/IsInstanceOf.php | 79 + .../src/Framework/Constraint/Type/IsNull.php | 33 + .../src/Framework/Constraint/Type/IsType.php | 205 ++ .../src/Framework/DataProviderTestSuite.php | 76 + .../Exception/AssertionFailedError.php | 26 + .../Exception/CodeCoverageException.php | 19 + .../Exception/EmptyStringException.php | 19 + .../src/Framework/Exception/Exception.php | 82 + .../Exception/ExpectationFailedException.php | 39 + .../GeneratorNotSupportedException.php | 30 + .../Exception/Incomplete/IncompleteTest.php | 21 + .../Incomplete/IncompleteTestError.php | 19 + .../Exception/InvalidArgumentException.php | 19 + .../InvalidCoversTargetException.php | 19 + .../InvalidDataProviderException.php | 19 + .../Exception/InvalidDependencyException.php | 19 + .../Exception/NoChildTestSuiteException.php | 19 + .../ActualValueIsNotAnObjectException.php | 25 + ...hodDoesNotAcceptParameterTypeException.php | 32 + ...dDoesNotDeclareBoolReturnTypeException.php | 31 + ...NotDeclareExactlyOneParameterException.php | 31 + ...odDoesNotDeclareParameterTypeException.php | 31 + .../ComparisonMethodDoesNotExistException.php | 31 + .../Exception/PhptAssertionFailedError.php | 55 + .../Exception/ProcessIsolationException.php | 19 + .../Exception/Skipped/SkippedTest.php | 21 + .../Skipped/SkippedTestSuiteError.php | 19 + .../Skipped/SkippedWithMessageException.php | 19 + .../UnknownClassOrInterfaceException.php | 30 + .../Exception/UnknownTypeException.php | 30 + .../Framework/ExecutionOrderDependency.php | 193 ++ .../MockObject/ConfigurableMethod.php | 83 + .../Exception/BadMethodCallException.php | 19 + .../CannotUseOnlyMethodsException.php | 31 + .../MockObject/Exception/Exception.php | 21 + .../IncompatibleReturnValueException.php | 33 + .../MatchBuilderNotFoundException.php | 30 + .../MatcherAlreadyRegisteredException.php | 30 + .../MethodCannotBeConfiguredException.php | 30 + .../MethodNameAlreadyConfiguredException.php | 23 + .../MethodNameNotConfiguredException.php | 23 + ...odParametersAlreadyConfiguredException.php | 23 + .../NeverReturningMethodException.php | 34 + .../NoMoreReturnValuesConfiguredException.php | 32 + .../ReturnValueNotConfiguredException.php | 31 + .../MockObject/Exception/RuntimeException.php | 19 + .../CannotUseAddMethodsException.php | 31 + .../Exception/ClassIsEnumerationException.php | 30 + .../Exception/ClassIsFinalException.php | 30 + .../Exception/ClassIsReadonlyException.php | 30 + .../Exception/DuplicateMethodException.php | 37 + .../Generator/Exception/Exception.php | 21 + .../Exception/InvalidMethodNameException.php | 30 + .../Exception/NameAlreadyInUseException.php | 33 + ...ConstructorInvocationRequiredException.php | 23 + .../Exception/ReflectionException.php | 19 + .../Generator/Exception/RuntimeException.php | 19 + .../SoapExtensionNotAvailableException.php | 25 + .../Exception/UnknownClassException.php | 30 + .../Exception/UnknownTraitException.php | 32 + .../Exception/UnknownTypeException.php | 30 + .../MockObject/Generator/Generator.php | 1085 ++++++ .../MockObject/Generator/MockClass.php | 70 + .../MockObject/Generator/MockMethod.php | 396 +++ .../MockObject/Generator/MockMethodSet.php | 47 + .../MockObject/Generator/MockTrait.php | 50 + .../MockObject/Generator/MockType.php | 23 + .../MockObject/Generator/TemplateLoader.php | 39 + .../Generator/templates/deprecation.tpl | 2 + .../Generator/templates/doubled_method.tpl | 35 + .../templates/doubled_static_method.tpl | 5 + .../Generator/templates/intersection.tpl | 5 + .../Generator/templates/proxied_method.tpl | 37 + .../Generator/templates/test_double_class.tpl | 5 + .../Generator/templates/trait_class.tpl | 6 + .../Generator/templates/wsdl_class.tpl | 9 + .../Generator/templates/wsdl_method.tpl | 4 + .../src/Framework/MockObject/MockBuilder.php | 491 +++ .../Runtime/Api/DoubledCloneMethod.php | 23 + .../MockObject/Runtime/Api/Method.php | 33 + .../MockObject/Runtime/Api/MockObjectApi.php | 54 + .../Runtime/Api/ProxiedCloneMethod.php | 25 + .../MockObject/Runtime/Api/StubApi.php | 56 + .../MockObject/Runtime/Builder/Identity.php | 25 + .../Runtime/Builder/InvocationMocker.php | 325 ++ .../Runtime/Builder/InvocationStubber.php | 40 + .../Runtime/Builder/MethodNameMatch.php | 26 + .../Runtime/Builder/ParametersMatch.php | 51 + .../MockObject/Runtime/Builder/Stub.php | 26 + .../Runtime/Interface/MockObject.php | 23 + .../Runtime/Interface/MockObjectInternal.php | 24 + .../MockObject/Runtime/Interface/Stub.php | 21 + .../Runtime/Interface/StubInternal.php | 26 + .../MockObject/Runtime/Invocation.php | 152 + .../MockObject/Runtime/InvocationHandler.php | 154 + .../Framework/MockObject/Runtime/Matcher.php | 212 ++ .../Runtime/MethodNameConstraint.php | 42 + .../Runtime/ReturnValueGenerator.php | 250 ++ .../Runtime/Rule/AnyInvokedCount.php | 34 + .../MockObject/Runtime/Rule/AnyParameters.php | 28 + .../Runtime/Rule/InvocationOrder.php | 52 + .../Runtime/Rule/InvokedAtLeastCount.php | 66 + .../Runtime/Rule/InvokedAtLeastOnce.php | 48 + .../Runtime/Rule/InvokedAtMostCount.php | 66 + .../MockObject/Runtime/Rule/InvokedCount.php | 94 + .../MockObject/Runtime/Rule/MethodName.php | 60 + .../MockObject/Runtime/Rule/Parameters.php | 141 + .../Runtime/Rule/ParametersRule.php | 26 + .../Runtime/Stub/ConsecutiveCalls.php | 53 + .../MockObject/Runtime/Stub/Exception.php | 36 + .../Runtime/Stub/ReturnArgument.php | 32 + .../Runtime/Stub/ReturnCallback.php | 36 + .../Runtime/Stub/ReturnReference.php | 32 + .../MockObject/Runtime/Stub/ReturnSelf.php | 29 + .../MockObject/Runtime/Stub/ReturnStub.php | 32 + .../Runtime/Stub/ReturnValueMap.php | 49 + .../MockObject/Runtime/Stub/Stub.php | 26 + .../phpunit/src/Framework/Reorderable.php | 30 + .../phpunit/src/Framework/SelfDescribing.php | 23 + vendor/phpunit/phpunit/src/Framework/Test.php | 20 + .../phpunit/src/Framework/TestBuilder.php | 282 ++ .../phpunit/src/Framework/TestCase.php | 2412 ++++++++++++++ .../phpunit/src/Framework/TestRunner.php | 471 +++ .../phpunit/src/Framework/TestSize/Known.php | 30 + .../phpunit/src/Framework/TestSize/Large.php | 38 + .../phpunit/src/Framework/TestSize/Medium.php | 38 + .../phpunit/src/Framework/TestSize/Small.php | 38 + .../src/Framework/TestSize/TestSize.php | 82 + .../src/Framework/TestSize/Unknown.php | 33 + .../src/Framework/TestStatus/Deprecation.php | 38 + .../src/Framework/TestStatus/Error.php | 38 + .../src/Framework/TestStatus/Failure.php | 38 + .../src/Framework/TestStatus/Incomplete.php | 38 + .../src/Framework/TestStatus/Known.php | 28 + .../src/Framework/TestStatus/Notice.php | 38 + .../src/Framework/TestStatus/Risky.php | 38 + .../src/Framework/TestStatus/Skipped.php | 38 + .../src/Framework/TestStatus/Success.php | 38 + .../src/Framework/TestStatus/TestStatus.php | 195 ++ .../src/Framework/TestStatus/Unknown.php | 38 + .../src/Framework/TestStatus/Warning.php | 38 + .../phpunit/src/Framework/TestSuite.php | 726 ++++ .../src/Framework/TestSuiteIterator.php | 84 + .../phpunit/src/Logging/EventLogger.php | 68 + .../src/Logging/JUnit/JunitXmlLogger.php | 464 +++ .../Logging/JUnit/Subscriber/Subscriber.php | 30 + .../Subscriber/TestErroredSubscriber.php | 30 + .../JUnit/Subscriber/TestFailedSubscriber.php | 30 + .../Subscriber/TestFinishedSubscriber.php | 30 + .../TestMarkedIncompleteSubscriber.php | 30 + .../TestPreparationFailedSubscriber.php | 30 + .../TestPreparationStartedSubscriber.php | 30 + .../Subscriber/TestPreparedSubscriber.php | 30 + .../TestPrintedUnexpectedOutputSubscriber.php | 26 + .../TestRunnerExecutionFinishedSubscriber.php | 26 + .../Subscriber/TestSkippedSubscriber.php | 30 + .../TestSuiteFinishedSubscriber.php | 26 + .../Subscriber/TestSuiteStartedSubscriber.php | 26 + .../TeamCity/Subscriber/Subscriber.php | 30 + .../TestConsideredRiskySubscriber.php | 30 + .../Subscriber/TestErroredSubscriber.php | 30 + .../Subscriber/TestFailedSubscriber.php | 30 + .../Subscriber/TestFinishedSubscriber.php | 30 + .../TestMarkedIncompleteSubscriber.php | 30 + .../Subscriber/TestPreparedSubscriber.php | 26 + .../TestRunnerExecutionFinishedSubscriber.php | 26 + .../Subscriber/TestSkippedSubscriber.php | 30 + ...BeforeFirstTestMethodErroredSubscriber.php | 30 + .../TestSuiteFinishedSubscriber.php | 26 + .../Subscriber/TestSuiteSkippedSubscriber.php | 30 + .../Subscriber/TestSuiteStartedSubscriber.php | 26 + .../src/Logging/TeamCity/TeamCityLogger.php | 425 +++ .../src/Logging/TestDox/HtmlRenderer.php | 158 + .../src/Logging/TestDox/NamePrettifier.php | 305 ++ .../src/Logging/TestDox/PlainTextRenderer.php | 79 + .../TestResult/Subscriber/Subscriber.php | 30 + .../TestConsideredRiskySubscriber.php | 26 + .../Subscriber/TestErroredSubscriber.php | 26 + .../Subscriber/TestFailedSubscriber.php | 26 + .../Subscriber/TestFinishedSubscriber.php | 30 + .../TestMarkedIncompleteSubscriber.php | 26 + .../Subscriber/TestPassedSubscriber.php | 26 + .../Subscriber/TestPreparedSubscriber.php | 26 + .../Subscriber/TestSkippedSubscriber.php | 26 + .../TestTriggeredDeprecationSubscriber.php | 26 + .../TestTriggeredNoticeSubscriber.php | 26 + .../TestTriggeredPhpDeprecationSubscriber.php | 26 + .../TestTriggeredPhpNoticeSubscriber.php | 26 + .../TestTriggeredPhpWarningSubscriber.php | 26 + ...tTriggeredPhpunitDeprecationSubscriber.php | 26 + .../TestTriggeredPhpunitErrorSubscriber.php | 26 + .../TestTriggeredPhpunitWarningSubscriber.php | 26 + .../TestTriggeredWarningSubscriber.php | 26 + .../Logging/TestDox/TestResult/TestResult.php | 58 + .../TestResult/TestResultCollection.php | 55 + .../TestResultCollectionIterator.php | 59 + .../TestResult/TestResultCollector.php | 447 +++ vendor/phpunit/phpunit/src/Metadata/After.php | 26 + .../phpunit/src/Metadata/AfterClass.php | 26 + .../phpunit/src/Metadata/Api/CodeCoverage.php | 317 ++ .../phpunit/src/Metadata/Api/DataProvider.php | 327 ++ .../phpunit/src/Metadata/Api/Dependencies.php | 57 + .../phpunit/src/Metadata/Api/Groups.php | 132 + .../phpunit/src/Metadata/Api/HookMethods.php | 108 + .../phpunit/src/Metadata/Api/Requirements.php | 154 + .../phpunit/src/Metadata/BackupGlobals.php | 43 + .../src/Metadata/BackupStaticProperties.php | 43 + .../phpunit/phpunit/src/Metadata/Before.php | 26 + .../phpunit/src/Metadata/BeforeClass.php | 26 + .../phpunit/phpunit/src/Metadata/Covers.php | 50 + .../phpunit/src/Metadata/CoversClass.php | 60 + .../src/Metadata/CoversDefaultClass.php | 50 + .../phpunit/src/Metadata/CoversFunction.php | 58 + .../phpunit/src/Metadata/CoversNothing.php | 26 + .../phpunit/src/Metadata/DataProvider.php | 65 + .../phpunit/src/Metadata/DependsOnClass.php | 64 + .../phpunit/src/Metadata/DependsOnMethod.php | 79 + .../src/Metadata/DoesNotPerformAssertions.php | 26 + ...otSupportedForInternalClassesException.php | 35 + .../src/Metadata/Exception/Exception.php | 14 + .../Exception/InvalidAttributeException.php | 45 + .../InvalidVersionRequirementException.php | 16 + .../NoVersionRequirementException.php | 16 + .../Exception/ReflectionException.php | 22 + .../ExcludeGlobalVariableFromBackup.php | 50 + .../ExcludeStaticPropertyFromBackup.php | 65 + vendor/phpunit/phpunit/src/Metadata/Group.php | 50 + .../Metadata/IgnoreClassForCodeCoverage.php | 52 + .../src/Metadata/IgnoreDeprecations.php | 26 + .../IgnoreFunctionForCodeCoverage.php | 52 + .../Metadata/IgnoreMethodForCodeCoverage.php | 67 + .../phpunit/phpunit/src/Metadata/Metadata.php | 835 +++++ .../src/Metadata/MetadataCollection.php | 561 ++++ .../Metadata/MetadataCollectionIterator.php | 57 + .../Metadata/Parser/Annotation/DocBlock.php | 267 ++ .../Metadata/Parser/Annotation/Registry.php | 98 + .../src/Metadata/Parser/AnnotationParser.php | 568 ++++ .../src/Metadata/Parser/AttributeParser.php | 698 ++++ .../src/Metadata/Parser/CachingParser.php | 88 + .../phpunit/src/Metadata/Parser/Parser.php | 37 + .../src/Metadata/Parser/ParserChain.php | 77 + .../phpunit/src/Metadata/Parser/Registry.php | 38 + .../phpunit/src/Metadata/PostCondition.php | 26 + .../phpunit/src/Metadata/PreCondition.php | 26 + .../src/Metadata/PreserveGlobalState.php | 43 + .../phpunit/src/Metadata/RequiresFunction.php | 50 + .../phpunit/src/Metadata/RequiresMethod.php | 65 + .../src/Metadata/RequiresOperatingSystem.php | 50 + .../RequiresOperatingSystemFamily.php | 50 + .../phpunit/src/Metadata/RequiresPhp.php | 45 + .../src/Metadata/RequiresPhpExtension.php | 74 + .../phpunit/src/Metadata/RequiresPhpunit.php | 45 + .../phpunit/src/Metadata/RequiresSetting.php | 65 + .../Metadata/RunClassInSeparateProcess.php | 26 + .../src/Metadata/RunInSeparateProcess.php | 26 + .../Metadata/RunTestsInSeparateProcesses.php | 26 + vendor/phpunit/phpunit/src/Metadata/Test.php | 26 + .../phpunit/phpunit/src/Metadata/TestDox.php | 50 + .../phpunit/phpunit/src/Metadata/TestWith.php | 43 + vendor/phpunit/phpunit/src/Metadata/Uses.php | 50 + .../phpunit/src/Metadata/UsesClass.php | 60 + .../phpunit/src/Metadata/UsesDefaultClass.php | 50 + .../phpunit/src/Metadata/UsesFunction.php | 58 + .../Version/ComparisonRequirement.php | 40 + .../Version/ConstraintRequirement.php | 56 + .../src/Metadata/Version/Requirement.php | 57 + .../src/Metadata/WithoutErrorHandler.php | 26 + .../phpunit/src/Runner/Baseline/Baseline.php | 61 + .../Exception/CannotLoadBaselineException.php | 22 + .../FileDoesNotHaveLineException.php | 33 + .../phpunit/src/Runner/Baseline/Generator.php | 120 + .../phpunit/src/Runner/Baseline/Issue.php | 147 + .../phpunit/src/Runner/Baseline/Reader.php | 102 + .../Baseline/RelativePathCalculator.php | 105 + .../Runner/Baseline/Subscriber/Subscriber.php | 30 + .../TestTriggeredDeprecationSubscriber.php | 31 + .../TestTriggeredNoticeSubscriber.php | 31 + .../TestTriggeredPhpDeprecationSubscriber.php | 31 + .../TestTriggeredPhpNoticeSubscriber.php | 31 + .../TestTriggeredPhpWarningSubscriber.php | 31 + .../TestTriggeredWarningSubscriber.php | 31 + .../phpunit/src/Runner/Baseline/Writer.php | 67 + .../phpunit/src/Runner/CodeCoverage.php | 426 +++ .../phpunit/src/Runner/ErrorHandler.php | 225 ++ .../Exception/ClassCannotBeFoundException.php | 32 + .../ClassDoesNotExtendTestCaseException.php | 32 + .../Exception/ClassIsAbstractException.php | 32 + .../DirectoryDoesNotExistException.php | 31 + .../src/Runner/Exception/ErrorException.php | 21 + .../src/Runner/Exception/Exception.php | 19 + .../Exception/FileDoesNotExistException.php | 31 + .../Exception/InvalidOrderException.php | 21 + .../Exception/InvalidPhptFileException.php | 21 + .../ParameterDoesNotExistException.php | 31 + ...hptExternalFileCannotBeLoadedException.php | 32 + .../UnsupportedPhptSectionException.php | 31 + .../src/Runner/Extension/Extension.php | 20 + .../Extension/ExtensionBootstrapper.php | 97 + .../phpunit/src/Runner/Extension/Facade.php | 110 + .../Runner/Extension/ParameterCollection.php | 53 + .../src/Runner/Extension/PharLoader.php | 150 + .../Filter/ExcludeGroupFilterIterator.php | 25 + .../phpunit/src/Runner/Filter/Factory.php | 81 + .../src/Runner/Filter/GroupFilterIterator.php | 65 + .../Filter/IncludeGroupFilterIterator.php | 25 + .../src/Runner/Filter/NameFilterIterator.php | 142 + .../Runner/Filter/TestIdFilterIterator.php | 63 + .../GarbageCollectionHandler.php | 89 + .../ExecutionFinishedSubscriber.php | 31 + .../Subscriber/ExecutionStartedSubscriber.php | 31 + .../Subscriber/Subscriber.php | 30 + .../Subscriber/TestFinishedSubscriber.php | 31 + .../phpunit/src/Runner/PhptTestCase.php | 843 +++++ .../Runner/ResultCache/DefaultResultCache.php | 166 + .../Runner/ResultCache/NullResultCache.php | 46 + .../src/Runner/ResultCache/ResultCache.php | 32 + .../Runner/ResultCache/ResultCacheHandler.php | 157 + .../ResultCache/Subscriber/Subscriber.php | 30 + .../TestConsideredRiskySubscriber.php | 26 + .../Subscriber/TestErroredSubscriber.php | 26 + .../Subscriber/TestFailedSubscriber.php | 26 + .../Subscriber/TestFinishedSubscriber.php | 31 + .../TestMarkedIncompleteSubscriber.php | 26 + .../Subscriber/TestPreparedSubscriber.php | 26 + .../Subscriber/TestSkippedSubscriber.php | 31 + .../TestSuiteFinishedSubscriber.php | 26 + .../Subscriber/TestSuiteStartedSubscriber.php | 26 + .../src/Runner/TestResult/Collector.php | 667 ++++ .../phpunit/src/Runner/TestResult/Facade.php | 105 + .../phpunit/src/Runner/TestResult/Issue.php | 115 + .../src/Runner/TestResult/PassedTests.php | 124 + .../AfterTestClassMethodErroredSubscriber.php | 26 + ...BeforeTestClassMethodErroredSubscriber.php | 26 + .../Subscriber/ExecutionStartedSubscriber.php | 26 + .../TestResult/Subscriber/Subscriber.php | 30 + .../TestConsideredRiskySubscriber.php | 26 + .../Subscriber/TestErroredSubscriber.php | 26 + .../Subscriber/TestFailedSubscriber.php | 26 + .../Subscriber/TestFinishedSubscriber.php | 26 + .../TestMarkedIncompleteSubscriber.php | 26 + .../Subscriber/TestPreparedSubscriber.php | 26 + ...stRunnerTriggeredDeprecationSubscriber.php | 26 + .../TestRunnerTriggeredWarningSubscriber.php | 26 + .../Subscriber/TestSkippedSubscriber.php | 26 + .../TestSuiteFinishedSubscriber.php | 26 + .../Subscriber/TestSuiteSkippedSubscriber.php | 26 + .../Subscriber/TestSuiteStartedSubscriber.php | 26 + .../TestTriggeredDeprecationSubscriber.php | 26 + .../TestTriggeredErrorSubscriber.php | 26 + .../TestTriggeredNoticeSubscriber.php | 26 + .../TestTriggeredPhpDeprecationSubscriber.php | 26 + .../TestTriggeredPhpNoticeSubscriber.php | 26 + .../TestTriggeredPhpWarningSubscriber.php | 26 + ...tTriggeredPhpunitDeprecationSubscriber.php | 26 + .../TestTriggeredPhpunitErrorSubscriber.php | 26 + .../TestTriggeredPhpunitWarningSubscriber.php | 26 + .../TestTriggeredWarningSubscriber.php | 26 + .../src/Runner/TestResult/TestResult.php | 586 ++++ .../phpunit/src/Runner/TestSuiteLoader.php | 143 + .../phpunit/src/Runner/TestSuiteSorter.php | 344 ++ vendor/phpunit/phpunit/src/Runner/Version.php | 63 + .../phpunit/src/TextUI/Application.php | 752 +++++ .../phpunit/src/TextUI/Command/Command.php | 20 + .../Commands/AtLeastVersionCommand.php | 37 + .../Commands/CheckPhpConfigurationCommand.php | 166 + .../Commands/GenerateConfigurationCommand.php | 103 + .../Command/Commands/ListGroupsCommand.php | 83 + .../Commands/ListTestSuitesCommand.php | 74 + .../Commands/ListTestsAsTextCommand.php | 87 + .../Commands/ListTestsAsXmlCommand.php | 142 + .../Commands/MigrateConfigurationCommand.php | 64 + .../Command/Commands/ShowHelpCommand.php | 35 + .../Command/Commands/ShowVersionCommand.php | 23 + .../Command/Commands/VersionCheckCommand.php | 74 + .../Commands/WarmCodeCoverageCacheCommand.php | 81 + .../phpunit/src/TextUI/Command/Result.php | 48 + .../src/TextUI/Configuration/Builder.php | 52 + .../src/TextUI/Configuration/Cli/Builder.php | 1252 +++++++ .../Configuration/Cli/Configuration.php | 2325 +++++++++++++ .../TextUI/Configuration/Cli/Exception.php | 21 + .../Cli/XmlConfigurationFileFinder.php | 69 + .../CodeCoverageFilterRegistry.php | 78 + .../TextUI/Configuration/Configuration.php | 1393 ++++++++ .../Exception/CannotFindSchemaException.php | 22 + ...deCoverageReportNotConfiguredException.php | 21 + .../ConfigurationCannotBeBuiltException.php | 21 + .../Configuration/Exception/Exception.php | 19 + .../FilterNotConfiguredException.php | 21 + .../LoggingNotConfiguredException.php | 21 + .../Exception/NoBaselineException.php | 21 + .../Exception/NoBootstrapException.php | 21 + .../Exception/NoCacheDirectoryException.php | 21 + .../Exception/NoCliArgumentException.php | 21 + .../NoConfigurationFileException.php | 21 + .../NoCoverageCacheDirectoryException.php | 21 + .../Exception/NoCustomCssFileException.php | 21 + .../Exception/NoDefaultTestSuiteException.php | 21 + .../NoPharExtensionDirectoryException.php | 21 + .../src/TextUI/Configuration/Merger.php | 963 ++++++ .../src/TextUI/Configuration/PhpHandler.php | 123 + .../src/TextUI/Configuration/Registry.php | 111 + .../src/TextUI/Configuration/SourceFilter.php | 51 + .../src/TextUI/Configuration/SourceMapper.php | 99 + .../TextUI/Configuration/TestSuiteBuilder.php | 146 + .../TextUI/Configuration/Value/Constant.php | 37 + .../Value/ConstantCollection.php | 60 + .../Value/ConstantCollectionIterator.php | 64 + .../TextUI/Configuration/Value/Directory.php | 30 + .../Value/DirectoryCollection.php | 65 + .../Value/DirectoryCollectionIterator.php | 64 + .../Value/ExtensionBootstrap.php | 54 + .../Value/ExtensionBootstrapCollection.php | 53 + .../ExtensionBootstrapCollectionIterator.php | 64 + .../src/TextUI/Configuration/Value/File.php | 39 + .../Configuration/Value/FileCollection.php | 65 + .../Value/FileCollectionIterator.php | 64 + .../Configuration/Value/FilterDirectory.php | 53 + .../Value/FilterDirectoryCollection.php | 65 + .../FilterDirectoryCollectionIterator.php | 64 + .../src/TextUI/Configuration/Value/Group.php | 30 + .../Configuration/Value/GroupCollection.php | 72 + .../Value/GroupCollectionIterator.php | 64 + .../TextUI/Configuration/Value/IniSetting.php | 37 + .../Value/IniSettingCollection.php | 60 + .../Value/IniSettingCollectionIterator.php | 64 + .../src/TextUI/Configuration/Value/Php.php | 100 + .../src/TextUI/Configuration/Value/Source.php | 166 + .../Configuration/Value/TestDirectory.php | 69 + .../Value/TestDirectoryCollection.php | 65 + .../Value/TestDirectoryCollectionIterator.php | 64 + .../TextUI/Configuration/Value/TestFile.php | 46 + .../Value/TestFileCollection.php | 65 + .../Value/TestFileCollectionIterator.php | 64 + .../TextUI/Configuration/Value/TestSuite.php | 60 + .../Value/TestSuiteCollection.php | 65 + .../Value/TestSuiteCollectionIterator.php | 64 + .../TextUI/Configuration/Value/Variable.php | 44 + .../Value/VariableCollection.php | 60 + .../Value/VariableCollectionIterator.php | 64 + .../Xml/CodeCoverage/CodeCoverage.php | 295 ++ .../Xml/CodeCoverage/Report/Clover.php | 34 + .../Xml/CodeCoverage/Report/Cobertura.php | 34 + .../Xml/CodeCoverage/Report/Crap4j.php | 41 + .../Xml/CodeCoverage/Report/Html.php | 106 + .../Xml/CodeCoverage/Report/Php.php | 34 + .../Xml/CodeCoverage/Report/Text.php | 48 + .../Xml/CodeCoverage/Report/Xml.php | 34 + .../Configuration/Xml/Configuration.php | 104 + .../Xml/DefaultConfiguration.php | 166 + .../TextUI/Configuration/Xml/Exception.php | 21 + .../TextUI/Configuration/Xml/Generator.php | 73 + .../src/TextUI/Configuration/Xml/Groups.php | 51 + .../Xml/LoadedFromFileConfiguration.php | 67 + .../src/TextUI/Configuration/Xml/Loader.php | 1052 ++++++ .../Configuration/Xml/Logging/Junit.php | 34 + .../Configuration/Xml/Logging/Logging.php | 105 + .../Configuration/Xml/Logging/TeamCity.php | 34 + .../Xml/Logging/TestDox/Html.php | 34 + .../Xml/Logging/TestDox/Text.php | 34 + .../Xml/Migration/MigrationBuilder.php | 88 + .../Xml/Migration/MigrationException.php | 22 + .../Migration/Migrations/ConvertLogTypes.php | 55 + .../Migrations/CoverageCloverToReport.php | 34 + .../Migrations/CoverageCrap4jToReport.php | 35 + .../Migrations/CoverageHtmlToReport.php | 35 + .../Migrations/CoveragePhpToReport.php | 33 + .../Migrations/CoverageTextToReport.php | 35 + .../Migrations/CoverageXmlToReport.php | 33 + .../IntroduceCacheDirectoryAttribute.php | 35 + .../Migrations/IntroduceCoverageElement.php | 30 + .../Migrations/LogToReportMigration.php | 81 + .../Xml/Migration/Migrations/Migration.php | 22 + ...ttributesFromFilterWhitelistToCoverage.php | 53 + .../MoveAttributesFromRootToCoverage.php | 52 + .../MoveCoverageDirectoriesToSource.php | 64 + .../MoveWhitelistExcludesToCoverage.php | 73 + .../MoveWhitelistIncludesToCoverage.php | 54 + ...ResourceUsageDuringSmallTestsAttribute.php | 33 + ...StrictAboutTodoAnnotatedTestsAttribute.php | 33 + .../RemoveCacheResultFileAttribute.php | 33 + .../Migrations/RemoveCacheTokensAttribute.php | 33 + ...RemoveConversionToExceptionsAttributes.php | 45 + ...CoverageElementCacheDirectoryAttribute.php | 34 + ...eElementProcessUncoveredFilesAttribute.php | 34 + .../Migrations/RemoveEmptyFilter.php | 56 + .../Migration/Migrations/RemoveListeners.php | 32 + .../Migration/Migrations/RemoveLogTypes.php | 41 + .../Migrations/RemoveLoggingElements.php | 50 + .../RemoveNoInteractionAttribute.php | 33 + .../Migrations/RemovePrinterAttributes.php | 37 + .../Migrations/RemoveTestDoxGroupsElement.php | 32 + .../RemoveTestSuiteLoaderAttributes.php | 37 + .../Migrations/RemoveVerboseAttribute.php | 33 + .../RenameBackupStaticAttributesAttribute.php | 40 + ...BeStrictAboutCoversAnnotationAttribute.php | 40 + .../RenameForceCoversAnnotationAttribute.php | 40 + .../Migrations/UpdateSchemaLocation.php | 36 + .../Configuration/Xml/Migration/Migrator.php | 51 + .../Xml/Migration/SnapshotNodeList.php | 53 + .../src/TextUI/Configuration/Xml/PHPUnit.php | 515 +++ .../FailedSchemaDetectionResult.php | 21 + .../SchemaDetector/SchemaDetectionResult.php | 38 + .../Xml/SchemaDetector/SchemaDetector.php | 41 + .../SuccessfulSchemaDetectionResult.php | 49 + .../TextUI/Configuration/Xml/SchemaFinder.php | 82 + .../Configuration/Xml/TestSuiteMapper.php | 117 + .../Xml/Validator/ValidationResult.php | 73 + .../Configuration/Xml/Validator/Validator.php | 37 + .../Exception/CannotOpenSocketException.php | 32 + .../src/TextUI/Exception/Exception.php | 21 + .../Exception/InvalidSocketException.php | 31 + .../src/TextUI/Exception/RuntimeException.php | 19 + .../TestDirectoryNotFoundException.php | 31 + .../Exception/TestFileNotFoundException.php | 31 + vendor/phpunit/phpunit/src/TextUI/Help.php | 318 ++ .../ProgressPrinter/ProgressPrinter.php | 402 +++ ...BeforeTestClassMethodErroredSubscriber.php | 26 + .../ProgressPrinter/Subscriber/Subscriber.php | 30 + .../TestConsideredRiskySubscriber.php | 26 + .../Subscriber/TestErroredSubscriber.php | 26 + .../Subscriber/TestFailedSubscriber.php | 26 + .../Subscriber/TestFinishedSubscriber.php | 26 + .../TestMarkedIncompleteSubscriber.php | 26 + .../Subscriber/TestPreparedSubscriber.php | 26 + .../TestRunnerExecutionStartedSubscriber.php | 26 + .../Subscriber/TestSkippedSubscriber.php | 26 + .../TestTriggeredDeprecationSubscriber.php | 26 + .../TestTriggeredErrorSubscriber.php | 26 + .../TestTriggeredNoticeSubscriber.php | 26 + .../TestTriggeredPhpDeprecationSubscriber.php | 26 + .../TestTriggeredPhpNoticeSubscriber.php | 26 + .../TestTriggeredPhpWarningSubscriber.php | 26 + ...tTriggeredPhpunitDeprecationSubscriber.php | 26 + .../TestTriggeredPhpunitWarningSubscriber.php | 26 + .../TestTriggeredWarningSubscriber.php | 26 + .../TextUI/Output/Default/ResultPrinter.php | 634 ++++ .../Default/UnexpectedOutputPrinter.php | 38 + .../phpunit/src/TextUI/Output/Facade.php | 281 ++ .../TextUI/Output/Printer/DefaultPrinter.php | 122 + .../src/TextUI/Output/Printer/NullPrinter.php | 26 + .../src/TextUI/Output/Printer/Printer.php | 22 + .../src/TextUI/Output/SummaryPrinter.php | 160 + .../TextUI/Output/TestDox/ResultPrinter.php | 366 +++ .../src/TextUI/ShellExitCodeCalculator.php | 170 + .../phpunit/phpunit/src/TextUI/TestRunner.php | 76 + .../src/TextUI/TestSuiteFilterProcessor.php | 84 + vendor/phpunit/phpunit/src/Util/Cloner.php | 36 + vendor/phpunit/phpunit/src/Util/Color.php | 181 + .../phpunit/src/Util/Exception/Exception.php | 21 + .../Exception/InvalidDirectoryException.php | 31 + .../Util/Exception/InvalidJsonException.php | 21 + .../InvalidVersionOperatorException.php | 31 + .../Util/Exception/PhpProcessException.php | 22 + .../src/Util/Exception/XmlException.php | 22 + .../phpunit/phpunit/src/Util/ExcludeList.php | 231 ++ vendor/phpunit/phpunit/src/Util/Exporter.php | 63 + .../phpunit/phpunit/src/Util/Filesystem.php | 51 + vendor/phpunit/phpunit/src/Util/Filter.php | 117 + .../phpunit/phpunit/src/Util/GlobalState.php | 289 ++ .../phpunit/src/Util/Http/Downloader.php | 23 + .../phpunit/src/Util/Http/PhpDownloader.php | 30 + vendor/phpunit/phpunit/src/Util/Json.php | 102 + .../src/Util/PHP/AbstractPhpProcess.php | 314 ++ .../src/Util/PHP/DefaultPhpProcess.php | 148 + .../src/Util/PHP/Template/PhptTestCase.tpl | 56 + .../src/Util/PHP/Template/TestCaseClass.tpl | 116 + .../src/Util/PHP/Template/TestCaseMethod.tpl | 116 + .../phpunit/phpunit/src/Util/Reflection.php | 107 + vendor/phpunit/phpunit/src/Util/Test.php | 40 + .../src/Util/ThrowableToStringMapper.php | 52 + .../src/Util/VersionComparisonOperator.php | 57 + .../phpunit/phpunit/src/Util/Xml/Loader.php | 125 + vendor/phpunit/phpunit/src/Util/Xml/Xml.php | 81 + vendor/sebastian/cli-parser/ChangeLog.md | 30 + vendor/sebastian/cli-parser/LICENSE | 29 + vendor/sebastian/cli-parser/README.md | 22 + vendor/sebastian/cli-parser/SECURITY.md | 30 + vendor/sebastian/cli-parser/composer.json | 42 + vendor/sebastian/cli-parser/src/Parser.php | 206 ++ .../exceptions/AmbiguousOptionException.php | 26 + .../cli-parser/src/exceptions/Exception.php | 16 + .../OptionDoesNotAllowArgumentException.php | 26 + ...RequiredOptionArgumentMissingException.php | 26 + .../src/exceptions/UnknownOptionException.php | 26 + .../.psalm/baseline.xml | 9 + .../.psalm/config.xml | 15 + .../code-unit-reverse-lookup/ChangeLog.md | 45 + .../code-unit-reverse-lookup/LICENSE | 29 + .../code-unit-reverse-lookup/README.md | 22 + .../code-unit-reverse-lookup/SECURITY.md | 9 + .../code-unit-reverse-lookup/composer.json | 36 + .../code-unit-reverse-lookup/src/Wizard.php | 114 + vendor/sebastian/code-unit/ChangeLog.md | 78 + vendor/sebastian/code-unit/LICENSE | 29 + vendor/sebastian/code-unit/README.md | 22 + vendor/sebastian/code-unit/SECURITY.md | 9 + vendor/sebastian/code-unit/composer.json | 50 + .../code-unit/src/ClassMethodUnit.php | 24 + vendor/sebastian/code-unit/src/ClassUnit.php | 24 + vendor/sebastian/code-unit/src/CodeUnit.php | 478 +++ .../code-unit/src/CodeUnitCollection.php | 74 + .../src/CodeUnitCollectionIterator.php | 54 + vendor/sebastian/code-unit/src/FileUnit.php | 24 + .../sebastian/code-unit/src/FunctionUnit.php | 24 + .../code-unit/src/InterfaceMethodUnit.php | 24 + .../sebastian/code-unit/src/InterfaceUnit.php | 24 + vendor/sebastian/code-unit/src/Mapper.php | 259 ++ .../code-unit/src/TraitMethodUnit.php | 24 + vendor/sebastian/code-unit/src/TraitUnit.php | 24 + .../code-unit/src/exceptions/Exception.php | 16 + .../exceptions/InvalidCodeUnitException.php | 16 + .../src/exceptions/NoTraitException.php | 16 + .../src/exceptions/ReflectionException.php | 16 + vendor/sebastian/comparator/ChangeLog.md | 188 ++ vendor/sebastian/comparator/LICENSE | 29 + vendor/sebastian/comparator/README.md | 43 + vendor/sebastian/comparator/SECURITY.md | 30 + vendor/sebastian/comparator/composer.json | 63 + .../comparator/src/ArrayComparator.php | 127 + .../sebastian/comparator/src/Comparator.php | 32 + .../comparator/src/ComparisonFailure.php | 68 + .../comparator/src/DOMNodeComparator.php | 80 + .../comparator/src/DateTimeComparator.php | 73 + .../comparator/src/ExceptionComparator.php | 41 + vendor/sebastian/comparator/src/Factory.php | 114 + .../comparator/src/MockObjectComparator.php | 43 + .../comparator/src/NumericComparator.php | 67 + .../comparator/src/ObjectComparator.php | 88 + .../comparator/src/ResourceComparator.php | 42 + .../comparator/src/ScalarComparator.php | 81 + .../src/SplObjectStorageComparator.php | 57 + .../comparator/src/TypeComparator.php | 43 + .../comparator/src/exceptions/Exception.php | 16 + .../src/exceptions/RuntimeException.php | 14 + vendor/sebastian/complexity/ChangeLog.md | 68 + vendor/sebastian/complexity/LICENSE | 29 + vendor/sebastian/complexity/README.md | 22 + vendor/sebastian/complexity/SECURITY.md | 30 + vendor/sebastian/complexity/composer.json | 43 + .../sebastian/complexity/src/Calculator.php | 83 + .../complexity/src/Complexity/Complexity.php | 64 + .../src/Complexity/ComplexityCollection.php | 132 + .../ComplexityCollectionIterator.php | 51 + .../complexity/src/Exception/Exception.php | 16 + .../src/Exception/RuntimeException.php | 14 + .../Visitor/ComplexityCalculatingVisitor.php | 132 + ...CyclomaticComplexityCalculatingVisitor.php | 60 + vendor/sebastian/diff/ChangeLog.md | 148 + vendor/sebastian/diff/LICENSE | 29 + vendor/sebastian/diff/README.md | 206 ++ vendor/sebastian/diff/SECURITY.md | 30 + vendor/sebastian/diff/composer.json | 51 + vendor/sebastian/diff/src/Chunk.php | 124 + vendor/sebastian/diff/src/Diff.php | 114 + vendor/sebastian/diff/src/Differ.php | 239 ++ .../src/Exception/ConfigurationException.php | 37 + .../diff/src/Exception/Exception.php | 16 + .../Exception/InvalidArgumentException.php | 14 + vendor/sebastian/diff/src/Line.php | 66 + .../LongestCommonSubsequenceCalculator.php | 18 + ...ientLongestCommonSubsequenceCalculator.php | 97 + .../src/Output/AbstractChunkOutputBuilder.php | 52 + .../diff/src/Output/DiffOnlyOutputBuilder.php | 70 + .../src/Output/DiffOutputBuilderInterface.php | 19 + .../Output/StrictUnifiedDiffOutputBuilder.php | 326 ++ .../src/Output/UnifiedDiffOutputBuilder.php | 257 ++ vendor/sebastian/diff/src/Parser.php | 112 + ...ientLongestCommonSubsequenceCalculator.php | 82 + vendor/sebastian/environment/ChangeLog.md | 207 ++ vendor/sebastian/environment/LICENSE | 29 + vendor/sebastian/environment/README.md | 22 + vendor/sebastian/environment/SECURITY.md | 30 + vendor/sebastian/environment/composer.json | 44 + vendor/sebastian/environment/src/Console.php | 187 ++ vendor/sebastian/environment/src/Runtime.php | 294 ++ vendor/sebastian/exporter/ChangeLog.md | 39 + vendor/sebastian/exporter/LICENSE | 29 + vendor/sebastian/exporter/README.md | 176 + vendor/sebastian/exporter/SECURITY.md | 30 + vendor/sebastian/exporter/composer.json | 65 + vendor/sebastian/exporter/src/Exporter.php | 334 ++ vendor/sebastian/global-state/ChangeLog.md | 108 + vendor/sebastian/global-state/LICENSE | 29 + vendor/sebastian/global-state/README.md | 22 + vendor/sebastian/global-state/SECURITY.md | 30 + vendor/sebastian/global-state/composer.json | 52 + .../global-state/src/CodeExporter.php | 106 + .../global-state/src/ExcludeList.php | 95 + .../sebastian/global-state/src/Restorer.php | 106 + .../sebastian/global-state/src/Snapshot.php | 371 +++ .../global-state/src/exceptions/Exception.php | 16 + .../src/exceptions/RuntimeException.php | 14 + vendor/sebastian/lines-of-code/ChangeLog.md | 55 + vendor/sebastian/lines-of-code/LICENSE | 29 + vendor/sebastian/lines-of-code/README.md | 22 + vendor/sebastian/lines-of-code/SECURITY.md | 30 + vendor/sebastian/lines-of-code/composer.json | 43 + .../sebastian/lines-of-code/src/Counter.php | 90 + .../lines-of-code/src/Exception/Exception.php | 16 + .../Exception/IllogicalValuesException.php | 16 + .../src/Exception/NegativeValueException.php | 16 + .../src/Exception/RuntimeException.php | 14 + .../lines-of-code/src/LineCountingVisitor.php | 93 + .../lines-of-code/src/LinesOfCode.php | 119 + .../sebastian/object-enumerator/ChangeLog.md | 95 + vendor/sebastian/object-enumerator/LICENSE | 29 + vendor/sebastian/object-enumerator/README.md | 22 + .../sebastian/object-enumerator/SECURITY.md | 9 + .../sebastian/object-enumerator/composer.json | 43 + .../sebastian/object-enumerator/phpunit.xml | 24 + .../object-enumerator/src/Enumerator.php | 68 + .../sebastian/object-reflector/ChangeLog.md | 66 + vendor/sebastian/object-reflector/LICENSE | 29 + vendor/sebastian/object-reflector/README.md | 22 + vendor/sebastian/object-reflector/SECURITY.md | 9 + .../sebastian/object-reflector/composer.json | 41 + .../object-reflector/src/ObjectReflector.php | 41 + .../sebastian/recursion-context/ChangeLog.md | 54 + vendor/sebastian/recursion-context/LICENSE | 29 + vendor/sebastian/recursion-context/README.md | 20 + .../sebastian/recursion-context/SECURITY.md | 30 + .../sebastian/recursion-context/composer.json | 48 + .../recursion-context/src/Context.php | 141 + vendor/sebastian/type/ChangeLog.md | 176 + vendor/sebastian/type/LICENSE | 29 + vendor/sebastian/type/README.md | 22 + vendor/sebastian/type/SECURITY.md | 9 + vendor/sebastian/type/composer.json | 50 + vendor/sebastian/type/infection.json | 12 + vendor/sebastian/type/src/Parameter.php | 38 + .../sebastian/type/src/ReflectionMapper.php | 176 + vendor/sebastian/type/src/TypeName.php | 76 + .../type/src/exception/Exception.php | 16 + .../type/src/exception/RuntimeException.php | 14 + .../sebastian/type/src/type/CallableType.php | 182 + vendor/sebastian/type/src/type/FalseType.php | 42 + .../type/src/type/GenericObjectType.php | 51 + .../type/src/type/IntersectionType.php | 126 + .../sebastian/type/src/type/IterableType.php | 71 + vendor/sebastian/type/src/type/MixedType.php | 41 + vendor/sebastian/type/src/type/NeverType.php | 36 + vendor/sebastian/type/src/type/NullType.php | 41 + vendor/sebastian/type/src/type/ObjectType.php | 67 + vendor/sebastian/type/src/type/SimpleType.php | 83 + vendor/sebastian/type/src/type/StaticType.php | 64 + vendor/sebastian/type/src/type/TrueType.php | 42 + vendor/sebastian/type/src/type/Type.php | 192 ++ vendor/sebastian/type/src/type/UnionType.php | 138 + .../sebastian/type/src/type/UnknownType.php | 41 + vendor/sebastian/type/src/type/VoidType.php | 36 + vendor/sebastian/version/ChangeLog.md | 43 + vendor/sebastian/version/LICENSE | 29 + vendor/sebastian/version/README.md | 50 + vendor/sebastian/version/SECURITY.md | 9 + vendor/sebastian/version/composer.json | 37 + vendor/sebastian/version/src/Version.php | 93 + vendor/theseer/tokenizer/CHANGELOG.md | 87 + vendor/theseer/tokenizer/LICENSE | 30 + vendor/theseer/tokenizer/README.md | 47 + vendor/theseer/tokenizer/composer.json | 27 + vendor/theseer/tokenizer/composer.lock | 22 + vendor/theseer/tokenizer/src/Exception.php | 5 + vendor/theseer/tokenizer/src/NamespaceUri.php | 25 + .../tokenizer/src/NamespaceUriException.php | 5 + vendor/theseer/tokenizer/src/Token.php | 35 + .../theseer/tokenizer/src/TokenCollection.php | 93 + .../src/TokenCollectionException.php | 5 + vendor/theseer/tokenizer/src/Tokenizer.php | 147 + .../theseer/tokenizer/src/XMLSerializer.php | 79 + 1857 files changed, 163516 insertions(+) create mode 100644 .DS_Store create mode 100644 .RData create mode 100644 .Rhistory create mode 100644 .dockerignore create mode 100644 .env create mode 100644 .htaccess create mode 100644 Dockerfile create mode 100644 admin/app_log.php create mode 100644 admin/dashboard.php create mode 100644 admin/manage_aboutus.php create mode 100644 admin/manage_announcements.php create mode 100644 admin/manage_classifications.php create mode 100644 admin/manage_contactus.php create mode 100644 admin/manage_datasources.php create mode 100644 admin/manage_faq.php create mode 100644 admin/manage_permissions_admin.php create mode 100644 admin/manage_slides.php create mode 100644 admin/manage_users.php create mode 100644 admin/r_in_jupyter.php create mode 100644 api/run_r_script.php create mode 100644 assets/.DS_Store create mode 100644 assets/diagrams/data_ecosystem.mmd create mode 100644 assets/images/niph_dsp_data_ecosystem.png create mode 100644 assets/images/niphlogo.ico create mode 100644 assets/images/niphlogo.png create mode 100644 browse_datasources.php create mode 100644 classes/Aboutus.php create mode 100644 classes/Announcement.php create mode 100644 classes/Classifications.php create mode 100644 classes/Contactus.php create mode 100644 classes/DataSource.php create mode 100644 classes/Faq.php create mode 100644 classes/OAuth.php create mode 100644 classes/Permission.php create mode 100644 classes/PermissionManager.php create mode 100644 classes/Slide.php create mode 100644 classes/User.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config.php create mode 100644 data_hybrid/browse_datasources.php create mode 100644 data_hybrid/dashboard.php create mode 100644 data_hybrid/download.php create mode 100644 data_hybrid/manage_my_datasources.php create mode 100644 data_hybrid/manage_permissions.php create mode 100644 data_hybrid/my_downloads.php create mode 100644 data_hybrid/my_permissions.php create mode 100644 data_hybrid/r_in_jupyter.php create mode 100644 data_owner/dashboard.php create mode 100644 data_owner/manage_my_datasources.php create mode 100644 data_owner/manage_permissions.php create mode 100644 data_owner/my_analytics.php create mode 100644 data_owner/run_r_scripts.php create mode 100644 data_user/browse_datasources.php create mode 100644 data_user/dashboard.php create mode 100644 data_user/download.php create mode 100644 data_user/indexTesting.php create mode 100644 data_user/my_downloads.php create mode 100644 data_user/my_permissions.php create mode 100644 data_user/process_request_permission.php create mode 100644 data_user/r_in_jupyter.php create mode 100644 db/migrations/20241103_oauth_tables.sql create mode 100644 db/migrations/20250114_add_permission_proof_path.sql create mode 100644 db/niph_dsps.sql create mode 100644 docker-compose.yml create mode 100644 docker/app-entrypoint.sh create mode 100644 docker/custom.ini create mode 100644 docker/jupyter/jupyter_server_config.py create mode 100644 docker/jupyterhub/Dockerfile create mode 100644 docker/jupyterhub/jupyterhub_config.py create mode 100644 includes/auth.php create mode 100644 includes/footer_admin.php create mode 100644 includes/footer_contributor.php create mode 100644 includes/footer_owner.php create mode 100644 includes/footer_public.php create mode 100644 includes/footer_user.php create mode 100644 includes/header_admin.php create mode 100644 includes/header_contributor.php create mode 100644 includes/header_owner.php create mode 100644 includes/header_public.php create mode 100644 includes/header_user.php create mode 100644 includes/jupyter_config_reference.php create mode 100644 includes/jupyter_helpers.php create mode 100644 includes/nav_admin.php create mode 100644 includes/nav_contributor.php create mode 100644 includes/nav_owner.php create mode 100644 includes/nav_public.php create mode 100644 includes/nav_user.php create mode 100644 index.php create mode 100644 install_config.php create mode 100644 logout.php create mode 100755 logs/.gitkeep create mode 100755 logs/app.log create mode 100644 nginx.conf create mode 100644 note.md create mode 100644 oauth/authorize.php create mode 100644 oauth/token.php create mode 100644 oauth/userinfo.php create mode 100644 phpunit.xml.dist create mode 100644 process_contact.php create mode 100644 process_login.php create mode 100644 process_register.php create mode 100644 profile.php create mode 100644 r_scripts/.ipynb_checkpoints/data_summary-checkpoint.R create mode 100644 r_scripts/category_frequency.R create mode 100644 r_scripts/data_summary.R create mode 100644 r_scripts/descriptive_stats.R create mode 100644 scripts/seed_jupyterhub_client.php create mode 100644 scripts/trigger_workspace_sync.php create mode 100644 tests/Helpers/JupyterHelpersTest.php create mode 100644 tests/bootstrap.php create mode 100755 uploads/.DS_Store create mode 100755 uploads/announcements/.gitkeep create mode 100755 uploads/announcements/announcement_69134047cbce0.png create mode 100755 uploads/announcements/announcement_6914b1463821d.png create mode 100755 uploads/announcements/announcement_6914b29f6aeac.png create mode 100755 uploads/data_ecosystem/niph_dsp_data_ecosystem.png create mode 100755 uploads/datasources/.gitkeep create mode 100755 uploads/datasources/datasource_68eef48bbe249.pdf create mode 100755 uploads/datasources/datasource_69031cab35897.csv create mode 100755 uploads/datasources/datasource_6913347f4448d.pdf create mode 100755 uploads/datasources/datasource_6914abacc0d2d.pdf create mode 100755 uploads/datasources/datasource_6914abacc1819.pdf create mode 100755 uploads/datasources/datasource_6914abacc20c2.pdf create mode 100755 uploads/datasources/datasource_6914acd4457ed.pdf create mode 100755 uploads/datasources/datasource_6914acd4469c3.pdf create mode 100755 uploads/datasources/datasource_6914acd447794.pdf create mode 100755 uploads/datasources/datasource_69368a828843c_individual.dta create mode 100755 uploads/datasources/datasource_6936917a7503c_household.dta create mode 100755 uploads/datasources/datasource_69369f61b1b4d_household-wide-3.dta create mode 100755 uploads/datasources/datasource_693834f41d365_individual-health-lifestyle-and-care-seeking-datas.dta create mode 100755 uploads/datasources/datasource_69427e9be4fe3_questionnaire.pdf create mode 100755 uploads/jupyter_workspace/.gitignore create mode 100755 uploads/jupyter_workspace/.htaccess create mode 100755 uploads/permission_proofs/111_2b244e290a8ec4dd.pdf create mode 100755 uploads/permission_proofs/111_4ad1f733bf0af41f.pdf create mode 100755 uploads/permission_proofs/112_1cef429f1cfbdb18.pdf create mode 100755 uploads/permission_proofs/112_512d70a7d311c167.pdf create mode 100755 uploads/permission_proofs/112_614088e027f0a120.pdf create mode 100755 uploads/permission_proofs/112_6514768a50170927.pdf create mode 100755 uploads/permission_proofs/112_c0168e06927f56d2.pdf create mode 100755 uploads/permission_proofs/112_d7472874e6a14767.pdf create mode 100755 uploads/permission_proofs/113_3cb551f388e44388.pdf create mode 100755 uploads/permission_proofs/113_83cb17260b3b684e.pdf create mode 100755 uploads/permission_proofs/113_fb5b39c491bf59f2.pdf create mode 100755 uploads/permission_proofs/114_a3aca9fce7e79ad0.pdf create mode 100755 uploads/permission_proofs/114_ebba3b0b3f0eda6f.pdf create mode 100755 uploads/permission_proofs/115_40a1f6d150fefbdc.pdf create mode 100755 uploads/permission_proofs/116_9309c1f48740b5ea.pdf create mode 100755 uploads/permission_proofs/117_bdf6dffc75b365dd.pdf create mode 100755 uploads/permission_proofs/122_6608c4133a837b01.pdf create mode 100755 uploads/permission_proofs/122_8bd46bc453d755ed.pdf create mode 100755 uploads/permission_proofs/122_ba6ed4e43df5bdf3.pdf create mode 100755 uploads/permission_proofs/122_e4a1393aaa5bf8d3.pdf create mode 100755 uploads/permission_proofs/2_09fd4e13e8321d91.pdf create mode 100755 uploads/permission_proofs/2_1a75981da8e5f636.pdf create mode 100755 uploads/permission_proofs/2_1d9f0eb42a4b3c7a.pdf create mode 100755 uploads/permission_proofs/2_66ca7e3b59134941.pdf create mode 100755 uploads/permission_proofs/2_80c4dd7ee257b1cf.pdf create mode 100755 uploads/permission_proofs/2_8651d2182ab05914.pdf create mode 100755 uploads/permission_proofs/2_9d96d3bcd4a2ec74.pdf create mode 100755 uploads/permission_proofs/3_21d0fe450b003394.pdf create mode 100755 uploads/permission_proofs/3_403222c3bba8372c.pdf create mode 100755 uploads/permission_proofs/3_9dae3103f90ba5db.pdf create mode 100755 uploads/policy/policy.pdf create mode 100755 uploads/slides/.DS_Store create mode 100755 uploads/slides/.gitkeep create mode 100755 uploads/slides/slide_689aae8993e8c.jpg create mode 100755 uploads/slides/slide_68f5da6a43a8a.jpg create mode 100755 uploads/slides/slide_68f5da6a43a8d.jpg create mode 100755 uploads/slides/slide_6904393484fbf.jpg create mode 100755 uploads/slides/slide_69043941bc921.jpg create mode 100755 uploads/slides/slide_6904394af324f.jpg create mode 100644 user_guide.php create mode 100644 vendor/autoload.php create mode 100755 vendor/bin/php-parse create mode 100755 vendor/bin/phpunit create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/composer/installed.php create mode 100644 vendor/myclabs/deep-copy/LICENSE create mode 100644 vendor/myclabs/deep-copy/README.md create mode 100644 vendor/myclabs/deep-copy/composer.json create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php create mode 100644 vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php create mode 100644 vendor/nikic/php-parser/LICENSE create mode 100644 vendor/nikic/php-parser/README.md create mode 100755 vendor/nikic/php-parser/bin/php-parse create mode 100644 vendor/nikic/php-parser/composer.json create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Declaration.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/EnumCase.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Enum_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/FunctionLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Interface_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Method.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Property.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/TraitUseAdaptation.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Builder/Use_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Comment/Doc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluationException.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Error.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/Differ.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/TokenPolyfill.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Internal/TokenStream.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/JsonDecoder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/Emulative.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AsymmetricVisibilityTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/AttributeEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/EnumTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ExplicitOctalEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/MatchTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/NullsafeTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PipeOperatorEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/PropertyTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyFunctionTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReadonlyTokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/ReverseEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/TokenEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/VoidCastEmulator.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Modifiers.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NameContext.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Arg.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/ArrayItem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Attribute.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/AttributeGroup.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/ClosureUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/ComplexType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/DeclareItem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayDimFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Array_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ArrowFunction.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Assign.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/BitwiseXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Coalesce.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Concat.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Div.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Minus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Mul.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Plus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/Pow.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftLeft.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignOp/ShiftRight.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/AssignRef.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BitwiseXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/BooleanOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Coalesce.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Concat.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Div.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Equal.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Greater.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/GreaterOrEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Identical.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalAnd.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalOr.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/LogicalXor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Minus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Mul.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/NotIdentical.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pipe.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Plus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Pow.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftLeft.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/ShiftRight.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Smaller.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/SmallerOrEqual.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BinaryOp/Spaceship.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BitwiseNot.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/BooleanNot.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/CallLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Array_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Bool_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Double.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Int_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Object_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/String_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Unset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Cast/Void_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Clone_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Closure.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ConstFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Empty_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Error.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ErrorSuppress.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Eval_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Exit_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/FuncCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Include_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Instanceof_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Isset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/List_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Match_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/MethodCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/New_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafeMethodCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/NullsafePropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostDec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PostInc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreDec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PreInc.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Print_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/PropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ShellExec.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticCall.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/StaticPropertyFetch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Ternary.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Throw_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryMinus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/UnaryPlus.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Variable.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/YieldFrom.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Expr/Yield_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Identifier.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/InterpolatedStringPart.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/IntersectionType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/MatchArm.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/FullyQualified.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Name/Relative.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/NullableType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Param.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/PropertyHook.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/PropertyItem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Float_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/Int_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/InterpolatedString.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Dir.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/File.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Line.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Method.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Property.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/MagicConst/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/StaticVar.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Block.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Break_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Case_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Catch_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassMethod.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Const_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Continue_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Declare_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Do_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Echo_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ElseIf_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Else_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/EnumCase.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Enum_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Expression.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Finally_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/For_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Foreach_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Global_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Goto_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/GroupUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/HaltCompiler.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/If_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/InlineHTML.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Interface_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Label.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Namespace_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Nop.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Property.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Return_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Static_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Switch_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Alias.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TraitUseAdaptation/Precedence.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Trait_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/TryCatch.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Unset_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Use_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/While_.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/UnionType.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/UseItem.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VarLikeIdentifier.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Node/VariadicPlaceholder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeDumper.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeFinder.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeTraverserInterface.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CloningVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/CommentAnnotatingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FindingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/FirstFindingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NameResolver.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/NodeConnectingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitor/ParentConnectingVisitor.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/NodeVisitorAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Parser/Php8.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/ParserFactory.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PhpVersion.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/Token.php create mode 100644 vendor/nikic/php-parser/lib/PhpParser/compatibility_tokens.php create mode 100644 vendor/phar-io/manifest/.github/FUNDING.yml create mode 100644 vendor/phar-io/manifest/.github/workflows/ci.yml create mode 100644 vendor/phar-io/manifest/.php-cs-fixer.dist.php create mode 100644 vendor/phar-io/manifest/CHANGELOG.md create mode 100644 vendor/phar-io/manifest/LICENSE create mode 100644 vendor/phar-io/manifest/README.md create mode 100644 vendor/phar-io/manifest/composer.json create mode 100644 vendor/phar-io/manifest/composer.lock create mode 100644 vendor/phar-io/manifest/manifest.xsd create mode 100644 vendor/phar-io/manifest/src/ManifestDocumentMapper.php create mode 100644 vendor/phar-io/manifest/src/ManifestLoader.php create mode 100644 vendor/phar-io/manifest/src/ManifestSerializer.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/Exception.php create mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestElementException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php create mode 100644 vendor/phar-io/manifest/src/exceptions/NoEmailAddressException.php create mode 100644 vendor/phar-io/manifest/src/values/Application.php create mode 100644 vendor/phar-io/manifest/src/values/ApplicationName.php create mode 100644 vendor/phar-io/manifest/src/values/Author.php create mode 100644 vendor/phar-io/manifest/src/values/AuthorCollection.php create mode 100644 vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php create mode 100644 vendor/phar-io/manifest/src/values/BundledComponent.php create mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollection.php create mode 100644 vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php create mode 100644 vendor/phar-io/manifest/src/values/CopyrightInformation.php create mode 100644 vendor/phar-io/manifest/src/values/Email.php create mode 100644 vendor/phar-io/manifest/src/values/Extension.php create mode 100644 vendor/phar-io/manifest/src/values/Library.php create mode 100644 vendor/phar-io/manifest/src/values/License.php create mode 100644 vendor/phar-io/manifest/src/values/Manifest.php create mode 100644 vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php create mode 100644 vendor/phar-io/manifest/src/values/PhpVersionRequirement.php create mode 100644 vendor/phar-io/manifest/src/values/Requirement.php create mode 100644 vendor/phar-io/manifest/src/values/RequirementCollection.php create mode 100644 vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php create mode 100644 vendor/phar-io/manifest/src/values/Type.php create mode 100644 vendor/phar-io/manifest/src/values/Url.php create mode 100644 vendor/phar-io/manifest/src/xml/AuthorElement.php create mode 100644 vendor/phar-io/manifest/src/xml/AuthorElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/BundlesElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ComponentElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ComponentElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/ContainsElement.php create mode 100644 vendor/phar-io/manifest/src/xml/CopyrightElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/ExtElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ExtElementCollection.php create mode 100644 vendor/phar-io/manifest/src/xml/ExtensionElement.php create mode 100644 vendor/phar-io/manifest/src/xml/LicenseElement.php create mode 100644 vendor/phar-io/manifest/src/xml/ManifestDocument.php create mode 100644 vendor/phar-io/manifest/src/xml/ManifestElement.php create mode 100644 vendor/phar-io/manifest/src/xml/PhpElement.php create mode 100644 vendor/phar-io/manifest/src/xml/RequiresElement.php create mode 100644 vendor/phar-io/manifest/tools/php-cs-fixer.d/PhpdocSingleLineVarFixer.php create mode 100644 vendor/phar-io/manifest/tools/php-cs-fixer.d/header.txt create mode 100644 vendor/phar-io/version/CHANGELOG.md create mode 100644 vendor/phar-io/version/LICENSE create mode 100644 vendor/phar-io/version/README.md create mode 100644 vendor/phar-io/version/composer.json create mode 100644 vendor/phar-io/version/src/BuildMetaData.php create mode 100644 vendor/phar-io/version/src/PreReleaseSuffix.php create mode 100644 vendor/phar-io/version/src/Version.php create mode 100644 vendor/phar-io/version/src/VersionConstraintParser.php create mode 100644 vendor/phar-io/version/src/VersionConstraintValue.php create mode 100644 vendor/phar-io/version/src/VersionNumber.php create mode 100644 vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php create mode 100644 vendor/phar-io/version/src/constraints/AnyVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/ExactVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php create mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php create mode 100644 vendor/phar-io/version/src/constraints/VersionConstraint.php create mode 100644 vendor/phar-io/version/src/exceptions/Exception.php create mode 100644 vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php create mode 100644 vendor/phar-io/version/src/exceptions/InvalidVersionException.php create mode 100644 vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php create mode 100644 vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php create mode 100644 vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php create mode 100644 vendor/phpunit/php-code-coverage/ChangeLog-10.1.md create mode 100644 vendor/phpunit/php-code-coverage/LICENSE create mode 100644 vendor/phpunit/php-code-coverage/README.md create mode 100644 vendor/phpunit/php-code-coverage/SECURITY.md create mode 100644 vendor/phpunit/php-code-coverage/composer.json create mode 100644 vendor/phpunit/php-code-coverage/src/CodeCoverage.php create mode 100644 vendor/phpunit/php-code-coverage/src/Data/ProcessedCodeCoverageData.php create mode 100644 vendor/phpunit/php-code-coverage/src/Data/RawCodeCoverageData.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Driver.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/Selector.php create mode 100644 vendor/phpunit/php-code-coverage/src/Driver/XdebugDriver.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/BranchAndPathCoverageNotSupportedException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/DeadCodeDetectionNotSupportedException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/DirectoryCouldNotBeCreatedException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/Exception.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/FileCouldNotBeWrittenException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverAvailableException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/NoCodeCoverageDriverWithPathCoverageSupportAvailableException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/ParserException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/PathExistsButIsNotDirectoryException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/PcovNotAvailableException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/ReflectionException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/ReportAlreadyFinalizedException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/StaticAnalysisCacheNotConfiguredException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/TestIdMissingException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/WriteOperationFailedException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/XdebugNotAvailableException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/XdebugNotEnabledException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Exception/XmlException.php create mode 100644 vendor/phpunit/php-code-coverage/src/Filter.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/Builder.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/CrapIndex.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/Node/Iterator.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Clover.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Cobertura.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Crap4j.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Colors.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/CustomCssFile.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/branches.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar_branch.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard_branch.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_branch.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item_branch.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_branch.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item_branch.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/nv.d3.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/line.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/lines.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item_branch.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/paths.html.dist create mode 100644 vendor/phpunit/php-code-coverage/src/Report/PHP.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Text.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Thresholds.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/File.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php create mode 100644 vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php create mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php create mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php create mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/CodeUnitFindingVisitor.php create mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php create mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/FileAnalyser.php create mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/IgnoredLinesFindingVisitor.php create mode 100644 vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Known.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Large.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Medium.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Small.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/TestSize.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestSize/Unknown.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Failure.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Known.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Success.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/TestStatus.php create mode 100644 vendor/phpunit/php-code-coverage/src/TestStatus/Unknown.php create mode 100644 vendor/phpunit/php-code-coverage/src/Util/Filesystem.php create mode 100644 vendor/phpunit/php-code-coverage/src/Util/Percentage.php create mode 100644 vendor/phpunit/php-code-coverage/src/Version.php create mode 100644 vendor/phpunit/php-file-iterator/ChangeLog.md create mode 100644 vendor/phpunit/php-file-iterator/LICENSE create mode 100644 vendor/phpunit/php-file-iterator/README.md create mode 100644 vendor/phpunit/php-file-iterator/SECURITY.md create mode 100644 vendor/phpunit/php-file-iterator/composer.json create mode 100644 vendor/phpunit/php-file-iterator/src/ExcludeIterator.php create mode 100644 vendor/phpunit/php-file-iterator/src/Facade.php create mode 100644 vendor/phpunit/php-file-iterator/src/Factory.php create mode 100644 vendor/phpunit/php-file-iterator/src/Iterator.php create mode 100644 vendor/phpunit/php-invoker/.psalm/baseline.xml create mode 100644 vendor/phpunit/php-invoker/.psalm/config.xml create mode 100644 vendor/phpunit/php-invoker/ChangeLog.md create mode 100644 vendor/phpunit/php-invoker/LICENSE create mode 100644 vendor/phpunit/php-invoker/README.md create mode 100644 vendor/phpunit/php-invoker/SECURITY.md create mode 100644 vendor/phpunit/php-invoker/composer.json create mode 100644 vendor/phpunit/php-invoker/src/Invoker.php create mode 100644 vendor/phpunit/php-invoker/src/exceptions/Exception.php create mode 100644 vendor/phpunit/php-invoker/src/exceptions/ProcessControlExtensionNotLoadedException.php create mode 100644 vendor/phpunit/php-invoker/src/exceptions/TimeoutException.php create mode 100644 vendor/phpunit/php-text-template/ChangeLog.md create mode 100644 vendor/phpunit/php-text-template/LICENSE create mode 100644 vendor/phpunit/php-text-template/README.md create mode 100644 vendor/phpunit/php-text-template/SECURITY.md create mode 100644 vendor/phpunit/php-text-template/composer.json create mode 100644 vendor/phpunit/php-text-template/src/Template.php create mode 100644 vendor/phpunit/php-text-template/src/exceptions/Exception.php create mode 100644 vendor/phpunit/php-text-template/src/exceptions/InvalidArgumentException.php create mode 100644 vendor/phpunit/php-text-template/src/exceptions/RuntimeException.php create mode 100644 vendor/phpunit/php-timer/ChangeLog.md create mode 100644 vendor/phpunit/php-timer/LICENSE create mode 100644 vendor/phpunit/php-timer/README.md create mode 100644 vendor/phpunit/php-timer/SECURITY.md create mode 100644 vendor/phpunit/php-timer/composer.json create mode 100644 vendor/phpunit/php-timer/src/Duration.php create mode 100644 vendor/phpunit/php-timer/src/ResourceUsageFormatter.php create mode 100644 vendor/phpunit/php-timer/src/Timer.php create mode 100644 vendor/phpunit/php-timer/src/exceptions/Exception.php create mode 100644 vendor/phpunit/php-timer/src/exceptions/NoActiveTimerException.php create mode 100644 vendor/phpunit/php-timer/src/exceptions/TimeSinceStartOfRequestNotAvailableException.php create mode 100644 vendor/phpunit/phpunit/ChangeLog-10.5.md create mode 100644 vendor/phpunit/phpunit/DEPRECATIONS.md create mode 100644 vendor/phpunit/phpunit/LICENSE create mode 100644 vendor/phpunit/phpunit/README.md create mode 100644 vendor/phpunit/phpunit/SECURITY.md create mode 100644 vendor/phpunit/phpunit/composer.json create mode 100644 vendor/phpunit/phpunit/composer.lock create mode 100755 vendor/phpunit/phpunit/phpunit create mode 100644 vendor/phpunit/phpunit/phpunit.xsd create mode 100644 vendor/phpunit/phpunit/schema/10.0.xsd create mode 100644 vendor/phpunit/phpunit/schema/10.1.xsd create mode 100644 vendor/phpunit/phpunit/schema/10.2.xsd create mode 100644 vendor/phpunit/phpunit/schema/10.3.xsd create mode 100644 vendor/phpunit/phpunit/schema/10.4.xsd create mode 100644 vendor/phpunit/phpunit/schema/8.5.xsd create mode 100644 vendor/phpunit/phpunit/schema/9.0.xsd create mode 100644 vendor/phpunit/phpunit/schema/9.1.xsd create mode 100644 vendor/phpunit/phpunit/schema/9.2.xsd create mode 100644 vendor/phpunit/phpunit/schema/9.3.xsd create mode 100644 vendor/phpunit/phpunit/schema/9.4.xsd create mode 100644 vendor/phpunit/phpunit/schema/9.5.xsd create mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/CollectingDispatcher.php create mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/DeferringDispatcher.php create mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/DirectDispatcher.php create mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/Dispatcher.php create mode 100644 vendor/phpunit/phpunit/src/Event/Dispatcher/SubscribableDispatcher.php create mode 100644 vendor/phpunit/phpunit/src/Event/Emitter/DispatchingEmitter.php create mode 100644 vendor/phpunit/phpunit/src/Event/Emitter/Emitter.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/Finished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/FinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/Started.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Application/StartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Event.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/EventCollection.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/EventCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailed.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceeded.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Assertion/AssertionSucceededSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegistered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/ComparatorRegisteredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodCalledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErrored.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterLastTestMethodFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodCalledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErrored.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/AfterTestMethodFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodCalledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErrored.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeFirstTestMethodFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodCalledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErrored.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/BeforeTestMethodFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionCalledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErrored.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PostConditionFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionCalledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErrored.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/HookMethod/PreConditionFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRisky.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ConsideredRiskySubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/DeprecationTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/ErrorTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/NoticeTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpDeprecationTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpNoticeTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpWarningTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitDeprecationTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitErrorTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/PhpunitWarningTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Issue/WarningTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Finished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/FinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailed.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStarted.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparationStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/Prepared.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Lifecycle/PreparedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Errored.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/ErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Failed.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/FailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncomplete.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/MarkedIncompleteSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Passed.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/PassedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/Skipped.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/Outcome/SkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutput.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/PrintedUnexpectedOutputSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForAbstractClassCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForIntersectionOfInterfacesCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectForTraitCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/MockObjectFromWsdlCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/PartialMockObjectCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestProxyCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreated.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/Test/TestDouble/TestStubForIntersectionOfInterfacesCreatedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/BootstrapFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/Configured.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ConfiguredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/DeprecationTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealed.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/EventFacadeSealedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAborted.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionAbortedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStarted.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExecutionStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrapped.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionBootstrappedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPhar.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/ExtensionLoadedFromPharSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/Finished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/FinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionDisabledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabled.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionEnabledSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/GarbageCollectionTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/Started.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/StartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestRunner/WarningTriggeredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Filtered.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/FilteredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Finished.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/FinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Loaded.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/LoadedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Skipped.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/SkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Sorted.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/SortedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/Started.php create mode 100644 vendor/phpunit/phpunit/src/Event/Events/TestSuite/StartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/EventAlreadyAssignedException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/EventFacadeIsSealedException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/InvalidArgumentException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/InvalidEventException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/InvalidSubscriberException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/MapError.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/MoreThanOneDataSetFromDataProviderException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoComparisonFailureException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoDataSetFromDataProviderException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoPreviousThrowableException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/NoTestCaseObjectOnCallStackException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/RuntimeException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/SubscriberTypeAlreadyRegisteredException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownEventException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownEventTypeException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Exception/UnknownSubscriberTypeException.php create mode 100644 vendor/phpunit/phpunit/src/Event/Facade.php create mode 100644 vendor/phpunit/phpunit/src/Event/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Event/Tracer.php create mode 100644 vendor/phpunit/phpunit/src/Event/TypeMap.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/ClassMethod.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/ComparisonFailure.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/ComparisonFailureBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/OperatingSystem.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/PHP.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/PHPUnit.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Runtime/Runtime.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Duration.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatus.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/GarbageCollectorStatusProvider.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/HRTime.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Info.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryMeter.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/MemoryUsage.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php81GarbageCollectorStatusProvider.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Php83GarbageCollectorStatusProvider.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/Snapshot.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/StopWatch.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/System.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemMemoryMeter.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatch.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Telemetry/SystemStopWatchWithOffset.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/Phpt.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/Test.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestCollection.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromDataProvider.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/DataFromTestDependency.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestData.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollection.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestData/TestDataCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestDox.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestDoxBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestMethod.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Test/TestMethodBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestClass.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteForTestMethodWithDataProvider.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/TestSuite/TestSuiteWithName.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/Throwable.php create mode 100644 vendor/phpunit/phpunit/src/Event/Value/ThrowableBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Assert.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Assert/Functions.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/After.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/AfterClass.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/BackupGlobals.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/BackupStaticProperties.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Before.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/BeforeClass.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CodeCoverageIgnore.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CoversClass.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CoversFunction.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/CoversNothing.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DataProvider.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DataProviderExternal.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Depends.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternal.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingDeepClone.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsExternalUsingShallowClone.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClass.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingDeepClone.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsOnClassUsingShallowClone.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingDeepClone.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DependsUsingShallowClone.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/DoesNotPerformAssertions.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeGlobalVariableFromBackup.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/ExcludeStaticPropertyFromBackup.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Group.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreClassForCodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreDeprecations.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreFunctionForCodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/IgnoreMethodForCodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Large.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Medium.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/PostCondition.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/PreCondition.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/PreserveGlobalState.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresFunction.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystem.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresOperatingSystemFamily.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhp.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpExtension.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresPhpunit.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RequiresSetting.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RunClassInSeparateProcess.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RunInSeparateProcess.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/RunTestsInSeparateProcesses.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Small.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Test.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/TestDox.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/TestWith.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/TestWithJson.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/Ticket.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/UsesClass.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/UsesFunction.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Attributes/WithoutErrorHandler.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsFalse.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Boolean/IsTrue.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/GreaterThan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/LessThan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageIsOrContains.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageMatchesRegularExpression.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsFinite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsInfinite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Math/IsNan.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/BinaryOperator.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalAnd.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalOr.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Operator/UnaryOperator.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEndsWith.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringEqualsStringIgnoringLineEndings.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/ArrayHasKey.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/IsList.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsEqual.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsIdentical.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsNull.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php create mode 100644 vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/EmptyStringException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/GeneratorNotSupportedException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTest.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Incomplete/IncompleteTestError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/InvalidDependencyException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ActualValueIsNotAnObjectException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotAcceptParameterTypeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotDeclareParameterTypeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ObjectEquals/ComparisonMethodDoesNotExistException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/PhptAssertionFailedError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/ProcessIsolationException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTest.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedTestSuiteError.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/Skipped/SkippedWithMessageException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/UnknownClassOrInterfaceException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Exception/UnknownTypeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameAlreadyConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodNameNotConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodParametersAlreadyConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NeverReturningMethodException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/NoMoreReturnValuesConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/CannotUseAddMethodsException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsEnumerationException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsFinalException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ClassIsReadonlyException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/DuplicateMethodException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/InvalidMethodNameException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/NameAlreadyInUseException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/OriginalConstructorInvocationRequiredException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/ReflectionException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/RuntimeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/SoapExtensionNotAvailableException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownClassException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTraitException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Exception/UnknownTypeException.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/Generator.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockClass.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockMethodSet.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockTrait.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/MockType.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/TemplateLoader.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/deprecation.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/doubled_static_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/intersection.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/proxied_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/test_double_class.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/trait_class.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_class.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Generator/templates/wsdl_method.tpl create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/DoubledCloneMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/Method.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/MockObjectApi.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/ProxiedCloneMethod.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Api/StubApi.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Identity.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationMocker.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/InvocationStubber.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/MethodNameMatch.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/ParametersMatch.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Builder/Stub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObject.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/MockObjectInternal.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/Stub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Interface/StubInternal.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Invocation.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/InvocationHandler.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Matcher.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/MethodNameConstraint.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/ReturnValueGenerator.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyInvokedCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/AnyParameters.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvocationOrder.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtLeastOnce.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedAtMostCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/InvokedCount.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/MethodName.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/Parameters.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Rule/ParametersRule.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ConsecutiveCalls.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnArgument.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnCallback.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnReference.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnSelf.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnStub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/ReturnValueMap.php create mode 100644 vendor/phpunit/phpunit/src/Framework/MockObject/Runtime/Stub/Stub.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Reorderable.php create mode 100644 vendor/phpunit/phpunit/src/Framework/SelfDescribing.php create mode 100644 vendor/phpunit/phpunit/src/Framework/Test.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestBuilder.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestCase.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestRunner.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Known.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Large.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Medium.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Small.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/TestSize.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSize/Unknown.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Deprecation.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Error.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Failure.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Incomplete.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Known.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Notice.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Risky.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Skipped.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Success.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/TestStatus.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Unknown.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestStatus/Warning.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuite.php create mode 100644 vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php create mode 100644 vendor/phpunit/phpunit/src/Logging/EventLogger.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/JunitXmlLogger.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestMarkedIncompleteSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparationStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPreparedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestPrintedUnexpectedOutputSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestRunnerExecutionFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/JUnit/Subscriber/TestSuiteStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestConsideredRiskySubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestMarkedIncompleteSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestPreparedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestRunnerExecutionFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteBeforeFirstTestMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/Subscriber/TestSuiteStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/HtmlRenderer.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/NamePrettifier.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/PlainTextRenderer.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestConsideredRiskySubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPassedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestPreparedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/Subscriber/TestTriggeredWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResult.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollection.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/Logging/TestDox/TestResult/TestResultCollector.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/After.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/AfterClass.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/CodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/DataProvider.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/Dependencies.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/Groups.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/HookMethods.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Api/Requirements.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/BackupGlobals.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/BackupStaticProperties.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Before.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/BeforeClass.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Covers.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversClass.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversDefaultClass.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversFunction.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/CoversNothing.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/DataProvider.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/DependsOnClass.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/DependsOnMethod.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/DoesNotPerformAssertions.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/AnnotationsAreNotSupportedForInternalClassesException.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/InvalidAttributeException.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/InvalidVersionRequirementException.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/NoVersionRequirementException.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Exception/ReflectionException.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/ExcludeGlobalVariableFromBackup.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/ExcludeStaticPropertyFromBackup.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Group.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreClassForCodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreDeprecations.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreFunctionForCodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/IgnoreMethodForCodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Metadata.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/MetadataCollection.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/MetadataCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/DocBlock.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Annotation/Registry.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/AnnotationParser.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/AttributeParser.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/CachingParser.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Parser.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/ParserChain.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Parser/Registry.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/PostCondition.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/PreCondition.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/PreserveGlobalState.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresFunction.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresMethod.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystem.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresOperatingSystemFamily.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresPhp.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresPhpExtension.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresPhpunit.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RequiresSetting.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RunClassInSeparateProcess.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RunInSeparateProcess.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/RunTestsInSeparateProcesses.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Test.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/TestDox.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/TestWith.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Uses.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/UsesClass.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/UsesDefaultClass.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/UsesFunction.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Version/ComparisonRequirement.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Version/ConstraintRequirement.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/Version/Requirement.php create mode 100644 vendor/phpunit/phpunit/src/Metadata/WithoutErrorHandler.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Baseline.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Exception/CannotLoadBaselineException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Exception/FileDoesNotHaveLineException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Generator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Issue.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Reader.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/RelativePathCalculator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredPhpWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Subscriber/TestTriggeredWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Baseline/Writer.php create mode 100644 vendor/phpunit/phpunit/src/Runner/CodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ErrorHandler.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ClassCannotBeFoundException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ClassDoesNotExtendTestCaseException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ClassIsAbstractException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/DirectoryDoesNotExistException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ErrorException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/FileDoesNotExistException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/InvalidOrderException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/InvalidPhptFileException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/ParameterDoesNotExistException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/PhptExternalFileCannotBeLoadedException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Exception/UnsupportedPhptSectionException.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/Extension.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/ExtensionBootstrapper.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/Facade.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/ParameterCollection.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/Factory.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Filter/TestIdFilterIterator.php create mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/GarbageCollectionHandler.php create mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/ExecutionStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/GarbageCollection/Subscriber/TestFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/PhptTestCase.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/DefaultResultCache.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/NullResultCache.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCache.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/ResultCacheHandler.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestConsideredRiskySubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestMarkedIncompleteSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestPreparedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/ResultCache/Subscriber/TestSuiteStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Collector.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Facade.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Issue.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/PassedTests.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/AfterTestClassMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/BeforeTestClassMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/ExecutionStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestConsideredRiskySubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestMarkedIncompleteSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestPreparedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestRunnerTriggeredWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestSuiteStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredErrorSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitErrorSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredPhpunitWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/Subscriber/TestTriggeredWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestResult/TestResult.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php create mode 100644 vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php create mode 100644 vendor/phpunit/phpunit/src/Runner/Version.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Application.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Command.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/AtLeastVersionCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/CheckPhpConfigurationCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/GenerateConfigurationCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListGroupsCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestSuitesCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsTextCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ListTestsAsXmlCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/MigrateConfigurationCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowHelpCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/ShowVersionCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/VersionCheckCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Commands/WarmCodeCoverageCacheCommand.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Command/Result.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Builder.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Builder.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Configuration.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/Exception.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Cli/XmlConfigurationFileFinder.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/CodeCoverageFilterRegistry.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Configuration.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CannotFindSchemaException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/CodeCoverageReportNotConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/ConfigurationCannotBeBuiltException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/FilterNotConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/LoggingNotConfiguredException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBaselineException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoBootstrapException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCacheDirectoryException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCliArgumentException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoConfigurationFileException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCoverageCacheDirectoryException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoCustomCssFileException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoDefaultTestSuiteException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Exception/NoPharExtensionDirectoryException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Merger.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/PhpHandler.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Registry.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/SourceFilter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/SourceMapper.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/TestSuiteBuilder.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Constant.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ConstantCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Directory.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/DirectoryCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrap.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/ExtensionBootstrapCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/File.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FileCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectory.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/FilterDirectoryCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Group.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/GroupCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSetting.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/IniSettingCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Php.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Source.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectory.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestDirectoryCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFile.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestFileCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuite.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/TestSuiteCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/Variable.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollection.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Value/VariableCollectionIterator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/CodeCoverage.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Clover.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Cobertura.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Crap4j.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Html.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Php.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Text.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/CodeCoverage/Report/Xml.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Configuration.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/DefaultConfiguration.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Exception.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Generator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Groups.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/LoadedFromFileConfiguration.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Loader.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Junit.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/Logging.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TeamCity.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Html.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Logging/TestDox/Text.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationBuilder.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/MigrationException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/ConvertLogTypes.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCloverToReport.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageCrap4jToReport.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageHtmlToReport.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoveragePhpToReport.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageTextToReport.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/CoverageXmlToReport.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCacheDirectoryAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/IntroduceCoverageElement.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/LogToReportMigration.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/Migration.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveAttributesFromRootToCoverage.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveCoverageDirectoriesToSource.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistExcludesToCoverage.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/MoveWhitelistIncludesToCoverage.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutResourceUsageDuringSmallTestsAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveBeStrictAboutTodoAnnotatedTestsAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheResultFileAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCacheTokensAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveConversionToExceptionsAttributes.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementCacheDirectoryAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveCoverageElementProcessUncoveredFilesAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveEmptyFilter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveListeners.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLogTypes.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveLoggingElements.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveNoInteractionAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemovePrinterAttributes.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestDoxGroupsElement.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveTestSuiteLoaderAttributes.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RemoveVerboseAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBackupStaticAttributesAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameBeStrictAboutCoversAnnotationAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/RenameForceCoversAnnotationAttribute.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrations/UpdateSchemaLocation.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/Migrator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Migration/SnapshotNodeList.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/PHPUnit.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/FailedSchemaDetectionResult.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetectionResult.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SchemaDetector.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaDetector/SuccessfulSchemaDetectionResult.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/SchemaFinder.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/TestSuiteMapper.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/ValidationResult.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Configuration/Xml/Validator/Validator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/CannotOpenSocketException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/InvalidSocketException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/RuntimeException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Help.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/ProgressPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/BeforeTestClassMethodErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/Subscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestConsideredRiskySubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestErroredSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFailedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestFinishedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestMarkedIncompleteSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestPreparedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestRunnerExecutionStartedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredErrorSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpNoticeSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitDeprecationSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredPhpunitWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ProgressPrinter/Subscriber/TestTriggeredWarningSubscriber.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/ResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Default/UnexpectedOutputPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Facade.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Printer/DefaultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Printer/NullPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/Printer/Printer.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/SummaryPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/Output/TestDox/ResultPrinter.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/ShellExitCodeCalculator.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/TestRunner.php create mode 100644 vendor/phpunit/phpunit/src/TextUI/TestSuiteFilterProcessor.php create mode 100644 vendor/phpunit/phpunit/src/Util/Cloner.php create mode 100644 vendor/phpunit/phpunit/src/Util/Color.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exception/Exception.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exception/InvalidDirectoryException.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exception/InvalidJsonException.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exception/InvalidVersionOperatorException.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exception/PhpProcessException.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exception/XmlException.php create mode 100644 vendor/phpunit/phpunit/src/Util/ExcludeList.php create mode 100644 vendor/phpunit/phpunit/src/Util/Exporter.php create mode 100644 vendor/phpunit/phpunit/src/Util/Filesystem.php create mode 100644 vendor/phpunit/phpunit/src/Util/Filter.php create mode 100644 vendor/phpunit/phpunit/src/Util/GlobalState.php create mode 100644 vendor/phpunit/phpunit/src/Util/Http/Downloader.php create mode 100644 vendor/phpunit/phpunit/src/Util/Http/PhpDownloader.php create mode 100644 vendor/phpunit/phpunit/src/Util/Json.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl create mode 100644 vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl create mode 100644 vendor/phpunit/phpunit/src/Util/Reflection.php create mode 100644 vendor/phpunit/phpunit/src/Util/Test.php create mode 100644 vendor/phpunit/phpunit/src/Util/ThrowableToStringMapper.php create mode 100644 vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php create mode 100644 vendor/phpunit/phpunit/src/Util/Xml/Loader.php create mode 100644 vendor/phpunit/phpunit/src/Util/Xml/Xml.php create mode 100644 vendor/sebastian/cli-parser/ChangeLog.md create mode 100644 vendor/sebastian/cli-parser/LICENSE create mode 100644 vendor/sebastian/cli-parser/README.md create mode 100644 vendor/sebastian/cli-parser/SECURITY.md create mode 100644 vendor/sebastian/cli-parser/composer.json create mode 100644 vendor/sebastian/cli-parser/src/Parser.php create mode 100644 vendor/sebastian/cli-parser/src/exceptions/AmbiguousOptionException.php create mode 100644 vendor/sebastian/cli-parser/src/exceptions/Exception.php create mode 100644 vendor/sebastian/cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.php create mode 100644 vendor/sebastian/cli-parser/src/exceptions/RequiredOptionArgumentMissingException.php create mode 100644 vendor/sebastian/cli-parser/src/exceptions/UnknownOptionException.php create mode 100644 vendor/sebastian/code-unit-reverse-lookup/.psalm/baseline.xml create mode 100644 vendor/sebastian/code-unit-reverse-lookup/.psalm/config.xml create mode 100644 vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md create mode 100644 vendor/sebastian/code-unit-reverse-lookup/LICENSE create mode 100644 vendor/sebastian/code-unit-reverse-lookup/README.md create mode 100644 vendor/sebastian/code-unit-reverse-lookup/SECURITY.md create mode 100644 vendor/sebastian/code-unit-reverse-lookup/composer.json create mode 100644 vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php create mode 100644 vendor/sebastian/code-unit/ChangeLog.md create mode 100644 vendor/sebastian/code-unit/LICENSE create mode 100644 vendor/sebastian/code-unit/README.md create mode 100644 vendor/sebastian/code-unit/SECURITY.md create mode 100644 vendor/sebastian/code-unit/composer.json create mode 100644 vendor/sebastian/code-unit/src/ClassMethodUnit.php create mode 100644 vendor/sebastian/code-unit/src/ClassUnit.php create mode 100644 vendor/sebastian/code-unit/src/CodeUnit.php create mode 100644 vendor/sebastian/code-unit/src/CodeUnitCollection.php create mode 100644 vendor/sebastian/code-unit/src/CodeUnitCollectionIterator.php create mode 100644 vendor/sebastian/code-unit/src/FileUnit.php create mode 100644 vendor/sebastian/code-unit/src/FunctionUnit.php create mode 100644 vendor/sebastian/code-unit/src/InterfaceMethodUnit.php create mode 100644 vendor/sebastian/code-unit/src/InterfaceUnit.php create mode 100644 vendor/sebastian/code-unit/src/Mapper.php create mode 100644 vendor/sebastian/code-unit/src/TraitMethodUnit.php create mode 100644 vendor/sebastian/code-unit/src/TraitUnit.php create mode 100644 vendor/sebastian/code-unit/src/exceptions/Exception.php create mode 100644 vendor/sebastian/code-unit/src/exceptions/InvalidCodeUnitException.php create mode 100644 vendor/sebastian/code-unit/src/exceptions/NoTraitException.php create mode 100644 vendor/sebastian/code-unit/src/exceptions/ReflectionException.php create mode 100644 vendor/sebastian/comparator/ChangeLog.md create mode 100644 vendor/sebastian/comparator/LICENSE create mode 100644 vendor/sebastian/comparator/README.md create mode 100644 vendor/sebastian/comparator/SECURITY.md create mode 100644 vendor/sebastian/comparator/composer.json create mode 100644 vendor/sebastian/comparator/src/ArrayComparator.php create mode 100644 vendor/sebastian/comparator/src/Comparator.php create mode 100644 vendor/sebastian/comparator/src/ComparisonFailure.php create mode 100644 vendor/sebastian/comparator/src/DOMNodeComparator.php create mode 100644 vendor/sebastian/comparator/src/DateTimeComparator.php create mode 100644 vendor/sebastian/comparator/src/ExceptionComparator.php create mode 100644 vendor/sebastian/comparator/src/Factory.php create mode 100644 vendor/sebastian/comparator/src/MockObjectComparator.php create mode 100644 vendor/sebastian/comparator/src/NumericComparator.php create mode 100644 vendor/sebastian/comparator/src/ObjectComparator.php create mode 100644 vendor/sebastian/comparator/src/ResourceComparator.php create mode 100644 vendor/sebastian/comparator/src/ScalarComparator.php create mode 100644 vendor/sebastian/comparator/src/SplObjectStorageComparator.php create mode 100644 vendor/sebastian/comparator/src/TypeComparator.php create mode 100644 vendor/sebastian/comparator/src/exceptions/Exception.php create mode 100644 vendor/sebastian/comparator/src/exceptions/RuntimeException.php create mode 100644 vendor/sebastian/complexity/ChangeLog.md create mode 100644 vendor/sebastian/complexity/LICENSE create mode 100644 vendor/sebastian/complexity/README.md create mode 100644 vendor/sebastian/complexity/SECURITY.md create mode 100644 vendor/sebastian/complexity/composer.json create mode 100644 vendor/sebastian/complexity/src/Calculator.php create mode 100644 vendor/sebastian/complexity/src/Complexity/Complexity.php create mode 100644 vendor/sebastian/complexity/src/Complexity/ComplexityCollection.php create mode 100644 vendor/sebastian/complexity/src/Complexity/ComplexityCollectionIterator.php create mode 100644 vendor/sebastian/complexity/src/Exception/Exception.php create mode 100644 vendor/sebastian/complexity/src/Exception/RuntimeException.php create mode 100644 vendor/sebastian/complexity/src/Visitor/ComplexityCalculatingVisitor.php create mode 100644 vendor/sebastian/complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.php create mode 100644 vendor/sebastian/diff/ChangeLog.md create mode 100644 vendor/sebastian/diff/LICENSE create mode 100644 vendor/sebastian/diff/README.md create mode 100644 vendor/sebastian/diff/SECURITY.md create mode 100644 vendor/sebastian/diff/composer.json create mode 100644 vendor/sebastian/diff/src/Chunk.php create mode 100644 vendor/sebastian/diff/src/Diff.php create mode 100644 vendor/sebastian/diff/src/Differ.php create mode 100644 vendor/sebastian/diff/src/Exception/ConfigurationException.php create mode 100644 vendor/sebastian/diff/src/Exception/Exception.php create mode 100644 vendor/sebastian/diff/src/Exception/InvalidArgumentException.php create mode 100644 vendor/sebastian/diff/src/Line.php create mode 100644 vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php create mode 100644 vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Parser.php create mode 100644 vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/environment/ChangeLog.md create mode 100644 vendor/sebastian/environment/LICENSE create mode 100644 vendor/sebastian/environment/README.md create mode 100644 vendor/sebastian/environment/SECURITY.md create mode 100644 vendor/sebastian/environment/composer.json create mode 100644 vendor/sebastian/environment/src/Console.php create mode 100644 vendor/sebastian/environment/src/Runtime.php create mode 100644 vendor/sebastian/exporter/ChangeLog.md create mode 100644 vendor/sebastian/exporter/LICENSE create mode 100644 vendor/sebastian/exporter/README.md create mode 100644 vendor/sebastian/exporter/SECURITY.md create mode 100644 vendor/sebastian/exporter/composer.json create mode 100644 vendor/sebastian/exporter/src/Exporter.php create mode 100644 vendor/sebastian/global-state/ChangeLog.md create mode 100644 vendor/sebastian/global-state/LICENSE create mode 100644 vendor/sebastian/global-state/README.md create mode 100644 vendor/sebastian/global-state/SECURITY.md create mode 100644 vendor/sebastian/global-state/composer.json create mode 100644 vendor/sebastian/global-state/src/CodeExporter.php create mode 100644 vendor/sebastian/global-state/src/ExcludeList.php create mode 100644 vendor/sebastian/global-state/src/Restorer.php create mode 100644 vendor/sebastian/global-state/src/Snapshot.php create mode 100644 vendor/sebastian/global-state/src/exceptions/Exception.php create mode 100644 vendor/sebastian/global-state/src/exceptions/RuntimeException.php create mode 100644 vendor/sebastian/lines-of-code/ChangeLog.md create mode 100644 vendor/sebastian/lines-of-code/LICENSE create mode 100644 vendor/sebastian/lines-of-code/README.md create mode 100644 vendor/sebastian/lines-of-code/SECURITY.md create mode 100644 vendor/sebastian/lines-of-code/composer.json create mode 100644 vendor/sebastian/lines-of-code/src/Counter.php create mode 100644 vendor/sebastian/lines-of-code/src/Exception/Exception.php create mode 100644 vendor/sebastian/lines-of-code/src/Exception/IllogicalValuesException.php create mode 100644 vendor/sebastian/lines-of-code/src/Exception/NegativeValueException.php create mode 100644 vendor/sebastian/lines-of-code/src/Exception/RuntimeException.php create mode 100644 vendor/sebastian/lines-of-code/src/LineCountingVisitor.php create mode 100644 vendor/sebastian/lines-of-code/src/LinesOfCode.php create mode 100644 vendor/sebastian/object-enumerator/ChangeLog.md create mode 100644 vendor/sebastian/object-enumerator/LICENSE create mode 100644 vendor/sebastian/object-enumerator/README.md create mode 100644 vendor/sebastian/object-enumerator/SECURITY.md create mode 100644 vendor/sebastian/object-enumerator/composer.json create mode 100644 vendor/sebastian/object-enumerator/phpunit.xml create mode 100644 vendor/sebastian/object-enumerator/src/Enumerator.php create mode 100644 vendor/sebastian/object-reflector/ChangeLog.md create mode 100644 vendor/sebastian/object-reflector/LICENSE create mode 100644 vendor/sebastian/object-reflector/README.md create mode 100644 vendor/sebastian/object-reflector/SECURITY.md create mode 100644 vendor/sebastian/object-reflector/composer.json create mode 100644 vendor/sebastian/object-reflector/src/ObjectReflector.php create mode 100644 vendor/sebastian/recursion-context/ChangeLog.md create mode 100644 vendor/sebastian/recursion-context/LICENSE create mode 100644 vendor/sebastian/recursion-context/README.md create mode 100644 vendor/sebastian/recursion-context/SECURITY.md create mode 100644 vendor/sebastian/recursion-context/composer.json create mode 100644 vendor/sebastian/recursion-context/src/Context.php create mode 100644 vendor/sebastian/type/ChangeLog.md create mode 100644 vendor/sebastian/type/LICENSE create mode 100644 vendor/sebastian/type/README.md create mode 100644 vendor/sebastian/type/SECURITY.md create mode 100644 vendor/sebastian/type/composer.json create mode 100644 vendor/sebastian/type/infection.json create mode 100644 vendor/sebastian/type/src/Parameter.php create mode 100644 vendor/sebastian/type/src/ReflectionMapper.php create mode 100644 vendor/sebastian/type/src/TypeName.php create mode 100644 vendor/sebastian/type/src/exception/Exception.php create mode 100644 vendor/sebastian/type/src/exception/RuntimeException.php create mode 100644 vendor/sebastian/type/src/type/CallableType.php create mode 100644 vendor/sebastian/type/src/type/FalseType.php create mode 100644 vendor/sebastian/type/src/type/GenericObjectType.php create mode 100644 vendor/sebastian/type/src/type/IntersectionType.php create mode 100644 vendor/sebastian/type/src/type/IterableType.php create mode 100644 vendor/sebastian/type/src/type/MixedType.php create mode 100644 vendor/sebastian/type/src/type/NeverType.php create mode 100644 vendor/sebastian/type/src/type/NullType.php create mode 100644 vendor/sebastian/type/src/type/ObjectType.php create mode 100644 vendor/sebastian/type/src/type/SimpleType.php create mode 100644 vendor/sebastian/type/src/type/StaticType.php create mode 100644 vendor/sebastian/type/src/type/TrueType.php create mode 100644 vendor/sebastian/type/src/type/Type.php create mode 100644 vendor/sebastian/type/src/type/UnionType.php create mode 100644 vendor/sebastian/type/src/type/UnknownType.php create mode 100644 vendor/sebastian/type/src/type/VoidType.php create mode 100644 vendor/sebastian/version/ChangeLog.md create mode 100644 vendor/sebastian/version/LICENSE create mode 100644 vendor/sebastian/version/README.md create mode 100644 vendor/sebastian/version/SECURITY.md create mode 100644 vendor/sebastian/version/composer.json create mode 100644 vendor/sebastian/version/src/Version.php create mode 100644 vendor/theseer/tokenizer/CHANGELOG.md create mode 100644 vendor/theseer/tokenizer/LICENSE create mode 100644 vendor/theseer/tokenizer/README.md create mode 100644 vendor/theseer/tokenizer/composer.json create mode 100644 vendor/theseer/tokenizer/composer.lock create mode 100644 vendor/theseer/tokenizer/src/Exception.php create mode 100644 vendor/theseer/tokenizer/src/NamespaceUri.php create mode 100644 vendor/theseer/tokenizer/src/NamespaceUriException.php create mode 100644 vendor/theseer/tokenizer/src/Token.php create mode 100644 vendor/theseer/tokenizer/src/TokenCollection.php create mode 100644 vendor/theseer/tokenizer/src/TokenCollectionException.php create mode 100644 vendor/theseer/tokenizer/src/Tokenizer.php create mode 100644 vendor/theseer/tokenizer/src/XMLSerializer.php diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..88974cfc674ee5a7ee647835e1d47bcf6adaeac7 GIT binary patch literal 14340 zcmeHNeQX@X6`!}Zt%2(W{5N8n*Se*GX||q-dG8wU6>GYQ!Wr-aayE zPmh!`B`k|lgg}Hqgg}Hqgg}JA$47wfy_iIq)94-{5FrpDFoytLAL4jXns(_yPTA6d zH|oOEdg{WngwGfUu(G&I(=I*8DQk*tSW~3DDYzj9@a9+^r|d}6E;%%BM)wGT2!SvHDi%qe*t<*|f{}N2+9_mBJBziy$QDe)DJ2pwgHTuB zfN{9wjl;`Mf2MdVjmk%D+ssy;Gud5+K0TpaI$&F+jA7|T7PuRljx4v08J1>G_uFMl zb6DFEULi@MG@)ERJDW=Mw#Sp*9S7Ruv%Segdpy;-?!W;_T-vsF!;XnN&Aesb&xHYZ zK_E*4!X2tEnYpiHBxmOfocnlJb*{WUIOxhRu01yMz4hvIeYH5X)8s5ndPhD*U!V%| z-ZKy65O8j?=X*9f5=oqmRQIQx4JJ!KK9LxBR+J+qDWjx1aXhj<6Vg223D6nVJP9@L zirLu?ChWSN7vH9JvSEXzyO z(Ve5a#>OWUrR?ZCbTd;jru4x~Np~icCI_u>OU|~o7xgK$zOkHbmh%?Y#Bv!kS4L*N z&ooDjyE%8RXq)DC+c8RpZS5W}>HABxj&|g$8sFpC#nJ%lY}~;9Iaf0sW4J&YJG=Cv zgH)1!bn&v5tG}>nZL0UC{x1y;pKMZM&6mha`=-(2Kh>PENNp!`ioV+R#dq zV^fA>WKDh4%H(w^2JOrle?m zoG!Ur9h-8cQigcpdU>fjj*CYgMR6ovwoy&1d+D%W&N!vvf^N}QdLHXggn?F7-A(KI zG>yGbb4+PcZ&tU8$_a6gGnpys!_&Alo^;E%i6WatET_F~(u|TlSGj{$Duy*>;OQq~ zO%FlKj@U*OiKe#nO8&rbY)dD2PNAOFm3YA0Pqvc1q(ElKA@U%3gd8Qu$j`{{$&2JQ z@;3P^`3L!c{D*u<{tNZ61e!pB7^tuUR>CS+4Jk-NAN0czY=^JF2#mt*kcAxRa0l2> zhAG$&Gw^k|9}dAc;al(!JPMD&&rN-E%Eq;`qL5xSXS(gP2&UUi2?Ba~5>0A(i+ojU#o~gNxD$;+ z-!D=dR2p6GwrfQ+3Z=o#uDl+zL&_qaZCP`Jhz6(#EGxGpJ0&zTrOwT+>BcPZjJ)AS z2@OuEce7WeF-uscrDbpvcJsUgjh4)0(ZycZ@QgIa7t9xNz85oX~YH~{y;*O(?BW}18iz6;-nhv5l$5}tym z;iqsEj=|628Px6H!5`qIfW8h@G?i0$y_&vyJ&eDt|KrSEZOp?6>2=p55-H->8V7gZBJRQk{QBbfH>t(P@y)AndEb5iPn_)PnCl&d`t!d1!kqs1XHi@u z`UC~^3~c-|r1?C9uuponJp=Sfds3b4@vg4a0*=Ay_@n`;e26#v@GppXfWwRS#t&Ct ze=paR5ZAn()aLS`-0&<8791_0Ba|ab5dskc7bXI&C{_boU-L8)yHKJpk4U}+7T$W_ zFR*uUedmRLuG)4P+sZucy<1py4&S0GFu&W=KCqzHA=m|Ccz_OXX6N95b)@E*L+LtJN&#Vz%vhaEgm1_0)yPwM*#Rnc5+hz-wSQi!miXp zM>nVEq0#fGIjMZuL-`fNJ|MRj{eQJLTr><}ritT%3yqrVHnyV_hfpmV1(2I4>Q&fn&7OnTs0I1u&@k_t*u3Kvmg%I!RtU zf?86Q&#Rdme*4A)ojg*j!8@;?AI0m_Qu22m$4Bu$wN^r+_QcjU*$So$r+BHuTgpr2kk}r~p(609!#1 AIsgCw literal 0 HcmV?d00001 diff --git a/.Rhistory b/.Rhistory new file mode 100644 index 0000000..b76d5c8 --- /dev/null +++ b/.Rhistory @@ -0,0 +1,3 @@ +install.packages('jsonlite') +q +q() diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..192b97e --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +.gitignore +.DS_Store +node_modules +vendor +uploads/* +!uploads/**/.gitkeep +.env diff --git a/.env b/.env new file mode 100644 index 0000000..623cc8c --- /dev/null +++ b/.env @@ -0,0 +1,21 @@ +JUPYTER_EXTERNAL_URL=https://hub.niph.org.kh +JUPYTERHUB_PORT=443 +JUPYTERHUB_AUTH_STRATEGY=oauth +JUPYTERHUB_DUMMY_PASSWORD= +JUPYTERHUB_COOKIE_SECURE=true +JUPYTERHUB_HTTP_TIMEOUT=90 +JUPYTERHUB_START_TIMEOUT=90 +JUPYTERHUB_USER_PATH=hub/ +JUPYTERHUB_USERNAME_TEMPLATE=user_{person_id} +DSP_WORKSPACE_ROOT=/home/niph_dev/Documents/dsp/uploads/jupyter_workspace +DSP_OAUTH_CLIENT_ID=hub-client +DSP_OAUTH_CLIENT_SECRET=hub-client-secret-20251103 +DSP_OAUTH_REDIRECT_URIS=https://hub.niph.org.kh/hub/oauth_callback +DSP_OAUTH_AUTHORIZE_URL=https://dsp.niph.org.kh/oauth/authorize +DSP_OAUTH_TOKEN_URL=https://dsp.niph.org.kh/oauth/token +DSP_OAUTH_USERINFO_URL=https://dsp.niph.org.kh/oauth/userinfo +JUPYTERHUB_OAUTH_CALLBACK=https://hub.niph.org.kh/hub/oauth_callback +JUPYTERHUB_CULL_API_TOKEN=kCc1EzULTX2jG8jyvOTA0B6vrMk5SGmWjwDvNqlQ2wY +DSP_APP_ORIGINS="https://dsp.niph.org.kh https://hub.niph.org.kh http://localhost:8082 http://192.168.170.226:8082" +DSP_FRAME_ANCESTORS="https://dsp.niph.org.kh https://hub.niph.org.kh http://localhost:8082 http://192.168.170.226:8082" +APP_PORT=443 diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..c73412a --- /dev/null +++ b/.htaccess @@ -0,0 +1,8 @@ +RewriteEngine On +RewriteBase / + +# Serve existing PHP files when the extension is omitted +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}.php -f +RewriteRule ^(.+)$ $1.php [L] diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..12b37bf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +# Dockerfile for DSP PHP application with R support +FROM php:8.2-apache + +# Install system dependencies and PHP extensions +RUN apt-get update && apt-get install -y \ + libpng-dev \ + libonig-dev \ + libzip-dev \ + zip \ + unzip \ + git \ + default-mysql-client \ + r-base \ + && docker-php-ext-install pdo_mysql \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install required R packages +RUN Rscript -e "install.packages('jsonlite', repos='https://cloud.r-project.org')" + +# Enable Apache modules commonly used by PHP apps +RUN a2enmod rewrite + +# Set working directory +WORKDIR /var/www/html + +# Copy project files into the container (can be overridden by bind mount in docker-compose) +COPY . /var/www/html + +# Ensure upload directories are writable by the web server +RUN chown -R www-data:www-data /var/www/html/uploads + +# Increase default PHP upload limits +COPY docker/custom.ini /usr/local/etc/php/conf.d/uploads.ini + +# Copy entrypoint script +COPY docker/app-entrypoint.sh /usr/local/bin/app-entrypoint.sh +RUN chmod +x /usr/local/bin/app-entrypoint.sh + +# Expose Apache port +EXPOSE 80 + +ENTRYPOINT ["app-entrypoint.sh"] diff --git a/admin/app_log.php b/admin/app_log.php new file mode 100644 index 0000000..4ac1f7a --- /dev/null +++ b/admin/app_log.php @@ -0,0 +1,119 @@ + null, + 'modified' => null, +]; + +if ($canReadLog) { + $logMeta['size'] = filesize($logPath); + $logMeta['modified'] = filemtime($logPath); + + if (isset($_GET['download'])) { + header('Content-Type: text/plain'); + header('Content-Disposition: attachment; filename="app.log"'); + header('Content-Length: ' . $logMeta['size']); + readfile($logPath); + exit; + } + + try { + $logEntries = tail_file($logPath, $lineLimit); + } catch (RuntimeException $e) { + $canReadLog = false; + $logError = $e->getMessage(); + } +} else { + $logError = 'The application log file is missing or unreadable.'; +} + +function tail_file(string $path, int $lines): array +{ + $file = new SplFileObject($path, 'r'); + $file->seek(PHP_INT_MAX); + $lastLine = $file->key(); + $startLine = max($lastLine - $lines + 1, 0); + $file->seek($startLine); + + $buffer = []; + while (!$file->eof()) { + $buffer[] = rtrim($file->current(), "\r\n"); + $file->next(); + } + + return $buffer; +} + +$lastUpdated = $logMeta['modified'] ? date('Y-m-d H:i:s', $logMeta['modified']) . ' UTC' : 'Unknown'; +$logSizeHuman = $logMeta['size'] !== null ? number_format($logMeta['size'] / 1024, 1) . ' KB' : 'Unknown'; + +?> + + + + +
+ +
+
+
+

Application Log

+

Streaming the latest lines from logs/app.log.

+
+
+ Last updated: + Size: +
+
+ +
+
+
+ + +
+ + + Refresh + + + Download + + +
+
+ + +
+ Cannot read log file. +
+
+ +
+
+
+
+
+ +
+
+ + + diff --git a/admin/dashboard.php b/admin/dashboard.php new file mode 100644 index 0000000..3232dfd --- /dev/null +++ b/admin/dashboard.php @@ -0,0 +1,171 @@ +getTotalUsers(); +$totalAnnouncements = $announcement->getTotalAnnouncements(); +$totalDataSources = $dataSource->getTotalDataSources(); +$totalCategories = $classification->getTotalCategories(); +$totalDataTypes = $classification->getTotalDataTypes(); +$totalFeedback = $contactUs->getTotalFeedback(); +$totalFaqs = $faq->getTotalFaqs(); +$totalSlides = $slideManager->getTotalSlides(); +$pendingPermissions = $dataSource->getPendingPermissionRequestsCount(); // This correctly gets ALL pending for admin dashboard +?> + + + + + + + +
+ + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + +
+
+
+
+ +
Total Users
+

+
+
+
+
+
+
+ +
Total Announcements
+

+
+
+
+
+
+
+ +
Total Data Sources
+

+
+
+
+
+
+
+ +
Data Categories
+

+
+
+
+
+
+
+ +
Data Types
+

+
+
+
+
+
+
+ +
Pending Permissions
+

+
+
+
+
+
+
+ +
New Feedback
+

+
+
+
+
+
+
+ +
Total FAQs
+

+
+
+
+
+
+
+ +
Total Slides
+

+
+
+
+
+ +
+ + + + + + diff --git a/admin/manage_aboutus.php b/admin/manage_aboutus.php new file mode 100644 index 0000000..be30d02 --- /dev/null +++ b/admin/manage_aboutus.php @@ -0,0 +1,216 @@ +getUserDetails($_SESSION['user_id']); + $fkisp_id_of = $currentUserDetails['fkisp_id_of']; + + if ($action_type === 'delete') { + if ($about_id) { + try { + $aboutUs->deleteAboutUs($about_id); + set_message('About Us entry deleted successfully!', 'success'); + } catch (Exception $e) { + set_message('Error deleting About Us entry: ' . $e->getMessage(), 'danger'); + } + } + } else { + if (empty($title) || empty($description)) { + set_message('Title and description cannot be empty.', 'danger'); + } else { + try { + if ($action_type === 'add') { + $aboutUs->addAboutUs($title, $description, $_SESSION['user_id'], $fkisp_id_of); + set_message('About Us entry added successfully!', 'success'); + } elseif ($action_type === 'edit' && $about_id) { + $aboutUs->updateAboutUs($about_id, $title, $description, $_SESSION['user_id'], $fkisp_id_of); + set_message('About Us entry updated successfully!', 'success'); + } + } catch (Exception $e) { + set_message('Error: ' . $e->getMessage(), 'danger'); + } + } + } + header('Location: manage_aboutus.php'); + exit(); +} + +// Fetch About Us entries for display +$aboutUsEntries = $aboutUs->getAllAboutUs(); + +// Prepare data for editing if action is 'edit' +$editAboutUs = null; +if ($action === 'edit' && $id) { + $editAboutUs = $aboutUs->getAboutUsById($id); +} +?> + + + + + + +
+ + + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + +
+
+
About Us Entry
+
+
+
+ + + + + +
+ + +
+
+ + +
Format paragraphs, bullet lists, and links so the public About Us page is easy to read.
+
+ + + Cancel Edit + +
+
+
+ +
+
+
All About Us Entries
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDTitleDescriptionReg. DateMod. DateActions
100 ? '...' : ''); ?> + + + +
+ + + +
+
No About Us entries found.
+
+
+
+
+ + + + + + + diff --git a/admin/manage_announcements.php b/admin/manage_announcements.php new file mode 100644 index 0000000..655d4c6 --- /dev/null +++ b/admin/manage_announcements.php @@ -0,0 +1,260 @@ +deleteAnnouncement($announcement_id); + set_message('Announcement deleted successfully!', 'success'); + } catch (Exception $e) { + set_message('Error deleting announcement: ' . $e->getMessage(), 'danger'); + } + } + } else { + // Handle photo upload + $photoPath = $current_photo; // Default to current photo if not uploading new + if (isset($_FILES['photo']) && $_FILES['photo']['error'] === UPLOAD_ERR_OK) { + try { + $photoPath = $announcement->handlePhotoUpload($_FILES['photo']); + // If editing and a new photo is uploaded, delete the old one + if ($action_type === 'edit' && !empty($current_photo) && $current_photo !== $photoPath) { + unlink('../uploads/announcements/' . $current_photo); // Delete old file + } + } catch (Exception $e) { + set_message('Photo upload error: ' . $e->getMessage(), 'danger'); + header('Location: manage_announcements.php'); + exit(); + } + } + + if (empty($title) || empty($description)) { + set_message('Title and description cannot be empty.', 'danger'); + } else { + try { + if ($action_type === 'add') { + $announcement->addAnnouncement($title, $description, $photoPath, $status, $_SESSION['user_id']); + set_message('Announcement added successfully!', 'success'); + } elseif ($action_type === 'edit' && $announcement_id) { + $announcement->updateAnnouncement($announcement_id, $title, $description, $photoPath, $status, $_SESSION['user_id']); + set_message('Announcement updated successfully!', 'success'); + } + } catch (Exception $e) { + set_message('Error: ' . $e->getMessage(), 'danger'); + } + } + } + header('Location: manage_announcements.php'); + exit(); +} + +// Fetch announcements for display +$announcements = $announcement->getAllAnnouncements(); + +// Prepare data for editing if action is 'edit' +$editAnnouncement = null; +if ($action === 'edit' && $id) { + $editAnnouncement = $announcement->getAnnouncementById($id); +} +?> + + + + + + +
+ + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + +
+
+
Announcement
+
+
+
+ + + + + + +
+ + +
+
+ + +
Use the toolbar to format bullet lists, emphasize important actions, and link to additional resources.
+
+
+ + + +
+ Current Photo: Announcement Photo +
+ +
+
+ + +
+ + + Cancel Edit + +
+
+
+ +
+
+
All Announcements
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDTitleDescriptionPhotoStatusReg. DateMod. DateActions
100 ? '...' : ''); ?> + + Photo + + N/A + + + + + +
+ + + +
+
No announcements found.
+
+
+
+
+ + + + + + + + diff --git a/admin/manage_classifications.php b/admin/manage_classifications.php new file mode 100644 index 0000000..9739e7e --- /dev/null +++ b/admin/manage_classifications.php @@ -0,0 +1,269 @@ +addDataType($name_en, $name_kh, $_SESSION['user_id']); + set_message('Data Type added successfully!', 'success'); + } elseif ($action_type === 'edit' && $record_id) { + $classification->updateDataType($record_id, $name_en, $name_kh, $_SESSION['user_id']); + set_message('Data Type updated successfully!', 'success'); + } elseif ($action_type === 'delete' && $record_id) { + $classification->deleteDataType($record_id); + set_message('Data Type deleted successfully!', 'success'); + } + } elseif ($type === 'category') { + if ($action_type === 'add') { + $classification->addCategory($name_en, $details, $_SESSION['user_id']); + set_message('Category added successfully!', 'success'); + } elseif ($action_type === 'edit' && $record_id) { + $classification->updateCategory($record_id, $name_en, $details, $_SESSION['user_id']); + set_message('Category updated successfully!', 'success'); + } elseif ($action_type === 'delete' && $record_id) { + $classification->deleteCategory($record_id); + set_message('Category deleted successfully!', 'success'); + } + } + } catch (Exception $e) { + set_message('Error: ' . $e->getMessage(), 'danger'); + } + header('Location: manage_classifications.php'); + exit(); +} + +// Fetch data for display +$dataTypes = $classification->getAllDataTypes(); +$categories = $classification->getAllCategories(); + +// Prepare data for editing if action is 'edit' +$editDataType = null; +$editCategory = null; +if ($action === 'edit' && $id) { + if ($_GET['type'] === 'datatype') { + $editDataType = $classification->getDataTypeById($id); + } elseif ($_GET['type'] === 'category') { + $editCategory = $classification->getCategoryById($id); + } +} +?> + + + + + + +
+ + + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + + +
+
+
Manage Data Types
+
+
+
+ + + + + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IDEnglish NameKhmer NameActions
+ + + +
+ + + + +
+
No data types found.
+
+
+
+ + +
+
+
Manage Categories
+
+
+
+ + + + + +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
IDEnglish TitleDetailsActions
+ + + +
+ + + + +
+
No categories found.
+
+
+
+
+ + + + + + diff --git a/admin/manage_contactus.php b/admin/manage_contactus.php new file mode 100644 index 0000000..4ae8dce --- /dev/null +++ b/admin/manage_contactus.php @@ -0,0 +1,213 @@ +respondToFeedback($feedback_id, $respond_text, $status, $_SESSION['user_id']); + set_message('Feedback responded to successfully!', 'success'); + } catch (Exception $e) { + set_message('Error responding to feedback: ' . $e->getMessage(), 'danger'); + } + } + } elseif ($action_type === 'delete') { + if ($feedback_id) { + try { + $contactUs->deleteFeedback($feedback_id); + set_message('Feedback deleted successfully!', 'success'); + } catch (Exception $e) { + set_message('Error deleting feedback: ' . $e->getMessage(), 'danger'); + } + } + } + header('Location: manage_contactus.php'); + exit(); +} + +// Fetch feedback entries for display +$feedbackEntries = $contactUs->getAllFeedback(); + +// Prepare data for responding if action is 'respond' +$respondFeedback = null; +if ($action === 'respond' && $id) { + $respondFeedback = $contactUs->getFeedbackById($id); +} +?> + + + + + + +
+ + + + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + + +
+
+
Respond to Feedback #
+
+
+
+ From: () +
+
+ Submitted On: +
+
+ Message: +

+
+ +
+ Previous Response: +

+
+ + +
+ + + +
+ + +
+
+ + +
+ + Cancel +
+
+
+ + +
+
+
All Feedback Messages
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameEmailMessageStatusSubmitted OnActions
100 ? '...' : ''); ?> + + Respond + +
+ + + +
+
No feedback messages found.
+
+
+
+
+ + + + + + diff --git a/admin/manage_datasources.php b/admin/manage_datasources.php new file mode 100644 index 0000000..c8fa833 --- /dev/null +++ b/admin/manage_datasources.php @@ -0,0 +1,195 @@ + 0) { + $newStatus = trim($_POST['new_status'] ?? ''); + try { + $dataSourceManager->updateDataSourceStatus($datasourceId, $newStatus, (int) $_SESSION['user_id']); + set_message('Data source status updated successfully.', 'success'); + } catch (Exception $e) { + set_message('Failed to update status: ' . $e->getMessage(), 'danger'); + } + } elseif ($action === 'delete' && $datasourceId > 0) { + try { + if ($dataSourceManager->deleteDataSource($datasourceId)) { + set_message('Data source deleted.', 'success'); + } else { + set_message('Unable to delete data source.', 'danger'); + } + } catch (Exception $e) { + set_message('Deletion failed: ' . $e->getMessage(), 'danger'); + } + } + + $redirectUrl = 'manage_datasources.php'; + $params = []; + if ($search_query !== '') { + $params['search'] = urlencode($search_query); + } + if ($status_filter !== '') { + $params['status_filter'] = urlencode($status_filter); + } + if (!empty($params)) { + $redirectUrl .= '?' . http_build_query($params); + } + header('Location: ' . $redirectUrl); + exit(); +} + +$dataSources = $dataSourceManager->getAllDataSourcesDetailed( + $search_query !== '' ? $search_query : null, + $status_filter !== '' ? $status_filter : null +); + +$statuses = ['Active', 'Inactive', 'Pending Review', 'Published']; +$uploadsWebPath = '../uploads/datasources/'; +?> + + + + +
+ +
+ + + ' + . htmlspecialchars($_SESSION['message']) . + '
'; + unset($_SESSION['message'], $_SESSION['message_type']); + } + ?> + +
+
+
All Data Sources
+
+
+
+
+ + +
+
+ + +
+
+ + Reset +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDTitleOwnerTypeCategoryStatusFilesRegisteredActions
+
+ + + + +
+
+ 'Primary', + 'dspsds_filename1' => 'Doc 1', + 'dspsds_filename2' => 'Doc 2', + 'dspsds_filename3' => 'Doc 3', + ]; + $links = []; + foreach ($fileColumns as $column => $label) { + $fileName = $ds[$column] ?? ''; + if ($fileName === '') { + continue; + } + $isUrl = preg_match('/^https?:\\/\\//i', $fileName) === 1; + $target = $isUrl ? $fileName : $uploadsWebPath . rawurlencode($fileName); + $links[] = ''; + } + echo !empty($links) ? implode('', $links) : '—'; + ?> + +
+ + + +
+
No data sources found.
+
+
+
+
+ + + + diff --git a/admin/manage_faq.php b/admin/manage_faq.php new file mode 100644 index 0000000..69951af --- /dev/null +++ b/admin/manage_faq.php @@ -0,0 +1,218 @@ +getUserDetails($_SESSION['user_id']); + $fkisp_id_of = $currentUserDetails['fkisp_id_of']; + + if ($action_type === 'delete') { + if ($faq_id) { + try { + $faq->deleteFaq($faq_id); + set_message('FAQ entry deleted successfully!', 'success'); + } catch (Exception $e) { + set_message('Error deleting FAQ entry: ' . $e->getMessage(), 'danger'); + } + } + } else { + if (empty($title) || empty($description)) { + set_message('Question and Answer cannot be empty.', 'danger'); + } else { + try { + if ($action_type === 'add') { + $faq->addFaq($title, $description, $_SESSION['user_id'], $fkisp_id_of); + set_message('FAQ entry added successfully!', 'success'); + } elseif ($action_type === 'edit' && $faq_id) { + $faq->updateFaq($faq_id, $title, $description, $_SESSION['user_id'], $fkisp_id_of); + set_message('FAQ entry updated successfully!', 'success'); + } + } catch (Exception $e) { + set_message('Error: ' . $e->getMessage(), 'danger'); + } + } + } + header('Location: manage_faq.php'); + exit(); +} + +// Fetch FAQ entries for display +$faqEntries = $faq->getAllFaqs(); + +// Prepare data for editing if action is 'edit' +$editFaq = null; +if ($action === 'edit' && $id) { + $editFaq = $faq->getFaqById($id); +} +?> + + + + + + + +
+ + + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + +
+
+
FAQ Entry
+
+
+
+ + + + + +
+ + +
+
+ + +
Rich formatting appears on the public FAQ page—emphasise key steps and link to related resources.
+
+ + + Cancel Edit + +
+
+
+ +
+
+
All FAQ Entries
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDQuestionAnswerReg. DateMod. DateActions
100 ? '...' : ''); ?> + + + +
+ + + +
+
No FAQ entries found.
+
+
+
+
+ + + + + + + + diff --git a/admin/manage_permissions_admin.php b/admin/manage_permissions_admin.php new file mode 100644 index 0000000..2a3b361 --- /dev/null +++ b/admin/manage_permissions_admin.php @@ -0,0 +1,310 @@ +getPermissionRequestById($permission_id); + + if (!$permission_details) { + set_message("Permission request not found or invalid.", "danger"); + header('Location: manage_permissions_admin.php'); + exit(); + } + + // Optional: You could add a check here to ensure the data source itself is still active + // $dataSource = $dataSourceManager->getDataSourceById($permission_details['fkdspsds_id']); + // if (!$dataSource) { /* handle error */ } + + if (!in_array($new_status, ['Approved', 'Pending', 'Rejected', 'Revoked'])) { + set_message('Invalid permission status selected.', 'danger'); + } else { + // The reg_by for permission updates is the user who is logged in (DAC Staff) + $dataSourceManager->updatePermissionStatus( + (int) $permission_id, + $new_status, + (int) $_SESSION['user_id'], + $notes + ); + set_message('Permission status updated successfully!', 'success'); + } + } catch (Exception $e) { + set_message('Error updating permission status: ' . $e->getMessage(), 'danger'); + } + } + // Redirect to self, preserving search/filter parameters if they exist + $redirect_url = 'manage_permissions_admin.php'; + $query_params = []; + if (!empty($search_query)) { + $query_params['search'] = urlencode($search_query); + } + if (!empty($filter_status)) { + $query_params['status_filter'] = urlencode($filter_status); + } + if (!empty($query_params)) { + $redirect_url .= '?' . http_build_query($query_params); + } + header('Location: ' . $redirect_url); + exit(); +} + +// Fetch all permission requests based on search and filter parameters +$allPermissions = $dataSourceManager->getAllPermissionRequests($filter_status, $search_query); + +?> + + + + + + +
+ + + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + +
+
+
All Data Access Requests
+ +
+
+ +
+
+
+ + +
+
+ + +
+
+ + Reset +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Req. IDData SourceRequesterData OwnerPermission TypeRequest NotesProofStatusRequested OnActions
—'; ?> + + + + View + + + N/A + + + + + + + +
No permission requests found.
+
+
+
+
+ + + + + + + + + + + diff --git a/admin/manage_slides.php b/admin/manage_slides.php new file mode 100644 index 0000000..63571b0 --- /dev/null +++ b/admin/manage_slides.php @@ -0,0 +1,258 @@ +getUserDetails($_SESSION['user_id']); +$fkisp_id_of = $currentUserDetails['fkisp_id_of']; + +// Handle form submissions +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $action_type = $_POST['action_type'] ?? ''; // 'add' or 'edit' or 'delete' + $title_en = trim($_POST['title_en'] ?? ''); + $description = trim($_POST['description'] ?? ''); + $slide_id = $_POST['slide_id'] ?? null; + $current_photo = $_POST['current_photo'] ?? ''; // For editing, keep track of existing photo + + if ($action_type === 'delete') { + if ($slide_id) { + try { + $slideManager->deleteSlide($slide_id); + set_message('Slide deleted successfully!', 'success'); + } catch (Exception $e) { + set_message('Error deleting slide: ' . $e->getMessage(), 'danger'); + } + } + } else { + // Handle photo upload + $photoPath = $current_photo; // Default to current photo if not uploading new + if (isset($_FILES['photo']) && $_FILES['photo']['error'] === UPLOAD_ERR_OK) { + try { + $photoPath = $slideManager->handlePhotoUpload($_FILES['photo']); + // If editing and a new photo is uploaded, delete the old one + if ($action_type === 'edit' && !empty($current_photo) && $current_photo !== $photoPath) { + // Ensure the old photo path is not empty and different from the new one + if (!empty($current_photo) && file_exists('../uploads/slides/' . $current_photo)) { + unlink('../uploads/slides/' . $current_photo); // Delete old file + } + } + } catch (Exception $e) { + set_message('Photo upload error: ' . $e->getMessage(), 'danger'); + header('Location: manage_slides.php'); + exit(); + } + } elseif ($action_type === 'add' && (!isset($_FILES['photo']) || $_FILES['photo']['error'] !== UPLOAD_ERR_OK)) { + // For adding, a photo is required. + set_message('Please upload a photo for the slide.', 'danger'); + header('Location: manage_slides.php'); + exit(); + } + + + if (empty($title_en) || empty($description)) { + set_message('Title and description cannot be empty.', 'danger'); + } else { + try { + if ($action_type === 'add') { + $slideManager->addSlide($title_en, $description, $photoPath, $_SESSION['user_id'], $fkisp_id_of); + set_message('Slide added successfully!', 'success'); + } elseif ($action_type === 'edit' && $slide_id) { + $slideManager->updateSlide($slide_id, $title_en, $description, $photoPath, $_SESSION['user_id'], $fkisp_id_of); + set_message('Slide updated successfully!', 'success'); + } + } catch (Exception $e) { + set_message('Error: ' . $e->getMessage(), 'danger'); + } + } + } + header('Location: manage_slides.php'); + exit(); +} + +// Fetch slides for display +$slides = $slideManager->getAllSlides(); + +// Prepare data for editing if action is 'edit' +$editSlide = null; +if ($action === 'edit' && $id) { + $editSlide = $slideManager->getSlideById($id); +} +?> + + + + + + +
+ + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + +
+
+
Slide
+
+
+
+ + + + + + +
+ + +
+
+ + +
Formatted text appears on the public carousel, so emphasise key phrases and provide concise summaries.
+
+
+ + > + +
+ Current Photo: Slide Photo +
+ +
+ + + Cancel Edit + +
+
+
+ +
+
+
All Slides
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDTitleDescriptionPhotoReg. DateActions
100 ? '...' : ''); ?> + + Slide Photo + + N/A + + + + + +
+ + + +
+
No slides found.
+
+
+
+
+ + + + + + + + diff --git a/admin/manage_users.php b/admin/manage_users.php new file mode 100644 index 0000000..43c643b --- /dev/null +++ b/admin/manage_users.php @@ -0,0 +1,782 @@ +updateUserStatus($user_id, $new_status, $admin_user_id); + + if ($has_valid_r_flag) { + $userManager->updateUserRJupyterAccess($user_id, $requested_r_access === '1', $admin_user_id); + + if ((int)$user_id === (int)$_SESSION['user_id']) { + $_SESSION['can_run_r'] = ($requested_r_access === '1'); + } + } + + $message = 'User status updated successfully!'; + if ($has_valid_r_flag) { + $message = 'User status and R/Jupyter access updated successfully!'; + } + set_message($message, 'success'); + } catch (Exception $e) { + set_message('Error updating user status: ' . $e->getMessage(), 'danger'); + } + } + } elseif ($action_type === 'reset_password' && $user_id) { + $new_password = $_POST['new_password'] ?? ''; + $confirm_password = $_POST['confirm_password'] ?? ''; + + if (empty($new_password) || empty($confirm_password)) { + set_message('Please provide and confirm the new password.', 'danger'); + } elseif ($new_password !== $confirm_password) { + set_message('Passwords do not match. Please try again.', 'danger'); + } elseif (strlen($new_password) < 8) { + set_message('Password must be at least 8 characters long.', 'danger'); + } else { + try { + $admin_user_id = (int) $_SESSION['user_id']; + $userManager->changePassword((int)$user_id, $new_password, $admin_user_id); + set_message('Password reset successfully.', 'success'); + } catch (Exception $e) { + set_message('Error resetting password: ' . $e->getMessage(), 'danger'); + } + } + } elseif ($action_type === 'add_user') { + // --- Handle Add New User Submission --- + $id_card = trim($_POST['id_card'] ?? ''); + $first_name_en = trim($_POST['first_name_en'] ?? ''); + $last_name_en = trim($_POST['last_name_en'] ?? ''); + $sex = trim($_POST['sex'] ?? ''); + $dob = trim($_POST['dob'] ?? ''); + $phone_number = trim($_POST['phone_number'] ?? ''); + $email = trim($_POST['email'] ?? ''); + $username = trim($_POST['username'] ?? ''); + $password = $_POST['password'] ?? ''; + $confirm_password = $_POST['confirm_password'] ?? ''; + $user_role_new = trim($_POST['user_role_new'] ?? 'Data User'); // Role for new user + + // Server-side validation for new user + if (empty($first_name_en) || empty($last_name_en) || empty($sex) || empty($dob) || empty($username) || empty($password) || empty($confirm_password)) { + set_message("All required fields for new user must be filled.", "danger"); + } elseif ($password !== $confirm_password) { + set_message("Passwords do not match for new user.", "danger"); + } elseif (!empty($email) && !filter_var($email, FILTER_VALIDATE_EMAIL)) { + set_message("Invalid email format for new user.", "danger"); + } else { + // Prepare data for User class + $person_data = [ + 'id_card' => $id_card, + 'first_name_en' => $first_name_en, + 'last_name_en' => $last_name_en, + 'sex' => $sex, + 'dob' => $dob, + 'pob' => null, // Add if you collect this + 'nationality' => 'Cambodian', // Default or collect + 'marital_status' => 'Single', // Default or collect + 'phone_number' => $phone_number, + 'email' => $email, + 'telegram' => null, // Add if you collect this + 'note' => null // Add if you collect this + ]; + + $user_data = [ + 'username' => $username, + 'password' => $password, + 'status' => 'Data User', // Default status for new registrations + 'can_run_r' => !empty($_POST['user_can_run_r']) + ]; + + try { + if ($userManager->registerUser($person_data, $user_data)) { + set_message("New user '" . htmlspecialchars($username) . "' registered successfully!", "success"); + } else { + // This else might be redundant if registerUser always throws on failure + set_message("Failed to register new user due to an unknown error.", "danger"); + } + } catch (Exception $e) { + set_message('Error registering new user: ' . $e->getMessage(), 'danger'); + } + } + } + + // Redirect to self, preserving search/filter parameters if they exist + $redirect_url = 'manage_users.php'; + $query_params = []; + if (!empty($search_query)) { + $query_params['search'] = urlencode($search_query); + } + if (!empty($filter_status)) { + $query_params['status_filter'] = urlencode($filter_status); + } + if (!empty($query_params)) { + $redirect_url .= '?' . http_build_query($query_params); + } + header('Location: ' . $redirect_url); + exit(); +} + +// Fetch users based on search and filter parameters +// We will modify getAllUsers in classes/User.php to accept these parameters +$users = $userManager->getAllUsers($search_query, $filter_status); + +$totalUsers = count($users); +$activeUsers = 0; +$inactiveUsers = 0; +$dacStaffCount = 0; +$ownerCount = 0; +$contributorCount = 0; +$rAccessCount = 0; + +foreach ($users as $user) { + $status = $user['isu_status'] ?? ''; + $isActive = $status !== 'Inactive'; + if ($isActive) { + $activeUsers++; + } else { + $inactiveUsers++; + } + + if ($status === 'DAC Staff') { + $dacStaffCount++; + } elseif ($status === 'Data Owner') { + $ownerCount++; + } elseif ($status === 'Data Contributor') { + $contributorCount++; + } + + if (!empty($user['isu_can_run_r'])) { + $rAccessCount++; + } +} + +$summaryMetrics = [ + [ + 'label' => 'Total Users', + 'value' => $totalUsers, + 'icon' => 'fa-users', + 'class' => 'bg-primary-subtle text-primary', + 'icon_class' => 'text-primary' + ], + [ + 'label' => 'Active Accounts', + 'value' => $activeUsers, + 'icon' => 'fa-user-check', + 'class' => 'bg-success-subtle text-success', + 'icon_class' => 'text-success' + ], + [ + 'label' => 'With R/Jupyter', + 'value' => $rAccessCount, + 'icon' => 'fa-flask', + 'class' => 'bg-info-subtle text-info', + 'icon_class' => 'text-info' + ], + [ + 'label' => 'Inactive', + 'value' => $inactiveUsers, + 'icon' => 'fa-user-slash', + 'class' => 'bg-warning-subtle text-warning', + 'icon_class' => 'text-warning' + ], +]; + +?> + + + + + + + +
+ + + + +
+ + + ' . htmlspecialchars($_SESSION['message']) . '
'; + unset($_SESSION['message']); + unset($_SESSION['message_type']); + } + ?> + +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+ +
+ DAC Staff: + Data Owners: + Contributors: + With R/Jupyter: +
+ +
+
+
All Registered Users
+
+ + +
+
+
+ +
+
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+
+ + + Reset + +
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No.UsernameFull NameEmailPhoneCurrent RoleR/JupyterActions
+ + + + + + + Enabled + + Disabled + + +
+ + +
+
No users match the current filters.
+
+
+
+
+ + + + + + + + + + + + + + + + + diff --git a/admin/r_in_jupyter.php b/admin/r_in_jupyter.php new file mode 100644 index 0000000..73ec8df --- /dev/null +++ b/admin/r_in_jupyter.php @@ -0,0 +1,162 @@ + [], 'missing' => [], 'workspace_dir' => null]; +$workspaceRelativeDir = null; +$workspaceError = null; + +if ($hasRJupyterAccess && isset($_SESSION['person_id'])) { + $dataSourceManager = new DataSource($pdo); + try { + $workspaceSync = $dataSourceManager->prepareJupyterWorkspace( + (int) $_SESSION['person_id'], + dirname(__DIR__) . '/uploads/jupyter_workspace' + ); + $workspaceRelativeDir = 'datasources/user_' . (int) $_SESSION['person_id']; + } catch (Exception $e) { + $workspaceError = $e->getMessage(); + } +} + +$jupyterBaseUrl = dsp_jupyter_base_url(); +$jupyterToken = dsp_jupyter_token(); +$jupyterIframeUrl = dsp_jupyter_iframe_url( + $jupyterBaseUrl, + $jupyterToken, + isset($_SESSION['person_id']) ? (int) $_SESSION['person_id'] : null +); +?> + + + + +
+ + +
+ + +
+
+
Full JupyterLab Access
+ + + Enabled + + + + Disabled + + +
+
+ + +
+ Workspace error: +
+ +

+ Approved data sources have been synced to + + inside the Jupyter environment. Only files you are approved to use are available. +

+ +
+ + + + + + + + + + + + $syncedItem): ?> + + + + + + + + + +
#Data SourceData TypeCategoryFilename
+
+ +
+ No approved data sources were found for your account. Use Manage Users to approve access. +
+ + +
+ Some datasets could not be synced: +
    + +
  • —
  • + +
+
+ + +

+ Use the embedded Jupyter workspace to manage R notebooks, explore uploaded datasets, and + collaborate with Data Owners. This view runs with your admin permissions. +

+
+ +
+

+ Prefer the full window? Open Jupyter in a new tab. +

+ +
+ +
+ R in JupyterHub is currently disabled for your account.
+ Visit Manage Users to enable R/Jupyter access for yourself or ask another DAC Staff member to toggle the permission. +
+
+

+ Once access is enabled, refresh this page to launch the JupyterLab workspace. +

+ +
+
+
+ Need the current Jupyter configuration? Visit + Install & Configuration + for defaults, overrides, and runtime details. +
+
+
+ + + diff --git a/api/run_r_script.php b/api/run_r_script.php new file mode 100644 index 0000000..304e636 --- /dev/null +++ b/api/run_r_script.php @@ -0,0 +1,203 @@ + 'error', 'message' => 'Unauthorized. Please log in to run this script.']); + exit(); +} + +if (!has_r_access()) { + http_response_code(403); + echo json_encode(['status' => 'error', 'message' => 'You do not have permission to run R/Jupyter scripts.']); + exit(); +} + +if (empty($person_id)) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Missing user context for R execution.']); + exit(); +} + +$dataSourceManager = new DataSource($pdo); + +$data = json_decode(file_get_contents('php://input'), true); + +if ($data === null) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Invalid JSON input.']); + exit(); +} + +$script_name = $data['script_name'] ?? null; +$data_source_id = isset($data['data_source_id']) ? (int)$data['data_source_id'] : null; +$parameters = $data['parameters'] ?? []; + +$r_script_path_dir = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'r_scripts' . DIRECTORY_SEPARATOR; + +$allowed_r_scripts = [ + 'data_summary.R' => 'Basic Data Summary', + 'descriptive_stats.R' => 'Numeric column descriptive statistics', + 'category_frequency.R' => 'Categorical frequency distribution', +]; + +if (!isset($allowed_r_scripts[$script_name])) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Invalid R script selected.']); + exit(); +} + +if (empty($data_source_id)) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Data source ID is required.']); + exit(); +} + +try { + $data_source_details = $dataSourceManager->getDataSourceById($data_source_id); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => 'Failed to lookup data source.', 'debug' => $e->getMessage()]); + exit(); +} + +if (!$data_source_details) { + http_response_code(404); + echo json_encode(['status' => 'error', 'message' => 'Data source not found.']); + exit(); +} + +$data_source_owner_person_id = $data_source_details['fkisp_id_of'] ?? null; +$has_access_to_data = ($data_source_owner_person_id && (int)$data_source_owner_person_id === (int)$person_id); + +if (!$has_access_to_data) { + try { + $has_access_to_data = $dataSourceManager->hasPermission((int)$person_id, $data_source_id, 'Analyze'); + } catch (Exception $e) { + error_log('Analyze permission check failed: ' . $e->getMessage()); + $has_access_to_data = false; + } +} + +if (!$has_access_to_data) { + http_response_code(403); + echo json_encode(['status' => 'error', 'message' => 'You are not allowed to analyze this data source.']); + exit(); +} + +$source_filename = $data_source_details['dspsds_filename'] ?? ''; +if (empty($source_filename)) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'No associated data file found for this data source.']); + exit(); +} + +$upload_dir = $dataSourceManager->getUploadDir(); +$upload_dir_real = realpath($upload_dir) ?: $upload_dir; +$full_data_source_path = realpath($upload_dir . $source_filename); + +if ($full_data_source_path === false || strpos($full_data_source_path, $upload_dir_real) !== 0 || !is_file($full_data_source_path)) { + http_response_code(404); + echo json_encode(['status' => 'error', 'message' => 'Data source file could not be located.']); + exit(); +} + +// --- Create a temporary file for the R script to use --- +// This is a security best practice to prevent R from accessing arbitrary files. +$temp_data_file = tempnam(sys_get_temp_dir(), 'rdata_') . '.csv'; +copy($full_data_source_path, $temp_data_file); + +// Log the usage of the data source +error_log("Logging usage for data source: $data_source_id by user: $user_id for action: Ran Analysis"); + +// --- Path and Permission Checks --- +$r_executable_path = getenv('RSCRIPT_PATH') ?: '/usr/bin/Rscript'; +$r_script_full_path = $r_script_path_dir . $script_name; + +if (!file_exists($r_executable_path) || !is_executable($r_executable_path)) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => "Rscript executable not found or not executable at: {$r_executable_path}"]); + exit(); +} + +if (!file_exists($r_script_full_path) || !is_readable($r_script_full_path)) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => "R script not found or not readable at: {$r_script_full_path}"]); + exit(); +} + +// Build the command, specifying the R executable directly. +$params_json_str = json_encode($parameters, JSON_UNESCAPED_SLASHES); +if ($params_json_str === false) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => 'Failed to encode parameters to JSON.']); + exit(); +} + +$command = escapeshellcmd($r_executable_path) . " " . escapeshellarg($r_script_full_path) . " " . escapeshellarg($temp_data_file) . " " . escapeshellarg($params_json_str); + +// --- Use proc_open for better error capture --- +$descriptorspec = array( + 0 => array("pipe", "r"), // stdin + 1 => array("pipe", "w"), // stdout + 2 => array("pipe", "w") // stderr +); + +$process = proc_open($command, $descriptorspec, $pipes); + +if (!is_resource($process)) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => 'Failed to open process to R.']); + exit(); +} + +$stdout = stream_get_contents($pipes[1]); +fclose($pipes[1]); + +$stderr = stream_get_contents($pipes[2]); +fclose($pipes[2]); + +$return_code = proc_close($process); + +// Clean up the temporary data file +if (file_exists($temp_data_file)) { + unlink($temp_data_file); +} + +if ($return_code !== 0) { + http_response_code(500); + echo json_encode([ + 'status' => 'error', + 'message' => "R script execution failed. Exit code: {$return_code}", + 'r_stdout' => $stdout, + 'r_stderr' => $stderr + ]); + exit(); +} + +$r_results = json_decode($stdout, true); + +if (json_last_error() !== JSON_ERROR_NONE) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => 'Failed to decode JSON from R script output.', 'r_stdout' => $stdout, 'r_stderr' => $stderr]); + exit(); +} + +try { + $dataSourceManager->logDataSourceUsage($data_source_id, (int)$person_id, 'Ran Analysis via API', (int)$user_id); +} catch (Exception $e) { + error_log('Failed to log R analysis usage: ' . $e->getMessage()); +} + +echo json_encode(['status' => 'success', 'results' => $r_results]); diff --git a/assets/.DS_Store b/assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..846e05d41fe9d0e19f1dbc9f20dd39e0e8e929c3 GIT binary patch literal 6148 zcmeHK%}T>S5Z<-5KNO({1-&hJEtm!oi4-y&F zO!OB``0Xtgvl;W*lvTg~BbX;~wzRBIzSC&#w%Q=Q_M`VKb8qP{SDEWC?s0S@WfGLS zAKb=KKI!jY%5>?+X|zxYaTr0!!(E()GI!-F4KtPNX-5}i(mz_SheOLAh_iEhGZ5>M zZ4Jcf$lh$aorB|(i|fftGE3!~W|9NxO7;wv@D56)s8?^1CNiCZz04_N35fw>fEXYK zwvGXF6m)u9S2-0-3=ji9F@XDnfQIN8EHtXE13J7uqrZuW0y@4W5QRaQru?7+j}=U6?q>V4+c`Gp<&KdCbb?xK60p>+AmOtILBb2 V5obZWN(ZEifFguCV&E4T_yR8tOg{hs literal 0 HcmV?d00001 diff --git a/assets/diagrams/data_ecosystem.mmd b/assets/diagrams/data_ecosystem.mmd new file mode 100644 index 0000000..1b65357 --- /dev/null +++ b/assets/diagrams/data_ecosystem.mmd @@ -0,0 +1,54 @@ +%% Data Ecosystem Diagram for NIPH DSP +%% Render with Mermaid (https://mermaid.js.org/) + +flowchart LR + subgraph Clients + U1[Public/Authenticated Users] + U2[DAC Staff] + end + + subgraph WebTier[PHP + Apache (dsp_app)] + UI[Portal UI
Dashboards & Workflows] + API[PHP APIs
Uploads & R runners] + end + + subgraph Database[(MySQL 8.0
dsp_db)] + DS[(dsps_tbl_datasource)] + PERM[(dsps_tbl_datasource_permission)] + PEOPLE[(ist_tbl_people & ist_tbl_users)] + USAGE[(dsps_tbl_datasource_used)] + end + + subgraph Storage[/Shared Volumes/] + FILES[(uploads/datasources)] + RSCRIPTS[(r_scripts)] + JWS[(uploads/jupyter_workspace)] + end + + subgraph Tooling + PMA[phpMyAdmin
dsp_phpmyadmin] + JUP[Jupyter (R kernel)
dsp_jupyter] + end + + U1 -->|HTTPS :8082| UI + U2 -->|HTTPS :8082| UI + U2 -->|Admin Ops| PMA + + UI --> API + API -->|SQL queries| Database + PMA -->|SQL admin| Database + + API -->|File uploads/downloads| FILES + API -->|Sync approved files| JWS + API -->|Whitelisted scripts| RSCRIPTS + + JUP -->|Mounts| FILES + JUP -->|Mounts| RSCRIPTS + JUP -->|Per-user workspace| JWS + JUP -->|Notebook insights| U1 + + Database -->|Metadata feeds| UI + Database -->|Permission checks| API + Database -->|Audit logs| DAC[DAC Reports] + + style DAC fill:#f7f9fb,stroke:#93a1c3,stroke-width:1px diff --git a/assets/images/niph_dsp_data_ecosystem.png b/assets/images/niph_dsp_data_ecosystem.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e9b8671741ed48519ccd004860f2f189ca48d4 GIT binary patch literal 554328 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ය|`YGZF=1*^Y(omLIHBy^h&)y*#eoCxyZ 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ĆVdy1FqxwBrsq(qhvOl{S8U5~2Ipb_!MPiaW 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 ZA>f3769P^MI3eJKfD-~v2>j(C@P8f9QU(A3 literal 0 HcmV?d00001 diff --git a/assets/images/niphlogo.png b/assets/images/niphlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..4e06dfe7b4ee2ae260f84dcc96488dad1346ab47 GIT binary patch literal 138218 zcmbTdb980RvoIXnwrxyoI}_Wsabnxa#Kt6<*qGRyXkyzrvGwM8?)}~G`{S2)3F>`(p5O51?H7z$S1$kamM|&pYe_)sZ_D)~e zARzog04HNpTXQ!O6LU*z2LZCnjvg`+Ycl~dO%4SX1t&3cD{Eo0 zG9f_{egN+m0ef>dV-kS9or5bcK!EIDy1ZZQf4Z5;Nd5(JvlSrwFQK#)lt{!JUCc>1 znAjOjSy)*~I60YEzj1JKvNDjcv9Pi+vwVFy8Ck#aa&YppagqG@hwO`+iXnbg^V+<>BG^hXxxP;}-;@tCxeDF@Vv*mHa;x#LZnz zU96qltQ{Rl{-J1W;^^)sK=vi+e+|LjNkQR%2s^m`x1zpO#tblaVrFGxVYavbXI%e6 zySk~E|36~giC}&l$(Q%M_d(|G|}UaCI|wFg5=VU+XWv|BWm1 zf5qh$b1^q|b97O2bhP`A2Pj!Nx;eU9IXaPusdAFgXj(g%IeNO%{$rm18m+jwi?xTj znWT%OJ;}fN<+c7_`2T;8`@e9_{{QHV`AZn)f1Kn0qGluEIfPwC(|ghH~B(CL(y!GyI^37R4`EUAtB%& z!i^v?I!quj>q81)qA`9xZj!>vNIRB1+9hvfKIi**qKnqQZGlht_`K<_oGZ4wS|0Lk z@jT|ZW|mqzMT!yZqC~to!ng)@|J&pi-XcYE{-+znFM@mUt34V(czn51`S#8?1yYGg zL!+jwGwJkDC8`iUR8d%?C}ti8C1I>|a${pdQSK(=Ef5j|zkN{MyCD`95fQ3^iePTu zTL>q}w4+#Q7_Uc;M8sBJz4KXtl z&!JPfzeb-;F;C6;af9yW7MIh}xXl*tzEF1P$WS_iUqa%M2q6aB7RMtsmbrU|#i=0p z{tUOsG%#R;%yfzXQ?*R?$>LXZpBRVTCPksEB?-N5u`AotGnnm?4GhA3!7l`nzF3En zXsy$&YxDwB&|8Cf<36xWWQDtx(O8TW(!Ab8{K89cfWPc}y9fY)tP|_6nm&=$!p7&ht0?q? zEEw-_d8*#Osv>JG1%4;bSC%ly(DDv=dA?w~Sw(9g7i-`fzu9o&5Da~P?Ti{j=60~? zxnqXZ3SHf6B8((d9It5(1O~Cam+o|VQc_UcwpsiLrgggvM*tNS<8XHDc~KEnNe%}J zaIEtYJ~?9!p^=T9&4BQ;A~SzS?)zq6^L{igFR6DdUsBQ?7<^Sz1`Un4 z{s8In2>}*L9zoO)BHFD{&EA69ZIsTjgPgCG&9cjEDS$%i0eLwm zC+8NYBq%I9b?i@lef;~`^Ek_MmnZf?Wm148!x))`+^jKg@(cC6e}AvKeaj8qwej01 zBS+k9%2elxyL}1B!|;~)*az+>)VA1pzG8GltLw<&NK$sLlrOdv37~&Kzp}JP?gah? z`(R#Cb)rB+{DPsG!3Oiw!jfP&ae@hH#&a~EanKUg+>tO&QoQ8nK&7W4$Dm&2tfzbf zXzMyc8~(LQOMu0n4*}wB9^I6vOitj>C0i$#UAy>qD89W#(ix*2EOd^S@1*F;%GvZt zzgD~kz2eMdS}Mxtdv#4eJuY^8e)XGd76X#Ra?Bjlf9WcJilS$=Zq4+R5XvhA=ZrHov+_AcR3K9l~$e?r0a-dx{setw#n4 zI=?_)P70jT4^36an`5WI*mrFWiXN9Ox?ez(ofst>RZ>zZDJ&EzqJsAPgW! zYxo6wt0FqTx3!)y(~-6m1ETDiHCW!Bj)=t`@kg5MCsL*Dt3z*GY9PL;fNAU>fkc&M zUirBS0US8RbfEIHXN>Bd3|U$=C`v0-q>WLFsrG0@-XFJaL5(S?Qqu5eMGvrgoo#$B zJ`XvwkiOzM_#NSmCXAFA(3Y5V0;m0u8teAiQYEyMRVdr1v_0WH$7gs!Jvg5^$SWf} zuM79(@h@o+<@Q-+)R><3(%aRa4Z3r*vd`+8_gVYTW5M&}{C2Qi^tR5G?sR4qjBivl zOtXWb58A=NE{Huoj|yo8@Mw5aDk1yDpf;tREWATcI+3kswP0SGF_m(+cr@nkX{diC z<$i7j6t<-4uoAdJAUS`nKQ(nuiI-v|-_(>*TCLIH*V<%mniR^}JV?n8XHifG*E`%6 zX6n&rTH?YpaOi_W?33s@oql{=jWxq>H?`{+r7u4eT}GwZ-ru9_;CFW9l=AU}@bJ0r zzOTI+T)l_oPutTQ&iM@%R|9O(5fSjJjIoluiM%w_s*==&8G}ek^LA!P6~x!o)Ywo{ zhoGhZQuNHRJzZ?jyKi-9W4rSPCZ3;v{ffr4@h9337G+_h{iYta3xvW# zgUcMbcA*qjI2aEq@7R~&Rg|iYm=#`Y|La+kC?*z|hB~8{bKXL&v#(XiYg>)0_%X9ioN`6eBsfct8*uS=|A|4X*ag&!2F0Qn}i8 zpJ(eYa}OcDeJ%Y{G{vqK76wfl#5_dSNGdTH{CfC9dl*wDi> z@WUhMKWh=T!?!s?>HHLkowW%_;4ilGc3l*N;jsviugEmZ%_+v8{^36`)CUV~v(6>F z`|0WB;(fXzF~Ws42nga$NM~+V_9;N zzY)w-f@Sg0+s_6Ueu5y1MX-Q*0r!G{g{)<1sn$qX%2_qsLFX+#uu?OF^-ArgpHX@!>0(&KE9{6i)Rf9@q<)CV(P}d;WpK{YhnVBM**C zVntHISlnZK>~n&)!?zx@Ye%|YRo_1*%aH$}QSLQg;Z&_@q^1^{raN0y0?OpB(e{mo zMcK7lb=$x+TrLWiZTgA_aD}!i3Oy8pA>wA6_Y9qC=`}PoyEQw*J@iQWvw%y_47%uceDYw5CIsKx0`w*!Bl4b3IP(ZH@$Gzne!bDbFGArETM zWaZgz))7Y^7K`TT9j2r+9Z!ZmedyBuNOuv@&j2g1GOBrc+&WF{6jV7YK|A6sk^Of9i-_+Tk`%2x|vmzs`a}A`dbac zYIBJ6-o+xOik%OOVStr~=Ipa8&Jk0h<;xAHKYu=c9hrba|6(=X;%AY`G*NgzSYfEX z3~EzhVcD?c9BJcPvlJVlE9LuWb)d?K?e>??ygkZ6Gc&I{UvA*&DgPob2~uUpV;Wbz zJMQ~?$PxQHoV4iY8$A-T9>g+TP+M9qGMIki z-cPZtTF_VB_FcCEcDmdk?_7ihnzg`A)L!-M>36;DA}YnnA41HnQM#a5nNb>IxqDdR zy!R`djz&_}r_|&_Mon5{ct%$GR+5i*c;c8GB%M{DvzBKl8hX&0c-REIR3SOFcqT(1!&-b1+J1RN(UzY+hI3 zxI7WxUs%_LtDK*lU<(U-F1#GZIhr|_*V%j?gDzIUH-f;0RoIktT{j;VAU4M!Vr7CP za}eBz3!Tta{NlLJeu*&#mB#h5;g{2A5w5p0OM$+2AX=nA7Utq3RC**04Wx<@($?^D zg`0fmI=4S_cnyR8(ilv69USBgPY0HMgAJ;xQUvF-1z>4D8I9Y_R_{(yc~t6R6Y;cH zWai}_s)!7<*i|*~IIMN;uUJGjmGCz~+D^ZSXvg%*<)&GU&xi+?ipum=`>mx(nlC1%Dj~mTnn}-J{ZZN3)*O(5O~fofBmgm=5tc?popF1KIRtBa0!-j= zg)4)@!3Qzw;-oPiF_FMZgmnsK)wgM#)*qYxilMOnjE?HVU5!%=B`#OzF(Cgp^fnb%tTRKPZh!no^kE6>8eGiF=zC;(VRh!2?B_)uF<|voxm`0dB(# z!@I*+s_G9N%e>BP!)UOBw#A)%rKp}aB5$(!c3K`(R94Hrtre6dO?7brA`yrrSL*#a zfSb6UJ{ER z!PqoSU1tu#*APTlaGBVXbQ}kD_g!(g2^mYei$l7w1t1EhyBK)oWa7OSgg<&lA#`r=UdVvy&|mt#jlI>FxwGu&3CXW==WoAvAS8J?f_(-7x?3!nY$DflY+{X!~b)m z%Ow>yYTvIOd_U0w+pYTsmYq2 z=oE)|H$0!W-PE1>`-}YfoOZ*sO+`yNmdQ_SQF!Fc(4XNXlA`54I6A*0`e|^L^bCVy z#~FSsVniiMmU_AXl9(wg^ij3!K3D|%z4D;;pZSdSxg6`D!We>}^au@uoFgV?1*)Nl zIxE&1%x3_5u$JWEVmm`;ugD<${8^acEgSkFppkK@zhnS!&g%2!NA3@v=XF$r9RY#&i1D13D*iGf;R49H3PHQfaF{KXJN)3(7nZ$xza| z*;zv0ev;Ra3Vv7&32IL!D#95V!!#Fy!q8WZ^!}iW<k55A(r0r& zHmWMj6)a6VX=DE|u;@?!M(`EjXw6yfjw8dz2vjhZ+M)v2%Cl>a=~Ef9cR=%`+X`!qYei7f zmr%aChgme5;W$$#PMLaw^~Q`cxIM<956p_#55m^=H}T#`&;~b>OBoY(U=KxJ#j+OS z?Gb&3z#7)enC3jMhx{UaG*dwf7U*SHLcE#6rr-{h{Xrn;Q(FsE8G+}}*JiWb7fr?} z;Igt-7M%eL%f?6Q8O=lE?zDQR5SmiYry9cYNbdVM+>x+3Pg7iWkYjgHr!)CoCkcP+ zY_8e)#dcKcMrU132%n2zT#Knw;%7jFJX^NmmR_u4-^R6Ds}JP1tDS7+xrl?S)}35OB#@xIj`e#^(xUoJ!Aomhr8i%gUu^i z$KLI~>Nq}a1OsSv+n&6j8B!M)t%Y|d;O@H$MrM%GK|z14f~y4+BcMlZAb>d)#%EZV zmy@j~1Crq{P=wN;p}vh6j{%Kpxqy2ZcS2m$OLeu#<$#EPDtVu!p+4x#LL72gW}Fi{ zaVQRK);I!q{f1ku%n8%h-Jx4N8q?S)A|_<>Kjlc7wc%*#6Iv0Dw@QVbPf;bF`!haI z@`#?TAj{8fIY3{d_tKy(vNU+1bn;dJ@d;o>B1nu9$hpGNc4EZiz^@g&7$%V@s0VYO z^1Z+f2qxc+Xx9(HV%TG`7|QsT!hHVm@k(bQXgyT)9S4ii)rIic9CtUMnZbO)XJd8dVCzZAo?zr%-B;pLPP3a#|bR+@sIb@ z<|V^v!F2OZFsWSPe=-#QouO$eD$4q?wbnCo`w4iPNu#>$-)Dii>~6=43f&ZfQC3g$ z?7h1~iBT&PUS7LC2Iz(7g{sbhF;ln;ZKj&6!$dX0 zO3tMFJdK52uS`|w4j{lTc$JZ<#0=j}Zi%LuJ^kG~LwsLK!+!MD_uLy%;5z4Y{+XEhAf&i%7C6icL z2M$75z5fk`Fmp+#FOQabs?oi*zohTR8g%~SwU~EgioF<-yXvDQg<6GpaBcywmyzp( z!FtD@L>r!f)77~$hDH)w(bo1p6Uc}th=HE2-6IZ;zZ5EJ;F2cETrnh3LN--ZNCKJ$ zNhJejLtbw-Mr1#>kabo4^f~%?iBV@RKP$%r7XSJQmNE)3D87}XjE;CAO{dfI6#p%` z9y9CQEw6v4Fwtt8GOrp3mj}VsXFbB<<6_7W^IrXl$A?Q$MlZ^q$44eXr&pZj^pb{Q zlZ$A0yjGn}?>O<*HeYP#Ls=X)PON&}iDnhiwWe~U#P4UDt0n8|LAuD}?8ppOfDQbs z?;UG_p%9C<&EW&6PHWor$7}C9ayj799#bxjA`Z2_u-^BYWf`);lxa+P2X?4-4ohXZ?XGX;0^N#wVR*Iz zxe@f3^cSj##0?Y{9$mU1-P)x)L})7=C{*KicVl>U6b75yU%9n3WoLo^Bz# zllv9yd~Z{3yC{s$jj}p`EcW}wM#VeaLR?aEjT3>GVaDmw4Y9Vn!sI|UYGHwOD_P}9 z@UHH~`^-vS4P&x+tqY%QbCeWm=93w#7}Z#2?280{IU3ptICr^RGGs0vIC~z%aNL0r zvtcrij^{<_!|GY$(kH^0jR?3lNH(wc-i7hUGQkSJU`u2cJ{BwvAx zW{iZMGW~QKSg-2%oDtRV)ZPm&tGxk{)=s5mZrM)&f;VHQf z0W`-4uV4&ukcUGe5nRIBTu+Q5{(*wVX`W-)oLabxI0Mk!I&Oc;LqhG)qTg&_{>61| z!tZIBpaQ|aP2?x~aIkqWl!1nB#&vfR>c0?=NB8_}ZvM z&KY_mMnbnsj|M51oj(4>pS(T&8z!wGxs zmJNoV@w2wYIFy($8pJP7OW=~;^1ggrtjUmX@{$W&Gva+a%-#29xSu?8Z~ukM={ zVT<`?i^AcmJ|kZJzEi7Gr_i>w9^s}Y$VFHKrzsz&g#$MEkd+~;v0Q#GjPJX&wi;Sw zK-wL7#mQD5sX$?(s7}rkVYmDTY*v+H7B^Pl_jkXlSHFxkQ(oE>uvkMb!m~z?6)Hy= z9`}cMs>&S=`B*$y@{5Vf1bS`4N4E@+08K;whBHcxc`Wqh37kzA5)02RXlKxip{=-n zIb~nYJIc_Gi0#~B!~U(IlplZfGYHtRvRxjwlNhH-I{3lyXki>6^{n3CycbI7-K5lY zA2@{ec4#!$XNM7Me?l28t~O>km1Bf=`4q(A!#4*6&`b-$Bj9@&$m22}bD2fP27#+H z=++ob+0m=0Qa04NtgIZF581uGEXDh}cg+=Yd=d}xNK z8_$mf>w$b4T=(LC++WTXkF@X-qx7c`Hb`%WXM9`RJ884VL0y!x6W}!|u+mGWZ@4mk zYc&aO8S7U*MZH)7BS!WHeGlQ?Gn1i1!ps#d7=!L(>fZI$y+PX9Q=M>Xp)yp9J6sGc z$e4!~c-Pm_jXD@RyM`s?o9ZE-EJ5Ks0uFTNgqW~tKkbIuMy02fi!Nf4Vw11rjJ0d6yK)g5nKP#imtCv?C@c|0rF0qX?}5H6%=+C ztU4AuEuBQ0La2Gc{8}E0U=-uJV!&eD(S0h0@eqZ0hSS-dG=u!zzyLlx%ZoTgHinvNdVtE%x?zWm}OV~RK}N#`xnKm;)z4UU(atYURvhsTK`Ak} znIOEcct#yFW;D1z5W(WNq!`ucgRH$cQ<)x&Z8*a% z4Mf|?@O8NdTw4#Om!d@CPDAcUdz-1}4)IZUQ?w8VwrrwuYh*s z?Q`J+DX0ikczJde^{-3t5&(yzanoYqS3hHTawapuZ;I9j)H_OY?s z?kUTKei-yFSUZuO)C#~djZYKlF@c=FKP%jHL%-VJODtOB^bt3IdT}XMA82!?JLE^U zTP7LMWA4aTG|@EVl05PFd_VOuFwm05$L84{_}T~2T;GW&986r#12^VSyq7oHCP?}9 z`l>SV0JCBt*Kb30?PB896;R{_mX6(^Jbb#o0p&lVdIfQ8JG`QXxWq>(xmrJ6>Kq|_ z!6;l=MFsk=B|pnTKUZn;J2-*KJNA}9Qj@MV)LpDd<3hjL)yAJ%ix27N8vu__pK{0Y z!Z`hGLLE^;(7lTNg~1v8tA)gLC!f3KB7NBxXwSa8Wmv%3a(YI973isrT!Dd!$+GZx z=yx#etO?kst%xw@{;5}bKGMQ(;Fja;sB(c*)9l>k_(9!>CAs&Kfb7U5bfwB@GT{zo zhQVHTn;WH{S%qkPLfYO?)5KbVxcb1}$SZ#>H*ZX$&3C#fHS;|tuuoIUu?(Lpu^cAZ z-sQ#OE0eG1SyS{y*3#7_FzB+X^|>9@(q0nbcY_zzQoD!8vymmvhngILRcPcv?~k;$ z);Xu=DWgZ#O1|co{6dJeRkEhOkyX=C^Dntoy{fi1tPI^?yx#Gt`ToH!M{3(i5hTyh z-zFL@j^~B~i8XYuHay`hrVG#Fj?!ZHUpG7KB%SKm-c~G|m#hbf38i;I-UEW4xcO`o zh`33%jOwL9As!qgizVh8^Vy|D&&p$hq<>Y0{PrMRre_u#nZQRcAB67MUP$`TS{Z=m zsPRrx8aS;EAX~O==|y|Mx0YV#5M}5{{jS@&@+f0ckn3Eq9SU-eQ>$_1dV}#w#4IG2 z!^ReTyaH}e-0`eV5Qku{`lK~>T<dhAr&_l`WLnzr|8R9TB3fJC-2 z07HJ3D7CeqWixAdUTdsAhrFECg^ujeg`eQo8HOPZjz#?u_$-B09NW^>xaJ3_Skt#U zz?$EG*<&2sk9mX^gxBQVS}M~l8n$tOdJ8DJ@`}KtSDV}Bi@d)~a2`lZ`8oIo&$8`? zdRN;GckqfiL*$2X+VcT9w$S{X+Z)FP1`cfvc;^T!%POdf&AhqU@BUj>{NB7|W7uq8 z`KJu=FJax6y?W?7h_7}c&ZAVzN(yrbZk8JTs=|-*z^T@kwVvl5R4V$5g@yh1S(bCK zNow`U{r`CW-Knk|xH=&b`r(ZV&QW<(2SCUyZy>HK7B#aj$>fUy%lSPC8X(AT(82D=myr>^Ui zrsZp`4~Z~16QcjNZR{p6{m@3&ggxBE3mW#KDZb`FNpC8kjo~gUkShe`*+M86O^QPb z3?hq7`3}6PpNS=UqBF)EKhCoB$P6X|tvCC599DVo^DFMTpEBdj1ED$>k67Iv6EKe^ zDrx&&p#^*EeN`3}4Mb7#)G(3V0@MfwmWIwc>+L1ROAM6=O40Tl3v7ARU7&2AJEayK zI(=^N=jYS=R17KC6?uQRq-w9#kva+$>4i9pRaUYj;qz==ywLuj@hhUOOcwFAL{%*`*}- ziEw(pG6RJS%8ut1o3OmJl^~oCcwZprnDi%FZjO1(^r|t4<4YhiC(Hwg`mFW6eC=R8 z(Ys<|9tOu#?L^(12_$L**_m^lUN53S-s)Iz|HMSXwrJ>p-R~ukI``JH7aLITL~t|n z3o${^7BVTF!9-Rt86KOPx+uW}=|j{{O`bN6R!&CDRaN|CtXYrM>S+PQ<5*N_%2kao z2RDrqfHqzKw3a@S(a8F9H1)X0j;eidB27Cz$O5)@LP)h^W=*$fX(wS}o@dmmx*9u# zo=Y7QnJ$+ip+F(`N5~;mUHNq)0rBqKs<-kh{SzVl_h&}D5P&)zTAzKsT zY3%-u9n0y`OxnPe*3p{8^06bVC&#t7c&7lmCzpzKPJsMY@PVcOa8eOK>m+N!nqb^! zB2hmp_`({$F8;@oZ$m}VXx2`@D^_U|nQSTRN@DXw8UxiD-A@~W@43QrO4j&vcu2ls~&zZv4KERcv;)7+sK`Q>LHWdClx46z{n&{mP%Kspau~|4ND`h9=PKrv=KU zc)iuS4V2B$q2rFNDxD7GGYUc|^m~8f;TdgoMiIS~6$*LCQ)pboxr{WL21gOL$5csA zoikJ8|Am3!{+m5}&$N#3gRX;iwM37Y;pxVTm7^D({96`ZX~xsx%OMN6n()XTat{_N zPPn}|h5&m{*ck!)=)p0(EK}Tw4$_n@e72W-%L}_OLC%n1QH2hKubAG@ZgtuSJ8L7b$fjQ3Ni$fq*{H7}t`8<|(6g>6vX0WjGN?jAAyaMZ=gA4gp(YKh3efA&uC`(`G1-T3#GgdVC?|tG%y!@TS zov}cL$3%J#1NoXX4AfRSKm&F@ePZ^|?k#I1S?oZK)=oZ4_;NhCkJ!SJ zsr{Ud+U&b`*{AC9@tTg7Uf3ZT>czkj7{DRa=;0m{hHS`5D*L*P{Low6r&(B#@Y1V6 z7Asc=PQjx^o6DEvn~wlFmA=7MZ4=qFeuC6xWbchZcSbWO@ql9LfOQ|37MDZd&3dDe z>2PrS@0G{o?Gs94pq^1LNZ4i}l*v0A9-i4H=GI>K9`z3oKkr5^tAT2yedoXrLoz0& zwu_XZo2DE)p7>1y%RD{6D}3nr&y(btiVA?j3AU7FAlekF^^L7UG>0 zc*5+_`G-pi^9NaW3=5S7L1`0y43@_hOTJz1+J%9cX5P@zU;!jO#Q_Uj19Oc7>vnPk zoZEGug7QE;wI%Zd`rbUuGDRN_CBYP5;DGiTYxSAh7n}Lyg%lNksAwe+Hio;`t2%?WILmFg(#be*NQ>2) zRh^jRQ#j*xiX@3!*F~f%nO8{VJk%$TdFX!Lm2@Aa*br^Yez_5>7(EaJ>$|@A)&f4- zo=3E_XqiJ0-(e>Cz z>rWm5V42^0qE=oIf5ZCVu62`8>+!I799oa(U7Q0iCo*fU+}1Tg_#;v`vVv4}1V)kk zq+yV~%S%Izc`t0NM2JnjiDMJ&l7z%g={se{yQyH&bWV`l*@aTgGZMf$Z*)I7E49Ak zlnytS_x4J$J0k|OnPZZNQd_944kU=vS zaZD-{o^v>w-lNCQC!fZoiK)DtRv07*IC!ia=?0JW;S`pxRG^u}u0j+rtt;1xatC`7 z_5LgcBFFI!46$AXD`@z*#dK&c@(*ZF9)^ss44g- zHCg&;7I8Eq$1x@Ql#ncn(?jkgm)(z7oKszL94^_d0;Wj#<48M`A%3ut)L!-by#d87h zyFCN8W~ix7N(X_XwW&27?n+#pLRK|2hr`srQYsq;J0ldEjY#g#Ha*bA&p%4n!DnWB z{*HRf(oGB}hh8RHQ$dQ3o7%5h0Fo(Z1q#rIQ_S5>_gTKpw3TTbtQKXqQU0{~C7=3S-2l7(;}^InSc!BRul=j-dNgxmUHXAn9aEIRnR))3uasf)h9T?SAh-(6MVS5|+=##QHb^*qaNgOe6IH zcLl7S9}EoFtoxhz`x!bx1d<@@vT!VSk~+o<7s@9;BbIos)d=OnMJx-fX!kLSD1=q8s2bTGvlQ{3eHS9OUc35%DmG8O$pzE<%x?*(D zq2UL~1iu#XLG#dZR!9C6wA({eI5BOIY=bm6AZDLlp-VdG_H~T0>2FEXx;6i9)X6QL zcscWc`vvv(tYQk}HZg6i6qGh~eRuVAjQFmyVrz4I%?i4xMrtGWjZD3t+rBAHClgx7 zn>k77MA>*W8a83xnf`S0bQ1p!s4c`cB%AwyLS*2eu25GZA zLK>Z_;Tq&A{xQ~2OPWh#3Ik?Z7JUCMRV~s#m)8w&F`<#|ird|>TuqJsbtr+Nwo}|1 z6v_@N1_xaKHu0b@hUpu%}I-f>ky%I!3r;i`jQkE%|ePm4U?18WfUz$O|9)gX_&q6572 zzS58`=4<3pF1t~KjSVKVn<;3`E(l=}`mKG713{j+qa^t{hVG<^@O@t=>80^c^6bhY z^$dc;C`oA#l_~V^*Ji1@vDz_257T*=SZXW>s7kO9_k3kNZ9t(NDH|Z1?lux5)UuwLM>e_V%h8M^0CJsvv{kvL+&@N25YfV3ZypxU&u?o6V-I;J}35TPBA(UC>ZQbH2$ z_OyEX?=oH+(Uu(>?gmIh?PWupWo)S!!}Ys=m-8F(;b;*{^@G|1fH$NK#p?9S*!KO$ zQaYxKr@s7c?I8a6oFaSxh(&Go!i@l8X9(<$fsx)LU)D=XO#R)0C4O0Hezz3M9yrbDDM*QuSO9E+7uT>6ZH651w_oDQI_=k4ki<3E>Ui92if4z z5!XlG$o1!RI96J+_VCY-jz(hi}K+Ps)|P3*IO6Yl&AS8>-ARrEr;g= z>DOEELcGjP!z&HUw9{-V^6=mNVhZ~<>d($u8`OfOL6=i%rDxmlyCUy}f_~L=aS}3D zlR>}6>?WzDLBVUwfDwA-tHr$M>DcE#ugi&1O15@@`ibpciLF{-sF}sk| zB`7iutVLiKWmQq&@GB{d@4Gi}(lNNVRsOlxO6^8{ZkE7VaY3oEWvz>vbtC)P7c;+M zkQ6kRg*FFpXj6eTY?(B`gi9*Kc7z$K!O`rz^F#8^rwwx$M$mdZ54sP-CK(#$gyiku zmTNOlj$Ks71MP_>fNaAoQc)#-zL#Ko zi$wIJrXJe{8<>-BU}Ci(D|)LWkMuOo+!HA9NU#qMtyFCJQr=1dapn++5%Yk=)9;GoT(3_=tb&2*7C)y zyHw#aTHI_+)X$}iABq{cmf6y2fZBaqBaL0YmsElCU8tkpD%M!49- z_Gkqz1iWLntYpE8#P+-VxdBfI#-!+XMAlDxLID=ub;$2EV;66|@IRKWPBwIh8qDDgd=xN&L<**gx-Hv_IeOI#<;odymy8L(dTx}-ui7tjq2?IbBG^$aA;PkX`uAIDMkf6NrlpY%*BR)%g>O@6y^x z%Wu^M%ohIVqJ4g~1TCXTPYj@yXEBH`EAln{N|j;GN7UrA8LNo(?as&W+Mm?ajS=D< zEV>2_Q(u$1sW$!j4(5tUF>fzUsPKDX-k{U)^9_jkrRbXhs4*_Lg5wH`Gy;SEotH%Kg+Dxt(?UcL`d# z-7@<)gU>C+d*abi+iE6#5z?&Z<3gd0<}G6y^}DGa*EYJle1fbBX>%jgJ^f$B!ZRJD zq2|FzU7r>dWr+xQ^m+;}#Fhh~2w?&Yn|HMF9wwh0eN;92Xv^L$g&E^In!rov9x(%d zSXG0Y)+9loWKDPS^yr64ixiRn!8d&G|G`hJMH1PlPW__t?r4 z`PB7g7vEnC1wQ%r1BYp-VMRn@Bh!N&oayp%evvYNmvl*9Z!8k^VrBuk zM7s(ARVG;d=jpU5!d3{*$Nv3U33Q}H)AqC6>?~r&XIkja0HO&}O%ig9(j>W5pT(bG z;{mAai{!6-!`Kccxj!d}x6*$0nm(6sn);2wq79Yid*pAZ_mJNohlgiuo_l*w2Q*|Y z%%_`cpoX^5D-H&S+UQuJmFJ-%JMXBnRWA7T=MLTWGvsyPNER2O{`REZa%+J>g&TvS z)JxUB2|L(Zb_aH9(XEiMq;?B~3mt-%)0@#f9de>La67JyMzUuI@;1gB?b$1C3s|bH zI|1!xz>xs6BRQ?K2X@w38j94PCWarV^DZ+SfMo^(uwQg0b3U#}#*Pnyx+QV4X_&NO z(k7pep1nJ^Y?E8{q0u`FgA^tkUA9u#=_K-r}655}VF~Eg=&tOxi z0__D<7nEMl6=uB%z4nS`9CHam&*-fHDSqA_1Gy5#qd}*LmPKUu;)?T)9j2irJe*u- zjs$(C?!1o8%Y9(#UqryJ@Gpl8wt;5XZF@27Lge|w!4W?_;DI7(Dq%B!e0SGMT&;OM zHU4q_(P)+!}aEj|iM)ohs8B{0}jz6p@;`55DeYRYVEaw*3z3Y-DI7oYUBB*L2j zQ-cku(E!OiZ#?J*lA&?)&q9e_Kq&G_$DdsOBox`I&och?j%Nl0cx+JtH;_dy<{(6T z2hT?qZoV_8TZ#gEA4p^Y@kjpz15GCl2W=;f?1i5(9MPM5>DGTmp^JEgKe>ji0u62G z@?PH9pGkvwydlME!8W~gBaV+Pj5FdICFRnDvjm{$GBJK+m`!$2!NkwhXoB_j)$GRIg*BmKn>Zk{F!24>0n+(vx~la{ZY(D|YQ`t+yr zY`H;!Lu*i!<_Kg{@VHp420*!oWPuv;q_fxCXH`WC)%Y?|}e*8I3Q+F*xc`E?| zKI$qIAYR__Jk7!2>h$7`D{pa{un8<}?)?cqYw>Frpk#pYiSC4&fed6$+{(Ifkn(q$ z_o~0o6sX9>ZEMTFU_%M>8I1-cE){FYg~;Lc!rQu# zAF0E|3Cp!lIqhL&D`*)Q$}Yhx8%Ax*h{HYP1%H0=#OQJf#SM*B&Q6hwP8R1d@QD=! zKv<~Ypk36W;$3G+R7TcIB`@3omS~IUEVcb8;Q+(zw8;MUIw55J>gck6A!a5X&|mp{ z(1mrAG^X_Vn!09nLpyFhuEvWr?)xM24LzY3e_0Ul`CyEhXR_ex*HO8$GxU4Av?3SN ziF$;{gI=+EN6umM2UlVyq`?8hl~RNRi(iN3^jwE}#bmE9p=elqNV&WnZv@-`v09&- z(wdX{nQ_M<5q(tOgKmzCi#VVpZrg!1`V_t$ImUCc zP1+UUD_=RN3@Z*wUQTSfW|dh=Xh)y+kbSH5*GUQ}p`P2bjTrSj!20_uaUdqP#=^s>f!wt|&DpX8A_97O5Z5?yfbkT^WvWwKamkPDwwH7oVP zb+E?hi!!Yk`89c1aB8V2gWQFzfFP4!Gw+awy?IBGSaRCtR^c^vsFhk9@ZzD5@m2C# zBvoXHs3#^FE(uVaUE>et4r%uP8A(AnH;eD*6PCdyU!jb6)~_le^`+mzBKy5(zkgPq zK*h&zQ|3-=Qn%SUA(WI+6hzY+?-wbj+WHDCNnL|}p>e|6`7~jrEfR>cdX8qKT+7U5 z_&IAgMz`oM64e?dk1VT{@+_DeDiG?`n!q;zUd~?lngBSHtcj~z^b=7=+i)FA}Wd(h&xr0CW^RiCFP`$1=BPpJZqW8Xl$EtqVOA^XunVjsE<3dcO$+iUL<_| zuB-5m;J;a=e(<<{Uz`qh#w*LSaCLkxWOwE+Oy4#en|Sp~dyF}ETfBMfGrVwk0rjm^ zgo8FYj|kYR>GycD9ISkK07-v&j2|Wn&5Q8Q<0a?k?^sA-^Ljg1$^zp`f-`l_dU=G9 z_Bgxd(B!x`-5VvCV4X&y8Y%MphwDGLz|^ zhkAsdtw&4jC#9_LG8m$`oo%%&==5ZG)Zlbkl8E@>i_-H|#ms!|U%PNu;*G6G!!85aAl!3|N^6$sF3EFOHTZ5St{P?&5=e zXHQ`KhR4v}J4#f9%&g2sN?E#yr-xvXmjGy;;W8>mn`_Eobft6F}hBsI6(KG1HWb~;C9wkhdC3%5Fg@#m%qzK@b>Lc2>6w`bD`aKdou%2 z!Y#Mx;qPz3tXUQuJ}e{kjMQP>TIKnkJzzBG@m-Br`rQHg|Eqv+%*@axZrjRcrl+$u z{2}kyQNdepF$^6lp9lEdx5*2B>t@de%gaNOzZ0IkISlLLxPO(GQMiom9L~ZCka@AT zNUxUY7uXpCc=joQsJq@ICJ1@)FuHs*qeXI7WE_Rgv*BgN`Edl&*p%o5sUS6^~ba>lM(9`g;i;r zu{-Y=CPa-8%5Yig+NMeCzgBGV`0Q8JKK(+VT3Azr#fjg;o!In|l0{7>ZL_>rFNxtc}X>^ zQ&6jyuw;-A(gF>5^_v{@NzH=%z(Y`yQ=mQf3@J#brZF8hOpm}o1rI;0V#^kWloYvL zc?DkS)JY9-bH|6YQH2Ba|JVHYdN`lW$K>6+*uz;_Qfm%YqeiND{dI=6?QHP@TBDU( zYlbrWdFU1_Al6ZX^&LF%_|2h640nZA&m%-GpF2lXeWaJTJu&W=`#d5R5&yN2%QoH- z7(p*GulBg=%+F$Svx@d#m9`1P!UtejSPuc}JQaU$?qLy?a&yc`Q9!I-wJ*pbu2U5W zMnlL<=k@Mu>33ThWYzAc)(PxBP;e3xetrZ&Zb29k(i2nLP7o_ftx4aCYMw>vYaUjrZ&omESN<`4n(#du%q4Iph2AePPOLjDtX8_`C(Bas z?U`RNHD)aK!2dr7`g%P~g@xL^M~<-j z^73>o_#-lItb*5G*Un40;)TJ~vuA;a9)|wg<>I^dhX&%M@gc}3bCZd>IhPqYh%p&- zP8bt4O!!Lmzq4XgTdxQ_+GPszY6`JG|Dc#K`7lpqjv>uHhdck*{%@mok5Ooimnc8|Mp+s`4&I&O3I^}1$ z7)-=8NhuoLguCKz0+Yf*F*j6WSI!=6%R7ugWGUG|M?;0V8s+A45sbtB`ZXv2sH0D; zlM6ztrXF)mO!q6fBnjK;-uDUa1V1NRvAg3XDVTR?A@&v=6><4|A~&6fi`s>|WxD#b zMWkyuDf3fUnYqmtzfabhoH7xQL?CX2kCao2Fs3(yOs{#{QkbIS`237sHO1jw=Yf+HxrN1KMMF z%YHaajEgha22vE8bN3*BTPb$r>_vLP34{g3Vd3C;Fp|bACy-Y-;#uqIZ)d~=bi&Lo zlQFK9EuKELA_v*E1*9DfmzbYmb~lYtgmv--$T_pVtR;E>)p2+E9h$@>FD2<)MXJu-!GsODe0_nR^hm6`6or2(jsUjA?x}Ug&wh$Z43d_e~nF zV}jv#@okHH+E2jnus%)e3-GytxjpU^zkhJzD`=J)F%My@l&XqFUILtb(83fb)-fK_ zatLM~cpsaxc8NK%f9tv70a3LoDhv|dzAgX-9y+}CZ4UhQ?1pvHzo5Q79~d+UvQUsR zyuBs7`nm!yA1mH|o5>|5vS&#NyR&Uu%|n*8xzvk12k8HoiY&vuqJqs%N@BNERKVBC zNn`ik3q12Q;O%1rd{H}xCz|Zu19|#=(49Pvd=CSjoDha({e59k$bdDgwj~5Fw-6h1 z(Ys=73vwr{N5(Jw9@JQz=2&EVInH?`+cgAKc9{D~x`nIPR%!IO< z5-6k$4wa?hU~vLieKlf3dSk)B=g>2-qd<<&hP;I5i1p=E7a+*wE7osqEX38IT7^Q% z<+WGzZurfN8_uTw#+WI>Ckfa#WbMVEqG@R3(^|}6B$g(ltgf6a7Zd*ZWm**B=Ha22 z-=wU?H_1Q2mSCp0EsSH&l;tIpPm%&$mb&5p*t-t+D5~yzW@a~=O*Wg}3%!IEdI?Pt z5Rj^<*n9o3!qE zHzw?EW@cyJJNMlC?mZV%yI$WA;z_H>#AoSC2?hK`E6vVykM2*p9$91@9@{Wmqh0$Jg{c=gj9bl$ZS^7Yq4efedmnd=a168aPW0ZiHsI8exuugiR1~q zJ7hYN$Q9?>D#GcdpS%qq@7Ee`4iSs7_1o%#6wKT9A@ZwoAaOl*c5Vw7ippZe06Td# z2dfX#o(m^u$f6eD-=oVVzNe@MFzS7Bg^Yr9gn@R^`0_RQie9@4J#*eOc;&(M_;}Z6 zq8Q6SpBb9aA9r-RRJ58j(mlGf)8!%qi)ZMJXnvlk8~A9;JJ?#b58b1?H}p>68Dqt+ zDy%Qw1=U`LP#V7v_PmX}t5!7blm@LOzV!%ij~(UiJ)+72JiHqaET z;F3?=i7^@^kx22!AAr9w0mt;EDE=$$YC<64|AvNL#^BNyP}t~TF3P5TyR znmnVMohKxT%XzCk;oX=-p%i!N|EYE1{;Gp`YSUc&Mr;k{kaHy7eKZ5qTN+6E&Kuk+ zJS9{Si#Z}>#b>M{9ebC(1FQb;fpg|A{GIxZFbXurxPV(I8FLQ8AM9O>83f>VzNk`2s)h8Bm`E#tYr@$aCC8<8gOUDoj2W^o;5TKYHIthE-I1A6yHU zEg!e_xCMh^`{0T7v+xLc4Bf&zh%qRMW<0XU0E-Wd5uwBqN12|dbTV$ER|HgYX()~G z!P0I)2(9)YF|!h;WhnG^ky?Zl6MQTXdB%!)SMnQqphJe4-MHgvn z>grJaKhQtNL7xVarKT3oZr?$GUn@met*SD8x`xSj$)cD;R3&n!37viFf718iT}WtGh^|@eDgqoTtPY0gDmP-vT?nss zBckf>_ozxYg6tmnka0KFY4B0WWAc%qn&czTWAqw`KWS_qOZx60jie3$(j-rD^Y zej$Lid)$zXW?>AB91x>AV<>@jAOZT?qHS1~{X1;#8nK}3XYj`wdX29WIckexBSO(7 zED^29W8^^YQl0oIb0rkt5Io-JE+j{F!NsjF6!ikUYZ^}y;9dg<_iZJ6h0)nao>>^#cDl;w`(`i-&7|uGLpJ7BqV6qw27gzQj!V^&@wGe zYdva|wAQ1c`ri)v|Js;7jV=G`YP^uLi8Fje`ul70^l2Jyy;XwAq%;7&MsMP+w_$kl zNjPn__(++4f;W+ae8sA^^Jms$SQUc!_y4`@=J70wsf$?~K`zLr} z?MzJl{aGOaF@~5DuaJCu_d>k6^*y+%bKw`;SFpIz&4*yof#ul6D^X1WVu5(Up2hfd z|BoVjXIN}9BK?BJVqB%mj-L+xj+HrUMfW8xU?y_y&tm)02DZ)_dcBxBmyW1o1js7F zYCULC>OwSubO;A`r;6wbH=5IHF$CU`RUQI-y(5{As>0-E$GryQAux9t^tBxufqhY+ z5e2kog_)2aMEA=qqry)?nZ=0AaC*&ZfRjGY$T%>A*GTd|=3b%7bQapwRso0=i8KUW zJHel|x1f;6_-kl9@Sj}Z?XFIj zCV5J44Rd31*Xz(PvWp(};VGUihM`MH4yOL`I->kSh=Al{T|o++tJ?dp4|_g*4T&=> z#TT+SBy`-=gWF-6uay=99=Rd`4l>erEYFAah3AO`l9%()R7hcAUf?%i;zS~Il7@Tl zm64k(88&T_E_(1GW_a}#={D7afA!+7;a>{)0fgl2B>=*VANMR>KX{5utqGl(In&g>IqzJ zk%#ANlugqCb`|pQ%DbLXtIxpn@ddu(G83*|K(277FDCDYhU{5S? zpm~`SEy~N}h_7({rRQNY8BlEXL507J z!axJI$N3>M%m;a7BzDA_Q5@g{moGO4-h0jKIXpOx9n(%A{*R+|c--V|=2Yj1>fBgE z1dTlt?n$}^_anqIP^9>xl0E@^(2l7mL1vg*(pSI~uJh%BR^o{C{5zPi3 zb-p%13FsZ!2`{dng$gd=K!hVEAPyHMaE%~e(T9Kw0`kNHo7+jGXDznyPHUpD&v^XM z&($|<9@xk*KXe5VH!{jozsp6$%P+x0uD|-&qe7xt2Yv;YTtXh5j~jR0Wk7be(YS4^ z=feB%)8@YMhICt99g6-3`sdE(S6hpx*RE9v@Rb;|S(9eWP;uRL^&uTeXZZ9X`IT3p z5a3tQpqn!?7SCJ~3n#hnQthb&K97lVqN-=eBnUtbHwV$r5TX6@Q`TziDA_6c%$C*F z;PZXoV_dVr=oHfGsAE}Z0*-At6nTy^0(CRu0%D2HFT?uG6(UyKj2Qg*R>R;&Mxt7E zBia%zdb|pa8Sf(&lile1PeGK^7oLGPJY$e`CeNFr6H9Ma2K;gh#fcMw-FgK zE0{GpnvAo8Cl=-)X3lJ=1pJ<-pMnw{Et=5q%HdHXJ#fxcamO8uzMo>;woM*+-~H+v zugsEe!M`+*|6c|AgliTe?@#>rgL0Y6CB>LbDgizthOfZiUul@Oj6NjsrYA4XLYd^m zOXK75(%2YyI55_DPEm$V(%HSM1{bs%igyM-cEq682ew84KM0rncpr**PQ1YvYYS8H z%+`5$zRx`(rpj6TPMSm;i?+dPv|vzdFMK%UnTBJGh#!EDqk0H;{My8^ND6J&Fz9*7 zq0Hl?s^_dd3s$d8$z$LK9Su!(747nCk(_Qr@_rk-=h#H3#;;C2=HGj~DScdHh;c*V zPp`(1H_)8GlJ}ma z8@!oWy!#j(r$&S1U_zxuvnkLD=nJINXA9~4HDpxE$RK19Q0DRRBI(MidjBmbWGRB| zZn3v5uwmG49XDL$&E$lcgnkT{3|`yHUw8!7jXEfD%+<0-@ zhxjz}7qky*4i|y#p7H}It;iIMy_a>r1yA<84IR84%ABg_kP0ci&)1kromE&#Ont+_ z^|*sR|5(pk5k$m>H^kv>ImPlAk(g=%{kOM#i0?Cg!z%+H!o-%tgbFI(2XNVus3a7m z|3uHjb>fZMIpcQ_@RNak`@%>#j54Nwm5qdX@6bJVL3@VgQCys!&1NuS{CM6UfXgT||WIXQZdk=<^+sqX!Ur7BBIW+~ir}LGV z+5drKcoAM1K~&h zE&J0EMJ9-wyo7Q(V;Q}`lciGW{CnuN95Pfp$YUs$gwd!Uc_y+uZHk;?AHSts7_$5z zA8bkR!^-v+{MIf2Y2*>u{S3lTF%NIAi8H#ME<%BH!rbb7To3o29q39f*h?^3} zHvm50`1qdI?|wW)ANV6@tzi2?0MKNlaa)Nm(tpHN?M9<(s1+-7H;TT;@JcUB+%xkF z6Y0UcNsf>Pr*Y4>IAZs_&oa*>t0Q9pF6pd!P8|4o5hV@C`9mV$@R9NS7ujg}(MM1# zs-V3*lg3vYJ*-FMVBC0_3;@Gzw=tBI!0^XUfq_o00>fy|ZU8Qer(<#qHI<9S#~*8);K1{z~%D0t(?;ET}h$Ov4xs~WegF2$7_ zE77XRg&OiyN~}hB%tqaSa;fDrHYFvIO~Ylcxe?$$`PvY#8zZ9OykDZ#fgXC+?P`W_wsS6$v#F`m8$ zKtRvkXAboKP7em9)!_c0itx(k2l2=c1sJ-!8c|hl(VRu|#@tn&=@L!*U;@UQ>2DvR zYn-ORaJLG11c7H86$*i2DWr|?R_nK5lU3B0ToBtIz68+G z))?HJbS<9fb-PgUyno$GA_bH+^kY7J92tZpNGUP;eo;wiZH@P?jY!y1mX1B8d-P6e zlHugs9zKLrJ#@D>&Wt*mL%q|hVcDHVjK2cfd4nOD%>wuhG(Ou9`40$SSiPD_ZntdN zu|sLoxie#-Vc2HzlU@G?(3g%SF}rTPdQN~o&&W$n)kfSkS(-zmC(dNz-L5puoGBwH z$g7sg0mtbi7Wo8>bLJAOu;JN@WAXY$F|d=%Ckn5mQ<)Nyx2cJ@zbXMT>g>3q>kW9M z$1PYuF7EV=b71GK0=aIyVBVV0D7X4raZk4!a1$Aa>wkS1YjW2??~M zmV@)@f2ZUlD23EVCqaO>=iuQ$Lk^9G?#AChr^Pt7&p^%XMK zXXqg?U!#OBu@deWtf5Z}4~&X-T7mP=!6%6q5AKnnuAzJME4{m(?nH^6-J{@8T!$|V z^X#Bs69ciZM+jE84M2I2-VjBsLuhAavI&JuTN&bsfIQvreq7gX%n`tUtj*?j;NEpF zV*Z|ms1qK9;n>F}l4K>rF?;Z%xR!_x-!>KR!hNfs!`g#u0Kf2)E8aRH>`DJK>uJE( z{Z@h*Ut}YeJ0(|6g7(TR@+2csj~EUISKL+c{PPn1F0u|PAAL-Hv_pGkesru>%j^7D z6XC@J2N)X%^zVPb-DJU@7hc800GCdbJi-V({wN7*z30o*K_7GJImK9vgy;7KHePqKw#iRrNt3hBmRy z7`VyB{cP`I(H%-M1^j8G=+XJMRVy$GKMd?5d~HGB2}$#bPodk|Du0%(lO7x zs$dHqT=N_@@q#LzZpjS_*Ibc(8$T7qAcNk3S3Tmvr^X~a5_A?-jY6l zK7srw0^7rvl- zOX8*EQRL(PwKMVU-bH|KFl73BzMw14FM02mq@1uJ5Yx|37Rgh$EHB0jpJpLYGs1oC z)sSY-hQZ&z;hxvksd)SehB>npB5eFTo{|@5%J=l@qb(w)?>v`5|Cr&OpO zKRB3NFpHEpc`}<@RA}gCGD#RYk_o_%i7_+`2Ih8yz4#K0vtC6V0saePV)5FjSX7z~ zBA@r<0N*QO#nUagM6taDW7>?weO<4IgIv_zm057m;M`W8j+BzUaB-LRuNsKZmkA=a ze?eS7vl#Pu(cMJNn4252ST1uXDXQ5D^??YMqzIVNnbLU3&z@`4Pg4Dtap z%BOMhSC8TIg<2jST~Fim(*r+aeen*II?9DG;O62zn7{8kJihS_(W5!1I!|vG>8-ex zaAd0OA(!1H8u4)NHZiz0p5Ocq-rxDT$ZF$Cp+@Ew9&a;i0t^N{Z{JOXiK$NS8pQGC zqe$L1jQl?BXl_BdzY&9Wl*7C$4Xmt;Jkj&%di6C2MUl{}Cqr&7Ls}Z|R;T#?zE`F(VO60WBPouIvhyYoFc!oVS{`jceVQWS3!mv9XlEt zCatEb(75%U{tVReGRz(th37Ah6;iA`kN0FJ26uD$DR_hJ?xF2PZvDho!-=U_Fn!Zp zyt?&0(K(72LuLjQQCKSVf{;}^!^!_rtKfo z3lVg_16A2b=UElJr7eBYB4-(#+>4M5jfzB!fS!kHx~JFTb^`mcTPuW=L4&O#zeMHd zY)=ex0)2248Mf{OUS`!>1<^D%r(42Tn+3A999evu z)_Rtzl0n@`gZ@VXt8a*GY?mOrJ$!|v;WIU68B03{W8T1U{GJ#9CpXq)9Hi6yC>YP5 z=Uui$yvm@5EqNG7EC8F15Pjo~Q#20J%xjgn&VGHU(^-WcaRc%8km=Z2%ELNOqoU3R zkbyB0(V5h499~SGLUSP)Hkw;p(mT7l5Lvc-e7^rj{E)R;%!lLdvCN$!KLvi|9o_PC zA)fmx2WGPc>g~4yGiH!ua)_iAm#Db=E*0N?Yk<=!BRpK)_SReM#>7NyaW#R)i(R{( z_}o9{U)*`8-1LCn&Tt?@!~S$c{jpxYp8&rPA5-nxt9bHB37tC0hXFH9kcEq2c=;88 z0RQ~~;dp6m^dZ1M*)>8wNNK?Nk}LXXx0`TH+p(}1%?)q23QQ0=^}G$;-wT#8k(eFs z8-UB&49CFOoEkJ2EStGl?30QmfJ z`26#g1rzGOy9W2HEW+s23YhDd7wElQo!GF(LpL|kr3~ebym?e!*C%R9fDbRAXO#h! zgf&6tzi@RGP9hizs+nkg+2lx$qJkySb@3?QRC*47kQeYic~n2pGb>_Z4Isdw;j)co zVqe|Pidn;=@N-fioc><$cjL5Fe+iKF0&RUZ&tEYK&0UQiQQh!h=j#z}3B|g?RO~K4 zfMQ1}B7K8Idjpn{A5FItp6b-1YIP~4h$3DPSvu(yI?Ky)|6`bUbrH|qos zk-J|Ht`kbCI9||~^gMn$0slusBguQx@WkR=_`LfbJh5?5Cr^fA)aO-1xP-?aS5QRv zdhJ@C&Z#85{<`~#_KEDCwr!Bzsgne&RpRT5=gf9a<>~wQz?zwftH1t=-AEK8AUayY zf2S~ivzHp!cGcL+_yHEqU-%i(~}H?F_)V2_)TS(}GH@-~6- zbT!^kg`FNi6;cRh1^#vw!`7GK&fiLLep(F-s@CAt3n>9^RBxc2n7tIwLlW*I^WU4G z;utUVF_A0J@AY49PYu zLKq(WuLj--1r6)&G*(hlAm2F|^3EMt(cX$FS0x}V-cJC&q@JPzmWV&r36ZqkQC$T) z_xFPJhkF-eY3^Edi0FvH%?1iR@*-O?RJY@Z++=U;308v-E@?edNZI~*<9hl*reLhk z-y(AL|LiI^3bW@x?ytb?)-YjHCFU+Th$-aiwkmOoG)r-r#1uWFjnLkp3HB@*s=g}Z zz_S;hKk@Y+3F*Z&N%!f-%||&JP*tJKAYph1hF;Azn3^~ZYFG#Gqvw!BD1HN(gb@Z2 zZes`OU7NmG9$V?g*lm>7DEMz`f$%e#0Nx+hA)C_x$UC+ zS6)??NC~a~V*d#K^$QF#DLsO+WZnqrm@2`QkIh;04 z)}0k^vlKNm1M-vyp{!qz?KH^mxuzMmwF=<%;*Fz+FF@Z(;9{U`(^YxS{oej|Dy@n z14+U;r?Ah{+Eq=)-U1-ARA0FL^W&_v1Fa(@T+y4MO{7*Yqkm3qatuAAF=PO)rso@M zfR;sHyh1n3VYP0IA@IL=OC@~B8%U2d!5*Z8{}~g1qw~0l?T>FcR5b6YPxa(AEZxJ~ zW5(vUv0(2aFvTD|+IB%LF}2&xNIooc&EIH7GXncc0{Qf+T%1R9&zFc352y0}6Wc2@ zh1L|8M3&%n?4*CTN0Jx#tH~hliZi2Cz5{Lc7em^;8*0}skYZ!K-ns+=cyV0fm2fy@ z)5eWba_d$&(77|VpRM@*$$B(}!W zJtNH__&IwGKHc>NDme`E)_$iL-r)^pK+N68$uN3r1s+~nfF4;kG4Yu{|5ic`O-z3uG=y+$E=e@Zc=RF_SN2lrJ?)(Rrp#-w z1>}{{zdxrJ-lBcyp~O(WrAL_Y>hMT>k{pUkVz|0zz)thE(ea&?m@!}~{zIgQYfIH{ zPp7y5V)?*AzhF89@I;n3!H2F8RqwI#7$bA7!Cmh6A4d$#f6jgp%07 z%lP%X{NJe>-h5L*ZH-jNpPP*`0Ul|#9h;4GX0EPJKka)gNc$F{<{)$oX-&tq2#=ta48RgPc7>x{53L?Y zsE0FtZf{B>e32e%LVuboVQE>=D$0QY10h)~4dQa$x@p+6Tf*MG5~`}?(2!sj-nOll z8WSUx@$Dnz`nGr^4_Zh(6mPB~K;II9yIN7Zu|wL~GJb-cKsz!xcYG^u2n~x4%Y)7E8~0Kh249-FxE;m!nfF(JS3X z?B9ffXm5Ix=QPFp-F9?|=!l{5eFf5m04o2_KNO?_lHcwW8H6|=i`SR zm6^yd+lMOVL2vSe!+nF0Z!0CR{~l|I$=jV3D61_(0e#L!b8~!)^F*&+zE#n=ejyT- zUz4kcRgX81-&^2Z5M_ogu2_{{_l_r@~cTj*kXLV%o*=u=&U$CF^7XU%;Nn1tYnf17doje{4?_SLYHdx9fvQ z=oeeyB7k3!w-Es}AbUh~5Dk;~g4BE4KY<&1Q*J-WfWh&}qFv!;E|gZ0;T1xY{$csx z6ab&cHT@NY*;L&BeG%p?$i`qAzNGx>V(v%9s z7rU?{-i#Vzxr~cisg0XEz&mvnIm?BI{6+fDn3?(^vT6$jq4M_)#4~;F#_+g)qTOeI z@{F%-KOTdc4MxAH?jnp+r@DoH)r%?bz(^q9EiM^t>GcZolwGzG42tiMDE}~#vBmTG zd0Wt3Rav4bjF2TcP9WgP9^?dKM@xUmH^eA(q1?zva;Ua}toxDnM`K^}VA9`DX@ zTALs@3E&r@$q2d!57F?wn!fWannQ0&kew=mYz+TdQ6!4+UKkaH_s@@n!$O_`SDw`x zXMAw)wuspI_XmFQhBoz-W@rwCnZps~cSz5g%Q)~k7wH!vD$u!r;AiPS;^za)5oZp? z(*qyEjbs$~T3%XZ2Bxlk1y7~CiJ5)xLx+%7;yK?y@AK|zPi=Y&*+keFdFRKg%g-YO zbwrw88ySU!iaK1mwiv!MWLn6bOSlsQ^3;zz#C$^ukZ=ZD4{{3=iK4gat_u!s;Bp8%KshKRB+`<=ULi=Mq zHn*~1`uJGnMH;zpcM=pu5@8%(A^B81^uN4dSEy2sF9|>7w5xODf&lj#j3GhcG3_^@w80@N(26u?}mb1nOd>@+7 zW&_%1*f9N@T#QexfTHPe=Hb%PL+F=BXp#>gz&EibS4efbQID%>%7=Bhm$~Mhq(PM# z{&lgPzZobZ<{wADzDRTF8X5)96G>V~_rs$io&avnCpozCk8(VGX*||-w!*{L#GLHU zec(^-+??nb{SWiN^tuS%BGmt|B1cY|-r4mfUR?h&R7UgJ90t@m5bhU(TYKCr0KMLj zw-0WGmj_M7O)H;3^1`doi@byoI$nBJ4$>+zY2LZKtw5#YpLcw`ke6H)q~Pg^vE(s( zFk(wC3^Qkf#l(Ph@9y=)72JC-LuRIm4?hGkemSbFj9slL8o4k?X|ja6sa+6H&-~y6 zT(NAKd=1@wYnwJI?zkOj-|kSWL$#_B`0xW5zx)bWfkw<69gD4r0d&_r$L+=)9ropY znpCt1jKk3QWJK}C4bT^lsyOJ=fP3SD=W$KjixA-Bf5e|&pLj7ch)vAf_6ZHxI+51N zGjqnZ9fg}ZT&y2QgU}Z_EP&J~U@s(&Ei$Zj6*qpHiwBn$iU#50E78Ez5*4tA6v*Qk z6srgLf5PmK3USmM$9fe2Ui+cw%O2AIv-=^$#<{9!HyWz*6?krvp-eMCUQhlY5ryOf zwfNzceRy+7I9|Fa2F1Lvkyo;N8oSfGuHIxZ_=+a#^;-}bhU?o;z(HFP7H6%1BKg3^ zWQ6zxplev-QJ28wn6GYq5w;ej;@6B7UNu{(A>)nlVhoWKA)~&x#y?&e_kycb9E>*M znK3blE_b2l@4th+{u)%?c`H6a9LZ`m;P%@&;|JEQlLAsxrID>#A-8LimPJgzv?)IS zzgWm+BE|1a?na}80~rGF$Nv1YG{tV0gjDhaQ-GUqG8|&$E&|lAzJl@bCr~AOgf9L& zBO-y?Qz^cZ1W5A+A8kTfV|aXjSh>V8xJsiNsik``IJO5yCiFjoku-QF1m;z42R0OL zMg`Zsr_bD$bRDMmzKhs>koZiMyB5n2uE+0r8@w@n`Bdi$81EouQP3sbj=#$Xf*)Z5Z=35PEZA2BY|fUkElCXqlWGY zT&(TzxIa7V--#U>3a5NM5?5vmr=Qb^`;4XU_=F6$oCCayzL_=n{hWMo@0*2EZJDDI<*rI>DA|R#c7Bevd0xq9F{l4J z)XCR0n9YL^2Za(i*>U?X1+dO~4O;v5VB^Po!#onMzD7dYUJWyz(@<1|xP58ze>!(& z+4Sb>|Alw{V)G*+vFvAQ;^q`(JcqR2y;YH^6B2S*^NEZMNN>LlwqrZCw6frp(J`nD z_a#KFJGFMO;uN|bPKb{cLF7i}R2SfZbuWtM4%7Sm2WG{$;p4nl?Sehu(y91;#C3+^HFnwFHHTOzlHX#=+o?c42bR_s&HMZn+9hwc2}ljD|r)67a0UP zkE9$s?l00XiGjjwKqq2h&wP`Maa+q9-d6(&>?f0t^81`#Dq&Zlg!k5Q z10dn@o(xy^)({zRww1M*_|LOG9IVV2O0RM#k#?XF7NhxcKj?dEi|DrxWk}D`aLiE= z;Pl|3A9B$@tp<-xjKk_AD_KnXtm9NuU6}w~o*zGN=a)E0bMA_EV`vVUgx*e4NLzG^ z=zwry{e2@lBbq#cd@>NvZk$8su0*84hyXGg!x9EzML`N&JPCu>!4QGcR2SxN{}36~ zIe2y8qv#RdUgYz)32F|f+lJl6J5k}P)#aPn-(!Ph*F>fBtkKbERpP?f%|%2!XF-dL zh1{#R9zLZ1U3UY+_MIBO|6W06rqq7>Huciven@vZk>BLQJL&1F82D#m=N{6gO~Bl_ z(xg?Zln3l~LED<^74jS0+z6<5`*O5UF;F(L}u)J3=q%!xZufusY zb^Hlz&x=dOkhnhZk$ljT2Hd1J7m9_Z`fY33eq8g*RLtG_E)A%B*jzQpDBc0Z$AUhQ zNyIt=jygQ=X}h6lJD%!sJErxSjN$S9g#5yg*j^ah;ym1#I009-zDP8Z*iVe5mZzBs zu{Nmzp~Sef7|1XY_^c|%n;&H%`9O`{8B8)jO*TS)kM7nDDr7(Pv@mcEHk!=6KYnOlA9`dlupIwC{ujpd@njnYR{3 zK~6;$Bm>Rm$d0ghL$(EEFn-D1NXIGDjl^+;c_gQX+6W)y1R2mJ+lKh<8A38Z>(vvI zzeRX0p`kp7U&EFy#6wFJ---&US#BSf)17x}xbsd0CevYG=-Y3hJn|SSJa)W3G8XfON9nB&)y7y{;xYX? z!M-m@=#NDdOAO{K+l)kF=pmT~o{CmvFU7jT?Lua@s;&kjn+?K%nC?g|+l!JKy@Qr;fw}Fo z8W2@chiASxh^H3kBeKRVV)t4I8O8f)QqG}?+Wz#G)Qc2PUvIJhZY!h!52SbpPI=Zh zV%VdcjM5vwDR}H#89C&Lg!n^a9e)~*Cwmz-9kfqdUQd) zJPf3F)v90Y z^Ab9CBz@;?G!CmJSjjqGxU(8<@|@TnZAMv?NpIY)p6Vrdo1t*fX8hjzpnFtj436n3 z3Lkw4#JhyG#dYn*;fD4XV`|qMaB1t|_&99|9^3FLT+E|OE*$O_^95aZ6-?v}42*?TaO|!$Br|VQ#4;-$ZhT~j7!gbRR~(U2`s)Dz=7Wz=4soO#u;JKFUvI8 z?XtyI%UUG1X9wH1LmKb;*Vx<1fc{wz?~t)nQc|R$gLAX9h>NGS?RS_Q`ekj*eJhSzEOr=4@gES8jGrzCvb;8|DBjCP! z&9i6~+zMY@GzXnRT8l!HX({jGyIo&kPiY#~5u5KC-U0qJ_-gCySd_6GMUFCDO9M5+ zFT@+_QALNL*S3FzpL5rt!db1?fAcH`Qy`*=&6Jb(Ap7`<#_x=W9Q_UGzPA=He36Tx zyDPm{EJNdR$1~_oj8(m|3GB3ks-zI;H?u(tbA#;+1iDmunPyW6=g4?_jf_`*k%Vws zM1aoX-KvBrx>O5cKz(Nq0zg8*?a{W35Lmu7Y_twhzGDSjh4Mg)5 z&OgG)xv3xN4pPrJYbLU?{q0)Zn(|#qgay8(O=zz=gy05E-$GOE1%~HC4m>`7%n&SWHGHMiaT+ zNpEK~+3-$fl_p~Br*pSjfvil1_upriE?;iAuck(d2@O^8@Wa5cVf6yC64csSNONXG zTCf1A(Iz~1Ndoq?q1jyShIGn+uYq~x__(F!VBqAvI8{0}?U4cDI6tnBSipU3<6Ob~ zX7;-eokLp_n7F`sc)#c*)RB9-Auol9fCn8y+hR{yIwmcjf{n%7ac|N!XdRRw&bF)c z0PbBo6A!F=0Xs@|L+Dy^2?p<8M+TvsScroccM*%{v3oAXdGWe3%=tJQeKKqH*u8TXuZMyD$Oa#Er*n%q0gfnZ z0_U3t0MCr$vdJ1&?347Q5t{2E7KR~-8WKY4bNKb$>dP>g=JD7hZZPP%ZeN8)SJ z7lNya@nx1tXdN!0MVNNR0AD9S!C>2ifNo@&+Scfxd^$lNdWt8Drt^%TIq9Ycy;INP z;i83KD4E!Kl$jqU+<}E_%OXu5EoFZt44w~7Tv=VkN8Bsy%^IrzlG_v^PU!x z(f_aFMgWm7vyU0calMd4pwA75N^^cE5w=Z5+w|5iyq)RsD2{SZmp2u%7?2)jLdS!( zXuYpcge$b(y~y*mig{?Y>if3s3~r8+tOmuLdb8ui*mZsj|WF$MG{fAijxI=U6B*2Lja`@ z4HlIqd!2`X-kUwccSf!xmucNwnTJYet;i!TBQPElKNu~ndcWFIS0%E@uec`iDoV=oF*E<<`iPGK$=4&D$Z1lY9AZ2ti!1hG}DE zw23fa)-N)OYgL32p$zbqkVT+Bca=h*FQIwZ>92nf`i>3*SZWYhFu5;ni2(R$XY8Jf zm9+>D*voYPk`%b786jnFv; zfnM2W1U%=!*#y3-9$!9@s$)K2=sTyk z@W*?@qS3M_6Ky{H5UfpGsE<4>n!89ePX`WEaq~?Y?z&4tMFopow@$t7vdg7CXad4k$GFnwx;BfMeF1yS~7E(DByIj8>#y8#qYAW${zfjB`7O67{H#>2# z=dulafz(|i*!T&4tk;I~A&(FpqOL7I^^U^U-5&`b}42G%fECK#u6Df-BRaau0B{a!1 z{mDBz-TCa2x3AUF=h$DY;M0x3_FPqb#@{UC-U}Gsx!NrNUvHDdLy1fjV>K8rN&3e% zXdm(pu1|Jj>Ie;C76oOsvS9msf%gw`)|c!&R9SjjA)nk#w#y2Z;}4}>4U}+)*E>1G zk6t0Kh$jntLf`p3p6_E2?FR4otr+v>5dh}eMZX4iij4_`Y=*&%N}7}J@BSJ?7vF@7 zez+5F?f4A2_7X^@fQBqLK95*kt-f;tSML>x`{qWNDHyE+;)P~UYS}*Ax8_+a&0J0o zF~DmyPRv^qy@zW&_^NLxzD$k~O==8t38xk>J~VE86pR^dz%^Iva?A%08k_IfE>BPt zM4WBVKPJ;J$Y-Y=@E0zWM*Z}oe4X8n(4Zg{*Ivupk{ve89d;N#{|wl$9-CrJ_~g7u zcmj+-`H7`x3Ingz!AvgP`EeJB3fT+e4;5K84~RvV&{=q8+XB3r`XTIGj+JNY5c97k zHa~OQ2k0Hy8FzNL40o=YK`c>2Vn_?Tx$7$ois^?j&Cf>w4V+d1aR{bCRBJD7h$r$` zBrga5`oMAwjqQsNQ=oWna7=IXkLrds2iJhnfNaSA_BJ@_m|?@51v#Si9q(eLa-KC& zfjpfUSNo>We4K+N8J_lJM7NPkyMw-0Yhs=O?$ZW(%t_wSE;^4d-Hle&^o-O7-m*E% zfVJs-0hXa(OJK@y4HLSF+U+Blu;c}Q<^=>@n&F?hvLZ8#@1}}e|Jf^mTBqKSrIx_% zlhq261O3pwo9n3aHR|Rf4!JcH%tGf#q;YWuS^hC76y#(L>H;Dn&(YX?hYYG)#e}UD zXj|mM-B%@GMYlkj!HX@qI*s#LD~>+_CZrq!sT1xFiZ04Q?>%o1~l&RpwzHvxE=Mj}-C!k$Z9ouRe#? zy&I&2X5wS~$F|Zm=47qJ>*vM*LgSc2Ega(gg!DZ z*iwm4-#&oz_ErhN_xQ^2JVf5l+@=Efhi?`JqnZPTTalrQ+1Mt0RZW3$osAMMLc*(NWSHrMG9x7r2^!eYJ z3=*=c7#8o6QClmYCJ>f{7p0{K5E~;))45XjvZS+HAjZd`5=#d7d739L&=?KT!;&5I z?N~sJ|HkFTq5zH=8!MIc7tf zwcivx-s3hb*#85r`srSzm8Ox!4j0g8&=^cSHJausqq)o6HrkzF$Fry_>1_W%Ge3MZ zG!~hGH1EIo0_^?wp&sU~^zA3(iYxW@TsFI8EiP6rqn8IZIi?>Lrks|O@q4*>vk)j6 zvS93L0J>G=&sdiTj`ynwNJNp@kTr zJ}N=UQxRS1!mQ77L>T15^CLuS&{Jmo#{d(F(YY+q7!cVN2Cr(Z+2|{T5+}78h3ER- zD_WaQOL+^gZJviJ0(6NyYv!y#Y+xLw_PB$*{$#Ak`vdEXwxQBhi(Fd?_EcxV!9V*C zO1S*{v0692=oyGk2g2~!kA+Yc5mpQ!OdmQ_tV~+Sb00GXSi4rm_uonWnVDL@)KoSg zIa&H0XQ{ONOfTee;q9B}50-e^NT;z~j00W*?oYbH>k$O5Lh7TB(YG;D|vYhKz@aU zWyJP7#_0L{jrzTLeL*IXgDihYorvW}yPD8o(CLp%#)w@@1~itg^?n8N4i$k86|+Ch zL6BX;n?u84C&qu`YjOWz3`HTC2}UlZ;Jqh2n`ci&CV3eKgqVUbGxdGU-~AQbTtQ9o z0jsM*ADX{YyWNBl3CUz6%xD{wfZID>CXCbCf^E2A<)g@`Jpjhn4gM~)AbG<)Rs%j8 z6p7vkYB79!D&!A8fY!AOlrTMf-?D{-@#BDBm#aK?KlsNV4Y&CFYdd@Nz!K>cnH(LX zX@fq^E#H(BjNG?RZmkh{9Y0>hL<0SQ!-`ntufKuv^&)UCvtVEZe(6Lr*{P-+B@!WB3C)x3MJ7kOJ zG?*8<2SF-!)TsC(TSGw*&%>9%C2`6f!0P?L((MZFJpb5>s(kL6jeHz1QK%&VLe}@= z-Hc?MgZy|s1y9>-5IGf1M>b~Bb=b(T1hGanb!r`7%LpQZ;DOY+5|YnpTsJtCP!CN| zZ74CA4`{SLD1)ukU?!{j{5Ls>FLPqrr9^sob0ZIHWPZ!^J`(kSMx^V~R>QEr>LBj_ z{W&Zp;-zx!e$@qwj|F%4z6DS8ydC*O0w>e^CYrZ1dQTSmJ$(N9k`duJA&km#6dj6@ zS?j^>1T#Jz9EqfiT10;T6SV#V!S1+Syw4kMjU6jt>sAeO=0GYgR>ITM*{JT_*>)P2 zIcJ*j9~1O5GaLUJILL3?#?Jrc7hL1(GE=8I2XGMw-Y4`)l0S;8jdr;zBSrYi}#2e-iuod z!+S%f;ezL8(_<&7`ZolFbMvmT>>~ zg?MyH?jdtAm?p*?0@F_CkSb;Zp>8W1u~9QnNPFuVpphGsh$98Ku|K>9xixN>cw!u{ ztzbHsS2-kX%8}_A84w?Q>=a5_;U1;Fax1j%ByVfLhffedJyP;q7dV!IsLf@1|l_g|5^mA zQ^TW|$D_ci=(+BVr7q4FbN}S2EzjM6|E_%jTZ?y!`NqMge_U@o+4~L*i%S-t;i=aT z_qYY?3$`P(Di6UCR*}sW;~$20)_82s-vqT@py?kjR*15BGn8CM%gm4DRcJ;m8jsQ0CoxPG<3oFT^@4gx2=m zJ?9O-GGmuo+Hn+!v>EgH1)Z_+Jsg^Fe~{%^o{H!tpAm5Mq&Bbc^KDr zB#c5Y-z~Cpju$T^k%8c=7h#DQzKn1O!y{kk;W01Zb3U&QGeY`+KHo__cL1N?31Xj0 zk1|1_L5=^Au{g z4Hkm|=g0O!_plB}9HkWj|A_d0qT-&5DDo}R9D*y_jYSlfOcCkV$C)_cWTM;FlKx@X z5Kp+ZW-ZO-j~bp9&sa=OX1Mw)O<41aawRA$TfUO)QFqiACY?>D9~Z|O6Y$}1!1&Qe zTAy|6lyQtnejPh8j2=tGEkJK@E@Ieg*1))E5#796d_FiFKXeEbIr-2|CMTaBma_^0 zeqng1`z^RGaU9;*`6ZSe{2f)qx{t2l)AjVZlxs^%G{VgxUS?-#h+MV_Oc1g8yxM$h zCXYdr<$ql0Ip&lw$_OJ?aLtYLA5R(=Vy(I`5O0{_69(Xw?pA9|C|{NJQT+uzu}b&SwQzl)o@u#spwYr z@O90QZ83t?X(yS4#KcW!M5Oqd+7p}SVn}o!EX!So1$)1Ro%gaP5|jTShaqD3S@UaNS&t)14Y6`@&J|6E%uzeR% z_tsX-9~6NepX9=@bQ!dT3xSI-)4wR~@>^tPvC-w_EJXCXy$l#U&;X7#9dLTlx=VaNwVnms%8go+@VD8qBz2Q@%VCczl$(TLx5p)l4 zk0se_asTS+*paae&k&L0SkOB{XZ4nf2uUh#V(@hu{A zT+Vf6rx5(uu?k~%9RORr2<(C(Py&OC5B*}-DCyyE_i;A^|?VCj~Ec{;RZG7D?2J2eU zEaoiWM7>#J>n6>KYujIh2fNoKqMgzb~Xt#T`ov@XX>o{c_35XcG)D z%%j0#J(qjd%DTVOt{Pf=EwC>Dp2TV>&1$@UT%)vEf?btRRp<2|XmC~7cs363pYs@Q zrEz64u)pKzu#y)L;x7xfE_oTcBpv_Nan@H#U$4@EBf>(=yRKkv7}KZzETu9N%8*pR;!i!y#ecLM!7w*&9(S%^7%7s5jfpC@P3sXR;2M~EPb z!Y$cw+~ZfIaQ+{6-vJ(1b#1-Qy;C&my?0x3lY8$K7fkOxgisUG2;qf%c64eq_kwyM>88}%;D%)RH|=iHGjgJq41gZU@l5LueJbLW(`*WPFE zwF$R!qpf&nQ5crywj=1{ZE!98CuGl80Rt9>4I3Cf`%J^X{-vUzz><36guY?&WaJRj zZ~n?NecDtCS+kjMy~XGotA19ihHI|j5Zcm$8OhuihXd^6k05#_zBkPeo92bWVWHjF zqm3XZU!h5J;dpH}s=FGI8elAjR!0Z+*PO!g_@#Jb%8f|yi@^)o@8XXcufa|(9Jlz( z#tY*8`|C1sL0${^))*kqABZ4y^m2{aXXsrFu697k&b1OloEfU%k;`;k zJKH7W^+OUv#fa-OcTh)j5*WFJ5%7#%2+jSvRz*rLn^ogGi+76liUBsE$ukyR$_$pz z&jf(Cn!r}pK^;TA{4a+SaH!8}(0u88{U80@qTzu(cJvbZJac0lYRDk)E^YMRPZ2=Wdl z65$PdM;$cb)hQn2;xe}qCxP46se$9avJ5yu~Q8Mb}>s967>K zUaok3_L*{9Qj&gf(L(+y0l)KN1HWldiarJ`zt;gcqQ?<53XlWfWqKAVpJ3sX|3|YYD2l>;(F8s3Y+I^~qNd;WC=NhrcMrHEk;VXd&FY zy$;X(tHK@TF+p2LS9_iolf{MqKU#A$qmknH4)D+(0)21jlgOIIxkk7om*f{Ih$(fr1^E~p57ZneY=VyWeOU)fFPS&1dSU9$@3C` zFyGN;Tp1??dL8Y7EHawm4k+(6%G*T+f{W8^NGv}&8(ZYK8!qZ*y|l80bS~DxjM-k48bjvZonhc??jY$2>v(o zA9(Kc-%;0HZ|L-}Aws&`2=g=sn6YJUC{|{*AZ^zk@HgH7d*TTLbm=>T{}X0}Pa*H3QEGX}OdFFg0kR>;B(rZu0Qj63zHs=jKTwaKe^3pP(k|kgt}AHq zzru+b>mE%3cmMAz@$e;9n$`;5W`&R>Eu{j z;AgT)8RfpmqNwS(EN&tGlJgF3+x9)=iH=%6F$Ps3BM@Zq#UryGz{#85#S6=yz=XgA z_|xwMIoy5i-*9=-Dwsu8zdrPQ$i_~@29728;G;RTIJ(-QZv6!O@R9!41OzC!{dR__ zQ{|YMckEy{968G7_d1xxY&KGhJ$a59===MP?im;$)6;EvXV~=8QYA@f>Ii|M%P!;c z@C$t>7MtFOvh7n81aiE$Fbp-pW`pJP5o3hZz3J|0MQ(E;x}4oIt}lu;gc@ewqrSTl z-`@8tO!>z(cq#XNT${Wa+pqpBzB~JV;}pKT*~tIxYe22L3|$VP;-`DyYIC>dh?jyj zr(5v!dsXo75ekq5_;ZQ<{x?lnkZ$xOz2HXS(CWP5%nO98%_8;wFYQ!LcUH}$Rv?%* zN1iW~ddq;e_QPZMu4;mbr-@npi>@$>=Ho6JkGnOvHqzhPyrI<(&!7mvH_236H}_<2 zHAfG&$>}N;@1CHw(;?DAjTInt(OoWvb(6^Zh#E%1{{>jS=zGfv^tsSA664svurF=M z=iMq?r2%l&dk;!vWD%E%*8H!?n6DG^;;P*1k8Z7&JtJUZQc`?Wz)yQM(8~{TzLB!y zR^Q{J(tUVv_s{UonfKump&@fsYw?sfcr@uNuci$-?{rUfb z9KN>tSGaTHweS|ZPI!U(U)C?O)=J?0)bSVbr&F)O z-dc)JstzN)u>cFhr{m5ES7K%C0+e*rqO7@qc6E=uUbrm`8xvOG?#b8Fb-Ym7TnvY3 z&vu@aO=+-%1@=|3FsBuN_(ug&>w09^NuO&1`x|YE@fwDf=W^$mWcY)-D zqe#`{TCZ%DG%0i<5x-Tmx4or|!=btisn;Xuz&Ij{Dq(=g<-aOvr3|>A77dW-x`wp# z`ERnXn77qiMOdc`tFxM9QJOwA4N7c`e2qBNwOYBX)UB(7(%6W|xHx1bC85}xtc$== zL6|S}jEPak2K39zw0=7_+^0A!>+Oa2;lphGrcKJNTKuGR4E?+_09o=wrj8*f5= z@vq47?ZI=G$00XXXtHx7mOt9qvS?Dmb)2j{hOOlXX_J~UC3rl%$nx*4K8hDl{~fg* zHRRq!&^l3Y#-4?L6mCO1f&2~R72G@dI@~aR18yTD@cpTG;jx)tCxfsNizBBKgNVZZ z$|Gb@8fCTb=e0ScJhHzDGYUKK>$fVgxTwPjQ_M6;rA%eICf!`-!S|5=jU&e4N1n#M zQ1Ci03H(Ak5JT4%Y*i@rcrf;%-X$B87Aq3YCr}3K1<*^E{AfC91NI@JK z%xD`}4Y8+ix^8T@$JZ6!!-;Z+qh(Assg5A8boC^TxZux&K6A5GhEo*^e*U3?oq2#C z0lw88(iNSwe2Jm`_;Q^L$7oYE-S2In`Q1-nS{xFusFNad>=Flj-eLiNI}Un!FmOXP z*!+eIu1wZ9x58UmOu&1LfWMrRC+tF6RX1`XyigiXSm5F#IM)+eJYMM59N1HR950{Q zj6Y<&j-6G9r0$k@ObeZi-z|H8CqJnUu-NdPfKIz1o~aN2Us{}pg$U>FA5CG%CO*t7xCl9Mm0fbNz_=F-^V$I>5yX&`vS1gNoZX}$Qnf8)t`3g`TY(|r_>!P89bWSg=FxY^v&}L z^!;6OY~W#IaKX;g%YZ}0G$*=(hyVflI^u%P!}Pg|chgOHe3OE7G8BOX_!c+d3$Zo9 zvhG;~+_jL)OrFs`gzx9d6|E4-vzyiem7bTbN9R^4wOgT+7b<0+@2r3_w-KHuI7;BB z@#nK?N1RfiRFdb_?nFv$FS256sG_G#+a9U6520w=hAvIS;Wg<2+?0AHUR?Qetc;l> zwRYx5q+xaZVq~^e%jAvKaSLS*zi=4rz3te3W)tB>0j5VxC9)UMe?}1P8;J~J`^9bL z{Y{q!XZs8t-X;Wh=~$Q12v%DUeOwY)YO4Hh7V>)hL~F&U{AN0Z%hyi^+|L`*@ncbIIZEMod?J#DhULKI_dFWZO1wHdToZDExKfrULJ2Opbh4!^l=x@aWuO@=uQUN`#^O6RBp~1sX z2NL7=HCif)IR6OlSAPF6n&&Wg|5b6gY1N^%Si!qZP%RFR@5!vHvLHtnCoCe3^9wP3 zh9bKO|Fc8Erqhu9c0+v5da|7YKQsk5qyi7lcfs4@8WR9z^;RgS2|T@BP^Mn`fUj5E zp#LMz2;)6e3MIA0ttBuFqb}xP8f~4YRX83o!J6U1;=*=3@=-N@;-7#b0)F1;7*T6f z>47t|akm8EO9|Y6H1i%Qy&xV^M!BPoSbYdKUH%+O+Nuz04Ll3hB5{uxe?dz=wwCY5 ztnf*)Ns@So#_E0|&0DrM9Rjy#{d8IwwoMC=nLJnImw;{kL`pBiDpE>SEL@;q{ydG? zzJl5sbNrbzeDQ(>{E&|i>=z@GXH2tq1pBeu`Gf-paUBhvcW@Ackd_V!b+a|m1?to( zC_8q@7|`}u_p-sL0}Q;Glt@71fpoL$o>R~>b^vSIquq;3UBDI zCxCUUFx_1O(+B|nECA^+t=6F4Px~d(xXP6$n{nS~weah3l7Tmmf)FaQ(Tecsr-c(+ z_lrIo!tSiby}N&cssFeV+sY4M95`fw>{y^DsaPv45eiq}4C=uKrBbLu; zTzD?I6DC?K6WcFQmd_={apeVqzmg0^6kOe12A0@4>id<9|2_@u>$IJ03cQ^}p7uB3 zPTEUyo&=%NMz{oJt&IvVvqfra^*yEqr{c}aev2E%t;g54KZ>RA--S&jyHMIzgFj}z zi5IfpMz>-}rk6CAkta|MCpYF>$T!E50kQV?*BzSei}3ZH$pP3a4yyBVp>Nyf?yYP* z=FO*jny$-(-NFJk@zg1{(B)DBM9**^pTVDBD$^H5FWuc3Us%XCw6&?BK|vgg7P$}~ zKVYX77Qp-oxi&qW*fKj9`^Wh~@aN%V?1+>}0piPJ7vNvS>hGR-b^l?iXo67OT7~zD zcVb)RAw-eoescB$NDG-retM70!S8>HGV8&Xw(c;_2Vitr65*mg6+ZDu3W$ZjSEzfg zY2t!Rm_=^s4?d~I1evL$KwCiu=5hKdSRZpBWeEiQ_ZI;%^gUjQhn5l4m+*JVLBB4F zwI&ivD)R;}^&1{Q4@%c{qX4Xv#< zQj(EKaC~50KZq_9S_VLOR33hQDkC=7_3X+V91! z6=-v`pY!Kr|2W)}b|WT*reJ^JC%AUY{YZLq9e#B1cSe^jlT9v~UIKfOtv8U=$NNOW z&+KOuYj_~NENoA9oHw?JynUAwrVqCQd-p+R6wvqu2QzF~uOmKATu-&`+^Jk!R)(3D zi%_k9-k5$^*zhJ%NGf!7!IYJy&pUb)%f#>I&*ixKO0_?XqPu9&4jcr?wK)?Ad^SA< z9e(auKKBgp1Q?qL*f%7t#Q!e+F%o^F`XQv5+^<*8Y=*t75e>x3KPcLUd#Bul#|iY8 z#LPuTeKul!BWZ#s$XI_)QvupVU(CL4SHcKry~NEl*QGN=(ztM%S5gW4{v_S8m&kgGtlXObnVKQ1xas|rxu>;YugL@8{%Xc&k z%DYiu$!$<>sssz^9rJr-k@R_w)BdSZVcF@#w8}0#_F)aGgDuEP@d0mi4)fEvapp$* zcW2pNycLm#Z%@4)-s)MRU}k3W=&Z7#(zK|V@VEG(s=XFv?N!i)k#Ke)%o2c5YXC9) zvx`h*^O$6LH+T1D7>fOH^q5ubm=cJc=}lOblMU?K3w_Zdazs=aUR-k-t;el8O3S#& zahaHvg*jniI7(!?>!O4HNLYSP47jw7bp${ECiRe0T5DC~m95D{G#?%+ORkyZBLf6QH*` zx}*p2=$r@XeYX?vN67c>uRevJ9(xYEEB1pch7i!S&`Ee|{=>LBaRsV6?6~#QAK*aA zZpL+uyQrnZ7r{7*{i04Gw*P$vt~vtMY$ulH zx8aeGYVgB563`e(lhy1TR(yhqtUjwhT6oF z_8CD~Ra6D#y)AI9SOsO#Ldl#3*(v=lr>L$~~tzD<|mkD#aV}9f)*si@O@#WZ;7JwdaWmqg7P&>^%Ho@ei>&cD{U{m)VLia^X~42$m892(+A4>=aC(lMz)Um-E^K z&A9bQBZ9kVv08|=-OHfftdSwq|1FTp2z=Nzl~BBBalao2-AM-Q@@jbqd1)|4wSHgXXMyKFs?rz#U%PnuwoX9Ws@ z!ywf5w&C%^&*G0+Z_5JC+OAsMo^l0VU;RtsZ)f+nFYWd935&5hZa#XQy|9>sH*hx2 z^75JY@p0*1Deedv*Y}Xz39Tn$`y#e~@Mt|2o+3B%_;K*LbHG%iaP_jw6ny-#PN2_` zo{qHX)A`&huVk5ov97Vo@N&-kw2OUls4gFw4TV@9J(FB7 z6+Pq`6tz|$(JxAB;lG-7>;I(2?iQSB z$djR=sbLfPnRAD;8@p?dqr$5f6N`HBo$Ylkx7*0r?+{OTnX>PaD>kM9I8@P$@ugOb=jsskl8qz5dZmnMXka2GwL66L_} zE7UMecsrfpPrDh)8#MUY03p1}KgTr~Gdgm%cZzsF!`%xs+`o)tLZn>1XE$}10@gx< z>+dkaOQQf(gFVm<75E#q29r82nb3|nuoZoT1&LsvhJsyQ1GcW#kV*b`tZ5T5{>wG+ z!!*`^GvfPq9&A8*k`H#z4lzv)K=w1Nbey?KoJS zj`EIb%#N6j8DXhJ5)GIIv zn+4ln26g%jStXp5q+t0n9fuByOh|+l7GY6$54QRFq3oi9{%{^5O_QwB%aNET~}Y?Tq;o5+bJW2Xyw z3S#;LiJwbTu(v?Pvpa!9MV!1gAk^2LXTi^MjXPB7`9LABFs+%q4E@ppd>4)8`>{~=(7L~-3d&0RzYXyFA8~Xq z57V<$g?YCwt98G>tq%FoUPc?$R&C_BqdO4k7lSJjS0d3rs{hwc-G#k1Cvo?VAECLq z5CMVX@Wi}tVMa&_p3nUkwia$jw@BS|OS*8U!$1+mVn{Nup*6V#hj5T{uxok%HlDC! z(&3|ECr^{npKNqcr!Tc=F~h_O0`wVja`d?+CHnNp2sQ}lt78NDo>qAYkEEvu%ArF% zEjO2q7r&cK_daXZfcMi2*ntDkYASGaB3Zcce&jYX_o?^D08Yf^dNn7uR~*5IrF&qq z`e07<;`A7{q&(eXPBSCh%ZgCOTc+ z^tX8F89YJm-|vq;kJQkKczxaPFgxsQU(NjHQv4+AMHIJJ;cG`aa7{)F{Cb2=xEcC4 z2zVD?>^S}qoS%SDSzrgZYDVEqs~7k+6)*)lzEnWz8xvg=YbADo7ZL(DTA@aa@_fo$ zld6>HFuOTELq(GbFYGhnHDXHLMBf8#kY^nFdG5+Vw9lXR+3oW*+_8X|eFQham!F@R zGx92!_&h%+MxKG>9*Zg;@Vo%9q)xDDt(Sx|CIP>T#`3*b0-^xmu2R|in0*Nzqby{c zMHu-_6|N!+OchQnDrm!fJL>U^>tmt!g?W_WtwdR^PuLUVA46C$?HnaearW2L+X{!1 z7?XDdTJ>H$MtC5aJ8@?VtkzK6H}f9cIDV}>BgkkfLQ#7)PS)q5ps5fpA;u`Q`7aRT zmu#OaIF{g#6RE+NaHI+9){nuLE+KC?Mc(7Yi3+Ap1CAc!C@W_%mbi~KIbKynIEByq0scq<{ao9aI5XIrPb2N4& zZ+Fu#BlVJ9aJ%&J{B~yt4ptq47kA;m*Zdj}OuC`}b%kwJ_~xFUb*ow@hPte?K_S>iKmI_&t~!QUdi z=_Dpp>UeNpGZGtmWsWz$mB!)*7Ze};OXX@(bzZasq>ai6nE3N#huerz-dq6|-UIff z5=jM2q~!^@;36{ohiPoD>Y+_H3I-WQUZiN9*kGf1XvK$T6#Um_6Ednfg2?k0Z4~=L zIpPx>x~Q;aQa?u&Wrg@C_~kV^)=kl*T=F?V;Loo;ah-Ov@f}3w)F`|;PWONuUt`&e zbXHZrGyuQVDs^;}0&l3_D3SNZzQnU3Mr%V^P2+VhnSfuK5Zd9y4aXa?f1)pT%yfr& zh8ZF@a^q?4Z9$0i4mm%_2>E1Dwa>hyghP;bC~i!;84so1Bt6B73lL&?kr5)!12O+bK(jaO(maDd~~ zDQ3>h!s=<$@o{J<_K(GZ?s>I$YHGD1)!oE1fXKk9lUTWB3vTJ?V8KEv^zOSEA|nm! zsdaY)ACnb({qHyyOAKsn464JeMrcQLD{*V(sH#P#E$O;jLGlaeWE|v*iHP$F$LiQc zGPb^nSpF>&ufh+e-+j)jgRTCU7d{Pp>{-Zdt-zH@tH`QP#ix}A@l5&)IBw6zp6Zi$ zHsf{Vx0IrT?%@=&cS3r>rxKv-2$$8cNa%**>%fO3};(9`_r|&ssiaIu+f8d~oHo}VwJzHC4s;1Ze{pvNlcdM8C`oetu z^&Hn+BMgF(Eza}up#1qoI1BUf$&4Vpxi}OK858Oy%GHhtzi>P}?G8M%;5&F`{=)?5 zk;o?Y-O}A8t6|S7SoVRwhNOTvtchPDT`3d2MjXg`4*+#Qioa-NF0`<>lU z!&N6RIe5J6m@_G4JPy^I#=BYn#F4sFXw-V4n0;hSu7NxN(MqkLy+VquY2-m1A>;7V zqyLAWAO0Uy^w!c$_~Yh-Ex2!Y9m3mPMp)-jax>R*_r|?c9!!p%;_raIpapD)Tc|Cb zfM0|r#^^@5EM=2bP9EA4X2jxYVpw{x45cXjSu1P=#?6G1QWKs&-iuc%yJZ+B*utb| z*SFOK*t;}hPE#5F_ZE?QsbPO1M|L%llK?|y(<9LDFiX`?Mr4J}q%rj#$$5m)qX7rQ zfeLT1#dfIio>sK>mEW;G=o%xyH$qK#Jr2Cd4Ab`t34l8BCA)>^1_#54=@a|q`xKa3 zH3W8Qa1cNrnCLH)7Nk%k^LWvaH*A$HR6j1?gTEJiOkREiVtpcr=-K4nUmLdwx20@E zI2nc0&G|T1n~AiLR3rz)NS1FQCjUnM$N10m=MicP#FQX|@(ZFkk$$e~sz+{JIdU}@=qK5Hged^{No1%7@yYU_ZLCsi~ysy=>xXkEGthvVXu zc0WIcz(C_U62Y|*Cs2q=vBE-3OFs#5Dr!qi(q(SG&E_t~>LsR`lLL0_IBMy&`zHsY z(}#ZOYK4^m{Nd?e$D!-q#INUn7mFgMOA#ZHCN(uU*@(NH)3=lxo$l$Mb={4q>a4+x z&WP(P1p_UX;iw=$N$dif)CQeERO=Xd z$zcl_=D)CJe4w_&N}D-=fIxFc2nCq6^+0OpJbt+g&)wF8*dQl5i5cp;(SA{+XeypI zMt6z+pR@+8t^s-K!;j|cLL@GiJg;z?m&8ub4W0n!CNH>7ghH$IAr3Tp-5*iAfJ*Xc zXrT7#ZOTw1NWQOuocTHy_9BSwfG;$Q~;w#Ps}p zK4UB@bk7U=zP^0OXJ{x#aS^8HoneW>bft{fF)@|(AKURxVlYRK!_jER(TRT8IVq4B zehY$CA3V4GN&If{4`i1b@s8}qBK(EGRwQ`L4WAAla+x4?F8BZgZJd%9(LleFvk95> z9)GJ(|KEEwC;m>>_oY*>B7wj?#yeCp{72_}6YCO|OPy@-m=u_VX#Y6(0l~R!O-Qmz zwM}M*Q`4Y{*qq5nR`8e{8XnqNk0~`hqR%t*RC@h)h#`)5jZ#eQ;vS%iMvsaJp*)@| z)t~e~jhA3MTGeF`+g{&pYaaJ-xA zB0Sa*;AK?M3cM2G90B;_LV-WrNCabri`bbFH}|%ZaqwocpiqHl%_`-8+fC3#^=z=_ z&Q%}&h>75(mO*3RMk{6pd9y*D9gm6(Xx_4j2q%by4yKAF z&m!n~GSLUe#|O#7V|DKy@apQmv;mACuOKar!(`G>Qp{5i9b(H`TDYyH*@fmN<2h!a zUsb7I@L5@*qM?C>pFWLMt*tydA_7>poFOUs>|u$LnF;l?U1+Cq6~$P!{tg0l6CRoQ zAnu%WRevk9KW6>|j~xCzg1r36#fn5bxm^xdFV5GFOjze$UBf$tA7RORx5zA=%*I0b zw^m0xwv=qAac;oe=vm};1tZ2c3=dDeg$zkr|KW?6G$FCzK0FxA12lB@1#A+NP|OTV zbJ}s$$!7R7+}&ec{ft-Z!7o1* z1a^d;3&~gta*uqk2EWSZ|&tHX^0CUBe zcHDBL+0aokk8CUi@e_i8;lAOLgbqCLt>~;nYj?8*{Z5w?T|&6gy<(b)z>0qh9p>Y; zr;*oO(*NEF!k*ZG7(=Rny9QqnP95F83bxM)LJ4`Ke8+AmC(?;P88sjwA;8Mj1pX-! z3oS*3`oiieEy-jWJsu4EAr5iNN|m&l8q-Aa?{VaU%$+OR$ho7FJ;WGt^Pru{Mpl%H z{S*BOZ9B0fWC}JUEP_Qb$&}06KKl{gDcX*o&%PfwB(K4S<0~n|_SKmLU@hck=LEV%6g`Gu>@5(@O%#}E1K2D^ILD^zwEJ^v|h7-omtZLGQcX7q2I`t&9(`J%ukNfE(7%jJXJsm(}WCf=8^%n5Z zT2#}xei{KjzC(7@Qe`#sNCBTfQ+QW@NdTMH2KGRKyM&Tm`it0$24gvSOt+Y1)?8Gp z1NZN4Ky*EMj^Z3~_(v=i@v&|3V+}l6VU-VHjY;K5%Bw(y!ul-x0dfE_FpE8 zLbE$6Q7Bq5_T8pv%x?CFOr_HY8C!O?fqHtPFU};};Hdu-&`iaP%NQ zJ^*ng{f@;+$-2anMTx-mdlHrR=wG|DLCi)l`5*G4tfXib?sRIXqIEffusgLYe4z zWAz=9*$9>|2*hcM2vl14S1`CfGHBZ&FsOo+#?s=O^d0M7)}@w1<&bABRL59c5ZaAQjNxu z!t3tr6&X3eU5j)qP1Oetc?o7Ho;^;EUZ)3aUv%mcImg6?O}@?%F(od(p8);jPO$h6 z_cfHELApnUwmXb~hvsfgE!4n~WnghP;PZoYt#{*q%j=-rRqAdN|J7K@@)RzX4EEg` zIN^;5vrew=z=ON%VG)P9CS^ny6<)oWS+k;!xOxV8A>vL~@*@(s8;^>R!KN|s~w z-x+_$YiHg^my5vJ;*W-|MwGT!_P^Ig#v?u;3X0WVhIj^Tz$}(1;dyP46kKU4uR=t6XSq;bECsSlrpk z!(w7M7B6Oqb)O=0p)a3bAT=cfIXao_k1m@^fXQGnS>*|Lx3dR_YENQS%v^fT!;Y$B z1l(_V<2mPbyQ2;+(Psjl;Cf0t&4>%PlLDHjZiJ10mGV%??unPS> z{>*NtVDwCqD3P%vZbHa)v-*?Tc`01Pn zQAdRI=1+f!A0PZ3{oF#{g-Gkxpppk5I%%B~ARr7gF%O80Q-@|{IFJ^C;sE+`=_kRn zvW-L-K<4aUwpPW2i4tEed1tV!s2Ed5bD%ry=#U8Q6c=k#>+H%z@%GdSz^vH=Ql{F8 z#iXBti|#CaoEe`^3pBc=JB&(4A$C^OSxp0CCe|M%WBWTQ4xv!6Z*h=HZWMR6%T0NC z;z}%yoGDYO?n}EB-xTqC(FunJTdHolobG_mR*H=R))LSLsi$|h=4959KqsX2s2i2P)_n zebFc?c599sF*VUKOJw4>uQk+)kZge#PeNrEZa>(FAfcd1t|KGBSEgw0vh+(cgfkpq z5R_WwFu8<8ah70^Mqh%d2rPmXo?+J$<(hId;bN&KeLWl!w0eNt* z#{p$NMlanVKHJyI5$LVULK)4C?Siq3scz_CsP9w}6LkJVcA-8RVB`I%nu-S_%6o`$ zi}PS9=RCZ*m)-KpeSr!x8rRl93GW$lEXApT-efTV-%P-?wic@B7B&LF*E;Ds@5YkH zKuCE}!<<__B4cw=NsDNCIf3@%w^is_3e-*w>oQugX+|4%PYZyHEV<0x_t<+N z04MN2)tHN~efDGc*n(ufzEg9cwzD3$j^BW*5|_&{_^9Mlv^%Cypy~H>}s+vez+f%s~H4?jVeZK4S6|_?$VzraK%64hz#UX_7c)c87LE9#~O{ zEGZVL+j+^pa0(4u@@6%Y4Lhq(;DeIg_};YJu`qI~d{0ALg}W;iH+F4rJHD27JH9jZ zHuw%Wj1@g<+j?4Hvv}bidjGf6ZbnK#qCAjmb9N!UJ_oOy`2g=0e1b0eH&bnfPQ*wk z4FSHNQ^Q>c8<1ArW#oNNQe<8}{D%+2ed_iXPnXA?;nC(L4_6`NmX)DD&xrBU|Iez2 z?nT_>pRrJ0A>hBWOak0+Kt`^BIAZPVYQf*94X}&6hs!I$#l2jB?Tb?&o!BprBM{(1kct;elG3LRy zY_!Nr@u1$}pQDIS*Jly*9mxnLdZMIBkWZe4b|_31aG9^IlHS4aVVc%Nn+5!h1fb9d z?EWI7U$OM@xF>gRSgd9vj=%z(GPUz!gFknl#xgd<+NCvug|v27(;E7aVSIfL?%&&h z^kg42i59F(8%DIUuRpf2e>w<1Is~KdYQnnI4R~taH<3)FQ%JP$uD%ve9Q_jxRUHNw zO;(r*Gb3kXyc_g8>Aj+G>mT_a%22he%Dqq@UGa5AjKu+B9(q` z9N_Bh?V@fNT6rll;>_5a8ff^?4gwG_KWGHpzo7wpA?qC}i!2`bO{FMrw@b-Wn2e4V zC+*qDZYu8o+=A9hyp;1cy{8v{SpF2ATk<1J2uzZIFCPBnZmo!(gO^r3iI-PBjTrB6 z=`k2{IZSpWSOPs$%DZKQW^q8ITL~KPr{{#>ju_p5aIM?SFpd{4qK6=~-uH$<`{g8P z`@@L=dtN;tU_hBntmO7`S&pwin+nw0hIzjRcq&4mYj!<&mM^sIU=Pj;2!a9};ERau z7x};?nu-khxjH6BlFJ)nq+QbTf?4RG(fX_=N8zRY4EqWPA8&b(3nT47VMAnK34ygb z0}NP1&#+l9uk@DRi_K~^3bKY;FQVuw+aK&eFw|)+G?tAc(D~s~eN=xn5v-9s-0v2G z5#TF*oyj}_kT}ffPi|L_?g8ObVc21LLSvcY~2||}gh0EVycJm6` zu{f_ou7!~lZ1t~WcPBk&^T(RFC5Z4o+dyeW^jv(j;g9&!ivPsMl&kQQ`H$ef$=Avz z>M!SR!jkvz!UMaXKxumoVP4>njnn%=JTi+X$ro7@{LtG}2W7`DXw_BjAf-ZN+k|P; zj5%m*;1PRw^VvH-8yTLQm+8-$t6U(oqfe@?<{{#46O$OiBL);um6p^m&YYmosE*rVf?V@;S; z-7C>SCvQes?vjm4hU?mE`F^tEktKJ^m^lyW5p}?0e1t|<^QQY-R}EcMxV;`Lt3I_G ztDppTLGj?TBp^&^f%Y{Wx@frm$8k`;RSXv0w!x0(hddz(e%CJI^1A$ z{%eRdO3{W-kM5DISiBxXgqWfOIpPWQ50x+p`a(p_tQw)8%u3+L@2U9VIuov%E*78b z9IP;@!ZToS62Q824vxX+Rj6t*q1P{@g#%o}16~(he_xoaNiZk3y4fqc0MycYsqzN) zM?eX8f?rnGuO8}oK!>i;=mq|AqC8M%cb7qp?ezE>qI0xP9s>JkJa8-!{E9kYtzF7k zk2TBJ4ZntrDt+eUR+-(4U{LwRaFR>)98Lh0nHBFy}toR$9bbJz%q;` zO`k_$A_LBD%!-_aWke=z>RFi=dsj0Wds}c5vHl09+$4XurF0jbJoY?J)|{lpMW1VS zX9jZJ^MP=3GzFS*YMdW79B)H-Mm9{P#P;KjhEXBG9OK4uScn&wSMadP8ccok(J@Tf z?Cd=M)8T;m$yy0f|b=vBZ;%nmZLdF~T;LIjmJK;(^JoUCAzmO=x5@pa!Vi!Or z59*%F(n)qe#%X*-2R39hOK{dL^k2d9Ck}tj3m{cf+rh|1N39k7$tkoMlMOcA*L!pf zfnOLU)5dDB#|j8^X`%jRJa|ShG?A+3A!sYfV1a%2qBg>GY$y!X6SXYel<;zwI>>%7d0?E@(#nJ z@2JSD6Q8g4FLy7KXvU+$DRKb@jkmgg?@*26F+q=pS&7RVY*2``E25w(tar!&gDyNm zG7`LvK68B))S%vBr-zDu1^mCsQ*)|N?&t%2#WN!%iq$g7P(M8hyu=&I4+>$vsuCuf zlW=fsm_8o>_FTwGyp#g`bP6Gv4UCM7I-$dJ&qll?k*@Pi1zLc?U+0!|U`as-L{Lhk zTn``gMW~br6cNao5mS*G7=MoZ@`;8V?5RD0sxCV|DBgjUAKZg$w|+-PCtwYbjaAt2 zfx^H^n)a*&KU9d~!Tfx%{5%=r5s%PNVD)PHx=FIk&%2^rN$Y6mfn&z>w`}?1NC`>L z1q=1qmKM`wL7n5{g>F8Rp&dC?ZEaA}$eRWc6)bX9N8GVsLr#W&JukwcU+)xA0SJF4=`1y%$T#A`7bBM&Thbv)hD*gNEM zlwN_*yuXXQw)dlHQzijlD+R{88iRrz5lwnJzitA=5 zxMzuu@!>*XjmWn@M|(HF0O-3vrQIZB?1=1fcjxjDI)n(&UfQYtF7jeJhR~!pa_F^_ z^mS8;TNo^j3UteP(p6d_&l|--z8t>aGz@oa`0K|uWe=8ZB4`b<`gTa>3p1GFD zgZF^*7&e-<$@*nKbfJ`AMEm%|2(VlquoN;%4;KNGXuX(+PlIG7HW4zujDGl#A&%Jo z#*?kGAhgcUG|c;UkCm$j!9I~#9z7RcpTntT(X(U^k8kY$PaLmFmucY==+yxkfx>v| z12YTVMP5V2^>r0FG2SRluwhz86U--0k*8G;78xb?RYU}rbyE5H42_LSa#ogeHW`8) zV*>i;dsykaA3mh6tf^tq!U-Io!Vw;!_8(8`_4QD)a?q(ckeM8W+&C{oLRna_p-2L; zF1@E+wn2Ps!6W$o^t}hdPx!0<&Y-G2=lGXe}=2H8_oz-OI#Sf8gXdDoeC$pv&+%6VQ zDD)@-BJtUShIwe5102wnkb(R#3arUSbpAqWj|>UqZQi~>mpyP#lrduYT!wk{KGshI zAE+AO|LS3e&8HPyHpPt8a3c)V?ZS}invB@DB6@NA2@>F$yDmn+)#?RynppF4+O$EA zp$`!YeZdZhj$$29SJ;QK4h$boPY;6jHqG;70@16hp#*h%#5gq}$&gR?`DUyP!?H&T zi8Qpi69Go+iL$;E0=Pt3U>1>{k7#boY_f5TkOfhaI^6xF*@)J?)R&6apx;5pWG_t- zIaRC9v|)Zh8$O;D1Q)S=<{X9!CzqPYaOgegBofNqA(~#T7jG4A$L}&;Lv~#zbg9#2 z8!$%hlPG$fmHw6-G7b@hKZS%#m93RBY<(e8C(oVfK5N3QI5m#&E~5(}*;&vlDv5AJ zNir50sbczcO*T$1EoD(BPbtgjtz!fF>(}e&jpsk}45n09vmhJo$4L`KoayYcRZ2^M z+#EE~6*K9kyS(WKV$DNir2^jDF58Vgv+z+on0DhiQpssFc=3J_Qp@_7JqM5N`2|ka zoIrBiLNs^P)3bp*a2lw_0_4&FhueZA=!<5?s<6J?Lwy{xVEG&yvf41I+Gv5OO&}+6 zJ$I)tjtL1T`$qRNt`+(N?a(THC9B0>5}}hT&(}48FK8g|z~xRlVx!t_Dgh=>ZGrw& zC-irSBK$cSt`%fp*4987vYQr@ePGq=Y0;UYz@JZoezO3baD5KV$; zUZs~eqZx`-8`RLr7<_{bT+}xRPiTEDbop7H0ls{{kX3j;Mux}O<+ZYJ0`owsS#PG# z-5vpDX9(ERMkqH`0R43mqYpj0WPzE<&{x_{B&VJXq3A_$N0~e;Qu_(S=sru%+ANyD z#U?0Qol*sN9eL}AiS65cOa}S%^hyHr&E9AgioHkw7kh|g3U%J?l}C}&m`xm(%X32Z zIWi*8h3GxW0SS0)*1foY()E(BY%4#ANA^F19D4@f6F&ICuDi<*_cGyhk{>GkY7tUe z4z-+!+gyY23N0RyEg2TZQCG+O3-WntcDAOLm6PfI+z@V9Zy6rww|=gBo48K``k>-s zHl6f0Rz?&Smyl{F|0RFIkAYwRphkfnHlgyaf&5zq$_yC2wf{y@zs zyqvcgYvSgk-Pwtka^8X6*@gW#Z^GiJnK)LLgqT?|idQSkZ^;M$oStBJ@YhA7fo zkU5$H^&8Dbs-lOD&?N|qHkC(dK36tE^&k8I)M(PA$dDGR@q)6BjB$L|fK}o_NavGC zdXn?KoX7$hbCZvAh!taG2vvE^ACIdOS0ShB7+uEYE({$6gIvbg6-U@m zMT~z&QMptq<||hK!66VrYqMty^-T!SXAO;*T2!p1czNN>aGIuj6y6bpxv~;TU0q6y z_=3sfjLu&DkGeXko6lS9Xq;$+-QUvR7Hr6Y7P0CcxiNr{Aw2}_8r2jgU89=^N# zr!?ey`+)<6+E_ze~zIeS4ozJoULmT2$~qa|yDh_CuM z20-{opnOf-{O(CFbTyN}j4 zlOf$qz`el^tRsf+ec^6i5>f=n?+b^%DGE$I_WyPQ9vmxt` zgz~SHN`~=!8S7_Xcu%j^gC2UVx7mnR6t*zgm(ybRUbi|PXw+{UNhhjhsjWouhkc^zLA(ru9f(mkYYGgpNZNo+C-uf zmnpaqnH7n>;SJqblhuNdE}9fy`sG@BCIkNt>13sk*U_fcudIM3Hp#wV=-X-IY$cFg zNgHQXt&DlIb8dWi+tSqc84nggKTI3*?O5Bb z=%VTRg@E7fzKidttrW;hOleOTv^Zk3k%Od?ieH5|!tlsDNB>7cGkKk#>=p^yQ_o#d^NM|Cz-H&W`t-4(<(qeI)C5HN3A z6Ia%dx7s8P3d6st&u$8R$~E*k8T5^sbS%qn!<+UXG$r`B%g;yf{RBvpC7%;H9S=^v zLAFJFp0H_i$xd|Z&a*8Mg}|e$8wYCAB|%*qw-9a4PHdvr?I`|ChIWSPfgrXEcW7u1 zGGljI09G7tLP~KN%~v(}gh_G)MRaAt1RYkZf~qQ0_~FCsvOoNRzu(d_N~V9y=ThOt z2R-;87T4D!Bp`re)+`ZMQqQ`f#pJdXm!QTM$QtJhmz8d>V;KI1FjL;4$g^kS!_wVY z9yJ>aVizJXd@90388gjRLr*Ib29!FBM{`db{+9OvD(G)d%>TAzaWXtbEdOY2I=Y31 zkICCO4CH)JmM?yoTGEYKrG{sq1=DxCQ5-C4`1d}H44>F&ZbQQCHkpye z4uyh6IKc0ymT`N(50MDeqgfOol*?)It z=ww6%r=q5v=GbZ(I?POD8MIz2!fj~qSCCR&OLOEyh+tW0<9E2QHmeom8hYiw`2zY1iTDy9#%5GR3fmI9 zbo=$JK=4l@fL}}mpWF^@V+~kps~h~;2wIM{PUQCcgPEG z?f?RPI8KytJXfF~h*;~)X)X`Kd<3ozGq{M)&uWH3MowYpKfDzXtsf(no)ciyGo-Z+ z5&Ce0vZ#9yfG>pDZma~G-VD{GpLd>&BWYb$6Z5y@p%?l>5m`NCcp0>FvQ9i*HGN5! z@;-$sstEOoj2s$k_RV6jY0dI*mbq(xzm!K38KYHnuZ0Z$Z5o!HX~X6@K`0Be48MDb z%-rEf^pAtD#n%7pNS{yySp(#^)cVJd8xafUgf-mOTMEcdu6 zw&fNlaguL4-*%jDxhAn4JF+d=mYXE2i>j2UPLUMFP68x)@4zm$mznqPd$TAc!468G zsF9WgfyK_uoA=H=_r812B~aSA2l2=dY8H9WNEa&sKZR4%y%A;4G??|nZTN@Reu(Wo z`*7>@E3t&EWqY^>1JMEWM*HMjMdOt(KmRovcn`jH(YNu%`L~UJOntBezuJ30dT5X# z+AbcC<(rHLP|+U6%0?rWuahO^*U+?m$CWh4V*aw7-6DGEi-wF!*A2v!e@G9aA_k4z zXb}TvjGxk`FB=7ay3h69QsEN!ktg-N8PIR)lpzCULhi}rb5#h~xSv3lJO%#ya_|ok zJ3d_keNK}I4p@d(=ydi z4_c2Sre=hjM1vkp=Q3Te#Lw`5uGR_Q8UE{eg;<mlPKSV$&HaMq8p{zQQ%!0x0`Je?l8CZRYJl9V)Lzy)s#p5ROlyvzY z-Q}wVz$1k;m!nYsr3NS*c|NBork4rg=tA0K7a44^m(WDlu`nRJZh__w$H@FU^WME@ zbhzksodW$4nx?~PENhBjd3^{iIa$)HXYo@Yql%IJcW|fy0V0|{i(7ts8(~xJP-CV8 zpZN$ zle1$ zP)a4p%(B00gi;t8w+}HjR5&GpsHWAs+yu2%L-}9=7ts2CdA<*QPW2Q&i$0CO`qBDl zG235>e_H%WBARaW#0D^w7|vkJ#PdvIkJ&jsR&??wPIIJe3R?1P5MrxY0U~ungQL{Q zNuFp)5rfUjFg&c=2M6_v?|&Z<(r4pb-%|tquY6@Je(5IT_7DH46b}!pHU}B^B4WS} zCm;P#h1?Dd4uLQTho(89iJkIr>I@zlWCfd0cT3YiZSC4cuN|XS_w%p(2mXZy{}Z!s zf?c)Ba86IOADcS2;zzsxfIXscLg-y9$M4|8GijRsK@AI9Vz3EaYaao@g*t)RWOv1y ztc5Yg36(rDQn%NEzt0Z+X<~GDl|#=hlzJ^}`4E^bb&A;%BAi6md3^`8>0|&NECTzF znb1GdCOwIX^nzrpz9a(nnFi>;A>jWNy*|{2G_iN}81ZSDB04Pw{pxOLLX$}7yx-7< zBa;;6{<@hw2{L57)(v*R4P_;7!GtYL{r8(4aXS5@#Dw7MfI(A&?8$vvIU*eh)oR0M4(>Jms&HX8`{At!Y2wU z107`C|5z&Ls)>v;%Zp7Yt1yznsqZ01`{!cWT9AFE9_s9&)7txyxj1PP_?v#gtga zHzOmIMWlP)Tpd2Yg6?j`xo;nzt8=cT(kHi7J#n7?urfO5><-;}=pdU-|FmaiaV%P- z!0XNYoLm6b*d+UQb^1(b&3BA#MofZKhg^^*>)3`d{dp+Zf=_Px2EMfU$Eb3b!fG<1 zhFq;sJYcw(X7`AK&++G%*=U(m*%86)&WQ1C0)4&`Qp0@Gz&>I!ByL4jW~R64WT=>o zPO^M*+5fhQz`qlGBQeN76@&k^80?aMnF0!5{FK07zIQH-C4o7fA|vwiN?^?p^xIlw zgOiEEJxU=l+s~4_`@faocTERA)(SrVSkzV7i><52t#Osq0VUJ@AHFiBF4O$#%59QIAF}>IrTa(`28isypm8p(h5a( z?P7-kX^+~D)lX}QhG+lykzt@W1EW*FK08rl~rEZwVBP)h0rW*-1 z-QA2uqw0+M`gB=Kv(hxeVU{gD&6vJ$Av-&j(qxjA3ES`Y>nJQ7C%q6Pm%F}!{E8v; zmsv36$ut7i__6y!o*~B-8@}R!g;Npi>fdYRwyNfFg%kXwuvl!^dgK2OmKMZ3`Jz%ZDx!k2*xfzf;5R^tV`x6F_v z{&XXhMFE+$bh5LHXa3McCXVP=EHW-C2=j4Sx=K6 z))JnGi0gOfSWr{!z;NvVJau(6hiL5)=!;OV!=a#XnueMhhD3r{3GgcjubWOLiZmhU z@7^^Q&nFC@6OVJ7n4o24v;bV=T<~6+yn7E|fTyviA{#wfG@wa-X4*_A?FFc(-6TbZ zc8Ja8^dvB^#c);iY!kFK3e+-f63rA1#B^e+U#JH}>gDS>;2ZM6r$?a^8)FNJ8QKy@ znYJ?t`!FZX==EJ-7j{G2okeVInk;g{0%8eQ_ChTQWx7AH6PpuypSp;QMkz6EVtv|w zO_#+s{N@f~{prJE_mcm)$iKXuNWfo8frse4N&5Nf{$l_?9X?{PSM`A3T?+nSA<`di zBbLn%s}Po8Qyqj>;)n8Pwj58M7oV6Ps{|(^4U||i3t5gEyzp8zsO0OXb#){#f}Rk= zzAlDn(qNw^m0@N9M@5b{A<)U4pD-;UdakT04AYF@1YjkqLFwO*6v*on@pX|kH8DXU zz)uNf(mWc!LSuuTye4K#AN85?F6h0Q@akS81F>ch$~9d^OUIMmtTlw*bdenJOdi-y zpHYNH&sU_JDl!#!vf}lltzDoItLOX3P`ygevyRT4ONRQoZt$f;F!|$?QmxC}begLK7z$-6{xITA3`J{dsf&Qiu(7*lmQ{BjYK_4GhydWG_+!l+DrAs+Ph-c)cm8NE( zy$yXLo?q%lLd5fhgWgle5iC8!j{bZ)?egx? z(9ls~o@oT)H+D)HXI330@ajAIeuTSEdDO; zY2w75N1aE4y=?MQ9f9_b4KRs$p^SJT$|S6X5tB+YrIP?x0R6Tsx#uF3X4yY9KozwE z8SiaU0Dt6+bLcNo+S3M<(>h<$7QxOLE~G_h_mnGi-`3q|Bd+f-p_7c%kjO|H7?R2d zBTraFd1lT8k#H_#b8H9p%N9>3bxa8QKlp*MU|e*v4}LIR5|1;p&nMC~x!l+ty|zAD zpn)KQB82M6_{u4LN@Kn}%na_BjunkjRQ6;*f9BcA&1d5vQ57tsZm z;}Lx^84=Oi@UKPSKd6E(nrvT1fUfGJo(;=LEA#ia8lg8bHWFa2?wk<#WxK>m@`i}z zGtn*PY1Xp>bVH zb8Ig|K`4z24utUd;w*IKSPU`Esfte{Iy^Lax^pe)^bsES(%k9kH8k$cW>_p7g@xSc zTFAMo>&)|uUzl(*5!?wuzo|JTH*x38HnZ+-Rw$BDtv2%f3KTluNKsZ=X6+yxld&h! z*jLVQjZexZ?%6uHYJ_%jd*WEs6oy4;U+2)oxR|DT#hJz{PrMvPheqh>T-Igi?TCip zo3o+ZKMnW`vE#*L6xQ`aEenq;3Oaq}uZ%2v0w(>dAtN^a95K9KR6`S+uvhj#5jodp z?YQTXIo`QsoNjM|B6_&e^=f;Famr>L(NXcWku*^K)^_MF0@3I5phxMqZx~_2M*zP_ zwOl@M+;g*R@`ME2e<>eYlZU*I{)ywh4qfK+>k*pTnkuV%*)d>A#JwF>n!<52{+Hb3 zU9DVZFp12ai!>Lm_p0!_hjDafiBVvc?k2X=O~!?cH9QkbMTkYH3L}361sD(bX^~?2 z_%tZneNf0N5}Hfwi1Uf{sC5tv`(qgxol_M(4pt4&^`49(C;fg>HFSPn$N_7j`9@wF z`@gk7Nl5r-<359*(fpQwl3~%>$*{ae9_?E`YScPOk*_qAhlbrb?uVfLO z!zUC1ILZeSC>%^k`C=&usqv|c{JPOXGHf>?AV9xykOn}H*_K3 z_NP+1)|p6NN58wiHLy0X9NR?HE}-C)^*I83x~;4OTJXYn|iaH*u=gIz1>To5Kl7v@Hyb|J;p~w$;i&;c6`o~jTLq>WaiYw z*EeJa+vW$dXsqUlFxT<&;E!Kv%UX#6_gTR%JqF;D7a;o8^2eru3F(ZlH9;+m;`p>K zlOh_k$c=qGn+Ijc2EK9-`iE=5WT6(HgkmZ_y0rL^p)M-K@|XyDiAL}rXqUoniajxY z=jm)yyRkiz`HVbCGtBJ?RP-jWyfud1)oy4)ekD4ELp&M5%3-G&?RhSQ=|5M^0m9wB zQP3AXP73ll_U%>30Z@x-4{DVH^u@1Vd6ntZK)Nd*@DPfcDUQW$F_iXXKw}k$X@QnmxWdS)vLUuESd^lj75DSV z@QGXsR?(iU*Ld~Y44rhLQ}aL(_?%&Am(T;BH7q*}DZm-TKQjg=hk)Y)#2ByaghmXS zKTr%jRtQbR{MYu&>tV+@kHQGriS_GWp*i+^0hmbdi_ukG*(GD}W5Fc?{tL(;tnHOy zB%FaxsFEL*rT*I1ETjo2Re$oRXCu2WxszZi`d+)8ytvqe9>E-PjUD8*{=cV1#*Qvk zH^XEv3J4#+oM*;m-KxyW9#!v5+lBfnq}eu$jcHN$@#ucGh0$z&GKoc0*p zF%1C#OF*>0yE>)A&{E4Mp<~#lVt=Uvy)?|OFwOtr;nDZlY;;crM)S#ZS~0b?>m{ch z-f3&YIM6rVBjQIw*=_Wq#L2@E;oV|SnNwbz$bV&1dL$ve5cfb5bDN^@ip?By{n!k0 z>kGy@!D__f@W&Ez-3fRv=?7mvAY;YsEZ^N>;FJ@GdTj@>?{45AEvA=pp#OZj5x!VQ zuHFT`;CZnT*{iYC%~OUP$SfN5#y04e_R265p3aw>rhI)L6rug&PfnbblIf78i^@{b z-&V{N+u@8?ou_bsPZSn z!bF;<=xuNU!zr4YV-p$RmvZS@&~v-8Th;{#Q9ORwQ|G4z^n8Tb_mP(o4|ku$7G5CYl?SWN_Z!3WesbKFb8%r$8ZQzqm1s z(#|*nGhDJ;9-FEmo{`O5rwJ{&HuRFCJUuupnf};jF2kb5z=IEQBoeT``6gS8lPGYQ z5cGHKWFw$Ik3P&|w{y&ygV9Y~`A7$8B8Eb8XSplOW^|~S%A2?&T006ud5_52G2DKs zwKIoh>Iw{P7sW%MaYK)kiRF(H_}y0oZ7wlvV%mb0jdT~{XVnN~GG|0S_Z(ukqRB;6 zv>x<W&;@&al|W--4zvyn)W2D0FBC{zw8G8e# z5LO~jL#rV~+?XrLk*wHWCVD2)%d5#nN;W5L4`3x>6M_)h8tu1WkD5BE zQ-HnD+!5J4hW|*5skwzNB7l&~jELQoK~+ArV`L_ye_rKa3OV5nNQ%iY?eIw|-RJUQ z@bVzE57=bGX>9fZzo~#GKzQD;!M3MIp<2$iUU()HBVLZU)YaE7>V?+ehQ28m>^Egn zb0)otjDpZaDTv81m2xJA#zA0rc_;X~KACyLPO2$9ds|k5+>^Mh8zZglCXzc)9Vz1; zjskq3ri0e1*ua&?hL= z&uGig1mcUywO-r{9yZHTdWgyY(@I%=sV$?2uy%-MQ+TZ;@)+LB{7bGCps4!6K@Z=fEv(Qes*ttd3=>vBQFp z%5=J))%1_&8GM5}7SsCo22+UVTBmk;xlD}F5pb($&$S>?6M(g?lMHW^o`E4ZBZ#=m zZCH0*=Ow*8$Z4o&!=iBOlt5q9TxDk?N7qpzKFm&x$mtw=u+q}>^dp&$qAky3$S;Uy z&>Bv%0pmMB^yU0y@CTBZ)e)6FzjPl>oCO5YIofgK>?0up?h+fVea1`Z>Fgw?@oE+z z`nigNp_M`Kl><-;qT|YG*ja*z%%UgvU0>Hj=k6!=4TRO{zy&>*|bD`TTtO9ubi#AwphTBeLk3>Chp}P!%-eIDNv71<|7JDp%K; z9M2LV+GiX0(|{=Ssi%wJ81UK<6K;}@sUO;*Q7k6+E;p2MNkye);i&~bMzPJ4fO1hc z_(grt`e@{Z8sU~~*+nQVignfw!n9-vsy}`fLm*>mm=HPkB85`CPAM(!@O__9NJUpC z(AA}(xs_x8exR9vC>%1tNz~(Yb&<12U;8{3m@Tv@xgr}x9JXX>!J5q`a{dws1j4fI zTz&zO335o>E<>K%*j?o^a3MXF^YzKd6N(SHEfVy-!5~<7 zw-Ij_OrOa3g89TdHwn<^rn)*-O>1Z4DTjA5Q}#V?DW z^oMBWiE7ie1K{(CDLIp8QGfhYKF0d0 zi$nCXuBj1GRyQ0rKfG=~s%MsC-hxtGQJ95kg?^M2<)FAUmkghS#z_=Cs&sE=`8phg zCt}r^M&x=DX)>nC1ig|eGRA#qZtg>OcYus@kPLP+9($|-_x^r}4E7KiqX2mbx@?5B za1qD)iy0~_85svtCQB*(Ht*GpNHox@2w7zh2fmrWzTOGuP8lsHKN*lsU`)`@$oMcJ zACu{}>J4isA@XM-uum#eIlg0P@MumGnsaOzBxuPOq4nTcLtKH&Wn~)8AJOE-r1bXc zIqU@Cg$Y5wx0{P6%nOl~eFfq(Mcc&Thy79wLp<8w1jdu5CxP9&>9Iwem{wGRS+gn#V2km^FV4iORda|b3eX<`Apc#I=l%NvEKt<8*CF@>;{#xuYIiw$z}psRtW3w&PcKH4-Zh!0Ae0 z@e<&|3xTEd_k3bEMMcDVRpqeg?};ErRnoY6o{oj|>>u2r;^}=V9^IwjfwzGFdp+>E z3pIFb$1;@05sPu`*~{_Tt2&;0PN(q{o{yctvm7&Klw;2965MgeLabUn3;B6|8b@1Z z43%+l_z~l!j{|k_b^I7$e`J_QWGa!dAl7e|p)*E?+K)MNW?@`w96Az6rxF+(4Ab*& z#EUQQ#=+V){P7R<`1ZHz>Gu-!J4sx7EwF4kuw)5&134po1}0O7YV69#l2d7oG`paS zVlENF5m{05iOGJU0ZeSnD*CvLpfg)3oIFZ>E`1gOXI3~ZL%dGHfusmcPgU3&CsW@` zINR%1Fgu=*S(77y6+z4WSw=W89*5H3kF3)I{l0!CT-0m<`erjnPOjK29v3+a5qpg# z(C=dC63Ut?rgpk!W(_!oQ>f~W!6n)`(g3oV^n-%Q)6PF^YKltRc|qv(5{i#pY=*s> z4eck@V7>%&(f@VT5R_?=QFoP1Qj?VtK-G0djFaQJjT)YMirD7?T35+jOrJgr>((v6 zSO0!4=FTlead80wlWQEXr^c~q@pba-+GCorZjYH>ZelH^xbbf;H<&C>5~&$PN7o?s z?`y&9uhruDjdl3N|J2b0??pjD0xMSPxa?A3&1#^cLXrCj#|j&aSF!Or7(RW0j?Z4i z@!)pg>yIgTt&ZX9xhfVE@x#ZFhT>4Yj%S|Xcv=|CJ&expMS1xQtX@42pZWA+V$KyP zBj#?A<7mo^--uBZujpxqJC6PDliU9=nN7&c&%)(bGuy}lpM zJ-Zvf{6zzKW1VEA)41>=;C(lM2!N>kJo6a-Xnw!&j@sQa9LnGFfd$CRC=1Kp%v^LG zb0ssC!jtQ1FwweurUKnVUR{{Hot`*~1`-(ZTcp+!n~LFSxg2#Fb_}`A7<3TU_QxgD zXX5*0^u=CTRyLD@!{lr$9UZLbM0YYF=no7ig6aDO=$pvh&COM$3qN{@0B<~r0a~cT zo=gGERMp%OnWQ2gmtJK($x(qdElY(yn?T~MZQzaLTW&h%nqKIu`@shsM)tv0AFweG zIsum`jTcQdO!?7cx7j;MY7kE_V#+!mdQiuv7eEW!h2oM*Tz>g-eBq9zShaEn^78VH zz627CMgTtY&IT@xr;@pzkq{AskJzivpN+Y5X5-dduaiI;iw4os(t}rD+m9Ds*okj{ zXFqy-TacX{A&>&DxmtJxD$2^0Ow!@eU?nznLo`E*Mw(1$LNX6@~ zb3F2hPUjHgXd~lTP2;!{cYI+fmMyJDenB2BHb>@~M*u!P^%lUW7m*&lK0)FtDoW@z z9amg=k^Ff$JcK=a$QyWZ50Qke_|32OkP#cgIx>#8+@j*rOBfki{WRd7fL=&`?D86M z`W`D-eq5#mv!wwjB2LdvBTj#+*Fhc(_Y1X89iDg^MS&#tflqB6o{U47pyw5K5nMNk z{nSRIH=@@oJ>A?~2D_aIQqZLK^eDxD`7=Lt(EsHxHTJ&il}b%xs;Y8X1fXUxKOK$2 z)Y>lDekk9Bm@o!mdd81Hs`YELp7K10Mjczg|UAF*|NpP19)M?WFlFvfEmmwBC}?M8~jC4$7i7 zld2!#ou17|30-5J23|tfw4cEr)==4(kgBd+h6uH(`Is`;nzS%PoF*dvVJQ6r&=bkg zMC!a;BVWI}TV!)`;cAM&b;BuvKApoB9OiC;;=U|~(z0=!Ax3Ppql4C97;%Ttrq0Cv zrn2k~JyfxYTRM=0H)1dqUP^bD`_61W%P@{;s8Kph*FlTmeZ)YT-BM>CJ$A5Ezz6{! zH%<@q^>F<8J{`Zg2dF>f!lH#s@r`d>i5qWRMb>{>=6#9G!Vclxag1lK24D#nx1yqm zUgh}M$KQu|JdA_2jo7$xC!Tz23x5CmeK0BA#8`n3eFV7pBJv=73Pf�H)2Gb^PJ? z2|W2EjaG6RRj3-hcBI^tuLIk7Mti zI^6q*O}O*U7x54Oa0n|_rtqmxG2C#2*kqreIXJOrz12w&6o-0amu!7$GV90Gb2{sX z&?&1j9-S|gCa*sZTT(~N#HMy=ny@QjQ845*%UNg-hQL!}###__uSYd#CFipT2KCMK zb^a-Vep3^#i^t^cyI@sI!XVFZTy@ye_F@Rz^5h);dub()f0xaw*R zRh0}IHt5*1*Nz1X7UJ9Axe<|__uF9jL(1mX>@fB;h+BL=sBxcXkOpc0Yg&! zoe!EbXJ*Y?>HipqC#J(B(lu3OO3YwnYKg{T!x$c8}u1IH(`6M}v$E;iAOANjJ<#H3V=W&@-}TcLy`q8A*DpzE;?>@Kn+N}wM$ zD~Op@#Ar}MWGq596=|C~x=lGsjxt)&BSv9tOP`Nb*H5OUq(L#!J^9F`vx;*IH$R&j zlVA!Nbkhk_1sU4g)A;7U0WZHi2S5Ayr}5d(icL>v2IRwd?-*G^@lnR=^SgLUnZ|Egm%k^r3N2#VWx*kqTpb%{Dyz(nh?n zcNKjhNA~N~Tg5u^Vh%+`WVU1z5hiz_-c`E>~#83J``f#Q%aN2-#hQ#S;?+gx_jA9iSxy|E4 z^*kDb*4HDids%xN%kFPGEc_(7ftevp1KH!XqSJ5200Dp4t{`GHq2HyVDc6ENx0#HB z32`zMK`Xsq7!9Y2r0^IJPH1o@2*?S*bB0r>7)YXEn0}VfrN`kF z_!LfJS}-a18>}fV3+pHHLG(x%yrUDCF>~~?Y?h3aIpOxepmG{aKRTwTkd=keOVq5wTd=rf9^I$b_22ziB|q zXplugh8#3EgI;)U!laPMh(vuTDV>&KRwtvt_}*b0<_w@SL_#qP3;_PbrHXf!R2<~!#8{ow_ST14z2d=C-WFz-2Es$xd3syCTf3@s37B!8zz<>*W}9| zA#f+~E*eV09#6weAU;y5abmZh-sN;d>T0+g&>ePgn*%5)gi>4tHg^uxSu;mRTGUX@ zo5!REo5c}L{(|FT`d)G{Zo3VfUSp#vdVD6qlk|#2p@^FWjUF?uMO%$))n{G4+SCPmRJ*;pFx9F&(8WNIhU z?_v1~4+}IR0ku7c@a!9JVE_I)ym;VE*iKAmA4j z`<3Jch_p^`EDe8DlZ?E8-jg4q_t5vu^t)CLobV|NB5EeM_c;m39pFA6bf*){;{h)z z1}`g<;z@4DaygwNEz>_$(IKXz1G*3<>Fp%M`zW(E%%54!(xf{z@EW`5Rwdif@!=4xRpr@;s794Rz@+|xN`qA6k zgH%XEDy?DuiaGeZ+dqTlGgiQ5_MoPt1_APPwH(n%{_Hmod1pgBnk2=!xn8J>ONMu* z{tD8exCwjm73j=_EMnr{e5@1y=dlh6>gJQ&PvkZ`^eh5y!NiGXYi61QeHXSo&Xi~~UC{1g=Pp%N za|+P+`$ehyBy(aW8gH1PdcDRVlGRgY&pxWqd~ExeOTR^-I}&>ed|&{qtquA>KeUE= zF!Cyta0DzAhEB$U_x2b`tMol{JPuz%6LNJKenMZ0M#+wI55(G9ftF?~@(Zd_BpViw zY#hD^`V#}b6Fmg@|Nis;#{d5EA*e1DPOlSMDoyiGK}l5+c>o$hgCVH8f@DC$z8Ci6 z&DeG%v^cDGE9^Nosc#b-j>GMCp|Cm+y2{Zv(1(JeeB|2lu;<_byte&yw01P$pKrMh zW|JB3{>&+(-XS~NO(5oyilOJkK^P1X*LQHJ5e|1;m*EssFT#$9n0`;s zX@qx@NoMSmN~|5(l$u<3l^x^jiND7T?Ov-YEhY04%dM&!wTSEp4#G7JI(Y+}Ub+Z9 z3D4pCcS8BY{ZM!uD4^eQpGynOV2v#;V#CabS+h#u^Vwk(ES)cDnWqBy(s@TDmc*Z* zco_ft+lOR0-)geS`cP|@8Kx`+m5a;CfaYWS>pRfb(T7NH1aa~ny~OxkHa8;uQSd+l z#nTH>ylNVTi=$ad+)z<0k3rL0`a7&8%i5ihg(a7@ABd$-5K zE*$6QXDg)4_0hiOh(=B$yfbpY;_o?g^h|hXYC_>eSH^_p6_SkNC5~Yi83KBsY4Q|A zcH=Y}8SlBb)CLDc=*@}ToGdt<;?X7W-Z9Z(kvj-hXXL*t4h1>o z*(jS`jP*;`!{KtEcJCoH>~DgeByW=JXtFN}SCx-|z7W~Dept*_4E6@;ef3C3lPJ#0 z!>2BJAFf!t5=*LQ!sE!v%tT>?Q|E~xHprmeZiCz76Vffj_VpF`sASyO;b$@FG-O# z^SN~k$rP6jHZ108WQa?o6tDp@?`7>A4n$0XemEY+>j$=AcWnbLY=zi25dkZM*{{gv z^0UfjV}AJpJpcL&Xm4+q#8pqw3?bmx(z;Z5>>KDuds7#3-C0;Ma~3{(@pV`^cOl9P zi(oc6Gi+BF-q?9M)*9?KE4-d;@HrFB?7(h;GH9Y>jvx8x=i0l9&??=c+kmsVFR9m{K zv%vcMgwi9ynLP`6`96$o;=Tv^NANf~ts4l)H}BddhskU;k*BAFaaDqUI3B@Jd=MLV zJdej7*?{I<9k7|Kvg(uz3G8$lg-RB#S$!ccU9lYVsw?4fj<9(F@?ufFR|sch@HkOb zU5+hVbJ5xw#>$m^iqA;~UFd~bHMz0N;zNzUdwmUHgxib<;n>={^f_7okC&Oc;@IAxGo^ zrux)8$~g7{Ljx*ua&zHwc`&BM{@y0;I7b&E-#(d2VB79D@!~6Q%7?6)RapEMOq)|6 zRSAQA!)V;sj5bp{O^pQn*?y#>DI~QtG*MqN&4(|2^mg2K)y?$lg2jtI)6w^a_b7}= z!fbYt=UEJsnvX`|ik=G|ijBbDVaUUXZsO?a6={lR2k_%j)NT3$TK@D^_{!%(wfr1q z^VdxNT?w4l*|>FZ{8e&n&ZKgb7p2ERDeG7@Uzo4)zj)52MME%ouAsU%{ z2E}4=utXxW@yn&M=DCxuX*|e=M&g*M0?eH|4|#ds4C8!n6L;hgox9Q^*I0nQu3{h- zKq8SgXib_U+7n01whnaG_8=Kap|5uUR+|ko=2oDvDhJtBeiSdrgLkF-C+vAaYPN{Q1hDc#LR3)Pc7KzC0zq4_qk}0&m_9*%`ej62Y zlW;lqVDDXDMa$0DC;eP5R| z(Xugy+6~_zufl?v@B5sL6;2u;5X;w7Y3ZCZmq^!Q=U9$D(9tfklCn@6}e+WsQf+J`}Nl6ig zf+5uHXdga*$HH?n*pCDws=w$H#+KMc^f+Z=E@{iBWEr+fyF(ABS|*|VKP zPp74hjcKw;2r=*0ZBL>3;s1l8>3x{>VH-mIX~cfJ9S48+O;}t%CbF?;(&XqJ4il`_ zlk@sdc&~htB}7C}qVdt6Be32E@8yn(%akM^lC+z+_R9^le*|T_3 zEIZL;HZW+UUY&y>@H8>ifquYZ@gZNb{1Kh`_u}~(dV&I0*QO20Q(O1CZ^`Nkz9JRG}w6(fZGd>Yw@z%De&O&oV>ta&m*{LaaI}S6LC<--D(N{{vTH8H(nwot)_@^b5Gr zu#H=3c+KZhwIrAA3mTe$oV*GY6y{^BOOx^*@DLkM>mfY1V-sF#*a;MpaU@VDScewT z5p7SvWEzIA(gTOzhU@}Au3mQymdsp6^MXma5fSHqwdOV4_w;?xYLbWyMexnLeui)V z<`b>!o;T;Qda{Y+ya$sm^>SrkkR+eWR=$p=Cz!A?*WSQCV@GF~e&+{9w=Bf*D z&5hUMk9YkAy{&!7D)q^%olt97daT}Z7aGxwpB0kdkNmz5T30BN3pjSR!u zb!&0y>PzVR7VJM%gV(li#qa)o1G4QdET1_am#!%mPht!^RP#ELT^r$;MPCn^Vc(#kwTI4|V5pu=*Wk6l zwOX4_6#;z(@4W^B%9yFqH8qd-ey95P(jOfpnnIj>q($C zrJ?vk7L+cc@9lpT{f+gLFei2BUER=QM)rl+lol0}=LX;#^?yA*#4F=Y&ykZ(c5fy&-fQ>W16qLP2f; z83SWZGOozEVE0&Hb6Mc@*fFni9#+j*gEh0(;$v5R6hHmuf8w`4y&E6@^k)!utN6}+ z_h8A#Z^doj{1P_p-a^J=Ouh5`WBMsrEF80E716rN!BkJ+VVOh@g&Cl)r#0x&m?2L& z2}d*>L+`;IaCtj1|1%89*&1GXLq*pf1-&i6j#`>`YZ>O<%3+E%Akf|@6$IWjOg|PG zMqkrGshN{KZ#e>kgNVkuVRmyAE#TO)8HfmxIa;GbjSP9!964nikvyQQp$)waHDdP? z!>u*2__B~wJs(cD|I{ubl?D^il=NWPc#?PyFoQksBN#s z*Z$`}&=n2gC*S%Z5~&0>Y#w;Gd5!`!G}WW2xmgxw zd2K#)1lsXd?OWJ>Xa@$mhY=l!qp7tKhuUh9AQQ zd-2k?*YM?E{|Ix7OL50_AHdqV%ZxtA=S|p$je4CvUkfz_$wfT;|jPCIPw zK`;-aX`;g%<0zX)9El7->Q4+Qnk;Ghp505p7HYwvyT5?$LUP3|!$>8v5nTHXEV%V6 zr#vs2=#hJlVq}yYl%77o;mMXgOEXjLJO_O@dcvLf_j`YeXEwi%+itoAo&DW7w0|#d znST-1FI|OuUU?MHA9xGZjw)O-_cD~^m%?VXVQ%?c-22Gy@#Y&_QC3`z?no!vgRMxX z)0pqC#0Rgt8cXKPlm%UJJ%u590Kuq+D6_(3cEDz_!=l)+YW6CunYRYPNDzDL_u)6M zKZos&HTc9Oe*>S(d7c3OSlXt|>VVgiD>Hb8hRy}hAG-sb!D^~|{aLg>_BA+^8Vs7v z=xNP@kX|aj#!NGSK_^VJkt3MDOoum{qp5`<-OFINn_x9_bZz`OB6UB8$rnPXnZr|l z9V{RIf5@$#|IUH_>4GJXrjZ&9!n;7jtlLEfN-OsNQbD-Z3?5R!>KGhBAuGV)5?VN9 z7}5s_?2Bj$^^5*iQ50Ph!Mu-;Gb^&C~mv_(+Grmp$Fp#^+u4pC=UaH0VtY^%a&Y@ zitGvmQbYL8*X~5ya5H}LgRf)Vg$rpkMVP`3lWNI~@mR&Su4@=1ueGkX8y!OtxIB5t z_2wf@UZhpAV$IyuSUGPsc96HQVaKbuVc7-nIP96{^lm>44IZo2BD<2+H&_t}CgdL7 z`EVrrLxf#Xl-~m6&1a~2X$Vb!RgfkOGqt8A&WVHp6R~`gi9Cx48GAtQ zVq6W~_#C$nt1B1d!txoY+5IZ+dia-UAL@X^=|D1_Bm&A?|6Ibb28A%rgdkyAs8L7LuYrTV zW{40L4%IUZY*An(G%H%fh|nn*?$r_LBoDwp8}_`yQwDrdh?q)GLUEQzT^$}~68ukg zb2&wBax^%IP)8$rnrqRp&5SU8&b$vONSZ}kM2&~YiTJhwoPvXw|{};~EEd1@wA4dCu4*cwg z|AWGc0<2iS42sSXXz7JtcY{UsjKs)@()sb|m0<+3Jw+&S7U73K{WTuA|6$y5``_W} zwO7MtvOy?1+3ju|Xlp`cUO8NL>v>?HGijSn0>I)d3kRi*?ksuy1Ouv}r<>;$32tm}(VGeR^y`Q6J zvk9p-6}saw^mR0&Wa-5yT)ZB>qDq*|rW3A=U{FOQa&ov}I^Ob<|0|}GavLESX`2vZxcGzF(s4{$C;#bHG-(0(omcj_K=ffz#o9mo6qQWkIYa zA4;ZWjRT+a4fMr)bf7OZfQPp{kN$7~l_jO{xSet%O=Mu$RXbYRJMg;=k052S;S)E0 zl!(VLe)pR{z~oX&M`53$cIkoNO3tw)$>|L5{q9H<3d- zL=(Jsr{4{9AKHc1X9inPti@()A#d$ z=}UB2>6NZvFezrlXhI!)HjSnyUq<-A>*#*vx2U@9yC`3L!LhHEpPP$L#PbgkE663* zm?vC5IqlBJPFaS!Wh5O(kSW;S+DyRi#@f6&FcWi+#ADzhhMuj#U7U*~v9R55?Z$!K zHAu1qDyphcURs9wy$!H??J#BM#Y*Q?#(56!_JfUrewIHEMMZgp9Y8E*H0+-8mwuA?5DE_B;G_SA zp%;IRV1GBf>&#eqixs(LLaCEO38lfv!?C@rkatPMpok;)GGg-c6tvbb*!JtlvvIUJ z6_kFIFzrDG^$mtlild;EUMuNy=F{h7iC(xSbP)M9J)Yx4eRyA6<{$i$8-|H-8Nte~#>j zJN97dKFnrtMKQW;okQzT2v`l1+a~h!ZFUDnG9@Ovi`lsV`a0L}(ylG&3HIaCl^3JA zy&iAXY{5kfE(;jP*zrj_O?yv?9fnIHO2i$p(3n^3VqWtSCqK3 z_Fb=_>5u;meQ-NwEYVO>Y(`&?ijK{qXi^0a1L1bUv<@99BCCD}L;gAf{ELC6Lpq|h zz$`KnX*WaTlQHO*TTp&AM|qH=aW}_aBE)-}RM=nUu+JtFN|@y(!Z&ZG0_O!P1`efB z_v){)WA7$RyXhOKy7WV^SuBU4y{?H+rP0egFYox_pb05sI?YC7`up~BX|<0$M7)06 ze|`dekA4wz7Pe!_$1KQMXM(drgEPR<_bXuUcU3e!qM&&zM^h~aqib<3VCYJ!sQGIg zS;JNouKzl$H@}LRH+>SGgI3f(O$(GR%U`ZYMa-ay?A~-0seXoryH)i5g>EaXBRQ7_ z^;&X^K4!(@H4((#_)om{?>C@f+w(L4<5UsF;+t7L+C@v0VDob#e^W;rxr@PI7D`J? z;rCl{{&ZzJI((oo3zk*QK`IeMEzP~zC36uB2l41@52H8G1&7T}^E3gkJqwp!cnQ{B zv>F=C1F^wn@tAO+`2Ygx0GM4tO6H{Y+DzzeB~X=Hj?!rhv3DSZ?QI98=Dxv+ zjOy)V%Fvk!g!`~{|8{iu4H$ZCqM0^la!*Mkx^GjgsLn5j&7|V|$le(-Y?@3%EG*2! z;E)sjQ@Jo#5Wx`uG+Sij}Io36p#@8@3Xt z|B49eb_S<~j6cn#sF0M&(=b3ESNklTWrvCx7v2ijO*`Sf@b{>kIUTV_V%WD)!H`R6 z`!gx^oO_{;;tOalc9DnwC=tFlfB+GU=mH)7+f*$5j0F|N4QT)4=dk0KUqqm%V+<*D zh5%u1DwWAL(@rC%FDmQ=TNaj3ON(y1huelge<$i6_yJPe9>k2*K=IW!pjwkR+}EI> zp4fTX$1vlQK-n@{EJ=>`XMs+-(N}jU@Vv}0pKv(urb?KK*3pz%3v)#yDnrkp^NA34 zb!o)x6lB{N3NHc*uhXH?XIowcx*s6-iI~5-hM3(<`sjrm{%kV}k}1@^v-DXPKr<@6k;<(W7)-0y>jgaIzb;>9!I^@{rmXnD_ zdd+4mo3RW7fj&I33g&&+Wt7`4%(u$$rY_-MT-WJD71JIQnKXF)Zc4=n$1;J4WnaD7#sQFNecK zK;1Q{U?9ZM_5!_?yvpg9+F+}iPG_oyVoAeQRfgh2b*SCWQA-5WM%;p&PWYGV$euxf zT%mxbC89fkp~(6T%zzqV$Siz&d*~wAziRd#w-QMP{t{FoW_2N6pg=`yOKC+9=Rz za8iThx;QziR_GuP9C3PhT0KM4V=;8>@uK9mf5nWOz5<8!h`ZLb%;Tn`l^)#C)CYVK zTI(cZ?k1O6gm=c``R8jRI6I+my}2QEfh0fx2U88k#u)c5t2e9n zHquC%Ue3AS|DTa9z!(?Vm}?HtAXzhW%3t2^{kll&pm5D+pjI2u^w;mfyRiwyJ`Jq1 z2%z;cN|+7ar$YaB5q&#J;Kd3g=!lF?$e2$Um$ZnmPgJ9#k+ewHlSsIs9)7nMLz~{g zAc1}AcO}f~1ls>0;z*T%`u|Yz$R4J62!0v4Bmi>hT3VZk&?spX8~kY6BEVdB7fL_( zQ^X}@OfgeQ-0a96Ll9&nB?+ew`m8rDlYEMKM+Lu6fYtKu&m`r}hVdKEqV|RVgQ_=v zgVE+u6fRPeG*d&S8%_Lz2t$el(J6BWM}X9r5&Ah;PoQm!ApRB=YAR{a4!nZI!!M!5 zrGk2y24%BJ64%IRte}UbeOQ!DQk2dUDWHcc5a8<}wWxxG!WOzOy20LZ83DsWCi^hHrDbw`kP#v5m8B4J7+Co zNsz87yPN=CgCWll{_x@-U?-rze#P~0#5v#(_+irM5eTc%M~u)D>_>HT9opNvkd&1Q zZHx+~^NZ>8H(>e92QsBUKBxq(&+-ERY7A7LduLl<&Z)9 z4(>q_-NPge4~xj6n=76tpxdd&L1OZ8%(3C12j3;5YnzA((hL%kWMt$>FeMYP+i9}s zHhh{8k#z}sHpwt(laX}gS5SK6!!U41=Tt>!%96~Te?f+1F>m zyahRkiJ466zZjjkCpvrt*gAZA{#qo(*zxSat?&nZ$VtsXeRl(?*nPNW;nn!!)em57 zm5a0Y-jQCc-?|=0o0@RN!YjD>r!c(`Z|-hGdF2t@b?se9h)dvY=Q!~pRM4w6JidBR zP{WXx#xqXG23$x>NJ0_`6@zGij|44& z2Kq`3efnQtbcTo!g76_~k2|4|NXf`Y{I{P)>$d06`SQfr!nCaEs$~kTefTgh&D{BU3(orf-Wm9`osP zkpzpJL~79IGG{GELjH^BKJ*4js6S)i^*!i%c@zelfEc?5!EsW3oTQwGS=c4eNi5d2 zRm6;886FY@Zj%a`T@m=ZNG0kbhC3)=ILvHX^z$8h5H$^`Ho_k)5;8%wZ$8x45E3!7g+CoNL5(G0y&2NrH1MNI?D zLZnrz{=ZEW{BRB(fkva{xeEP*#D?8LI2;$?>T%QlA6Di}6oiv%W|K3iCEzN${0^in zxDtJPUc%u1=TPydL$r=OP#cu4EK*P;oFX9COC<1!s1oasCvDwim$`G5;ab6F87*yU z9+@{nYcN7wwZ0i>ZlIM!>&F{r)+QqimMl1Ct;EbP6UG%SfKL6v4PN|2Wb5jfiAMwr z>dDL$PapIxmM{&3QiGn^icTfW-DotTV8zYIy5t5-j0|C-w*@`BH==Uu6L8ENz>IHd z!Kxc~y+kMLAt6BHeyBnKuWIU-&_)^nYtN|Bv4#Tz^rZ6S-zdSTkDz^H2;+@&kagYH zkvM-9G^E~}%*OXDIN<}AqHHlkFeyR9Qb=*+3Kw*yWCSfO?B0`5HYaV+56%D`4Oq;S{OB~(Mp(?OVFsbd~=0Jg(Yk! zLLs2d)s9DNe?#A4PCgmIfD$DoYDA9wGLZzvphN<6=g0{9iN@MgvCywEK+U3b*ajis zkXR=!nVC7X7p>pLWYVChI0uzgHuU!o5sALA?D~o$m*y-0aX^m0EGfOR6YP-l^G|3Y zIMHDxZO?l3y~td17u=&m@C^>2b^Wj5b3cphJBj2LYtgfd0RCka0t8Y0W3--n*)o!$ zBGOxXm^E;bIr5r}0upYJ;aDoexzCU87j>`}d>PrF`UdZG5A;GFeFE7xk=k1XbnKU5p#4-Zn^c$>py7ZD zT2hOQnG#%8BJ5fjMav=>X%)~iB=F?ODC9r{F^S11k;fnK4gr8fl9F?1 zADz#8AvaMWp-1XxT|JPHkby+*p_e`Z{gVQ}giJ>^zOd>RJihgx*nVgyl2aT=&UB!* zvVnkK!&BMyL`;~oHB8?L%V8d|!*Wg38Vw8@16;!{cqY8i>vRxEHD?Yr7LFMRC|SQM zVtZa!01=M>o0c>%y$KOsm|xKf7#q}crjLsj^bH09**OXD2TT|tP`n`5ENgn^jY1?7 z+FH$N-=&_uqfbnM%SUTN7)Rm?3HdA3q&YH^jEvNH31zEgwAT|0Zz0BiiGVo5yq--0 z@=9gcGGvr*0Z%rKC2kSBgcy5k03r7XXb4ZM{BeYc%9u;V?f8NqA;yN&2mRDku|%g6 z-tzfSMoe5}aiFJrFlX3AZv%AZA!rG=1}0>*?hV1yr$K0ujF|Z{v;^*!89>S{GHM^A z4MzJ{y;6q8K^yI_61umCU?hwWlf)FX18{aUoKZZ0tT*ynuiWw&Bmf<`upMozJS|iI zVqy}Y*H2b!l<`S>#18`g2)Fa6#;4%&(&cFEYsQ{K`{3>OV4}~>-5{Z07^yiaC|HyY zx6e(?EC5%Z3lgo%pcJI>9)-nj#j0g1kdc-Nt%@`PV(%(a3)oLNqJ%LA0s-_p`;nfS zPNx+SCSkxcbBS(Q^+aO08h$ZF?!4QsuU1R2+byL0=;5Bg1veHPJG@adFB4M+69m(l z*MT1EVFmsAK%4=iE(u3B1u%3-jigz$=*l9{nnjpt9Ab#rCT9Rc2T8vuBrRhxeff}p zp4Y-KS?N_sd)~!P*o`2wh0B?z40Mtt9xIH=%<{IFGXQ=1qT6f|JT8|kkB)@V*`-ES z*6BGAHCkd;q&f}m*Q4UwMAfw^7#lD_r|BcH=7yX`g2BdGBnp^dHKyGnJvgaAG0Y+w zAOY;aSZyY1AMrx=camsLgZ;|9GvW<0%gCjBkwju}{s4p_2?CpV{PgdC#9IxAVNZ#N(WE6Zr$yn6LZoG-Vsvx_ z9c`T$^SQW9-scX&-QmaVlDYWer@x5O{8EgKO`xi+0^K9s$RaJGkW^JOF?)~SgQngl z5*!n}Oi6?#Z3zmn8HqKjFKT5>;sQ7=H4$c$11+r$BorkQ1i}Tizf_(GWEQr`Z6QXb zgvS{k#*`#lUs>pVz5)H49B>C%SGGY&rd9}c4bKY#D>OMGU?c{-KeshkK!iw#9MVH) zU5U{O2l_T2LBKl(`{G&9IucHc*|Laq*BHYHwM@jM(H^V5@w7qz%U@PWDQRf!>&Jp{ zSWu0-a9Wi%*`YI1G~;M<7it?C(KgfpgIzcawU9usea#b|}cbAfUo^Qep%t$@(53}1r`yG=smsDR!W5ksvc zK@;*}PtPTFS%5Y+{_JEs-M36SkEGKn*>|JN8gSt<=k^X3L1soqhCS+Ax!5~pou;XW z)Hr*L375vKz@@A_f;55N!Cqo9eHf4U@Q>GD$KHwq5W^xTA3;xm*QZKMN`TdDh1=ss zzpEbuV*}i5lbx9bl~qK?U^@y@3wT3y6RX!Es0ref)|IRmoJDQ8$eDh$p^8?8%*;gW z+h@S&i08rrecJm1?JqEBWF#_!n4eB}R;Sc46Rcj*7UFd=NY0&&&OLgx9`-{k>JT54 ziAd1c)B;&$1gzU-3`bbvrJXP_5h_un{jTD#)7Gs>u=MxK@Om`N{1}OkmwUeYuaK|0 z`ZPh`k-#H%MwtJT+4G%FrLF@@vp!SsAprtQb|K6&SE6G3cBEAKF=v5<#M@{Pd;$_3 z0!%{!s$cPj?_-=M+#gL_zM#w|qymn}=;;A+bF&Z^ zH|fOvq!Ie*9a^4E-rUuQ^_$;7eS14H(vq-d(Gt=EO7OOMA0$7magjycL`W#eP!p)z zS+PE%1vaw{$@Ubyxoa~zIy)865369-S-9iY@Atu|HS&lamf0)uGHW5)yas%1`*KdB ziASvw;c(b7F`$!kL63xv7O;NwB?0VAp5F1M;lOzZWt0$O~($nSM4+FIiVEO`M z`oo0N63ePP+QhQH1fIumHV4aaOImz2+V*XQs&^Yg8VQz#BJ^ezG=93{eYADDiRCA+ zgsph_w7D&LFjGo0WK!kWIU}SB$!?{f+l3av)7{Npdd!%SPg;=~$2(zd%*_QD}3uNJxpptJQm9vst*~He+cDTy10U^!xen8f^yHVl3QT!^}HN zXD&rnau(h`ycI6D3yVq@Aul5j!y`jHv{M}|wZOS8Z59m)52eW3#puMHs%bHDC?mfh z1zw*O!@Tm^g%P&N=gKQ^O`q+34*D@Mr)Rf5g~OUtintlqps)5V(k#3{x)E_iq}34( zLiHqY#=J1<9Y|er8)DOP-dFeMbjF(%$8@>aPp}SeQhYp|AGQEbh^w<_%hIe_a*ak4 z3bPR8wsw)HRG-JTUdW)2Ccam^AVJGT3(`GqMpAM-3`P|$?$(H>yQSHj>M`UR#!K7YK-FOa ze1{tG#O7>PGmHj3ViICtGMF%{q!eHK@mI0*noA%`#O_HGwA<~_sMI{3-xmlV!;yiT z*W8Sp^c+0@+H?5LQ;(vmuL6P|oaytcveL?=VjF13X+`ZP8X4(4YIOvKMacw0R$f2q z!dV|QJH)ny5hY7UGMk`EOXHk3w=y-uzz%R$~^09x{iWN zZ$fx{6s<3O8{)Qcv+J>16`BhR zxO#d4e=rs$CF!JDiTI@6&dHXp2FGg>DJ-9bWHk?rqGh}fadTslk)8sN+k>$YH_TQm zF}(<9Tt>l+s{J+ag*?zEtBB>>V9{HZ+DxqdpH9z#R>3qyw=!Dx9iMn*MAx$YOpx#F`Y zX$y81a7q$YwpeLT6Hxd=z+i;i_YimCY!x=nhYkVp_B<377C;o3X(xn>H$Gn%efFuv z=5!qF8#}AklS`Su~A|(a9 zTCnC|21f9+}g~48IU?TD?@Y>E=9PDm_#bAP2Z{eA;tZ__QO4Xh*V<@51X6hgbesSqy>!lofsW)VWQs+gH?yj{Ctd$j-$G%2FY>B z$V|@0=$I49qLC+ZeR3$#W;&e#vuBlH^IKccKQM*_hwzd6xCJ-e-H;5KnW{x*&yNGI zWqb|~dqy#eZu<_ZWfm|HK+QvHIm*I9R11pL`H$lgs^-PkpzWGh1YG7&# zn!7r&)aQe$t`1ndn1{7a+YPgb=Ys3LiqzF#fYD+jz(02l&IJN}p|B80h*Lnni5BMo zs}^_Rup}l}2L=t8KR=O}5nGJ@ixBh)m}L#B+UoH6U;Y54bLZo8pS}mR&9!*()o0Ms z-GYceLR!%T(v#B(cpXSE+YtS;EaG1NVXurCaIY%C0V0}s&*hJw6o19RMFH|1gb>w9_0hLSmj#1>^F#3Udo z$pN)W%e!x-$Jmh;Yr*mC;7@>Gt7WzIGx6MdGm)9G3xrkCUh0)0uwXc=k#)Ey&{v<^ zUCsKT=g)%m-~UFSFY(I6(}@|QE&)C-C-#!TAdl1EK6J28_{4MPC^JX*SY2L@fY%Fs zeLZPK?&$=5f#aEhfxX3c&cTg)?(KGn(QeH$4VE-UYWxM$K}$w&FEBD{$Go}uQG5Qy z2p}TDvV>iA)o3`_3WLUqr;UHZ!P-N}h|j=7H+>m-Ik~9sszXKN5!7^5Vc0*+wSZV! zM=X=}P(?X{zL4T%4F^fNGt*|Xz;2C0Bp8OQwi39@MD|FdAjYpY39vijpwnuVGUBuh znLXd2HQ?q;Z$@Tn2HxJkjRf)l@5MXd8G~K0W8v)iywISAb=@);@k!S7@wKc{Nu*d? zNCVUIT2g#iKVt484X7YBNlF}?!w$Kq2r?ss=XynpB8Zfm!&#f1DF*qnMKgIWZBau7*5J zf9PPIY6;>6v00Tqmr~e>w6qvvN*AMPhtCoM#L9=9N|V*9mP+^y9(?hR`!O$P0aTI- zfsh}|i&kK9-X)muO~4oM@p8x^A%t#k9}ltAn6yaFOh$ZsJTITjnxfk*u^4ta5p;(X zB}$Tc;k}qR8BmP&1&MTomIq~ zAco#Q+>ga4HnauExdwBi#c!z@ko|vE%nxdKuJQ<5+=(14G{LDPk6a~!7n}@uF ze7NX*toBYUv3)I%(f@?$AKz^u==3&P&kpX)b-QJr2lY`3BcU?_743W8=ZlfQ^o)=7 z7&E5N#+H!{jYbYv5%n(>pXs>Eya>op>M z*UW{&CoKQnpd^Y~#Kn3yupQ9#Dv zpn?x-wG__JQ?(W3t3W?bpXul1sG}!BfC$iFPp=&E`=ROYlXwzAymorEtIyTJTFZ@$7?GWo2%S#6fLNn|<5{NiIlWFul2JFpFOset(FQ3c=3TwO)3J0Op z>bUu+p}U@&lLEc~4=e6-4PjuQ7dMtIK-#R8genTd{p66NCLS#*)|uF`!vL2ngrua8 z%C0YvMo(bhq4dR;?Xj%A6p=vv$9jzW`ea&vd{4^6g_?>>gqr#~`9sI}gn0M0e-9t~ z-C{+LPNxd_e1fLE9i-|inadyBp(-kboRkQmv4Mwel0tMr+!sq?@whE0E=q@9e<9fO z1*OZ7%o>R>)^@I2HcGr$*{tLY6kM|oc1r>htOEYyzR%&o|NJ>do#WW_@|&EY-+#yb zh&Ls0vkUXduy%K>u6@`YMp1eZ9=QL0yt4fj)HT$hzo8E?)>!0cjS-`_Ash%pOAI{{ zkuXMD#gZ!*!cNS6Z^K^L2CTgH4(ps{HCkX$>-oQpCL{D(J@Qg=L2`w&f4#&c(IXi0yK&3>)iAQc>b!Ku#ct{$O-LhQ;lg~ZUvI_G&;$w#Kf)3f{dDav1@u|e zj$By43o(9N^=Q_+oCSUa0{jWWadDDUrBcaR*&qHyCj|XVS4WGH@#YZNRa-0H>U4_6 zgNH@jHX?kiL0_=jSxYMAcb=ImC|dbPnEw=!1T?qEv`OMIvow`7tnf!{Dp0d-a@bgT z1iyOiB?4e8etG+6P@I$tUZ(I|%?&G7WwIicZ$;Mdz<}#lUV$TbHR7=+o`c8l!^Ji&2nXh}{*tv18v3jE;?9CtOeaY;1N@*k0_Nv=%g(^9KAEz|3XgA$J%hpoVP8_ z0#E4F>*XLRt8EW_={PCd{HFHwKtCF?IqA%;*6T&q$rc^$O4#Pd`mkAn*<}#k+zg_6 zkoU5Z&MJt7(nnT&&F7WT-_HUHVxU%8aJ*C2N3kqbd|B*msmCKPK94>7_QQ~xibpIK z{Nj##;V?3ZKZ0{t08W|$9DeSAefW;MdBVtR8+X9(4C94oHo)um;NIKrMRr^c{BA$D z?K8&Dn13)3fJJS=wTrLEl?$)J@c0l0U4sY`(6iDBEWFZYup!PA$IB!8eO{hXt76|L z!6C|`(kwe#R93~FRh(3+l@^K|{Mmnm{H$Bn>ba}YGT4US?b?XjXD`Pkg|ngN$y$+9 z07xOqIws9}p(*n}S#Cm@^0%p`Het%Rg)bmM!^{j3*zIN*^cG_J;6=eSA3@m@X+j0L zf$nEa85=nxli0<_+n&$r=N~Q?5DdzQj~6B`Un6W6#Z&W}oYb7noL9-oa<@h!v;5V} zkr4?aqm#5)_=uO(8QuY_dp&m^C-{27T?W^XM z5;v}Y6JsM|xO?4aF)M2hbU___VIM(Wggar?QOBxArA4Ye4QcVI9MCyOC&n3(BHSbt zh`71!o;A5;30$n$S|}2P+v|bH?L{Eyho4?7VT;4FmNr@>1TVeE`s+@3Conob3ir4d z;}dQY7!vND%c}TK1$=P|SWgvdBCqNhr0b1%yy$a{!JyS5KQRSbl?mRU8#|hgV0Tj! zA|!-#tOFdocUm+SosKjxv!apE{A9$&pe!vD4r`nun&i+it%OIeu<|4Po+h=(^O2tt zfktaXVqy}yIz%Fj5#B@hJc}O4O*H;{h!pr)7eWI3mCKb{TxYmnKl*ALEDKjcTbr`B z^m@r(HcPH!TGSbXzSVmCn`**Fw~J-N!-B5-a0v6~Nidt$=M9vYgRXtJ7jM<< zMMHlZRu(VDjk8yr(Ybgeb$$V)loW^z^ofB;4fG_JeN`)1Tn* z!8*FC3Oiokho0_!+#zj;1l|O;%vmewSf-%T>z1YLvA?<99)$g2{%G8!ql(teCxK!ykVd8!;2rZq2ouDU zFz6q3Vnx9mq}kIUvQnIUOqes+4{s;{1A#X4C$O=u?P5`8#+OQghFaMzM$cyRSv6ep!{ zje+;|4TVwB*@$kZ6AN@o3O51HVQo2}M}cVa@&b#)5d#A7y}+sE<*d}tbI$HvMXc=5DE zGcrKHL+YZ@dd8s74`Q#FRSJ3Y+obZ*!fa6~b$Bf2AMzQPjFPGr2^o-;oxsb|P9Nw` znhvCs=t~Clx`wg2_6UlSGq5~limLWmXs{Q<3IZ;zV=_g#Fn@A5t~KA$UA~+KjCBiw1g~9%>EEtxDwVJrX26AS@y1333ySG0p%j2?eGdFp~}fiv3-JT7pq+#1(Uv@)FLKU5(h=(ulX} zYEjkQ!?TS4_}S0k3VH@McEcVI8k&xxoAt(IJ|@4P1c{EoST$LtA9}i8oY?}M#R4B2 z0;BOb=)ZR!X`_z$1NhyB_1IlkgP*Uv8&}RK}*IrkDB$>H<2h`I4hNI7sm#4hW;^=cb@z|y( zu%&trZ1E{5Ov%OSq6N6TWHCxobCFlyvqFB}G+J-rbadqsKLfJx7mVOZ|TAY_3B4 zKqsV-pY;w@3L}|q@R4d=*;Z16^H^4$)$4qm5p6{+p_> zgf~{#$ZAbOZVszK9y&wQ&U?*M3gCw$VIFxSa>pXm|00TAn*ZB`?$LgH`Kc%I^7b8A zIcF{&xl4-$nKQ9GFBXfk=3{a0JNV6(4T!VG(YM*E>f=mRmW?EoTk+Zd{R5od2|RxH z{a9Hr4{Bo6lI-W_Kc0ms@|yF^d8(#+(Q7mxVtYQ3u%i2x$5BR%|8GC~1%8(GM?CS= z%a|DSBB+YMJrRK3q=hlo4857aQzycpGr*)Z@pb0+d*OF^p(i1yOVROr@l5!T7;i^H zd>rq0t0SQ$h!U^ZnPPDuF~$y2r3eC(-iY{^7+8&ZE;v9!f&;XmRBvPFvf%|NU#U_0d>qHGBgZY&M#U<2HGgOeSiHZL=5aoJ6l60s64l3vV!pIHSlvVC?-8anuiQw^d=E^oXD@c1cn2yP8t}^v&m)1D*}TjG=!w;rq^I!iaZJ;xCV^Ak z(t_PpRTvF~@vXJ%=!E^4jM$3Mx!D>~i-xFKNSb06Iz2)nlA4&Gmx55hfIx8UJjd$O zv-GPWHPU^I(uGY{mVBi6_0Hm`>uE-ZdmNzkHAd^|K=TnCXgGkMzxF4@#KdD(N*y-07U2fBL!R=e!1jS945I*7gheb+0*=C`7*ua#7Dw}M@4kQmq-%*Uktua#kh;0)4bekZWmilrhEr{5itdBrylqo;@N`Q9;;9LLv2R^ra8SY$s8T!VDp(Rj@H(Lpd?AX^@jfb9k0tb&C zrHx?2_NGSM@w-RyZ&zQ7&n#YsdeRqPt=P-Q`3oy9i~1Uvur}gwdmX;|kH4a_x*C#J zi#z}HJ1ol1#SJvB*Ash;=c-^R3hwc!?`y{oU;aC6#Abhb(>f&ClA>Be=sja1@Zx4+ zW^K_b;g6HTLtrH{F@~g=L_GTNw{iW_RoGWw0gYLUL}IT-oep{eNyhM*ZQMZr*78Qv zD(F@8cUn_stsXX`9h=_XgCG9jx43=Yb+~KYr-?)}e?XAsHqzD9Q?wE>I=&JK3O71O z2Jv=dBM!B;U~Ne$Ze6%C`Z+~d%g}Itfy~#gK`H3PB7+F%>;?Xpyhp{5tNT@NG5D@)6$U^69<>qht`1}jC#BzheQSV3EbbQufsF@cN6Gm za&0cgV5D>DF~QVy(r&=An`vyueO??d-_0OjhY=Dy|Mli;M8I0GI6n`|^9xXxnu=ti zk~$`U-sPJ(x$T*em<0<9pwq{oyL*6_V>n+CJS;Rrs-dyl7j@ufrEv`(XIaU&uCEP) z&K{Z*pEBNzkZSe(d0i8u*j~FA+pBicdn%F(R?JGx!^5lBVcp`ZrscVYhJlI-<#*b) zqgP&m?TklBrznq42>MJIPCeLKF_|QyEh=eZTojv|WGq`E6Eiw{w$IpDb$c~xS}GA_ zK(9B^!VW4gwzyPL+aqlx1pG*`C*s~Ux8stWnP;W)5z0a;D1>U~E~tk|RX;$`a;pndE^bW3D2E_eYl+1fL>#Y0wpsU#1SAl z@$}v|@!I~q2oUfM65G6E(PCr~%buH&$?fiwU^q14#rI$O2mEyH|GDFCSPj-FC`}Dx z^>FsPX3=sK6cmA#%Sp4P(0NqR@tbOvkl$lYVn5B$NTjV0%atR?qi0mdYUc!|tP~@9 zU48h~8?WHcJ9om%S``r!2Z805>MA7A^RFtHh2ydLs%X28cU!gCSi0%E%n8dnH8IUg z(YB)Y4hF*XnSR#@#(ZN)k4dLLld$3q*rOgg2I_R}P)Ne9v*+RA%Ws6;lz=@g`?+x6 z+1SLZB=Y$ra6e4Ksj|BZv(jdgKs3NYn#{!5abyTaBsj+>qJnv{z#p+kqm?uyJ*q2? zU|0De{Mt$aoV1&w^h^@ix8hTC7enbi<@?ZeDhNT^Y7QhMq@b~(i8lz>YR}gWqj9d4 zAUY#_X2O|S5Q>V=IvMk}`IjTrX2;ug2XMHv9_>V2y}>}#&mt-zN;KYV&I0Z+G<7$l zdu({xo~pBhhTM9FOM?@{U@K4-e;G~%frFuW~_EP1$%k9jBBom zAT3RG)(#*Csaz%5W!O}`8^LiW)aDqZ#HZluvK1&y%))C&-p1D2JzR{%nq%?M+I#TD z6*r%?olixqMOZ*O(8kwU5qn@aJ##a?Gv|DQK6pmm*mykFUb%2eku{tG;4@~S!&?pI z_&R}mMMWiEj*Car$OvYqr{gbgzl9?#n~t7yXkr3GJ>7Wlfv*sV=iu-AHsgCw{~aBy zs2Q>0NiB;1B-X+JDnQ?vot=#z+`JA;^X4-5E_%jB@Y}bx;9<1JW}J0l7<0z3r5 zf8Mbfk8j<=`F%5~LF*PTLQ!H8smU3LGqL2U$T438b2xwhh39B}RN?E_T#pA#ro=!P*rMvgE@>mh;AOrT%N9mBct3Fu|5 z*#r|8Ai+o&UBiR$1zn^W8Kat4nC?xFf|NAq9S)2!!?A|enr|E(9c`%TYQvftb70jO zPQxE#KwO-S*18C+GU-Wkj7v4EV-Wl`@0){ zhhM(_7hZui)@tWsf0(cgK|gn}J8W^tPnwPz?lLAOB48DdM@KpK25E{qXekELGo%w} z|EB@^S6wB&$1cZvG49&GUvQ3&iuMkYG|aA_mNq?;Gb=3@pIUSkQezWwW$6+u$|>Wq z&p&$Q_jsq_AQ8O)^hOKrUj8Y3(xi>zt z(81PLR_i4Wvu9_JrZ}nof7r4#BSb9i83OO`KK~552L_q94CC~*KW%=4SC8aukC_)3 zfOtH3=+;|s|D`wJx$@ok-rpX_IGtrl*=+biK{Sy-@Gu6;z?$`4qu&>hTL1Ig@4@P# z#T@XNIl7syv+2-2_z3WCSg{foI{)^DdIFAN+_+*DzJKGb$RbTlF#}mJ9t?3%d}iBL z_*wB4*4;r;#x*Z12X`!7ti-@Gqm9plpS=1a9)0CyNIDIlpIr@g*md|Iu2^&l{(9eo zQL{@Zs^Q4^=ixorTyYq^{R8+aX)Qk`VRTtuAs$?PC6*SH9Rsm5Cnl3-C1O!5>P8)n zSmSBAY6R)$*79;Zle-=Ny7oE_(rn#WXG>0*| zmXir&8iPce6|+gJ+IghnIE0W8agL3mp5}FKdSP_D6fM(kvLM!E!~o4Lzph%%{W9Yu za00YupfllkUct$Z2q!05nW<>+)RO`dJ`c`ZW%owfRFE5$Qp$31K1iL0V6#p8)kghp zguN47Q@(HcP59c{&*D&99o`@!d#J6FNI^Pgr{zzNX=g}4Wu+2KlbjqLT)a54_4()D zZ`xV9^ek-p3OI3VNSo0p4bVgvw6q93wtU8n=^3;e=UmEPQ;+}N@)Ulx@o_}hU}|-^ zW#QEXDqorsrKTjt@FH1f;P>Rfo|X=|un5?*55g!d&cn1wt`{K~&rirCbHw!Yu(GJc z<}8+DjQ4{#k{ktm;PG8s@So2;jlp3jXY*{Ms|m0Z9Ek|h?T^xCmRP!;-;W2czaHPb z`W6zT2GX1kWA=2ki5_9iI zRb3_0;~jYT>gzBoBac6GV_!GE^Wt-OVfQYDRjSm-OfEXJ6_*f@8?`Z00GxzPQx*QW zbu)Syvn35jB0w7G=!B2hY(k6;$IBcG=L}dFqaLI2{mqswJQQ+OK`FncK|7fza6FBd zMGp12#^Ir#W}QkY7KbV3ov2Zt0jf9XS1i)BwvB2XF9D&L(Iv$UN5A)vO^~KDf;5`@ zfr$pZQ(r-U8&}?shI58!O|Vc=Hf}}|Lh;N@GbMwE?Vkw}@I9_k0(~{6CV(-a6h|*X zR*Km%Asll1&_V)sXu`!C*C=CrDneDp@)gC{_9F{MMkcsf^IU?y9JS}mB;N$5vL5B! zT%e@*EH!iaeW966gPmyUYa_w!hsm0X+{8>Cy>nIBQvPC%Q+RPcVR{@HtVUN)w=zd& zvpha`E~=TbE}aHsoe=a-6pl$)Fp!dhnwlDUA!)g~%1RkamMCSZr~7zn??(LQjmP1c zaB>I9rx#y~U)}m|FcbK1YdC-{wfnHQr4kFXO7W9h9){)&>U1lmmg5mwvJ}D_Z$d?E zU)U0Yd^;`VdFRWtLvrS@84DN9q`k^)*W(|;oGe@=|NT3g@DpPA!^1-WssD_btAjyY zxo{!==dOEU)M)Yj7uREFQzJgVVma|7V zv$*tI#du=JTSy=fU$;Gh(-88R^KeCt?4QBiPT(M^TX2uyZHAMd$rb zV*8(4ekm+^W|A1=vFR&{O0c4!7-J;BBg>XzSwSIYMaxHff&px*If57W?16>=z9=~v z?Zhr8m}U?TV>W&E_JxaJ)lafUGy2Ac@c6dPsAf?G3|!g#6RTAjjim6TBaK&241Eab z%V#GPCT;Ar(xu&QOY()ugO3?E(UKk)??4Ff5juAJU&0y)OgY0DJicafvZ|p=1xcF zv70T*`@CeR$boUx>qBEt7p^PyW3vA+gM~DEEV7dwD5vZAxv)`$MgO>qK%db}0q@Qd zKABxVfH`w=NZT{>s*vZUwtfeV-7XrDA&I5yL7G_x6%m57xvJCS!jE720|v&OSXQ(E zpI&eUb~jg}x~G}1)j277D0>g1SBaCpqUkvrn`E@MDeKE@7Fx5i)GgiJ;nNbLCj|YC z8{aRL*!oUO6KWC@#nFKQDXFH0R70mopg+Bnx3PK`e)-BD&^bV?Q)56nsYVW)9Y5Ll zXS{giZS;*2Qu^FbNzCfwM@?Td=A@p!>cn{@sjTwi#iaTbbGyDgAVVV6Njwjr&-T&C zh=A5sGuGW%LVNkcGJ=hyUWf3DSJ&g$ufK*{7B9iwD^}uvw{OE!yLaNYl`HYfPv42u z*kt~6f4t|uDDbJGKQ%Z+AicY>f!JEVVpgD)vSG&#-gT&Pr@Jc;@_^i8+MBgP6F?L5`+K4#+P}^ z%5}?E;JP{Uqb3?+MAwMx|iX)eW zp-ONELx^KB=OiQsMqOxkI-uy|=0Y zf7$sKzH{w5r7r(eqkfdhGt&+Wq2(J-RKuh*Kuh2Eg~G?q$4oYXh{Od0EB2-%rf<^e zkJSTG&L`4mn3K?R{QOMg6{c*~a0syk@=3NyMy{}TZla2UK3f9=Bw+sYl^02K+>V*4 zX;_q#ixv5WNF~9UY>VY)RzC~j(lZlqWE|#G+HA!PlUtrIWNZ` zSJVHFDB~r}o&nY6YapJbY3Jy0FZLZR$H9h!cy9O0_|Ask()Q9|!cS|>NScwwO4`x6 zOJEuvmT{z9LVv$V(=ALC7NKVTe3h48r*)nag8of6zdvk|5e%;v+YTPoe12d+mDJcI za3^F|*7TJN*w$2zA8q)*sOdRMgJ|I_u7{-RV{a*uBs}JsIjM{`L};L!NUb{3-f%{s ze+>8uI3(66d)wQj3KF~8DnPo5wp;SKwd*U9JG60w%-)&6>y(@r^d(G2>AYIG6Mx$N zHdYiC;wPW_JW^uQ=&vHow1XN*{krk@|INb!XQ!v(UskQglAJ=?+mmcIf~u}g413*5 z7$MvIJZeNF6?G7O#NhH13{hv~)G`|a7Z_vy5T4xq4u0{{KN0Z-c&r$=MMuxU0f~TO zVsHR|c;gMOL1+l%eLlZ(4gwIFg!I$fwsIi(pLO@Z!oUmxBw0=P+Lc#fbA25iC4u&g zeIIEBULJ0F(__CS5GugKYpx>gAe%G9h#W>DvE46Rx*FHaC?)ne%3TF33Q9;*VP>GQ zlQ2-FwoPWHgVt`6Vl9!+(ws*p@sM`)n~fXk9y76a#thPQv^<7KJ_h=L%je-G7nHIH z#KIX16sI`RnHh)x*%zGj?WlP@AoXNe#(RU@C+XcW(k(0C@AvcQqNVc};QCp!kC_cq zV(mzvdE;Hl80to^>x)EC-`k7&&Q7e~vl}7-Jj+R7_vkekj%zivW(G!`wC~#CBj#-2 zK7_z2?6NR%0xRrs4)k=1@OmT|4CiQHvA7}+U2{9Doge)hp`)0ad)6pb-FcKp>c}j@ zP;bC^z#H}V)7Y3|@dn{n`G0*8rG!Vz@@Hc~b}{{4K!P`ZTAqz@waQ8rZ99?HE(S|x zNPExZJf|GJMC$^nsbaguDmT)T&SmD`x;j=mm8qd;Uy(jQ7kFy>3pm_Xqr?$2wOy7K z3o%=uY;!P>A%>?lno(RZ4_6j1CV(qAy9?Xx5H2CM|57G|_6{D!BUP&)BuCCE=(D7( z%4z{-V-jZ1&ZKqoL7PY9EZ^xK#K!Wyh$BYvsf9~%sIv;c`SZ`Qoz!n0rpG=Pjl!v| ztH;Jehw+#DzQi*wS&|I{!up;L&NjJkF>0e^YI}ZSB9d7hmnrsH_8tqHi`5rez|=Wad-CDqpf1G%OSm48%_0I8;} zg=g}z_+=(gSk%sewl?^gGnrU&|JWGcNIqhiV{SLvIy$harW%i~y9>9^zXDc+1+1mR z|7?04Ki%*G2i;3Z5V9zjD|qc0Mk7z2@4!kQ@XlC~X|ns%8f7M_Z~gOmWXC^%Sh^Qc zRPn^HNw8M1ThZuPbZLxHuK=gyJ9e5djrll@QBaOROCM$9oEM)&a$1cL+k{c=iU|un zX-O;?fRzJ?(B6>P`y>$cIxX(J_68E9*CH)09!eOihKFIYgsmYG%qI+Nh|+IXieiwZ zeNGDW$&wEwti4_jTKal0%o@|jm`>4m!rr%`s3;q?^?D3D-LS`>tDQxl-$vN6Lxwm( z*JUQH1q=B;Kik7ZbCnpEOxmj(5gG?>^5RKXB46Wde!55c(LL0KH}<~{v&o8oz4m_m z=*9=8;khCh8KLucD-n|k3DVH4QsL0FfxgLfVs(KLw>fhnN6O3PD|&lX_5%k6tX&JF zq?|q5*U`o;$)Jr}83UJ_ZTheR@{Hlr;Kq=ex*)R%*Oacr+R|mnif3`zXCLs(sw+ko zE`Ts^9#jPS;#dUIPJ;Utf)W*Zjt&-q*Vd|{u}dP&*^0?c%JuK+z35xjAW~+(W~7cGor@XP=W$j4h3O(c00D2(c3_u@nX_GLP~x zpeQvJX8mLxcplJ7Y%@$600F#8Am9-2+`e5XCnmmT`3ih#?bXPSx0CvB;|0w&lpn$` zH@=3Z-X2I?eNvGs>?AEF2p@q1Ardcfz_kmRIin`fLBeBJY9YVgzSb&yi@-a~%p6l2 zTL{9jWTSz;e*Ad-v&fB0!JMpoE<=J7vBzHSV+}JPpEPYnnYc`I(c0C6Z~t>Wdbv~e-DM9Y>9__ZN7=qGHHU!b zXo=u{Zmwo4>e};|0gHMqN7to+TYZ29MjMA zg*_37?TVW`GP?}8Vhscm!e@h0&mVddTk7`U3(Idrjw6+q+1OgQpC=s-PdE|wdya)X z^I!zJlEoU2jQEskc`g>MvwJt|RnE2cU~;m2sGvaAH*KK5f1mt8S}anMh1#@KVYsp!%mTaYkJH(GYHf(%>?@W?J&eAqbR))%k$>o(xL@ekTV0RF^*|pB0QBQ!2xOM zGRT`YLvXnvZ>6nw2aQ3=xpU&OEbh*B9kQ}hqRjMzYF2AFcvbbb;b>C>yv`9g3XAcn zm6ws~n1+xP!46{kyBZtd^9PQ_-Akk?b-G63@+wI~uUC~LJvAL)x$Z`+ol%B=96X4h zJ^wTo=H+2=ZZVEWVz9^(5eVI#36+gK7X4p&yUM4vxDdB|7 zrh1^e8|x45#=`7u=+%akjHwca8HohB@H;&sserGEu9=;bh#>;t0oPbGoRdb-pu-!r zb-aXvG%19m-(l?7ABviHpp+qzrj|%1_Rhm1eSWU_GHry7!(=?t|OsL3MvC4z|`}*U=-Sf!CpDs0TsMIMPz{k>{A6KD| zUcV?d7K3x<;0SFEdD=k#gAQhDoHYx32;^&;n^9O@E#vSZ31y`Mrb9(8Nyx-~m)!}h zxf7R_EJk5cCf_{g?ufD}VgXpQ8d$#`!rr}5HPeDQEJ7|(MKcelmys}nI4}e>G{xe9 zFD;B_W`2-qM~9l87Oda57qN~c{NOX6M;?JqZBHk%?Qyu0w4SeBuE$^Zyom3te-2K@ zFd6%27{Yj?$hf2v|FU8!9F};*8WZ^Q42^F_T1qm$e(m+qij3aq^|a_88^wkrhj;f{UprInT4xJn3Pu>MqzdqZdz~& zW+vxGoyhDJiy3J%F+f6VN6itWbKARs>aHfdQB@5ivH8!DAe*0)P0Ur~W~evo>aeM* z0u#(}s8h0r4>UL8m5L)IINZ?6tT3Nn@%1o=D*fKs(}gzY5Q-CX@nLb~XH*%HeTS|S zL*shqf`tU)Aw2ThYrI|#_%0OqeV)imAVvH7astIlEU>Z>la5s=_IT!#X?G67MFPTP zv%;v+5wncvIT0iN?se-eU2_hsPWpT|EZkZ^IBEx7N})mT+nh}TFk z?`vyAV}Bn;T`o=lNPVCW%Ev-!2gXT58Xq}LXRaShFDb&$e`dwNU_Un(tEah7DZ5ws zD6RV45w5ffg$2OXR}ra8ICEz`9S7U%u(zoaUREU_CIQ)w^r$}rFdIy`B)gQq9$I}n zFU?)o+lu`yRrDD>?XB$TKn!$thIx%H2HEN9!eD-Zbfl&>f}9+2dO*MABn+1{dRK0) zRIz8bu%@R6wj&i1t|0((B%FPAZiYP(4_Le2e-?Wh8hAY(X1``};(mI@)Qn7&k`}>i*j3%_={OML2@a-RFh9x4f>pSzsEp6s7|rdWjt=~0 z^P709yc_{0?3k9o1QQ9LF=oy~mu!k*vkJWye7OeI{_V7PB*o_-ncjR=Q%>E`a4n zu|dzwl=l2xMq6BrkB7AON=UD~3bCmXaygx)o?bcAEn-CY{Q|nW zWLRx+NKTG9fhvwEYPuF>X+;?Img8$rKZ!%NB<^kW9b)~SfEVq3ofz>t2^eCLPt09Z zYakI@R1-T}QdEGnI0yV;A2wGXz+ZN6$2&DOa1RdQzrJ`st}dH5c$s51M8IveK+7^kRRT1$(8qi(>^Ry;pdNsY=0KyG z+!RcpC?z8rdyf)RKZ=~h1mq&6) zdHD71YTWV1|BIHodZZE?y{>El%F+Wo&v;pNPfyT8m-0plNQ8vA9jl8HQANz|Kur~fJicg+CIA}Ry@Bs4vdX>Gg8ho_V7$V#{zKCDAYaUtzrR<3yTBu-o-_7Xe)=2Hatb+t+< z17_+N8-vAYL|$qp;*4>ma*v>U*a?X_Ls_P>&59gH3T?^+{O+9>@YCo1jy~o{U=;?f zRy?|SGqULY8|N%0!5Ra9Xo6VXOZegXXW^i0+_v%x=;`m{zIymQ0UiQan4F5Z@!Q3;mN%_;i2^)%3;ukM&z~Imj z?p(4AvBnqz{Q;inW7O+V)zw3?B*N?YNTCp_TU)W=@L_yraU$kr<>59GK)>ql!txn2 zP)b73rdL5J8{p-_YG!IW7U$)mdt?M59t$tyTy`H5q6t{cFHo9Rif>%|DSYFZzrn>! zFk0O?R!x;s3_+S}S&E#p`H^W0yu`0C1@E^4g!7VV~TZP!;!bKht~S?{5iO8_HxpU79lm(aV{qt-Q6NuTNDD5l`Zw<<_VQe ztxAl`!s!D2%=DAX0+KSlGiJy;_U{*$x3F`z6eoT$h0U&oc(ySawpal&*#~WXCiEb*jPj^yA;^?8qhkwrrt=*Tsv(i3Io|7W+=) zkWPYbDR;t}ade;>4Sl`58mWpvb6#2+aviDs{3?-vSx<~Cq(nQ3#729ZPTc*c-{a1u z)hJ3y!Ru93*mC4B#7G3!&zp}`1;w1DoAnyRn~ZQ0;J(b9x64)_BQ_3C?c0N`!~lQ% zsXMp>^2PFl=wrpXOcq}A<=I_3@Z6r=P)ECMh3TH;(NPpmFf^~Td*8E8|(3RriZiVIIa4@(XdYX9xrxBnp8wSp7F{;F$LxTp86uD z&q8%i-P8H(bjZ93NQ084Qngs|O=pNlPh9(oFl`9~|#hu;R z>GrlCtw3vU8ze3)X}mNl^p6i?{l3?*e$UIKt;gf~*(-6^!mF`_1c8Mmz)j=f^GVpV zCxYf?ZmtaHYo~Yh?%Lmn3GeAP1QS<1+G#GPW?ajt^+=bYI}b(yPMv7?}0QRBtRha-kWq$QB?FH zsHo3go~WqLh7T(!qJoNm^d`Lq5=aP12qBg9-jhwTJ2U@tXE!vX0@)z?=l*_UaI>48 zx%b@feCOO#SSXu=l^wk7UFDE81_&35FCr~JU5*GmntmGbxoPO**HvaHH$2#8AO;7Gsi`={D#Q`f=ZN`7 zgmu9n0`QE|TpUkJ)@7D5kk^-KW(-mzhukXU&nSq|4~;f97*2GlpFOhZ~pG2${Z1t98qom540#QKOaP@NI}Sbt5J`GAtCf zrc7zn$qHqBcsF!%d7hLcDHxhdmcYe2arrqok(H;sjzipQtOV}b1Fhftw63Yjr4LBD z^9;F1E3tjGrsW2Kn}~{+4b)9WXlgd#^w-n(Zy=VRrDOR*moAWok7!qo81_`9byY~r zNkS8=o6mgs&1!wIJtJKSc$&-Frbetjyb-I9ZH23y3r2-SKK(*bj9*aQQmR`Zt@RY9-cLuT<5b^xYtaAIq2fuSKG*zN0!#I$tT zHN;q=wY4?w>d^}xHXb-wd`eExk_E#=x*A{@;Opzp59rww^M?*2_Glry3+(A{vo?&! z63$@7p+i_OY?z#g#LjVcC7nSR4=?%S@j2;8yqJxW$_mU~xg4uwW8|c>5CTZ%%G-S| z1uJ&%LUmOQLi_ZEhn$FW13=hrha`i>X1H2;;H9yXFz>4`P{JaPT5~5D^JgH*>f?ye zE29?pIXPnCv}tg&u}2S@UrQ6#?8H(ZRn#JbJ`1O0zjw27ZsUxiH8fMaPQ2&z2f`Ag zkow|mIw1dTjG9hideV10l9g4!3Pmwjl0v5;8VI%7^IUsG{b$yOx0e%|)W&FN;Phde z?OP*B;vwV^!Pv?+7m+k3&*R5J>E+q3iZ?7wmL1?8$vlhZhH3;8i=W(UGzuzN){k^m{ z{a{(R{fXhfJ#98ZT>UORvx9{R1_TA;Q=5IrD#*uEKmMpQq3K@iOz1iKkcrM|uRFbqnHe;6-@6kNu{$B*GHA&lMxg8Afu5a%$*Qr^Klk;96dDHjRf>9IdOh*kEFchfkzt}f#u9@%1LMZ&f*sm3TaqAmhpS<=zG%O6ClFsScm`Z;98jxnz=89p z@pJ4>>`RM9NmZ%NBOyqnyt|>7Usr=j6-$cVvm0P-l$nX)?aiO^aF;S`>e@#>+XVfp z%0EZ8dIB#WZzOi^jGXv*-r+(z(@G5V4S#sn%dZQ%kfu!{t-ECBN_?<;6-wDen_EIf z3lbd~jb(Q~k1&tGc7L->eC!<{Jv0|cP6k&{KrBLnG@FCy%D0>CGczqK%LIV|o_g0r z!|(dJSQJWCa}%`0qW`mT16G|p0dHclEcU**rWzMXDb=uwhsL@-t0u&z$M+eCDUrQN z@wGNG;bk|CkG%)Jdhk&^^~1OLH8DYsCzf40j55%YO^WU(H%#%fXJJ@1dSAIDgQta& z3ilJhd)wLJm$>5ya&^a?{(}j$*&%ef93RcVZfHnX96XFE=US&>or=D^-dkuN;4$*{mqnARg2Nrjo%NR~hY^u1v9l`XHb zCYWL&#yBuA5F@)p=%2ay76JZMp#U&aYO!$0U=&nWqM7D+WLOvUB5TIk%0VujAc`$S z3Y+w7zO5vxjvdxC$Nd9?=?cYyA*?rb6H03tTIMLlN3>GH3s2wX)bFwrC$XB(x9>*@k3y%l&B|V`L;m&AjYuub!u&xq5#sK5 zQ(fs51S;a7ArQm6LSmp_EkgWO364kv=h>bH5FA*otL$t`3?JSZzh66F2Ow4~p55FW z$x0P8wE5DDi;zwX?UHMTEj~*uBjD!iYSAM!6i(?y)CQ69risXOk%zO0Pt97n4mzM3;oHP6p zq+QMnVf}YmSZ`}J%&Xrg$_-)ch&40oS*|z3EI6_Z8_5c7XllAa_l{21Jw5GlKFx@T zV`KZCq?VM@HV%p$y|i`i1n#cM;M-a6ojr{kDd~@9zkr@ZI8%st^zsgEv$?sAsRhP% z8z5g*4RyNAX#<@TB_)Z36*?^S^Ow?me7VHhI!VS}gM+@W@AWOBg$1fZL&P{ICn>kI zl=nRu%OmHah)#iq71Q{O=ZQg{)-@kyjhPAD&1nH<51)Z|r#>l{jLj-5z*9fHi>(LN z!GsuS1es(0&K|#;MDeErWn~3v?pz2-$x!6xL9tB$H{G!*3oP2+?5+J}xvMt$ANhFM`-5EE@XLb7@$UBRa^lteAtNy& zGy)2)idb?0e*V`&JhSdc985@n_7cv=+`}b+H};Z9nH_pufF`gtkgH=+>qV-P~QUZvFzCFDk<6yo<|5@~9F892k)6Z5nnFcLu(Zd_44HxfqQ~2WuSWItfj*0_bN4_RS>gox z@J&tvPQ<{Vpnt9~8*i^)io>UW1?=7A6Le=wTRb`XLHv8<93s2A&249H4O>eG@Wy6z z|MggNd@FkUcSD%l&1F|97^@sM9Ae*SAa^aK8e;oj8-oiH!21g~!S*>>$XS0&6BAp6 zhx_4=%hIalzNYsK9*)FlEGpaUKgeW_cyh*=ZNNa0N#J_aw3pM*eXFFpGf|77Fo zz+K6!^omD&gN*I^7~S;)K?^!NyJ6+rM=x6llD(5ATlQ!6At9 z^OM6LRXmUDX%PPR96I)IVPb+FzJYXw;E@5NP@}Gp-HTSTyQA(3QgK~A0z~!AEo3U2n@P?($Fve{{DQOig8tnj0PGptp4CQ$<0@@#rK z2jQZZH+L>C50d5@9>J=|+%or0tBc3m8|NY;u=ChaDKa}77W?*b7(E(rG*E^v19LYA z57zO7X1NZ&PTp8d?EaoUW3GB1i+q^VXDs3_#3SWG9AeWG$U-=W04EQ9*5FNOdoy!L z4?hek?licJ42ZkPm>-{d5)2y~2mEoP4;?s1`F6%?V!B@* z+KVkoXHiLJwSqK`lZ8132L)kvR9}R9`Rg}N-3|MoZ=Z3Ef4envRQ}lnQ)3b!c z`wl=I>q$zKhxMT~H!{~B+&A3-fQYa#Gl9LWt`JkHt)w-C%;NsO2Ce(E5BU zSI>v&>I~_Thrv5J-_qG%dulH}*|Qp40hl~uJEcVXYDkG1>%u5BKXA7E-Luk&)7g;9#6fO;z?{;fSZ>wHP&0VGy6Hi?to1gL`4c z;SC6O^1`R{-p1fg-G9r>Y2&j)!C_tcAtN^xjn(D&?#L$e@CikT>rI9fG5=+BKL}&T zK=I{rC|JFf&sC73IJtrPjS`gFdZ4t-1YNtZIC2H9uc>qcyc`_y)|7kj#$*keG-^4{ z-c)5uR*td$JvN5yJ|G&C} zpHrc~_$#hfcZ-B8GmTqX8pwKVkb44L>K!dfau+r;GfNm7n_Zy@xoeb!7MF7w1mK1W z3$`bkNFYLJ14~PDuv|hG;B=#)&oQ^o$8=R{uXvV&C#}S`)3h}4*z?AO8|L*7DU~biJ>nb%>iUS3>kNC%XsLIT7j zVi)U_5Zpy5oNt6pNnq83ONy)z`9P-|WZF9aFpJtTGd8&bkkt79Hzc$_d=c_oYBd6_ zNi~5cvl7hk`v>b{2RsL_2Y1ya0w9V_sHv$&S!p$G_&O99R}ui^A~&y;z_AX^O)aRX zs6lOAqg*kwqM{O|rKQklG?#kLG6le_7gtvovL>ye(F(9IH-od24NT39VNI{OxjG@d zTL7G#Y+-9_Mj&hpa|?zjMpr0+jKd$U{0P zLdi5;U;yyslTcW-9}(-D)mU|C1D0<5A3VH6aDU&sWRHT6qx)|d{O;r!oXSd;U93(% zAs8Ay$N+$^leOc=B-stjM(0j^A~F3WrrZqGVzN!pXLa&#WRRvVjR+Ty9Xra8FD~JI zPn-l&QY3WmZkX`R5I0}>x^}Qe+rOs7VA;N(a3m#0CpgT{$N-*{eq((l)*Ro4sDN-{ z`#v}K<*e3tU?9Y)Qz7Q$K*354d`I6igo8vEr?|dNp(T?vH%~%cy%{lmcidd4o}pbb z+%-(_O5ZG}2P5tV{?@fD@XGrYaXSucF9^iS|P14lVDAy@UNy)~Av^+B9 z^AMkK4i_$DqOqZlz*}N|xF#(mV)opSp-}Yg zdxK>!+PEv4+r+#J_$Bcmv?^odlo#PY>p#HzzpljO$dOn$WCp^$I?I)A+1N{J;DAUA%Xi3zVvRS}oY;YHk8MF}PKqwx+)T&rGFtDOi_s;=#>;NAV1F?|I=`ZOuZ(4~?*9VA9SEM9M#J0@g?c<1B6WMWP zS&S>)2CYD+y9ZHhmb*u_v}n=X+#<8Z`uZm1<`xs1tRgt}YJr z86HZd0>;KFxl5H&X+!|q%4)Av2v_>@Z?|)X_RPCV&z#x(HX<`K2g%7fNIa8HM&oIu zrKO{)s)|Hc17{Kk8*3$jtrPB_(+QSVwj{a^=-$l@0RdKWB#9&`<+|SpC_(z3_TDK`mNjii2)Km{ zp)_fKi#rzX9iMX!1%wrHA{t9bBdfZeG~@RNe#TG7w<5Z81YR5eD81H%6X^-i)YJOe zxu8#Qlw20Z5TJkLh=BNbU93j;aHNI?BcZ+)nyLz^V?qChwWKIV6Xpi^iw7+%xRDhV z3WuXdB}|zj!rR+$Osc4+4FB8rBR<`;26eR+v?#=G%=JP@i^hsldAj*vV)r3PEy=@? zq@$>-D8bs3JJG|hD*_$eZ<_6c)!TpK2}p&7;IpzJ?hv6Jqy+COfw%l~cSBjZh`fAr zbdLy=6IA}FtJBTEZ(~FKbyrNW|7#8@p(=N|cng z;MlQ70$~d@G+Lpyn)RqPlIyEyXEzgIlMD*n@0R#s%G=G2Cnjx7);Ldd-b`!RL_cfj zbz6)W6$~>Io$`O`DadCg%}sSUms*a5_$;KJqi2ZOk3Fw!L0to2OTZT1y&HxO?S)}O zBM=hmPs-g2m(P{7*9rO(JUr}4PE6!#5Z7}6FKWrsIZZ_CXBMp^$&n%~T8Crx@(lnl z7KA1DMURKGjU84V*^Fapr_j_;L(5`D7-I#EB;Zieag0ts10^YgCKkF#dt_So!5A9U z(;yO5QzL-|!sO-2?!KnTp4j2;!6i4;O9q$J-;BKc8~+j_b6P)tBzNn^r5!s4huBz& zh_Qfw{R=nfCiwkPM<(%wi>at9$|ex@(Z!55H^_B%I+5u$r}sGA-FqxN?VPaZ+zI3r zXCtk$2zyWM#s0AV@ER}~#y8onN9M=l$3r-L82qYlz}3}5Tuy=*NpsbQ<)n&#DCn#g zb$+f5X5Sm6pO2gMOY_$Nye`(A)xOEdC_qY526FQ&h)G_gD@U$J!+^Y|rh)c}34x9U zZG2-m*qb82&m4D64uh|s9RYzU%*}bZKeDBziOkd$3L^p(b6k$UZ_9F%u3)yz1;Gv$ zndQI~Kr>w$Vze5WU6z*CAvviC**O=HaHf$IP6KLdweq=;nW+f@za;@lAOZqC=-yn3 z>2!vpvpt!)CVJM~>Snn9dNUo%=8g1V-Gs`Da_m2lfL%LdaFm#Q&c#BS!)5|?2h5o2 zi=MsuqGwNEI6JdLXj6Ipnwv#hvnFELN|cq@BR#_iXA+G_L3p61)?RkQsMRL)_pS8o z-Vo%8&0Q^7UX3*08rax2!NsWhAQfdbI2VMwqKOpPo-{E5}#!ylc& zicGG~5!8RogD=v74Qp?zm^;^?Ef?)At#NnM7|iH7Qtp=Z^^sq&CH^qV2ty>sgiOtu zy(Cvb1z{1a?a()@kKC`j{X;-ZjD}b~t76K*$4ATz>MWgdbLVQ+YOdo!|7Hf;xSpOk zGh~SP6m08?C2f|TTJB%Vpb$&=>@NV8E{T_ZD0M+Y-_`PkFu zwZv2cn=W15=-RqO~s%fZ52OMoK6)|SAm8cCyQnU0IpI#OQ%$r8AL-Mi1wwH-f9Ur$E26+Lq_X3ZRd zkt3t@A<3<^pTukCPy;6yTey4s;@r6;vOZh>pk^1nzl5%zIB@$ka*cadUq^iUDR8!S z9da7OA_05*b&;o6>0IQsf^Ge~jh#zqO7HYt#H zp6xMF=sy74y}h|pnhx*+w+Z@TVK?{3h>$f2f^<48Oh`^nR`ou8T7d%x1k5r}2Sip< zA;Pm0CXh*Wz9+PoIex+hqVk-2LSyAM4`wV072Mus659=`GLs z`azsOAB4Q%v$G-Y6d(*jxjFO>V8O=+xO8Uc+BmB`7- zA~Qc3n>HUtTwDt38|vk@u#ByD3-`q1iy{%#%M<>7wy?6c(lbz2GewP>YSvWQ0w+!i zNIct!xL9-AWFBa!cP3CZM?-@Gb#<&U22(25@}Xec?iB92g!k&7ynfSHgX5c6?J=?< zBvJ%wy3Z0)MA?Xls6lYB9XfY%A=c=HDR*_Hc`}y&Mhh{_tgLDzBo<@yrZZT#ezV+h z$=b>WVO;_-VniX1%-L|VfC*BkXw+NnnrA1f&Tr2 zu;Qy37(UbwPOO|Y$AGb!SiBO;zZ9{3doTgKE3Jbi$%4K9Z(YwkcGUQzZe6BykEZfL zVo_0N96PF01PVnBJUsF+WXJ_fpP@njem&5)UvIp=Sd?8^zic>&pV#gu(BB0M3tLQ> zFbMyeKLx#eccsso=`BUgCGO6;Xt5}wk`fcLXnwy$vkdYl>33^nz7NUC5z@>V;G?5& zNjjXPl^q@(G93>OoPym+$Fc0-I_!_%OHw9bY{X!6aSt%a_ar7tNJ`?+sOE{~YcF&U z7Y`ELl`*AkXx`4XRVyMc?&j1B^PG@LYV-5Y++&}8#=Szs*!b?dMJ!#aBvaBbOT5Wj@ihAL1Dx3G6uh`@DfS)PjIO~^`0|l=Z2#(Ky?9Z=JMXB7O;5yz4U36ww}MkE$Q#MPB8g4J{K}D(l1-*`JPsX7Kyq@1 z9L?eCW{Dm>e9*6-A8jO00!n9?vBPU-ZZ-=jE#rtO1E=E@1V%0>Dzqa8$MOQ4(a>lM zK`_;8B}F?x;d<2KwV&s%VsOli&~g#aCWxA zTW>u>-)oD@30|#T%S>g(RbF05jQ$Y5`DPngR%c0ZDKUI_Fs9zs9V12t$ck3mq9rD; zAm(dKYv+bjaRg|k9we`JZOr-K@v!>Jb!;HTn}_b*FJknVLW~>VfRJDX$yg)KpU=el z^|7P?<5gpx1*jd-iy;ItRnc%Zt{f^#Ixui(mf=M~|(*Yp<1o1>jsOD{|^p5?RsD z(rWC|LSnrHST@(!UqR{VWss*zEzZIJ_O3xuWeK`^1|i%#2wrxsur;%Qqotj${pvM7 zq(kT95JMz#SV(WVgmQabOw3w-@kIfjf6nq2c$zEelY8%#-f?h1!JjexfddUxTDiFR z=AVLqz9uwOiu3XkvvPA4!LhLl96BtL$=l8bD_5|6v+Dr+xa?%Sz5Q$KJiQl9tVRf# zo2+Wy@;z(dI`xT5Wt(s69xTiuKK=xxq-1a>PlAspR=rdKt&<9h0O1<{K8Mm$33++u z=-k;u9|G5`19?d#CSHlSQ|IvOuP1QqcoNPgULf;Qi@-of3>p-OmtLHX9z8u_Ei-u5 zlth$Ur~UMkih#w2*rXlO(yWnR-~v&!*DDadgIxqSqAaBA025=H3u6*^8@l{SNnYuH zR>Rb+l&qK%L`IaOcT_q04Y0*)uZF>7i9l9LJx-m@!?vxdSoXgac=3gg;o{L!$h?NEJ?B)$`M-N2#cazI67-C+Nl10J*o@8Gl@*xxk1mLKN30Eq1(6N=$ z(0`D1#dCG#PEMSNHOrPsFK1+MCO`iyqHi<@JG%}pbxT%2YH_v<_8U&_L}OEfuE7C| z;bmc*1hV;c6{u0Oas@XJ`m*}!(goT@iy*!HGWd)PaN7w?!f84ea*V`WeTZAiYGd1x zN!(2a`;?S3#2k-e@18g^>C({DTn|4#dt#3vc1H1jZWWHCmKvLs6? z7%CNy%F0^o+jky6{1A`3@7_dUZAsQqBqmQ9K&-qsea=Z<1CDEIZ4s+il9ux8>FH_s z>Z?uoVa*OQwQDeDOc-|VoJ&m9U(SHe$2J;HZ*0Ao zYtRMp@$Bl2H{K{imo67DYgP`XPq)SL<^AwhSq?UDI!+372U%mkAUwP$o_=~RDQ73B zjI2n3wDBzhvHaZ}xSs`msRdVv_dfvTsF4P9>%?T9#b*cCLCw4!_Aa_6F zBJv17@=7l1EJfD+hLwWRs9|Dhi_h+_36l2-GAF=Y#dQ{hz z>%iW^TG!&Nt`VKQg7D0k2Qf2hlx(sYVx0}daaj46o zp;016UXNv;{)D&RS%#G4G&sAM5|i(YXP%jce*Jyrv~*FFP*5Nc`%z;5K06Ww4+0@K zG`BeDT@Bpd9N-P15ZETOB_(Q$0|$cSe30j#uY!|v0eVE{lM*P!xN$a^Hm$ep!a06C z6RTIp!~6tZkpl~TmcUBBXk557fWLL#D~Jn+Tm6ESpH zC`?R^XiZwkim<@ipZ$=K(24%8!!<6Oe|iaw>s=!Sk-k<15RJvJmtfeiRLq-ag8Sz9 z;{FH55_yTor=RY@WApz-@AZJXsR=F3D)~U4=cUW`Xp97I8NF6OWJ;xkNNC92cdxCTM7(^EYi|!?`P?A_{0?LJzw6WA_)Gg5JFo~5(o!}D4`boypYbml8F9ul zW{CLcBT}gLhD+FD_nu!_f>p=2;*TT`k9SeuwgZYD}!`{Ni z;1j6L$^!TJ{#6K%;Azjc z;PmNSeE!98{JQ%*0S-%aQozm4fqqBKPE&^&GrHlShx*Ae#jXE3>qk2O6_+u!d`WTcl?oK&@MQh$hYDNNh6ASd}9DxsKK8rs7U6ERpjrVqZ zgCAqIpoz#Bt7X(!SqwWX2Ym718<-S11S-CrEWcU6OD_VSea5qr>*DzF;>zjMrFU#> zuD^ux#ECaiUZyS3U$dtD-F%2dDN9N)^!@kwWqEmApufLJCO9xUa zUHc(mWv^rROd~heKxu4>S-mIV)d`Ovz}d6IL|bMh`}RY6`f2cqXXKb-=>a9UcO)pB z1i4~fMFk7VvVf`C5V*OHL{=7uojZ-NeVYsR?duAS)&;rJscd8u<)_7n7^Qr{w?6hkt3)m+lAhJNEx{D5E>K^-{rx*rv=|6ux8wlUVRPx z1NV1Gw9dx(19;?{*HFgXI4UD_@d?Gsc}w8y;DLFo{)5d#CM_I2u=L)S;6i}U?tzt< zZZCmku*)Lqo_-24)3>*mitfEve46#r`#m3?Z(qu0wm6Gwa zX%ex09!^fYL4aQ)YH>Ux5err=MsjAN%<_3&i7^p_@%*U!5k(qXN!mE8G#|T?kIM;L zg;iznuyMdd($wR_2f@~?{f!UU`iNhD1@865;PUbyT9G;WJP-b95lSOnQMQ~ME4=^S z6s%jn0JXKAq}gq*0s1?D(yqCyGl*O}m(Zv&8& z6e`ECUwUNC?7LT>XU}~wHC01P3Re7%tmIdS<>zW3+S)*RVj;Mf zUWP*1{zKDNsJjw-SWC+vPwd1KtCyg*x(rG)b9D0T1P^<698QfzQ+W{{9y1q9racJ< z3u}YTL}R0fmtPU_=_jmODkqK^D}6^S|4l2a8*7v@b&7$acbIS45JROxV{kBzdwWY+ z7cVM;_wEz1W2b<7?_rie`ww+h1n?1_!I%*}7RfnD=;7Z5izh9>@X$U`DwHU#tHcL8 zzr&XY*XbG@vwA!V1!6T#_~qy?i0;xK@6LDz{Q|?=Ey~=KX^>JmYoEW3Kh{^oxD&l1>ZaUv!ZB_&?^ z`ZkyBw>wkUVQayovdSIHzjVi@jn?>VMLwoXI0MCAddGVN`nfG+9B>dvjR78b2)xn= zhBysmU|-*)hPtH%)&%ZGN+pcxZ%^$x0#%K*c;Tn_1=%>4mq8n~9)bR$nA&Ru ztW6BpoJ9~M96Kgp?;f6HQUOOtv7}R=w2dsyJn ziLBzo^Uq15jwfNt<|a6@gg8qK8j%WBG? z5jBV+wr|x=ZO+-+Lh|&Kdm{3AdEiS3_;YAs`|{xIburrx4)qv0@)#K$xj1@sB(5)6 z>dv?`{wZM35jN!GrB@cBoG*SIih+X+s)|o!r(nsp zuaF$K8znUraC7#S%O$hHV(vpd0-@FlIGuF{%-O+|Pkwb7d>lPwd{HXeAK~88B4OJ$ z0bhK zkcmn%=>pvY+MQA@Gky;bfYn<$aS~ij4Y7TifC2*c5%jF4IwRHGoRmydBAi_luzS~V zTrPcZXWSY8Y4AVIRX173UqidnM_3ix?d zrFeh)SJ-}h3o%hE%o;WuPY$0Y19@3}ja;|O!q@~|JUgMVwi4&Ek{}tIqN*qh#^zQS z9NY`$MyBn)kNg4w%a%zvc~b7pTsP-_=_4B(Zk?SS*K#uvpf>~hZK|$YlhcNlbQO;!ZMhT(80xT?bK0ZT@WYW**UKl#CKlFsd)iZYXuw@^ z`P9}iA~YJYJyY>veg=xm@^J8cEWOsJ-Q90wE;DH|#KI!*ue<`TstVX4L41i;bQwns zUw25(1pbkSx5M0YHvaXmRnW>2Ja@*O@y`YPiIbM$z5l+2fPfO&A{SV}z4r+4f0DpA ziv+Sp5FdFI{N48$+}XA%{vfu-?gE<1b)`y#`ToB(e|O5Ams|AgWYQG-<)DrAb(#fQFS{ z&~F5m+COK`9(?=lOxW9}w_&&38UGZQM*FV6_w#dH1D=0j9#($+90CJNCb~@o*q3Hfi7P7<@7$R{B<=h zrpII3*~6%1<&tRxIJ)DVY0n@$d??08j>N!D5inM^uU8>U=uJxIux`CVKD<>ZgsPb{ z#s3)@A%^f#xRoo?Ce!!y>=3OZczWV^WhFLj-i(JbGdat(YXx-cCc(?gaQcU3+xk2E z;2^Jn)S`u_oeKf{Z>t*Sl;_hzA3;e~8EF7Zxrke{R%0MBCqXtdhdA#MNEMZkmVN}j zvIXKN#B7Wd5S~-WjUbo{Po$UjC-+*d3JndctTl7>nO(Crxxd|faQdo4_V#Ib|NX}?Yt~*E8;d0I z3dm`TYdP?53gC0Ky1F`3rh#9y2)vt{LDk&F%3>_vzZU0GV`1YOfcaw{!o=|Yh|fKb z54Np91K~h;^dgVB;?$4jdo% zZx}Y(xuPg94cikBFcoGmalErzpm5$x?U=w~{Snml-Wmy&!pz|QU>OwDTOrxxz+ zO)?0w-pMS3y}n+F{5)e+RGOlx$qBVJ&Zw@oL`J3~l9D>3xFiJSX4 zW)i>vUxcgMS$y@?!x%IAl>RPxT`=qpB0aCr|7Gd$jz#KlFTDURFwmfYuMq@%edrhb z8oy6I+jDksLpKk9l+;z>gRNg7kw~AbcQ6)=xDSzDol)Ibk8h4_!rqfxu}`BVb}nJb zl*i@PjO`ih@OJ-R5o=b(`Knd?%WAdK z;fEizh=`CtTF)RMoUCj8=&)$~6xbDI6$MDjO2mRSOJsi?i_Y1YZ~!~#s;RFgTp?D~ zSPM66dyJ153@=+JXtY{X)Yrno)buwlp_}oYaejUfUU~^aO%3?1+n^{Q#{aqsqE-Rz ze3qUiTmtxU9)YkoWRdMk2VyU_R_VRN`bmsdjdE&G;54dQ_UKFm?1sg9t8yfvQjKAb|9d1q0idj z*3~4s@_V!d@I~=x0hzhJJhY<~dV^QDVQ0+Ti-N+}@b0@G5zx8( z4M4sT7M5x7_s@jCUmpAeViDEr6oFs?TwI$77^Rz3=B0F{wu$A89hXi$R%?1-{AQMxVR)Ey!&ws8nhduM#dmGq!vm=N4T`E9xB?Y zjt&A{1?bbKfL__9b6;dDv2TA*Y}+vk$Bqp}X$f-=TKpx}5If6aS+CB{DMVhLyaf1? zNY*X$W1OQo{I`|>UjVDJBl-nE@#$w!Fviybqnl>{LjAfTpGY2>)N;l?i_9r3qxsV| zV+euzqM>)gL}`SWj6{5}<7=p^$ttsT#Dlc|2XyX1Yumn%YPDLxj_q2k{YiG&O3uzG z4h-ZD>doB0W(T)bhGEsWEgkx$tl7%O4gB;&hq(V%RKnZOPm85Xd5jsOghFAM&7ze= ze6sgPytUzfD6c8kfjmp)X3wjo=WD2jt&J0&p701>9P=RZt4i_Q&r9*+QL?&P)bRBV z#dq`GLBD`*2Du-(R72cJNDn>;E-6LMFMt=p{ZcaTCknJ-TH7s3a{TV%#S5`~`OC!O zoc?0=#$ELkN@W>5J#PN84_ScHb=!@)rV#Vr88-vhB`(xW9srZ{`n3&)Rl z$H~|MIGfl9<>jHcvARawHL_ZcZr%1{(xmkSV#g2?QUWV0;TAmOjn6}UJ%?k*J7LqN z;n=-%DzbB;^lq|_2Y;s6Sph*Orz|XaYXKg7Xy+xD4x=;!)K z3h?8`wcCBtrZ2y|NN%{~Xkm-5k8Z*{TfabYd4U|RDGMs?aXU*}IiZu4WBHu0VkMD1 zl|qThL;}B@^BQc-EZTh^ad85ke_p`;{R&uEpltSRyl!VFemZdA<+2d%8KXuSsP@jT zJ(>;|S7Q^HEdLxYZQi7quU3n8)2DNI>n#PD$cFu%t!EBl32E@ytVD<{&2mj_TPr(E zq=kNN^!*5O^~3iu+ws!+kC0cGMI^~aUJWBn6UGqxUpo5*c-t9{aSO@G5LrX#xHz!f zG{Hp$>3#aebTWCBa<3ryeT9W)cvsSnMjS!k zzNZlwP$ehd-5$XA`yg0RX^fa-f!MWcAPyZGg>$LV1UPnWy#MNZH#NyapQ!D)YZ?Rk zSor$Z$;RRB^{juU08}`9xHEoUI|h69OhI8$4_rP6=or_RlhZ}K^x`5cSg;Yg0+bvC zfk6KNeea_jlvx_tzbklogIl!{ia~?q+DC>S<@Gg~xAIl&PmRHn=}%$);F-uQ&Bu#G z0N2NCm6ZVt-eCDVN{RJ;wm^%f1uZod=+fO(x_5b!8Jag`xVhG)Z#gZjjJn@7QW@d)XQdJY! zXO`xou(|{mCguon^@j~H|BSMHyuRrZtUj_)w~-kOVADZ>Z%)FvZ~&A*YroX}cwzj* z?atJ_YHKo~KNSm*%2%Xk>J)*465?VWin$_qWAPI3pFi({XP$WzJ9o||urldD;J+Hg zjEstjy&uB(30p97)FFh061%n3-i9E5{Xp2*$RRn!8T@$tjasP?$@916Yy z;o%1{Yt|2#JZT?%{c5i9$^V@~C$E;0(lQfl{G~5eee(cfV@K;-I2w}ubFj57#lnSe z;)Umz5s2zu(`tE0JBi^hl%UAf>SDK9);a_H(PP1>R0e|H}va)n$P z;E|#C;PuJ#;Y?(2)zPhZbMt4&%)dbUon`AA%c0#+H^AA(5pT};Hy-FW0g84iBX%yZ zdbNOs3wYF#1?KE5q>UbpXD3YLwiq%@{ci{Q@o^HiZjt81C#c?PY=pa?pMa%Hf$`(n z22*s{M$^)Qe1Bpa-q`#(vh&k*i?1+}J8Q|Kr3uc&?th&3E(Qlh8vX{Dd7BU~cLGwd zc2Mjk8v_1Uc<_%B@SDjTN#2m#xA(xJMIRtNeSm>k+BNLfGzUE*_hZuJ%@{HA2s(AD zlAEtze(&Eknh00iyQJTcz=d=h{Pfd!oQR1g1(%3v)3zZZq5#Im(%%r|uTK%E)vRHM zA6BiJK}2E}%F4nF0R9}wPBrei=Tj_R{1#kX)Urh(G!w($O!E8`$#a2DmIWtga4Ww8 zKVoEu06rVXGm|iP#fwPGJFjb^q^0j}s6pSZthnOS= zMA6I)PODdQFYVih`&i?ZS+hjE{Wjq3t?ZDEccJ7WUfH+|KOf(!3$HM?kbV3-*`o?# z1sY=cD!P$T5yP$zg7yl>*YM^sh%)A6`)p{2=piCYCID z8>OW_1_0ixn_Kw#AH(cf-(cpacnCOU z#|90ursYqqeg`Mg;)u-dleKZP-n?{`7u4_|?leLW?cCa_Gys=0*$&?uEJi?}D23 z#LP~C4Vi&+2T#Yy&_1%j7S&Y9_4rxhm!*lWs9XCVoWR}52~yv_z{!(fjdbOv5hsWx znQ@T1(xx%i1;F|Gq!TMMLvnIBnarj)339Dh3*6jdFl*NTu;lHhNx^=Ckt37g=+vUG zgY-|y1ijID`Tvp$&B^j>XQ#%95vRz)`3^=#7m%Ihg@#6#8<-2-d%V3o7rn zO;8iyucLoGCqYpp=-%e(3F-Uq!4K(pz-PnL))^za^g|U{>}ds=MD{iEey^%3#opwj zXwbAE!Y2&j9)TDb+#60Vz8D)m7*T$q;JNlE60)A)|9zL0P*=dhTq+I<62AxxuYQ z_W9$}|Eq=9-0ULy_T7Tn_xy-);}U4oH(djKcgFv(p-T#5ZoK#3UrCH{9kKq=_-e(I z$j|S2O>cp=hqZMH=FIs5lP2%ixlOB85I*Ced`AnuPLPR>5D*Cdo0U*RN5fz(^R5^I zS3UqAVzxVpCX_Ss`?GX0z!5vHcNB^UD>`}=dO3w%ydkz|{m z&WBW0!KAKEL_`GO=x8`l@^Ns7iWdLa`BQMRcElGCy@f@?XQQ;P3Lo!TgQS!g*xI__ z;X%_eyh}7b*!>+I`T7;)mgmb+KXJLK@N@P;u$!OUk;^c9k2asZJ&1NeC@O?_;R1M# z27EkiwoKyry~sqg72)n)0WmUcttIOL$=|u$6m#H_atoHD$iM6WTd!t z`gGxID=U-=9aL<=&rfL>&`(Xh^@(C66KZf$Lt&xhQc(`ij0_mD#GWBTB!kBBdfB^S za9CeFHexpV2X>dkw{|BT!*>VQp_bUci&qeWU48MzfuHdC&Q;KmfXL0(n;T(eYKeZG zdLYarK<>C>&|zr_Y0zMxwpMP!!jTEeohLbsma5 zE(%V7gJUwL&sd73OBZ1A;uRP+^c)-3dj!swwn)uMhL-iwCZ$wf zmIqOx#Bjm`Q&oHSvxv_>m+-*{yj;!Q(Gi(lyGkGX`AJ9EamMWg`pVl$^YT^(=n?Y9D%pAzQHlMDt{tk313&X*%{%Im9fG&2!-l|=-+HYljAz`MVG3k`v; zeEQ$g0$$ySNxjG6l}Z0XR}V5*JD@nJoVjaf2kF1>LhI@V?fdURNhXi-gcibmDq>Ma zP~6>uyQXbLQc@7U{q{*>I;NNAMWw1H%V-DY+_w@_rXGcpQ}Z47&7EX?K1|h_AdBn z)2C2ZmtoX^sd#7VQ?NB{e-hTVZ4$ozni&)d7@LUY_uQ-fN%_AWIm#?kvA?X5()SP`1tT0GI{BxdHCkw&&XwFATa?^ z)MX6H-=(gH9VvnrC(XwjcP*3~ugHhE9k_-pl#T1x4axbSBEnvLQz)k4HJ_Bj2Q7TvHC}8bFM_MsBD;k>R_kk7&*1`rnS?v!Go`L9quI;{; z%uFrbctb)=j2vcOJ9v=z(*tv`%E}5g+71qcw0F31H*=dIo13?^{AHrXsvzg&a9zGz z#r-?xgklnNe9V}s#V4N-OSf0RkSze1aD1}wN4!azzrL}Kn7u907D0~FSBY8-={6W| zO?e!V-a)_lY>P&NgxvFT8db2HFKi6J7Opg1r zb4p+2#5rO5_=AY(m46jWyEE<#!-Bs~A}{9IU~5by9GV+2I_V6ozb9}l)};(eo*p39 z0q)-Wz~4eiWcYP3EgsMO_%0I3Vi#Cu7<0YWRl&>E7w^sZH>N}ml?yRSdWV4|iSp-I zb=~$KH3)d-89{dIFl_Sikz&V;7M~qERyq_G#v*t+_W3(?zHzryn@m3~P58@1j74;n zmvg11C1|Rs5c@PX!Z9O54s^kgA^44Nu|1=nz@3F+9!fb0Id7cxz-*|2lZ_)@o%$p` znDGp}?3^!q?Z^U1A&cOv!@uC^^-J-_+W%r}!hZNUd&`ZL4R!W#=?VS)!3`Jy>0&Op zjC479OpH^(^n?aIM`vKzgJ@nMx3+FZl$3?APYa-0NwV15?TJO^ zeEvE3@e^(-;J5A;Uq?4gj2MElrh1&uNrjdj*qRZ|t}ey4#Dmb%ZH9XW!PLlDXTPxE z2^Owx0KjLh4?q5xmlNOY?WHnrZ)q_Z>05({CptOl&X4~VOh4g_<}VjAJ3Cp99(wm3 z{yn-)8+SJWufHzh!H1Yw87^@vt@xrGlDYH91}H78F*IT*-k$OVx_jx^Jrkfac^9zt z%wajK^ISm&G))aU?W8gRs>{&HD;OW#^8&_&4>Y{*k|~?gQm~9Q{;RLR*VoI>E;=e8 zK1&P!xCn)jps!SZXWSVbGXzNq>01Iy+Jk(KR#pR&N(EuY3`noP4uzi|6o2tOHfdV0 zZ0`?vXWI%?)>Q(mU|O>ppx5u}Jr=J|UVt!ne*=A+7Q1(gc>XyKXA-MQIynIL)Ykt1E)~Q;h(G~e|f_``$=_{zkXD;I8|qa-l!#;yF@ z7WA2?q^_20;W(+Vu>pR$xqL`rA&-i34g&^A(6!Mt4Dfey^~F8?CLqYo56cg2z`XAk zFMA_3EX+wfZI6;_6l&_?g0Ot(f%Qq0hdc6D;7~i$4^p3k5pKN2@ap9SU0)6G}E`VAsGF)Bpk*_a;v$Lg;{rg!g ztQH@B$iq;+Y?j4mq)?)wp&Gx$?ZWw#7{K0DS7w<-@(3E38Jl3rz$tiQ_`L{n@x!z0 zKSW_=0Z>y))<;h~OuzGY^yrvL;JC}`ty?$9v0?AO2kEoV!Ku~Ya|!AnBUW~ju2<-t zE_cBH&S)pQCvt@kX>WW^#G+cK24pAr?AhR6dktJbz-=8i5bEZG@8>PS(^fXPSYC*y zN8F15CqwK{=EoPXX_HcJ=0o#RHt!Mcztg61u{AY+kM(Vn=@%8UBX0gLy+nbBu`v%{ zUj;^w=JRZArJ~)tr6C#(Z=ROM$=bAkf1LxwP*MD>M{bBmAmR%%QJj|s7@6vP_bqCe zs*Lf>=(+#L-gSUSQFZNiW;eZ(UP&Nxz4tCCiUm-L3d$!~!G;w@vG;;BQ52LS zz4u;1AfbeG(t9>#liiv7pL;imhBd_3fwZ0M@_BrkQrm1K(ZD5nUX zT1W$aO|F*Z>%g|sHjetwG8Ottv&Eeg5CCQNdyrp#2|91@TOv-(-r5%Zn{~mc_5;w6 z0AK#sx%(9?TBPFLcO_(J^K+?&sZ-g^;Un-1;gP~_z;N^Ssw4MKR@Ti0798OH{aLD$ zlUllOpVY-@)Y&AQWAJciM10lSGURpgTb@pC#0Y}nOD5vtbr|`DSvXE0 zpIusjMf=wxB|ihKssde`cf*r?9zX+k{|o0>b!z16=2d`r6IO`BD`_L_{dXSst!ExqqP_3N%(G1u8eDzUY# zn@U(3=-0Ym=)TI!VU}ez&CVWHaVOENv_!HwLu9;BD4+1HyWIP{lY|oB_ifq{VctPv zw%}*$85Gl<_82q{^(=qxH~5>P}tPc9ZDgN$M8rU8Ap#wBF4XKSGF!9 z0&lyyN#{MiBxs<24M4xD3dqi3x5*b>z0(^Y0&2*AZ)}cda z6pBsNh)s=0wWzUc7KN4X={yXhI}Q;MKwMVFY{zpy&&H|rvp_vh6y&Did|n2ko3w+s zlj}7A{TdsG6qOX#80y_4NNZUE@o|uhm5{2agYF>4zlPezgN_TLgKZ>@`D-HJ8@$j7 z?;np*|M-gfb!knVW@7W|=rO?jd60Vcyuj|SSI@~a6yo^#GdM-0$!MyAqm8{-QG25# zE0f{5=Oyf*wlbL{L`AU!etv9!$?jWKWHyXYR)N*u%E_+Q|F zpOFAKxBz9v@UQ2Cmq$*;-BhTri9W`GwQmeA75ggQJjaDSAJyy zd|pzK*z~a0z0t%sNF1~D@FqO_(=43IN+iIij#*lOKzCofe&2J~4e)E-Jvw4#R(<+H zzikWf(T7k10-%!^tYCt?sv2^42K6Z!<|I8S1HFjU(B#fw_WXI9bM#Q&B*5=RedW6< z+GC>rp^CgY>I=_9KCmBFW5z%)0RQ@7TArZ@lNY>&$#Y*pI$6lPq#mDB@OAM(_wcqi z1n_wtuGeNVESS#$pIbTRg12WW&xeL$XLZ%B8y@$k)VR3#=5_!`L|BQC9C-6h>BXm~ zsh?F=NOg=ME%s=VsJ^gcwFtBAn_SxV)<>FcgEPx!{FoWj)i+xW9HHi zky4Ne*f|Km5Akax3M`L`?sL6c=He>{N9dlK3XB{HHv2uW#fyQ$LZE_p{}-elex)(> z81cKwGGyP{7$_~;=XPcGY6*>rMfBz)dY8m5ScZ)H2?h@qQ8`j%- zZcW<2nb*1H?jIsuiFxORzu(iTo`}l17Q*Kb=g(I#V+IKDMZ&ql36CnD2L(yr@XVPy z-OclyBOH`O*7G|?-fAAoKlaq=TE$SBdoowvU*ry>P zg2OSgZ9gp9w+3(i`T@?1l&E>!LzIl5C_uK>4x|PV~!!j}; z^MddOVtzXr*fJSPIT?P9CCH8%bJ<_uQ>6@$tiKM|-Kz*@fEk76<)X-l0nh zpw!hBUymMRo-0W#$7s~EH{Ou2Y?%t9(G1I?^15J7K$pfX@GN!6ZD$VQ0}lA51pswS zlold7vJ*ZX`x^R2w7V(WsdoLczHdM1)~y5P&4WS;fYq4ua;ggb%cMiwC@{UEgDKrg zO#U*>?Q=`HaZCn1Oke0AwNas)V1j%?r0laqniIgYIqyN!*2g|=e(fMQ)m6c*^{N6gZjm#z!wr*AM!V5rt zo=CgQx^*+{w0FQ8bU?xF(ob&vSv)3yzu3V6v-|gBt93e-Ra&ZJQ=gKs`VWTcYPC*4 z>r#7RK-10`*y%1fTk|rC-(E4#BilLL&=NZpRh3XwOM)7s$w**ZCF!sTw;v}n6E8d7-pU3o z>W3l3zY*`es5G09Rg#A)#Z+gl$(VwJhk&P_mXMO7^S3)iQsgF!JMM|L@xe{O|)Gyi5Ks~eJrcrMYGIq(?in5pGyOlAej4S~6-Z7`z{%Y6 zi0}_VKt1nU!#&0~8(YXNTS9v10jOe$gND&ZVA-bztVv}6PwH+aPg8L z`N&!h{~H4OWO*eM(0```o*;nwP=!90*nL$^%46!|YKM+cUw;kq`|m;5w=ZNz#~ZGm zGYWI@pT+ND{-FM4cf{cubj@CbcY7e0Lj+qauBae|Dvc)bApkWgjUXP-%v>B181Y$Y5$ z3eXUNql1Lo!KeSHi?jCZG2h%kC0X+AXXkL=n~J<#ASaI@H(Q6NrZU*t${v#^D|3$? zl?E`TvkD4Q@!6*eh79Fh->S~J&YTSkG3SqOkyDf-R_nG5YlHX666h7)?iK@-TINIG zap)k}r=LJt`3Gs!vP<|S0X|=S7)_9WAHhsN+SLG-TF1~9eATsZ_YGsz&e_!Z8>yXt zp*AK~3PX)sqUO2rf+pzI1JYAZLGICu6uHfRxg~F;tUj>^Q@(i~sb!^L*4EUgiqN@f zCw%+J8))L&08jon3tw+o0F|%2wc&14Bix+b(U=HSg|QrQY4K1Lz@!|aK&+A`lY#PBJP;S>PI(h zb|ELv)rf&Q`N@oPFjSVq$<|)v1G;XkA2sFV`~x75xLc&sWqy7HIysPXb1cVkPQVvT zuBF%CQ6p?4V5*>N^dN8|CR95)tT})FnfpelPY(3?)UGSZx|&JP<9QX*5@Pe`=zsM^ z1+4~?#vT7CB*qdJ(+%1?p^}a}pPP=H;vBH*D)>5k;@J^T;;G*E*9qWn+p6LTvX+h> z<71R5p`q%Y+3#Vhx3_#;zC|40{{D58d*@aMecs*6D_D8I{%rT@Q)*~trY_WA(8&i5 zNC*s65E;oIdL012WZ_yoy17koxR^FOQILs;yWfZB20jA2e^{aCAepx#zjzL-W45Dp zgGdCr`P?|ykE<(Kr%u3_(LlRsu+mbp)w3X*sx5h1%+vzO)DCOt=y5NK88;ltAaOR(PQOKsYy=#VsoBfY=Bf?01X7&Df$=eo~4JHleSgT(x9$d1^oUyc*uiX zS#eoJfC%-pCE#yKAkrMZg(_TkKEADayt5--tvUAi6w^F}dBSYR#uS=8*ld-ih z#etqhHU)+agFNb9=o*LJT+ZdIkf(o{gSi_Qqm*M0PisQJK5f9mm@#+)JRR#HEk6qz z;`U-+(sBBjA-X{n1~>1DKzHwd-QpbZH*Zq#^wTmDVr9qtGdw3{#?KK6HCP^YH0CiB|lhr}m*$OgY zc~R$2R(yd{QM{!J-mac__3r=R;m&u7(6yTfuq?iRIW$z+S#44Y@Na+6 zzir(+CNrbH#F>PI;$pd|S1)OIcD59dmL^41R7leP{X9yHSVUVIc)A*7`d6-ye?Ju0 z#O}t+OFuxd+2XX7^j3Ikz$2L2cQlSApTe@kn*`hUc5%P)&j2;Pe|L9C?K=PuKMeNJ zgJ7*%h+NoGP7YXQWsP#6T?PX7Q~W0Bn{(;^0{Z@T0{(PrIRinR4Q-B+2;0LIA)&X* z+(4~A{^AvrI?JWk2e@yZ?(<`6h?%te9on~)j*g+D3suoRwbkF4y**gx&S1|zBV0E! zA(GUiCnRql5q);Ew#A8zbNJ8VS@@7xd~8-KIy7km-@oXmTp9EXZ->;vT%1mghe88T zRm?b?6h~ldkG2h(LNC{)6{8Bk|M@3|=LztWk}QB98OgTKn2zWC{IIWfN?evDv1#s| zTb$|h<ZLx#9|~XXvSACb zeH-L6r$x@6KT{uyM1$Ui0Ifc~3sE7prF{(uBpWd38Y_@pY99@&u?K2Z?2WJvq)V7% z?M)Nd6Y(%7TU<3VF?kN?>S?;KBm%i26*~1VGQe{Ge8Ui^-Ma&Qdy9D!_y>rP;G1nS z_OIkrRx+k6coSQWZWa@;Hr3S_O#Snt(K8U}>h+i3D<~_$`1v!j^3W!WRbwoJyMqhf zzJEF%>wZriU7cmp_Pg(R)hh{^nR?NxEn8yK3oo!|y}S@xW&rH$6=7rD2~7VM(Pwod zMMYBflqu@d&dy5S(qE;qrKLL8cW2AGynF?(zix(`Tiv*Nu2yo(3i0`tA8{__BpA;y zSYCpNz%V@7>p^%ryWz|2zhd{9Bcf1yMs_ORTl$GGhac;9&rP?w&f>%%sPgm%1`QS) zGn>Rb0Nc71(z^A)u^8ZdCM1*5k`9`gp(~~@@-3FO<(6|WdK9Xc9*QTu^C7^GqVu+( zLEMm7vKy}zOe)5eXNr_-ep{`xuu*o&899TOD+m-y=o-kHL?K;Unk24OItHLqPqzT6$gHy$}gtQ{?)zy=P0)VGhwf1|5$-LWfF%dH@RZr&Kuswa-5oIr7T zDXMJku<^)7ENR>VQ>hPI{RM4ycXYv=d!I#NNg;L}-$6r9kERWqp;d5roly`|wSw8R zxzVHtFS^7Te~+HZvb#s;0bLYSg>?gBwFVthlz|NnCl%IbA z_=KZ`tTQ>w1eV2>0kQjye80@?Q?iB#ifMxzpPi@op0wMA-rJFt;7UO4Bnbd!_S|~l z3FmmE(VzJm==X~0*Alp!N#(2V2-xYnCG@(2td0_%tc(LYz2@0h_{#rk`kd9yYw#%%Tq9trT^Aj5E)CZmgD7#J5uy_;!P`N zl(^Nyr}gWr)rx{CdAYLRf(4LxS+oy6P!JJ$eGF@!e}s4bnJd2{9FZ**;AII9cDV}= zwI2+V%JAF1HHbTNn81k4Umg)eCa}qDMkNirTF^h6lY)KcViD?9UzB##-Go8Lmt7IB zE!VUuB-)hm69^*+CiC*ZPM!dglYxXpQV0jYGBbdj90Fs*CAH`*GoCzF9kfY2^-=o8 z;_vDOjxN=>gXBwi_FqASbkV1N$)EHm6U?=i1iQ3{aAdM~AjRVe)!P@`cfguP0Kq|E z&09e7^|h3=yyQE#>Kca4@dxnE+PT}izJfA3_69zgyxtSmw~V%fs8U z)dDeryqV7d6cs=^lR(NK4Xlt}rzC-$I!&+1@+m2WuA~?;cgh;8E`X_YiHk?~H{3lE zl>eV;TUik^cZTZfO3%R&aB%@b8_^bONm=dh4}>)WBQsHNVZ;YIV_wRcaV~g_clhkV8KQNc zU-}`I?Olm7-j{WHEZnym{aSQI|Huw?bfpXl=gb1|SFe^~s+O3)zmjcluY6k14c{te zsRVbp=}lw=YH8hEZg8``y$opZ^KObn#X^;fasGWxKL?5@-HZ)le(Sp=4)4%Fc#d zT+FLph!8+lS_W2BWQhjiAj})1yaMvMb7Vba1H3$7BLZ$-WQL!MgAo0f2+$=bCrbh_ zM@O)Fu26{`NIrhB;#H<>tif*LD4M#KY$7BdZu}A7ZC!%m-1E>;8w53I3TGP!WR&Eg z(4c_lGt4Z`LmnxBrv4$A(r+|gTJj!p>Am9UieC#yDD$p#nIcAZf z=p7ziS5ykScA4NrU2Y%a@> zZWYBMstJg!i9L2{)C!K)cG!7nJ<7z6sOrUvo#^oNzK7onE-w&{a3A}#N){T@ceOekZG z6^A#_f14T?ri>|r9>oiE9{+lEHIu5~$Hgk1e@;eLmSv`-X{36%PapOw>7DIMkQWD|--na&+2)^-QJf3L*lpQ~uN4qWci12?tCm@jDw7Gx zIcYHDrNgq2MMbc?H~K|(fTxoiN-E1xTvjAPEz4~k@#(f@sQ+Al4FCLTI-Vne;c zc_J*c#ggKy$tw-;r*q7o@D^s>^Pf5ce1k#7E3Ys-_9$uqA86iO+40CYHZ8C|)>l_+ zfUhzAzYyx@@qvNt@iAk}nF|-{AFry?>lQ8IbBktt^s$8IQF_!hVdid(U@w2MaVes~ zv}n&NoJ%}m;iA@h^onecyIOU}qTQ=tva*Gd2GQ~(TVX|zl#rW7hgqQ>F|P+Y4nx}p zk(lxOr}%KyH!$%f?lfSxWF=$E;f;8O_D`k3_;~k`@VN;VcxiI;h)R9xc=~C~`r~^f z)@*^F~owtp@1N{jGE%r^XXaIHv=rttE0oS>LZSiN%@ zlxics9{(nt<9U%6Kc45#*Xb~<{Xo1oavB z_B1aUI~K3m+Dd15T!1DT)BpdOjv2Xr{+RLNOUiSyY)(`ZX5P6|kKuO#%YQeay815` z+0>DoJbw4pughh~3*cIKj+UFQ%Tt-n4j>S5-ns1E^2y zUKrnX1okDJ#EOF(VWMLsGPj!sHo>q?!{O&23Ij2%*MEE)xSy=h zAf6PE7?GJ+|K9lh*buh|O?-lhWITe%pa^_8`eiI6Yql}%`}cs)piuwbv)hc3BN>+b ztmEUh8c@x$1$?~%F}&RX zxY|47d{HJ0G>G{Dy7E#?=zKSRdvXreO#K{fLz_c(^}yOaE3k0a3KW)=Y7biz5%uNo z<_(>-t;l@IVPV~|Z6cg_U{p6e*kw2z`F>-$h-4jQ+Edj)|DTwSRgR8WHT?y3bcgopa*3z&F-w^Jo{TYLfFnm#>f?3qD&!Nc zeVcW}+GoDP?w1x~bcaE(x3;X-^meKTXI?a#yKVSZT>%HZ6-Go4z|iJh#W5jXLBzT| zg)`c0YlpX1e}$!oHljsfV+48Dhpr|{<#5U=tdHM|(cip)Cl}2^OnL$hQmqKe?Jilx zdH8bcQhdJkmy4jUvqJZ<)_An*a9Ep-B68_mRti=e-i)ehBOdB76m7%W3P9%}nzjTR zof}4>Gku3kYJMhJs0pId8h7{9BR1cmaZBpU7Dn%E=TJwvbQqG76#VBu3{O7|l$P@1 z<&qK}&UTL*uTHXez(VT6mD*GO9~g5dBwRBZW#RwhnP~0o8P1*&Ykqjp2kh;5*tG;V zckYsuaP}%>+kQb&SqXYXb%C3`rIex_XY#Th>&_fT1pzxBV40-_XyO-& zE{$5iOl0J6(g_$U3^cB)P(bH%b#leYj6^*B^ZPh*`jDt!>+bA^X9rKh@RmL6G-8a` zvE8@djPVl~)~&OIQp+-{>eAKx%Zo3nlS+!EQ#3ABPcM!MM1DfZXtCzW79m#SW@G@q zK0t#85-N>+=tyvIka^@Ts;ha_^qrG%O=J3hPk7|y^cSYHsU99?9v^8;PPW3xk$SxL z8Y2b5*XAp@)(OBoXpnh2Ig6NnloX(zvpdH27>N!cQTSr>60y)Lg;>|*?jtdC_>*ua z1t64z&IT{de+|DLScjRzCgIe(>oI-EqbQ+)&y!w(EQt!U3ESiLVeB{45&7ypczn^@ z*md?8s(8jvO>TMNb!M0CTZ<%Knaa@>X9_YfZ};yPfqx z#uIx`SYC=zZTn+zt3CvV)}rdwIYSX9|MU*V&3grB($5IXvt^@JnD@j-nAZ0JSn2DA z+4Iy1217Nz`bx!J!}K_ONT9LN(a{|9*kj6TpMNHgCVZ3jhNp`gWUUC| zP3Vifyvvmu%djbKKfc`hE0!PKBC!7+DLInaOZ)s)w z9dtaG6?hturPEhYh;%epxk77}F#6AV93ww}8aq!PMH#V0O>O}3fhD&7SlSu9vFdBIdFw%RfA?X0 zzGg1c`3hP_kZnz<=;Q{IqTNMK8;MjDpo}j7BpDph5uL)@qhtF)_g5E=mG^#Ji*}PBwh1n=7lH5bR2@%)Of5puz?1B5+*Kq13w?$fSlq&98HOXnX~e$ zN;LKi6qCJ|%I5fkIG%X?LdadKfQEQ))bnT)6pj@~w_?Yc!(>&ogAJKCt7CT(^WO=z zvKhW(1w)&4!Kytgpt||uTz&?Y>|c+rjaptfuLD_n zJhu*M6(Ru=Y>5cyB#Vze+^->io;*ibd3^PF-H8H|Nd;dF$Kf?Za49Ur`PW~Uo@w1mjs5r&HYqPp-z+arvY#^X_??*yjhFB`k z^QW{3Xo7Ix2I8~3TJ;ngm&CmDIF@n>YDF0&VvBzDyhX8>t)~v)n?Jroxl)bBAV_VGTxVX3^`=Mp*SCX+6}^tK@(8Fo|j0vcQXAfP9&Wq z{%iw7Wx22t?<0b+il;v&wqHqoV$;c8`1MFzjBM3Q1Oj}$?H8Qli2(K1a3D(|jDX&` zhA8le93EL#x1!?oX%#bH1%CTYhN23`Rhg5MnmBG8TQqQ>^x>*iOq;0HK>y|vLn#*A zJ%SxbN>-oQxKVd6fxPqP%|J|yipfuy@$9oYI62Cf80U2_fo?wd{J|ITNax{LyzdXJ zJFyq3#W_&Py!Ru9|H7bgc%c2j3pvZVoXJkb$>cao0wNn*c)5C_O`{fY5Q}s!N+kir z?lZ@*Gj6{~?H~~#gw_ui%4WxjT`=(#!~`g3&nMz+ay&j=HxF)fuGYa3=-#+Bx`wqu z3sMk{bq*MJw(xqg4ZRy6hX9>N&>TK{gn<5x0R2-LiAXKXuE{dW=cz0fSagF(+})-R zej{*aq}&q=vhdivnIZ*pE-8D<{n&dIN>8GAz6Z`i!Z+-V&_Ec`J6q%oI<@meveU^x>V_>e@X}GUeMfY>McHk$Br!fy|;@m=y)}J$&J4YyV#b+}D$0i0A2>iShB- z?yezGA_Vlm?ybBO`;v|$m)JgEwdq6v!sEBw1U5l_^Z=0$C?@q3vP+9#=3#vV7(CQ( z)A60ybaX59WNo;)xMOJZZkXJ26vBLhU_-yD(`jAMK+h?WEHj>hgGbMFZPFS(&TfC} zyPZOtqi0wv#1o@0ad1HzwfVd2=Hu2&NDDmH#Zq^+p=SV|>^BC7 zQsa9}vzZej zwbahuoIYg=erVD}`ewlblzV6?qBPLIB?hqpKlkg$_DB+YYT-gWOo-}s=#Ut}^Jh|8RgTpswxf`{2DmA2XOAx7(P-fA`(KE3e)AAbb=Fi(g4{Ms>K zE*?6Rtuz|(KC$~a4MjB2zvZN;2x*fiOV11$BCni2oxPfv$l4eT%w@qs8SBNi^lg`udC;u zT7=!h+hXVR`8b=Kid=d&JY7PlXAs<->IubAx2_yZ)wlWcK^CusbLTD;xa6fvlWE`E z_Kx`di_e*s3q%9`TUYpaHkq)qV@LMTkRi&Xk3W{5AUfrqn+v@9s*2xNm@$h6K;J&s zraIUEl2l@thH9gj(BtWuyEbYq0OU%^EY8Qi(?`IH>B7m>_axK5N0YYjb8){6fYS?e za5yF262@6o2_FX+QR}x?L^Ng&9EWN%v3)}^-d{HlC8kQT64;Xfe_&J>0(`lK4XfCH zE(Tx!_9-d};Ptk4m@;rYTGbE7M;jKAQcw^{iXh6r5yE^LiWJdq_D&*Qg)^as)pd3k z@oc7tNEt3YvJpp9PNRqvq_wO^s84;2>ogSIshzC#Rzg`hbN3o|x9|bo79#2Prt7sM z>&llHeXyG^T2Z@qY19%CexdNMcXbuJLp=S_t!aDgN{kWyc#zVF@(IR0ZTgCJ9si#= zQ2TOae{Ds@vEvF}oDOW=szY^k?K4tK@4sLDH78q|Z8l4Z+L~Go^luv}FGu#!p_n;h z1p8&`RMVSBkFuVMqIW%VNRPYjGSSBH{BshbqWHp)>!$!_3?7f+ZF*tZp^eyb`Vg82 zHG$O?iLok)IUY!g#eu}5!tbx=fEE~r_KjQq7vnyinTYhfbg-%l5jEsXz~fuv4|a8M z7XNd|0?0JvgYmk*^nE)5>`UEARn^r<%*%jkZ7os(IN3Ri@{u`Y6=ZNwBfyMFIf=!J z%IPX3`WY!NMicIWEtg@7K-0Lc=iak(=+7@?{1Xv zgoM2M+?)?oEdG&Kxiyo2D*vw~hC8AZ7`m6c>^5V9^j zoIQz+UYxDt3&#@jQbl179w+W(V+ThY2P9;tpsLmjCX>3cvZMc2BE>+J*@#?HG`WQt zIBu*&azGYRc^SaGr9;E!=os1pvFFdC($)b=WF|I0QA|sBU9RiTG9vQvn2?o>m{a?S@|Qw#^@6WQ zAi9P}6T7~=>l6@!kIznmvAUdyTonR+gVDNSGt_f*xp0g^H=mfB4g=5QPk?S?V}&r^ zK;dGz0Q#gn;<6H9t|`%HXJ?OA^~3OBhyEDVt}k*4P~$U_u;joR9Oa>=q&TbzFE9TRSv-FYDXis(H)3p!t0%-ige;XfF>!t> zI~jLHtIsM_xC; zFDf!)(IN>Se+VR}UhGrUgpVmIn43=--J_K=|`P{rc?3_U+8mmn@O* zG8(M{i;9{2_AJhlOql!xR{#=xd~Qs(49*XOh|%}!I0RXyYUC8=q74CXo0{|wmr61* z%X672sID@KFE%7_<8k@cm$-{cjpfKJ$rbfiISaNY#S!S{E8HvsG6)GuD-FmlDMIb! zc0;m68h8f4(b^tuf-S!rK;PMLVmBCHaAqz=hmdA?vngNzBi{ujOk+ zj(4ld3Jh%48J~=K3BF`i@HGedrNua3lno=jZcN|1npDz!0n>pqM??V|+0GHI8a2l| zBc~wL(_;OM={OYm<)wIg<<}@Rm!Yb%99!b{iL@CZbT8b;U#*%&Im_a*LQ!T=NB8Fz z(gIOIP2l0;_K%)d1hsh>JukjGdO*)nc%Z`|MEpO|TXiYCu*sqy&G_gehNMLP%tihw zrqh{nx_8GPvu3e(S1i{h*OcJZL<9Xhm-y3`O;|T|=T7y5mtQu$v~3&iGMOZ=fozM~PFc2+FCcei)G?3fAy&Ru5?BfTKg z5-LbQ7$zcaE>b;#jXmf*ilXhfLsK}&qREv27Ch&)YJ72S4E$Kwj5KpoOyj|SI zS^@bg3w#ul)lBIcOW^L^0Fi#7 zmMUMDK?D;no?3s3y^S3L>s?&SUF23Njm=wbkz3vk=20R@8Ub+Z= z<%*(+Qh*%ac;QMDv37Pvq#=)*aj+) z4@9A@0+&Gm+6~F%uy!W0CvB#y0y%@-kh`^DF6Q%Ftd zcVZ9BJaUIvzbAoXr;w=sO6+B*F29i8nMd&06R6wjFCN2V{fjHhh)o*=o92w1RU2Wd zst^cNCJs^nQXFM;4d$yT6UkedD=Ql-%g`|q0H)?=p^WFXxg?RD4PB2;wyM!@Ok_Fb z;hl}W0^sTC2c(}C5jx%8RpDUaQ8hb zru;`js}?sV&c9apByjV9#$ub?eH4u5YFP6k8eH6M%~1+yu~}fuU#_+~mLNt5y)enrr3-csM3c2W(??F|`GE@9_Bp zUJQm`gf%hqc42MMzgZ`knWaWBFEnz#AOoGl+rwUeby-3EiJg19c;O^nmr2s&K*Djv z@kM4e;i>$-V>8a8kjKo6Mqp^*;R}1ZFMAt%xbbKuy+yHQ6=sX|4edj2Zop4UHsPDE z85S+nAuIcWrOC_16%p9S^y-Bl^762h`mGjzse!&G|3)e*r1fpvvh@Q8nY--XjmOum zlllsIQU))z?bqwennjyx5i7uCgGK( zA0sO_6-KfOVv=Gl{&^0BJodh#6#gFmc&_glQRwATsU`p~B``NDRRT=86~K?t$@Ow@m(SIJ=9TqsUge>&zi+IJ^;x zwL4B^CgP#5r<0LlFUknP?Jbo9rQ%{BCI45vn|(KE6gdPhXV zR@U7Fz04A0Ur@mC>#q#+=1GW&k+{q8f(^wV!GHnMwid0VZ%a$qwsNh8jt2UgTyu#j zEya@q`eRm9lrm}ddl;=K`XE)6apsH)p2vUIECs`cN+R5|O&bXpUE()S&KjQ6|J7lS z;l&{nEa`kp3Pg-PFW1M5vDjMuc_z}L$}(gZXTw}kCe{PE*x10$(fO}c4S{);&KkcQ zSdX9g{UIz0i4==-LtlQ0d-L+- zKtdjGgF&zVaj}YDepS%Eoe87IN*FvyhL4XP(oL4DjQi{TT)o8hcf{A(6@8j_MJ2I( zo;xTaC{pB(zf{Zw=EX(>U?{Ob8Xe1OqlWmTF8wnU=K-WZ40iS+t?)kyA8+E@081X9 zgEg@`vG&AnWR~QM-w7fsg0C6i)y7)!)E2tST~Cg-wl_`t7Z)qouwKEBi-2w08TG3R z*nGHZ9itFV=~&b#<`}=)bDrg!Yb-t8q{l`ugOg)RfK<=yu7gahaV)r z)2DIof(7iJtSorbK(3#kFI%l#A%SlV8xZjK1xAh}MbMGK&aRf_-W>k_tFaRFf8q=0 zX@gtV4-?zpb8g(Onfz;08uN5W5{?~XSh0d({dyTOF_+pN;`y6gU2$^MD69!@BK@>( z9Xm@pQPGB#2Kt)Z8Y4Y}wvY6Bd@^&U+TqwS^}%i1SOd{}k8T<+%YSEg#l}hzRaLr%^!RPh zoB{au$)^g!o2cmB%Y^=<1lqTk;ObHf5R%rCw+QH)OlBN8%CLHsg!LO3PM(xdRdtyn zH|q6jYQqpEZNvz9c|?S|{Ik!Ht+ky7`kLH+!WW`0HW;w@r56#Am1`cpayc82nTb}! z`0P|gMqC`<7%2b-A8!SNho~5JzYeWikpgh#`s2o~0np^nbh;U(CH%PoD^@C4zJgb! zlEGB@3JXB3^zdLO`}M=NfB@;2MT>A$Yd;P2HMw&nJ~tQfpMNgD?d;4Vep{vvS-l2> z($ghU0C3>Io}DA(`|la%&SmiMP|>1=gkHTEdi7SxB9P$VAYI{7&=kS72Y8EHhA&Y# zn*eOt%&>KfEDDV0H_IC@MXpa+i8|Ew%M zeO7y%?lO?Ku~o7oA`suFH{0~+qgbhvcmk)56V`L zJ&wlTerxW#V;g!TBuI^oRm_tB-Az?_IXoFVcQV=_+zWi|QT;%mRVx)OS}`CrY&pzqf>$ky8;z3iIiF2XvE&yEU^zH4czQ|*43H2V4Rr1TGzw+#_6A&C zsUzwyWu?+zyuK9x{mR!C#$8-2fxF4l(i!&bp=}pKa*AbNNy(J}e;G?xb$XWP<;Bjn zY_6PqbRt{(-S@g335hUhB?mRpKwp#VCA{?2ZoXB~tK%_d=eUz{v%UM!_RwM0CgCg^ z6y(bximD@PfC)uVUZ$rFNJ$2E?E*gdfI+8MP|t;-eh@=wBf#5>At+EnvnUB}?hMXO zfS0$9{_AjY4c3*)fn5jXaOH1Y{+_2^;LJQP*MyQ%p4x!73EgWNke??ZC6ysDK|)~> zPhQ5;K zr;AYF?`MXOFDU{y9bD_FaB@=NMe3wsLmk}RWwD~z#s=V12#$^_Z0%&IOcupd?Cn%I zI^ch}k{HU%87hsE&{2GzqN++knZW|m)h0&Pi!AEECMPS%$RLof(4m+>ydYmeL4k_2 zGzt0nR`fjye~*EaN|af)yBkXl2xK{-jpeg_`rv@SKaMS!kMk!^Xceb4(Li65Tg%UJ zzGhp;-50(4NEkm}?_x5u(7n5r$e0+kN=ji3NfEdf6~U{b9F0*^fRF<;Bk<(_nvE2zAv9ZRPc|R!m2M%d|8cj6N*W~sTp7!!c&9+eZiK>9mP}qF;Eo*Z0DD%tAfd9Ef z7LuH-1{W5>t)xV9Eiaet$btxCj9Fg<+gjHS6Qy#+B&JCwMve>nxpLsHmXwtLby?D% zxmy0hy>od~j3mj`*49XLbVQ|_n_5_}o>b)R#d4Z9MVy}>J0H{lx%FIe=B1ZVay~=r z0Geo^uZboC`)NB~vt1_KU9^5Zsm3Ma61WX(?bZ=#ZMike;s6YoN4LMr9>; z%`keeB0pauW^aY74_j2>R!@bCt7VZBcQMs-Rp8{z;NvGFI9P_0lL8lKvLak$YYz|k z4A}~81`guxC+$IMa`TJCv=9JIG|@y84fHk9L=#Ok(Li4lO*GL&6Akn=(L@tXG`SVz b{{$ESKE1WQ{*%fG00000NkvXXu0mjf0MU`m literal 0 HcmV?d00001 diff --git a/browse_datasources.php b/browse_datasources.php new file mode 100644 index 0000000..679ea8e --- /dev/null +++ b/browse_datasources.php @@ -0,0 +1,247 @@ +getFilteredDataSources($category_id, $search_query); +} catch (Exception $e) { + // Log the error for debugging. + error_log("Error fetching data sources: " . $e->getMessage()); +} + +// Fetch all categories for the filter dropdown +$all_categories = []; +try { + $all_categories = $classification_manager->getAllCategories(); +} catch (Exception $e) { + error_log("Error fetching categories: " . $e->getMessage()); +} + +// These variables should be defined in your main index.php +// For this file to work correctly, you need to ensure $is_logged_in, $person_id, +// and the $permissionManager object are created and available. +$is_logged_in = false; // Placeholder, replace with actual logic +$person_id = null; // Placeholder, replace with actual logic + +$uploadsWebPath = 'uploads/datasources/'; +?> + +

+

Browse Data Sources

+ + +
+
+
+ + +
+ + +
+
+ + +
+
+ +
+
+
+
+ + +
+ " . htmlspecialchars($search_query) . "'"; + } + if (!empty($category_id)) { + // Get category details for the message + $category_details = null; + foreach ($all_categories as $cat) { + if (($cat['pkdspscate_id'] ?? '') == $category_id) { + $category_details = $cat; + break; + } + } + if ($category_details) { + $category_title = $category_details['dspscate_title_en'] ?? 'Unknown Category'; + $filters[] = "Category: '" . htmlspecialchars($category_title) . "'"; + } + } + echo $message . implode(" and ", $filters); + ?> +
+ + + +
+ +
+

No Data Sources Found

+

We couldn't find any data sources matching your criteria. Try adjusting your search term or selecting a different category.

+
+ +
diff --git a/classes/Aboutus.php b/classes/Aboutus.php new file mode 100644 index 0000000..e5913b3 --- /dev/null +++ b/classes/Aboutus.php @@ -0,0 +1,127 @@ +pdo = $pdo; + } + + /** + * Adds a new "About Us" entry to the database. + * + * @param string $title_en The English title (e.g., Vision, Mission, Goal). + * @param string $description The detailed description. + * @param int $reg_by The ID of the user who registered this entry (from ist_tbl_users). + * @param int $fkisp_id_of The ID of the person associated with this entry (from ist_tbl_people). + * @return bool True on success. + * @throws Exception If a database error occurs or title already exists. + */ + public function addAboutUs(string $title_en, string $description, int $reg_by, int $fkisp_id_of): bool { + $sql = "INSERT INTO dsps_tbl_dspsabout (dspsabout_title_en, dspsabout_description, dspsabout_reg_by, fkisp_id_of) + VALUES (:title_en, :description, :reg_by, :fkisp_id_of)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':reg_by', $reg_by); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of); + return $stmt->execute(); + } catch (PDOException $e) { + if ($e->getCode() == '23000') { // Integrity constraint violation (e.g., duplicate title if UNIQUE) + throw new Exception("An 'About Us' entry with this title already exists."); + } + error_log("Error adding About Us entry: " . $e->getMessage()); + throw new Exception("Could not add About Us entry. Please try again later."); + } + } + + /** + * Updates an existing "About Us" entry. + * + * @param int $id The ID of the entry to update. + * @param string $title_en The new English title. + * @param string $description The new description. + * @param int $mod_by The ID of the user who modified this entry. + * @param int $fkisp_id_of The ID of the person associated with this entry. + * @return bool True on success. + * @throws Exception If a database error occurs or title already exists. + */ + public function updateAboutUs(int $id, string $title_en, string $description, int $mod_by, int $fkisp_id_of): bool { + $sql = "UPDATE dsps_tbl_dspsabout + SET dspsabout_title_en = :title_en, dspsabout_description = :description, + dspsabout_mod_datetime = CURRENT_TIMESTAMP, dspsabout_reg_by = :mod_by, fkisp_id_of = :fkisp_id_of + WHERE pkdspsabout_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':mod_by', $mod_by); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + if ($e->getCode() == '23000') { + throw new Exception("An 'About Us' entry with this title already exists."); + } + error_log("Error updating About Us entry (ID: $id): " . $e->getMessage()); + throw new Exception("Could not update About Us entry. Please try again later."); + } + } + + /** + * Deletes an "About Us" entry. + * + * @param int $id The ID of the entry to delete. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function deleteAboutUs(int $id): bool { + $sql = "DELETE FROM dsps_tbl_dspsabout WHERE pkdspsabout_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting About Us entry (ID: $id): " . $e->getMessage()); + throw new Exception("Could not delete About Us entry. Please try again later."); + } + } + + /** + * Retrieves a single "About Us" entry by its ID. + * + * @param int $id The ID of the entry. + * @return array|false The entry data as an associative array, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getAboutUsById(int $id) { + $sql = "SELECT * FROM dsps_tbl_dspsabout WHERE pkdspsabout_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching About Us entry by ID ($id): " . $e->getMessage()); + throw new Exception("Could not retrieve About Us entry. Please try again later."); + } + } + + /** + * Retrieves all "About Us" entries. + * + * @return array An array of "About Us" entry data. + * @throws Exception If a database error occurs. + */ + public function getAllAboutUs(): array { + $sql = "SELECT * FROM dsps_tbl_dspsabout ORDER BY dspsabout_reg_datetime ASC"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all About Us entries: " . $e->getMessage()); + throw new Exception("Could not retrieve About Us entries. Please try again later."); + } + } +} diff --git a/classes/Announcement.php b/classes/Announcement.php new file mode 100644 index 0000000..0e68440 --- /dev/null +++ b/classes/Announcement.php @@ -0,0 +1,213 @@ +pdo = $pdo; + $this->uploadDir = __DIR__ . '/../uploads/announcements/'; + // Ensure upload directory exists + if (!is_dir($this->uploadDir) && !mkdir($this->uploadDir, 0775, true) && !is_dir($this->uploadDir)) { + throw new RuntimeException('Unable to create announcements upload directory.'); + } + } + + /** + * Adds a new announcement to the database. + * + * @param string $title The title of the announcement. + * @param string $description The full description of the announcement. + * @param string|null $photopath The filename of the uploaded photo, or null if no photo. + * @param string $status The status of the announcement (e.g., 'Draft', 'Published', 'Archived'). + * @param int $reg_by The ID of the user who registered the announcement. + * @return bool True on success, false on failure. + * @throws Exception If a database error occurs. + */ + public function addAnnouncement(string $title, string $description, ?string $photopath, string $status, int $reg_by): bool { + $sql = "INSERT INTO dsps_tbl_announcement (dspsann_title, dspsann_description, dspsann_photopath, dspsann_status, dspsann_reg_by) + VALUES (:title, :description, :photopath, :status, :reg_by)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title', $title); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':photopath', $photopath); + $stmt->bindParam(':status', $status); + $stmt->bindParam(':reg_by', $reg_by); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error adding announcement: " . $e->getMessage()); + throw new Exception("Could not add announcement. Please try again later."); + } + } + + /** + * Updates an existing announcement in the database. + * + * @param int $id The ID of the announcement to update. + * @param string $title The new title. + * @param string $description The new description. + * @param string|null $photopath The new filename of the photo, or null. + * @param string $status The new status. + * @param int $mod_by The ID of the user who modified the announcement. + * @return bool True on success, false on failure. + * @throws Exception If a database error occurs. + */ + public function updateAnnouncement(int $id, string $title, string $description, ?string $photopath, string $status, int $mod_by): bool { + $sql = "UPDATE dsps_tbl_announcement + SET dspsann_title = :title, dspsann_description = :description, dspsann_photopath = :photopath, + dspsann_status = :status, dspsann_mod_datetime = CURRENT_TIMESTAMP, dspsann_reg_by = :mod_by + WHERE pkdspsann_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title', $title); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':photopath', $photopath); + $stmt->bindParam(':status', $status); + $stmt->bindParam(':mod_by', $mod_by); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating announcement (ID: $id): " . $e->getMessage()); + throw new Exception("Could not update announcement. Please try again later."); + } + } + + /** + * Deletes an announcement from the database and its associated photo file. + * + * @param int $id The ID of the announcement to delete. + * @return bool True on success, false on failure. + * @throws Exception If a database error occurs. + */ + public function deleteAnnouncement(int $id): bool { + // First, get the photo path to delete the file + $announcement = $this->getAnnouncementById($id); + if ($announcement && !empty($announcement['dspsann_photopath'])) { + $filePath = $this->uploadDir . $announcement['dspsann_photopath']; + if (file_exists($filePath)) { + unlink($filePath); // Delete the file + } + } + + $sql = "DELETE FROM dsps_tbl_announcement WHERE pkdspsann_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting announcement (ID: $id): " . $e->getMessage()); + throw new Exception("Could not delete announcement. Please try again later."); + } + } + + /** + * Retrieves a single announcement by its ID. + * + * @param int $id The ID of the announcement. + * @return array|false The announcement data as an associative array, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getAnnouncementById(int $id) { + $sql = "SELECT * FROM dsps_tbl_announcement WHERE pkdspsann_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching announcement by ID ($id): " . $e->getMessage()); + throw new Exception("Could not retrieve announcement. Please try again later."); + } + } + + /** + * Retrieves all announcements, optionally filtered by status. + * + * @param string|null $status Optional status to filter by (e.g., 'Published'). + * @param int|null $limit Optional limit for the number of results. + * @return array An array of announcement data. + * @throws Exception If a database error occurs. + */ + public function getAllAnnouncements(?string $status = null, ?int $limit = null): array { + $sql = "SELECT * FROM dsps_tbl_announcement"; + $conditions = []; + $params = []; + + if ($status) { + $conditions[] = "dspsann_status = :status"; + $params[':status'] = $status; + } + + if (!empty($conditions)) { + $sql .= " WHERE " . implode(" AND ", $conditions); + } + + $sql .= " ORDER BY dspsann_reg_datetime DESC"; + + if ($limit) { + $sql .= " LIMIT :limit"; + $params[':limit'] = $limit; + } + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => &$val) { + $stmt->bindParam($key, $val, is_int($val) ? PDO::PARAM_INT : PDO::PARAM_STR); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all announcements: " . $e->getMessage()); + throw new Exception("Could not retrieve announcements. Please try again later."); + } + } + + /** + * Gets the total count of announcements. + * + * @return int The total number of announcements. + * @throws Exception If a database error occurs. + */ + public function getTotalAnnouncements(): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_announcement"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total announcements count: " . $e->getMessage()); + throw new Exception("Could not retrieve announcement count. Please try again later."); + } + } + + /** + * Handles the upload of an announcement photo. + * + * @param array $file The $_FILES array for the uploaded photo. + * @return string The unique filename of the uploaded photo. + * @throws Exception If the upload fails or file type is invalid. + */ + public function handlePhotoUpload(array $file): string { + if ($file['error'] !== UPLOAD_ERR_OK) { + throw new Exception('File upload error: ' . $file['error']); + } + + $allowedTypes = ['image/jpeg', 'image/png', 'image/gif']; + $finfo = new finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->file($file['tmp_name']); + + if (!in_array($mimeType, $allowedTypes)) { + throw new Exception('Invalid file type. Only JPEG, PNG, and GIF images are allowed.'); + } + + $extension = pathinfo($file['name'], PATHINFO_EXTENSION); + $uniqueFilename = uniqid('announcement_') . '.' . $extension; + $destination = $this->uploadDir . $uniqueFilename; + + if (!move_uploaded_file($file['tmp_name'], $destination)) { + throw new Exception('Failed to move uploaded file.'); + } + + return $uniqueFilename; + } +} diff --git a/classes/Classifications.php b/classes/Classifications.php new file mode 100644 index 0000000..3924f47 --- /dev/null +++ b/classes/Classifications.php @@ -0,0 +1,293 @@ +pdo = $pdo; + } + + // --- Data Type Management (dsps_tbl_typedatasource) --- + + /** + * Adds a new data type. + * + * @param string $name_en English name of the data type. + * @param string|null $name_kh Khmer name of the data type. + * @param int $reg_by User ID who registered it. + * @return bool True on success. + * @throws Exception If a database error occurs or name already exists. + */ + public function addDataType(string $name_en, ?string $name_kh, int $reg_by): bool { + $sql = "INSERT INTO dsps_tbl_typedatasource (dspstds_name_en, dspstds_name_kh, dspstds_reg_by) + VALUES (:name_en, :name_kh, :reg_by)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':name_en', $name_en); + $stmt->bindParam(':name_kh', $name_kh); + $stmt->bindParam(':reg_by', $reg_by); + return $stmt->execute(); + } catch (PDOException $e) { + if ($e->getCode() == '23000') { // Integrity constraint violation (duplicate entry) + throw new Exception("Data Type with this English name already exists."); + } + error_log("Error adding data type: " . $e->getMessage()); + throw new Exception("Could not add data type. Please try again later."); + } + } + + /** + * Updates an existing data type. + * + * @param int $id ID of the data type to update. + * @param string $name_en New English name. + * @param string|null $name_kh New Khmer name. + * @param int $mod_by User ID who modified it. + * @return bool True on success. + * @throws Exception If a database error occurs or name already exists. + */ + public function updateDataType(int $id, string $name_en, ?string $name_kh, int $mod_by): bool { + $sql = "UPDATE dsps_tbl_typedatasource + SET dspstds_name_en = :name_en, dspstds_name_kh = :name_kh, + dspstds_mod_datetime = CURRENT_TIMESTAMP, dspstds_reg_by = :mod_by + WHERE pkdspstds_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':name_en', $name_en); + $stmt->bindParam(':name_kh', $name_kh); + $stmt->bindParam(':mod_by', $mod_by); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + if ($e->getCode() == '23000') { + throw new Exception("Data Type with this English name already exists."); + } + error_log("Error updating data type (ID: $id): " . $e->getMessage()); + throw new Exception("Could not update data type. Please try again later."); + } + } + + /** + * Deletes a data type. + * + * @param int $id ID of the data type to delete. + * @return bool True on success. + * @throws Exception If a database error occurs or data type is in use. + */ + public function deleteDataType(int $id): bool { + // Check if any data sources are using this data type + $checkSql = "SELECT COUNT(*) FROM dsps_tbl_datasource WHERE fkdspstds_id = :id"; + $stmtCheck = $this->pdo->prepare($checkSql); + $stmtCheck->bindParam(':id', $id); + $stmtCheck->execute(); + if ($stmtCheck->fetchColumn() > 0) { + throw new Exception("Cannot delete Data Type: It is currently used by one or more data sources."); + } + + $sql = "DELETE FROM dsps_tbl_typedatasource WHERE pkdspstds_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting data type (ID: $id): " . $e->getMessage()); + throw new Exception("Could not delete data type. Please try again later."); + } + } + + /** + * Retrieves a single data type by ID. + * + * @param int $id ID of the data type. + * @return array|false Data type data or false if not found. + * @throws Exception If a database error occurs. + */ + public function getDataTypeById(int $id) { + $sql = "SELECT * FROM dsps_tbl_typedatasource WHERE pkdspstds_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching data type by ID ($id): " . $e->getMessage()); + throw new Exception("Could not retrieve data type. Please try again later."); + } + } + + /** + * Retrieves all data types. + * + * @return array An array of data type data. + * @throws Exception If a database error occurs. + */ + public function getAllDataTypes(): array { + $sql = "SELECT * FROM dsps_tbl_typedatasource ORDER BY dspstds_name_en ASC"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all data types: " . $e->getMessage()); + throw new Exception("Could not retrieve data types. Please try again later."); + } + } + + /** + * Gets the total count of data types. + * + * @return int The total number of data types. + * @throws Exception If a database error occurs. + */ + public function getTotalDataTypes(): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_typedatasource"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total data types count: " . $e->getMessage()); + throw new Exception("Could not retrieve data type count. Please try again later."); + } + } + + // --- Category Management (dsps_tbl_dspscategory) --- + + /** + * Adds a new category. + * + * @param string $title_en English title of the category. + * @param string|null $details Details about the category. + * @param int $reg_by User ID who registered it. + * @return bool True on success. + * @throws Exception If a database error occurs or title already exists. + */ + public function addCategory(string $title_en, ?string $details, int $reg_by): bool { + $sql = "INSERT INTO dsps_tbl_dspscategory (dspscate_title_en, dspscate_details, dspscate_reg_by) + VALUES (:title_en, :details, :reg_by)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':details', $details); + $stmt->bindParam(':reg_by', $reg_by); + return $stmt->execute(); + } catch (PDOException $e) { + if ($e->getCode() == '23000') { + throw new Exception("Category with this English title already exists."); + } + error_log("Error adding category: " . $e->getMessage()); + throw new Exception("Could not add category. Please try again later."); + } + } + + /** + * Updates an existing category. + * + * @param int $id ID of the category to update. + * @param string $title_en New English title. + * @param string|null $details New details. + * @param int $mod_by User ID who modified it. + * @return bool True on success. + * @throws Exception If a database error occurs or title already exists. + */ + public function updateCategory(int $id, string $title_en, ?string $details, int $mod_by): bool { + $sql = "UPDATE dsps_tbl_dspscategory + SET dspscate_title_en = :title_en, dspscate_details = :details, + dspscate_mod_datetime = CURRENT_TIMESTAMP, dspscate_reg_by = :mod_by + WHERE pkdspscate_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':details', $details); + $stmt->bindParam(':mod_by', $mod_by); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + if ($e->getCode() == '23000') { + throw new Exception("Category with this English title already exists."); + } + error_log("Error updating category (ID: $id): " . $e->getMessage()); + throw new Exception("Could not update category. Please try again later."); + } + } + + /** + * Deletes a category. + * + * @param int $id ID of the category to delete. + * @return bool True on success. + * @throws Exception If a database error occurs or category is in use. + */ + public function deleteCategory(int $id): bool { + // Check if any data sources are using this category + $checkSql = "SELECT COUNT(*) FROM dsps_tbl_datasource WHERE fkdspscate_id = :id"; + $stmtCheck = $this->pdo->prepare($checkSql); + $stmtCheck->bindParam(':id', $id); + $stmtCheck->execute(); + if ($stmtCheck->fetchColumn() > 0) { + throw new Exception("Cannot delete Category: It is currently used by one or more data sources."); + } + + $sql = "DELETE FROM dsps_tbl_dspscategory WHERE pkdspscate_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting category (ID: $id): " . $e->getMessage()); + throw new Exception("Could not delete category. Please try again later."); + } + } + + /** + * Retrieves a single category by ID. + * + * @param int $id ID of the category. + * @return array|false Category data or false if not found. + * @throws Exception If a database error occurs. + */ + public function getCategoryById(int $id) { + $sql = "SELECT * FROM dsps_tbl_dspscategory WHERE pkdspscate_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching category by ID ($id): " . $e->getMessage()); + throw new Exception("Could not retrieve category. Please try again later."); + } + } + + /** + * Retrieves all categories. + * + * @return array An array of category data. + * @throws Exception If a database error occurs. + */ + public function getAllCategories(): array { + $sql = "SELECT * FROM dsps_tbl_dspscategory ORDER BY dspscate_title_en ASC"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all categories: " . $e->getMessage()); + throw new Exception("Could not retrieve categories. Please try again later."); + } + } + + /** + * Gets the total count of categories. + * + * @return int The total number of categories. + * @throws Exception If a database error occurs. + */ + public function getTotalCategories(): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_dspscategory"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total categories count: " . $e->getMessage()); + throw new Exception("Could not retrieve category count. Please try again later."); + } + } +} diff --git a/classes/Contactus.php b/classes/Contactus.php new file mode 100644 index 0000000..5147681 --- /dev/null +++ b/classes/Contactus.php @@ -0,0 +1,172 @@ +pdo = $pdo; + } + + /** + * Submits a new feedback message from a user/visitor. + * + * @param string $name The name of the person submitting feedback. + * @param string|null $email The email of the person, if provided. + * @param string $body_text The main body of the feedback message. + * @param string|null $client_ip The IP address of the client. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function submitFeedback(string $name, ?string $email, string $body_text, ?string $client_ip): bool { + $sql = "INSERT INTO dsps_tbl_feedback (dspsfb_name, dspsfb_email, dspsfb_body_text, dspsfb_client_ip, dspsfb_status) + VALUES (:name, :email, :body_text, :client_ip, 'New')"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':name', $name); + $stmt->bindParam(':email', $email); + $stmt->bindParam(':body_text', $body_text); + $stmt->bindParam(':client_ip', $client_ip); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error submitting feedback: " . $e->getMessage()); + throw new Exception("Could not submit feedback. Please try again later."); + } + } + + /** + * Allows a DAC Staff user to respond to a feedback message. + * + * @param int $feedback_id The ID of the feedback message to respond to. + * @param string $respond_text The response text from the DAC Staff. + * @param string $status The new status of the feedback (e.g., 'In Progress', 'Resolved'). + * @param int $res_by The user ID of the DAC Staff who responded. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function respondToFeedback(int $feedback_id, string $respond_text, string $status, int $res_by): bool { + $sql = "UPDATE dsps_tbl_feedback + SET dspsfb_respond_text = :respond_text, dspsfb_status = :status, + dspsfb_res_datetime = CURRENT_TIMESTAMP, dspsfb_res_by = :res_by + WHERE pkdspsfb_id = :feedback_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':respond_text', $respond_text); + $stmt->bindParam(':status', $status); + $stmt->bindParam(':res_by', $res_by); + $stmt->bindParam(':feedback_id', $feedback_id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error responding to feedback (ID: $feedback_id): " . $e->getMessage()); + throw new Exception("Could not respond to feedback. Please try again later."); + } + } + + /** + * Deletes a feedback message. + * + * @param int $feedback_id The ID of the feedback message to delete. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function deleteFeedback(int $feedback_id): bool { + $sql = "DELETE FROM dsps_tbl_feedback WHERE pkdspsfb_id = :feedback_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':feedback_id', $feedback_id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting feedback (ID: $feedback_id): " . $e->getMessage()); + throw new Exception("Could not delete feedback. Please try again later."); + } + } + + /** + * Retrieves a single feedback message by its ID. + * + * @param int $feedback_id The ID of the feedback message. + * @return array|false The feedback data as an associative array, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getFeedbackById(int $feedback_id) { + $sql = "SELECT * FROM dsps_tbl_feedback WHERE pkdspsfb_id = :feedback_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':feedback_id', $feedback_id); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching feedback by ID ($feedback_id): " . $e->getMessage()); + throw new Exception("Could not retrieve feedback. Please try again later."); + } + } + + /** + * Retrieves all feedback messages, optionally filtered by status. + * + * @param string|null $status Optional status to filter by (e.g., 'New', 'Resolved'). + * @return array An array of feedback data. + * @throws Exception If a database error occurs. + */ + public function getAllFeedback(?string $status = null): array { + $sql = "SELECT * FROM dsps_tbl_feedback"; + $conditions = []; + $params = []; + + if ($status) { + $conditions[] = "dspsfb_status = :status"; + $params[':status'] = $status; + } + + if (!empty($conditions)) { + $sql .= " WHERE " . implode(" AND ", $conditions); + } + + $sql .= " ORDER BY dspsfb_reg_datetime DESC"; + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => &$val) { + $stmt->bindParam($key, $val, is_int($val) ? PDO::PARAM_INT : PDO::PARAM_STR); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all feedback: " . $e->getMessage()); + throw new Exception("Could not retrieve feedback messages. Please try again later."); + } + } + + /** + * Gets the total count of feedback messages, optionally filtered by status. + * + * @param string|null $status Optional status to filter by. + * @return int The total number of feedback messages. + * @throws Exception If a database error occurs. + */ + public function getTotalFeedback(?string $status = null): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_feedback"; + $conditions = []; + $params = []; + + if ($status) { + $conditions[] = "dspsfb_status = :status"; + $params[':status'] = $status; + } + + if (!empty($conditions)) { + $sql .= " WHERE " . implode(" AND ", $conditions); + } + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => &$val) { + $stmt->bindParam($key, $val, is_int($val) ? PDO::PARAM_INT : PDO::PARAM_STR); + } + $stmt->execute(); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total feedback count: " . $e->getMessage()); + throw new Exception("Could not retrieve feedback count. Please try again later."); + } + } +} diff --git a/classes/DataSource.php b/classes/DataSource.php new file mode 100644 index 0000000..3087b7b --- /dev/null +++ b/classes/DataSource.php @@ -0,0 +1,1489 @@ + ['csv', 'json', 'pdf', 'xls', 'xlsx'], + 'mimes' => [ + 'text/csv', + 'text/plain', + 'application/json', + 'application/pdf', + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ], + 'description' => 'CSV, JSON, PDF, XLS, XLSX', + ]; + private const TYPE_SPECIFIC_RULES = [ + 'csv' => [ + 'extensions' => ['csv'], + 'mimes' => ['text/csv', 'text/plain', 'application/vnd.ms-excel'], + 'description' => 'CSV files (.csv)', + ], + 'json' => [ + 'extensions' => ['json'], + 'mimes' => ['application/json', 'text/json', 'text/plain'], + 'description' => 'JSON files (.json)', + ], + 'pdf' => [ + 'extensions' => ['pdf'], + 'mimes' => ['application/pdf'], + 'description' => 'PDF documents (.pdf)', + ], + 'xls' => [ + 'extensions' => ['xls'], + 'mimes' => ['application/vnd.ms-excel'], + 'description' => 'Excel 97-2003 (.xls)', + ], + 'xlsx' => [ + 'extensions' => ['xlsx'], + 'mimes' => ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], + 'description' => 'Excel (.xlsx)', + ], + 'dta' => [ + 'extensions' => ['dta'], + 'mimes' => [ + 'application/x-stata', + 'application/stata', + 'application/octet-stream', + ], + 'description' => 'Stata dataset (.dta)', + ], + 'stata' => [ + 'extensions' => ['dta'], + 'mimes' => [ + 'application/x-stata', + 'application/stata', + 'application/octet-stream', + ], + 'description' => 'Stata dataset (.dta)', + ], + 'sav' => [ + 'extensions' => ['sav'], + 'mimes' => [ + 'application/octet-stream', + 'application/vnd.spss.sav', + ], + 'description' => 'SPSS dataset (.sav)', + ], + ]; + + public function __construct(PDO $pdo) { + $this->pdo = $pdo; + + // Correctly define the absolute path from the project root. + // __DIR__ points to the 'classes' directory. + // dirname(__DIR__) moves up one level to 'dsp26072025'. + $projectRoot = dirname(__DIR__); + $this->uploadDir = $projectRoot . '/uploads/datasources/'; + + // Ensure upload directory exists + if (!is_dir($this->uploadDir)) { + if (!mkdir($this->uploadDir, 0777, true)) { + // If it still fails, there is a deeper permissions issue + die("Error: Failed to create directory. Please check permissions for " . $this->uploadDir); + } + } + } + + // Public getter for upload directory (needed for file deletion) + public function getUploadDir(): string { + return $this->uploadDir; + } + + // --- Data Source Management (dsps_tbl_datasource) --- + + /** + * Adds a new data source. + * + * @param int $fkdspstds_id FK to dsps_tbl_typedatasource. + * @param int $fkdspscate_id FK to dsps_tbl_dspscategory. + * @param int $fkisp_id_of FK to ist_tbl_people (Data Owner). + * @param string|null $filename Primary file path/name or API endpoint URL. + * @param string $title_en English title. + * @param string|null $title_kh Khmer title. + * @param string|null $description Description. + * @param string $status Status ('Active', 'Inactive', 'Pending Review', 'Published'). + * @param int $reg_by User ID who registered it. + * @param string|null $filename1 Optional secondary file path. + * @param string|null $filename2 Optional tertiary file path. + * @param string|null $filename3 Optional quaternary file path. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function addDataSource( + int $fkdspstds_id, + int $fkdspscate_id, + int $fkisp_id_of, + ?string $filename, + string $title_en, + ?string $title_kh, + ?string $description, + string $status, + int $reg_by, + ?string $filename1 = null, + ?string $filename2 = null, + ?string $filename3 = null + ): bool { + // Determine public_date based on status. If 'Published', set to current date, otherwise NULL. + $publicDateSql = ($status === 'Published') ? "CURRENT_DATE" : "NULL"; + + $sql = "INSERT INTO dsps_tbl_datasource (fkdspstds_id, fkdspscate_id, fkisp_id_of, dspsds_filename, + dspsds_title_en, dspsds_title_kh, dspsds_description, + dspsds_status, dspsds_reg_by, dspsds_public_date, + dspsds_filename1, dspsds_filename2, dspsds_filename3) + VALUES (:fkdspstds_id, :fkdspscate_id, :fkisp_id_of, :filename, + :title_en, :title_kh, :description, :status, :reg_by, + " . $publicDateSql . ", :filename1, :filename2, :filename3)"; // Directly inject CURRENT_DATE or NULL + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':fkdspstds_id', $fkdspstds_id, PDO::PARAM_INT); + $stmt->bindParam(':fkdspscate_id', $fkdspscate_id, PDO::PARAM_INT); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + $stmt->bindParam(':filename', $filename); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':title_kh', $title_kh); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':status', $status); + $stmt->bindParam(':reg_by', $reg_by, PDO::PARAM_INT); + $stmt->bindParam(':filename1', $filename1); + $stmt->bindParam(':filename2', $filename2); + $stmt->bindParam(':filename3', $filename3); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error adding data source: " . $e->getMessage()); + throw new Exception("Could not add data source. Please try again later."); + } + } + + /** + * Updates an existing data source. + * + * @param int $id ID of the data source to update. + * @param int $fkdspstds_id FK to dsps_tbl_typedatasource. + * @param int $fkdspscate_id FK to dsps_tbl_dspscategory. + * @param int $fkisp_id_of FK to ist_tbl_people (Data Owner). + * @param string|null $filename File path/name or API endpoint URL. + * @param string $title_en English title. + * @param string|null $title_kh Khmer title. + * @param string|null $description Description. + * @param string $status Status ('Active', 'Inactive', 'Pending Review', 'Published'). + * @param int $mod_by User ID who modified it. + * @param string|null $filename1 Optional secondary file path. + * @param string|null $filename2 Optional tertiary file path. + * @param string|null $filename3 Optional quaternary file path. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function updateDataSource( + int $id, + int $fkdspstds_id, + int $fkdspscate_id, + int $fkisp_id_of, + ?string $filename, + string $title_en, + ?string $title_kh, + ?string $description, + string $status, + int $mod_by, + ?string $filename1 = null, + ?string $filename2 = null, + ?string $filename3 = null + ): bool { + // Check current status to decide on dspsds_public_date update + $currentDataSource = $this->getDataSourceById($id); + $publicDateUpdate = ""; + if ($status === 'Published' && ($currentDataSource['dspsds_status'] !== 'Published' || empty($currentDataSource['dspsds_public_date']))) { + $publicDateUpdate = ", dspsds_public_date = CURRENT_DATE"; + } elseif ($status !== 'Published' && !empty($currentDataSource['dspsds_public_date'])) { + $publicDateUpdate = ", dspsds_public_date = NULL"; + } + + $sql = "UPDATE dsps_tbl_datasource + SET fkdspstds_id = :fkdspstds_id, fkdspscate_id = :fkdspscate_id, fkisp_id_of = :fkisp_id_of, + dspsds_filename = :filename, dspsds_title_en = :title_en, dspsds_title_kh = :title_kh, + dspsds_description = :description, dspsds_status = :status, + dspsds_filename1 = :filename1, dspsds_filename2 = :filename2, dspsds_filename3 = :filename3, + dspsds_mod_datetime = CURRENT_TIMESTAMP, dspsds_reg_by = :mod_by + {$publicDateUpdate} + WHERE pkdspsds_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':fkdspstds_id', $fkdspstds_id, PDO::PARAM_INT); + $stmt->bindParam(':fkdspscate_id', $fkdspscate_id, PDO::PARAM_INT); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + $stmt->bindParam(':filename', $filename); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':title_kh', $title_kh); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':status', $status); + $stmt->bindParam(':filename1', $filename1); + $stmt->bindParam(':filename2', $filename2); + $stmt->bindParam(':filename3', $filename3); + $stmt->bindParam(':mod_by', $mod_by, PDO::PARAM_INT); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating data source (ID: $id): " . $e->getMessage()); + throw new Exception("Could not update data source. Please try again later."); + } + } + + /** + * Deletes a data source from the database and its associated file. + * + * @param int $id The ID of the data source to delete. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function deleteDataSource(int $id): bool { + // Get the filename to delete the actual file + $dataSource = $this->getDataSourceById($id); + if ($dataSource) { + $fileColumns = ['dspsds_filename', 'dspsds_filename1', 'dspsds_filename2', 'dspsds_filename3']; + foreach ($fileColumns as $column) { + if (!empty($dataSource[$column])) { + $filePath = $this->uploadDir . $dataSource[$column]; + if (is_file($filePath)) { + unlink($filePath); + } + } + } + } + + $sql = "DELETE FROM dsps_tbl_datasource WHERE pkdspsds_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting data source (ID: $id): " . $e->getMessage()); + throw new Exception("Could not delete data source. Please try again later."); + } + } + + /** + * Retrieves a single data source by its ID. + * + * @param int $id The ID of the data source. + * @return array|false The data source data as an associative array, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getDataSourceById(int $id) { + $sql = "SELECT ds.*, dspstds.dspstds_name_en AS data_type_name, dspstds.dspstds_name_kh AS data_type_name_kh, + dspscate.dspscate_title_en AS category_name, + isp.isp_firstname_en, isp.isp_lastname_en + FROM dsps_tbl_datasource ds + JOIN dsps_tbl_typedatasource dspstds ON ds.fkdspstds_id = dspstds.pkdspstds_id + JOIN dsps_tbl_dspscategory dspscate ON ds.fkdspscate_id = dspscate.pkdspscate_id + JOIN ist_tbl_people isp ON ds.fkisp_id_of = isp.pkisp_id + WHERE ds.pkdspsds_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching data source by ID ($id): " . $e->getMessage()); + throw new Exception("Could not retrieve data source. Please try again later."); + } + } + + /** + * Retrieves data sources based on various filters. + * + * @param int|null $owner_person_id Optional: Filter by data owner's person ID. + * @param string|null $status Optional: Filter by status (e.g., 'Active', 'Pending Review'). + * @param int|null $category_id Optional: Filter by category ID. + * @param string|null $search_query Optional: Search by title or description. + * @param int|null $limit Optional: Limit the number of results. + * @return array An array of data source data. + * @throws Exception If a database error occurs. + */ + public function getDataSources( + ?int $owner_person_id = null, + ?string $status = null, + ?int $category_id = null, + ?string $search_query = null, + ?int $limit = null + ): array { + $sql = "SELECT ds.*, dspstds.dspstds_name_en AS data_type_name, dspstds.dspstds_name_kh AS data_type_name_kh, + dspscate.dspscate_title_en AS category_name, + isp.isp_firstname_en, isp.isp_lastname_en + FROM dsps_tbl_datasource ds + JOIN dsps_tbl_typedatasource dspstds ON ds.fkdspstds_id = dspstds.pkdspstds_id + JOIN dsps_tbl_dspscategory dspscate ON ds.fkdspscate_id = dspscate.pkdspscate_id + JOIN ist_tbl_people isp ON ds.fkisp_id_of = isp.pkisp_id"; + $conditions = []; + $params = []; + + // Use strict checks for null to avoid issues with 0 and empty strings + if ($owner_person_id !== null) { + $conditions[] = "ds.fkisp_id_of = :owner_person_id"; + $params[':owner_person_id'] = $owner_person_id; + } + if ($status !== null) { + $conditions[] = "ds.dspsds_status = :status"; + $params[':status'] = $status; + } + if ($category_id !== null) { + $conditions[] = "ds.fkdspscate_id = :category_id"; + $params[':category_id'] = $category_id; + } + if ($search_query !== null && $search_query !== '') { + $conditions[] = "(ds.dspsds_title_en LIKE :search_query OR ds.dspsds_description LIKE :search_query)"; + $params[':search_query'] = '%' . $search_query . '%'; + } + + if (!empty($conditions)) { + $sql .= " WHERE " . implode(" AND ", $conditions); + } + + $sql .= " ORDER BY ds.dspsds_reg_datetime DESC"; + + // A safer way to handle LIMIT is to validate and concatenate the integer + // directly, as not all PDO drivers support binding LIMIT values. + if ($limit !== null && is_int($limit) && $limit > 0) { + $sql .= " LIMIT " . $limit; + } + + try { + $stmt = $this->pdo->prepare($sql); + // Pass the parameters array directly to execute() + $stmt->execute($params); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching data sources: " . $e->getMessage()); + throw new Exception("Could not retrieve data sources. Please try again later."); + } + } + + /** + * Gets the total count of data sources. + * + * @return int The total number of data sources. + * @throws Exception If a database error occurs. + */ + public function getTotalDataSources(): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_datasource"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total data sources count: " . $e->getMessage()); + throw new Exception("Could not retrieve data source count. Please try again later."); + } + } + + /** + * Handles the upload of a data source file. + * + * @param array $file The $_FILES array for the uploaded file. + * @return string The unique filename of the uploaded file. + * @throws Exception If the upload fails. + */ + public function handleDataSourceFileUpload(array $file, ?array $fileRules = null): string { + if ($file['error'] !== UPLOAD_ERR_OK) { + throw new Exception('File upload error: ' . $file['error']); + } + + $rules = $fileRules ?? self::DEFAULT_FILE_RULES; + $allowedMimeTypes = $rules['mimes'] ?? self::DEFAULT_FILE_RULES['mimes']; + $allowedExtensions = $rules['extensions'] ?? self::DEFAULT_FILE_RULES['extensions']; + $description = $rules['description'] ?? self::DEFAULT_FILE_RULES['description']; + if (($file['size'] ?? 0) <= 0) { + throw new Exception('Uploaded file is empty or missing.'); + } + + error_log(sprintf( + '[DataSource] Upload requested: name=%s size=%s mime=%s rules=%s', + $file['name'] ?? '', + $file['size'] ?? 'unknown', + $file['type'] ?? 'unknown', + $description + )); + + $finfo = new finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->file($file['tmp_name']); + + if (!in_array($mimeType, $allowedMimeTypes, true)) { + throw new Exception('Invalid file type. Allowed formats: ' . $description); + } + + $extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); + + if (!in_array($extension, array_map('strtolower', $allowedExtensions), true)) { + throw new Exception('Invalid file extension. Allowed formats: ' . $description); + } + + $originalStem = pathinfo($file['name'], PATHINFO_FILENAME); + $slug = $this->slugifyFilename($originalStem); + $uniqueFilename = 'datasource_' . uniqid(); + if (!empty($slug)) { + $uniqueFilename .= '_' . $slug; + } + $uniqueFilename .= '.' . $extension; + $destination = $this->uploadDir . $uniqueFilename; + + if (!move_uploaded_file($file['tmp_name'], $destination)) { + $moved = false; + if (PHP_SAPI === 'cli' || defined('STDIN')) { + $moved = rename($file['tmp_name'], $destination); + } + if (!$moved) { + error_log(sprintf('[DataSource] Failed to move uploaded file into %s (tmp=%s)', $destination, $file['tmp_name'])); + throw new Exception('Failed to move uploaded file.'); + } + } + + error_log(sprintf('[DataSource] File stored as %s', $uniqueFilename)); + return $uniqueFilename; + } + private function resolvePrimaryFileRules(?string $typeName): array { + if (!$typeName) { + return self::DEFAULT_FILE_RULES; + } + $key = strtolower(trim($typeName)); + if (isset(self::TYPE_SPECIFIC_RULES[$key])) { + return self::TYPE_SPECIFIC_RULES[$key]; + } + foreach (self::TYPE_SPECIFIC_RULES as $alias => $rules) { + if (str_contains($alias, $key) || str_contains($key, $alias)) { + return $rules; + } + } + // fallback to defaults but include description referencing requested type + return self::DEFAULT_FILE_RULES; + } + + public function getPrimaryFileRulesForType(?string $typeName): array { + return $this->resolvePrimaryFileRules($typeName); + } + + private function slugifyFilename(?string $value): string { + if (!$value) { + return ''; + } + $value = strtolower($value); + // Replace non-alphanumeric characters with hyphens. + $value = preg_replace('/[^a-z0-9]+/i', '-', $value); + $value = trim($value ?? '', '-'); + if ($value === '') { + return ''; + } + // Limit slug length to avoid overlong filenames. + return substr($value, 0, 50); + } + + // --- Data Source Permission Management (dsps_tbl_datasource_permission) --- + + /** + * Requests permission for a data source for a specific user. + * + * @param int $fkdspsds_id The ID of the data source. + * @param int $fkisp_id_of The person ID of the user requesting permission. + * @param string $permission The type of permission ('Read', 'Download', 'Analyze'). + * @param string|null $notes Any notes from the requester. + * @param int $reg_by The user ID who initiated the request (usually the data user themselves). + * @return bool True on success. + * @throws Exception If a database error occurs or a pending request already exists. + */ + public function requestDataSourcePermission( + int $fkdspsds_id, + int $fkisp_id_of, + string $permission, + ?string $notes, + int $reg_by, + ?string $proofPath = null + ): bool { + // Check if a pending request already exists for this user and data source + $checkSql = "SELECT COUNT(*) FROM dsps_tbl_datasource_permission + WHERE fkdspsds_id = :fkdspsds_id AND fkisp_id_of = :fkisp_id_of AND dspsdsp_status = 'Pending'"; + $stmtCheck = $this->pdo->prepare($checkSql); + $stmtCheck->bindParam(':fkdspsds_id', $fkdspsds_id, PDO::PARAM_INT); + $stmtCheck->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + $stmtCheck->execute(); + if ($stmtCheck->fetchColumn() > 0) { + throw new Exception("You already have a pending permission request for this data source."); + } + + // Detect any existing permission (approved/rejected/etc.) to avoid duplicate key violations + $existingSql = "SELECT dspsdsp_status FROM dsps_tbl_datasource_permission + WHERE fkdspsds_id = :fkdspsds_id AND fkisp_id_of = :fkisp_id_of LIMIT 1"; + $stmtExisting = $this->pdo->prepare($existingSql); + $stmtExisting->bindParam(':fkdspsds_id', $fkdspsds_id, PDO::PARAM_INT); + $stmtExisting->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + $stmtExisting->execute(); + if ($row = $stmtExisting->fetch(PDO::FETCH_ASSOC)) { + $statusLabel = $row['dspsdsp_status'] ?? 'processed'; + throw new Exception("This request was already {$statusLabel}. Please check My Permissions."); + } + + $hasProofColumn = $this->ensurePermissionProofColumn(); + $columns = [ + 'fkdspsds_id', + 'fkisp_id_of', + 'dspsdsp_permission', + 'dspsdsp_notes' + ]; + $placeholders = [ + ':fkdspsds_id', + ':fkisp_id_of', + ':permission', + ':notes' + ]; + + if ($hasProofColumn) { + $columns[] = 'dspsdsp_proof_path'; + $placeholders[] = ':proof_path'; + } + + $columns[] = 'dspsdsp_status'; + $columns[] = 'dspsdsp_reg_by'; + $placeholders[] = ':status'; + $placeholders[] = ':reg_by'; + + $sql = 'INSERT INTO dsps_tbl_datasource_permission (' . implode(', ', $columns) . ') + VALUES (' . implode(', ', $placeholders) . ')'; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':fkdspsds_id', $fkdspsds_id, PDO::PARAM_INT); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + $stmt->bindParam(':permission', $permission); + if ($notes === null) { + $stmt->bindValue(':notes', null, PDO::PARAM_NULL); + } else { + $stmt->bindValue(':notes', $notes, PDO::PARAM_STR); + } + + if ($hasProofColumn) { + if ($proofPath === null) { + $stmt->bindValue(':proof_path', null, PDO::PARAM_NULL); + } else { + $stmt->bindValue(':proof_path', $proofPath, PDO::PARAM_STR); + } + } + + $stmt->bindValue(':status', 'Pending', PDO::PARAM_STR); + $stmt->bindParam(':reg_by', $reg_by, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error requesting data source permission: " . $e->getMessage()); + throw new Exception("Could not submit permission request. Please try again later."); + } + } + + /** + * Retrieves permission requests for a specific Data Owner. + * + * @param int $owner_person_id The person ID of the Data Owner. + * @param string|null $status Optional: Filter by status ('Pending', 'Approved', 'Rejected', 'Revoked'). + * @return array An array of permission request data. + * @throws Exception If a database error occurs. + */ + public function getPermissionRequestsForOwner(int $ownerPersonId, ?string $status = null): array { + $hasProofColumn = $this->ensurePermissionProofColumn(); + $proofSelect = $hasProofColumn ? 't1.dspsdsp_proof_path' : 'NULL'; + $proofSelect .= ' AS dspsdsp_proof_path'; + + $sql = "SELECT + t1.pkdspsdsp_id, + t2.dspsds_title_en, + t3.isp_firstname_en, + t3.isp_lastname_en, + t1.dspsdsp_permission, + t1.dspsdsp_reg_datetime, + t1.dspsdsp_notes, + $proofSelect, + t1.dspsdsp_status + FROM dsps_tbl_datasource_permission AS t1 + JOIN dsps_tbl_datasource AS t2 ON t1.fkdspsds_id = t2.pkdspsds_id + JOIN ist_tbl_people AS t3 ON t1.fkisp_id_of = t3.pkisp_id + WHERE t2.fkisp_id_of = :ownerPersonId"; + + if ($status !== null) { + $sql .= " AND t1.dspsdsp_status = :status"; + } + + $sql .= " ORDER BY t1.dspsdsp_reg_datetime DESC"; + + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':ownerPersonId', $ownerPersonId, PDO::PARAM_INT); + if ($status !== null) { + $stmt->bindParam(':status', $status); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Database error in getPermissionRequestsForOwner: " . $e->getMessage()); + return []; + } + } + + /** + * Retrieves a single permission request by its ID. + * Includes data source owner's person ID for authorization checks. + * + * @param int $permissionId The ID of the permission request. + * @return array|false The permission data as an associative array, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getPermissionRequestById(int $permissionId) { + $sql = "SELECT dsp.*, ds.fkisp_id_of AS datasource_owner_person_id + FROM dsps_tbl_datasource_permission dsp + JOIN dsps_tbl_datasource ds ON dsp.fkdspsds_id = ds.pkdspsds_id + WHERE dsp.pkdspsdsp_id = :permission_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':permission_id', $permissionId, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching permission request by ID ($permissionId): " . $e->getMessage()); + throw new Exception("Could not retrieve permission request details. Please try again later."); + } + } + + /** + * Retrieves all permission requests for DAC Staff, optionally filtered by status and search query. + * + * @param string|null $status_filter Optional: Filter by status ('Pending', 'Approved', 'Rejected', 'Revoked'). + * @param string|null $search_query Optional: Search by data source title, requester name, or owner name. + * @return array An array of all permission request data. + * @throws Exception If a database error occurs. + */ + public function getAllPermissionRequests(?string $status_filter = null, ?string $search_query = null): array { + $sql = "SELECT dsp.*, ds.dspsds_title_en, ds.dspsds_filename, + requester_p.isp_firstname_en AS requester_firstname, requester_p.isp_lastname_en AS requester_lastname, + owner_p.isp_firstname_en AS owner_firstname, owner_p.isp_lastname_en AS owner_lastname + FROM dsps_tbl_datasource_permission dsp + JOIN dsps_tbl_datasource ds ON dsp.fkdspsds_id = ds.pkdspsds_id + JOIN ist_tbl_people requester_p ON dsp.fkisp_id_of = requester_p.pkisp_id + JOIN ist_tbl_people owner_p ON ds.fkisp_id_of = owner_p.pkisp_id"; + $conditions = []; + $params = []; + + if ($status_filter) { + $conditions[] = "dsp.dspsdsp_status = :status_filter"; + $params[':status_filter'] = $status_filter; + } + + if ($search_query) { + $search_term = '%' . $search_query . '%'; + $conditions[] = "(ds.dspsds_title_en LIKE :search_query OR + requester_p.isp_firstname_en LIKE :search_query OR + requester_p.isp_lastname_en LIKE :search_query OR + owner_p.isp_firstname_en LIKE :search_query OR + owner_p.isp_lastname_en LIKE :search_query)"; + $params[':search_query'] = $search_term; + } + + if (!empty($conditions)) { + $sql .= " WHERE " . implode(" AND ", $conditions); + } + + $sql .= " ORDER BY dsp.dspsdsp_reg_datetime DESC"; + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => &$val) { + $stmt->bindParam($key, $val, is_int($val) ? PDO::PARAM_INT : PDO::PARAM_STR); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all permission requests: " . $e->getMessage()); + throw new Exception("Could not retrieve all permission requests. Please try again later."); + } + } + + + /** + * Gets the count of pending permission requests. + * + * @return int The count of pending permission requests. + * @throws Exception If a database error occurs. + */ + public function getPendingPermissionRequestsCount(): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_datasource_permission WHERE dspsdsp_status = 'Pending'"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting pending permission requests count: " . $e->getMessage()); + throw new Exception("Could not retrieve pending permission count. Please try again later."); + } + } + + /** + * Aggregates total usage counts per data source owner (person id). + * + * @param int $limit Maximum number of owners to return. + * @return array + */ + public function getUsageByOwner(int $limit = 8): array { + $sql = "SELECT ds.fkisp_id_of AS owner_person_id, + CONCAT(p.isp_firstname_en, ' ', p.isp_lastname_en) AS owner_name, + COUNT(dsu.pkdspsdspused_id) AS usage_count + FROM dsps_tbl_datasource_used dsu + JOIN dsps_tbl_datasource ds ON dsu.fkdspsdsused_id = ds.pkdspsds_id + JOIN ist_tbl_people p ON ds.fkisp_id_of = p.pkisp_id + GROUP BY ds.fkisp_id_of, owner_name + ORDER BY usage_count DESC + LIMIT :limit"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching usage by owner: " . $e->getMessage()); + return []; + } + } + + /** + * Updates the status of a data source permission request. + * + * @param int $permission_id The ID of the permission request. + * @param string $new_status The new status ('Approved', 'Rejected', 'Revoked'). + * @param string|null $notes Optional notes for the status change. + * @param int $mod_by The user ID of the Data Owner or DAC Staff who updated the status. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function updatePermissionStatus(int $permissionId, string $newStatus, int $modifyingUserId, string $notes = ''): bool { + $sql = "UPDATE dsps_tbl_datasource_permission + SET + dspsdsp_status = :newStatus, + dspsdsp_mod_datetime = NOW(), + dspsdsp_reg_by = :modifyingUserId, + dspsdsp_notes = :notes + WHERE pkdspsdsp_id = :permissionId"; + + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':newStatus', $newStatus); + $stmt->bindParam(':modifyingUserId', $modifyingUserId, PDO::PARAM_INT); + $stmt->bindParam(':notes', $notes); + $stmt->bindParam(':permissionId', $permissionId, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating permission status: " . $e->getMessage()); + return false; + } + } + + /** + * Checks if a user has a specific permission for a data source. + * + * @param int $user_person_id The person ID of the user. + * @param int $data_source_id The ID of the data source. + * @param string $permission_type The type of permission to check ('Read', 'Download', 'Analyze'). + * @return bool True if the user has the permission, false otherwise. + * @throws Exception If a database error occurs. + */ + public function hasPermission(int $user_person_id, int $data_source_id, string $permission_type): bool { + $sql = "SELECT COUNT(*) FROM dsps_tbl_datasource_permission + WHERE fkisp_id_of = :user_person_id + AND fkdspsds_id = :data_source_id + AND dspsdsp_permission = :permission_type + AND dspsdsp_status = 'Approved'"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':user_person_id', $user_person_id, PDO::PARAM_INT); + $stmt->bindParam(':data_source_id', $data_source_id, PDO::PARAM_INT); + $stmt->bindParam(':permission_type', $permission_type); + $stmt->execute(); + return $stmt->fetchColumn() > 0; + } catch (PDOException $e) { + error_log("Error checking permission for user ($user_person_id) on data source ($data_source_id): " . $e->getMessage()); + throw new Exception("Could not verify permission. Please try again later."); + } + } + + /** + * Returns usage counts grouped by consuming user for data sources owned by a person. + * + * @param int $ownerPersonId + * @param int $limit + * @return array> + */ + public function getUsageByUserForOwner(int $ownerPersonId, int $limit = 10): array { + $sql = "SELECT u.isu_name AS username, + COUNT(dsu.pkdspsdspused_id) AS usage_count + FROM dsps_tbl_datasource_used dsu + JOIN dsps_tbl_datasource ds ON dsu.fkdspsdsused_id = ds.pkdspsds_id + JOIN ist_tbl_users u ON dsu.dspsdspused_reg_by = u.pkisu_id + WHERE ds.fkisp_id_of = :ownerPersonId + GROUP BY u.pkisu_id, u.isu_name + ORDER BY usage_count DESC + LIMIT :limit"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindValue(':ownerPersonId', $ownerPersonId, PDO::PARAM_INT); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching usage by user for owner ($ownerPersonId): " . $e->getMessage()); + return []; + } + } + + /** + * Retrieves usage counts for a specific user grouped by data source. + * + * @param int $userPersonId + * @param int $limit + * @return array> + */ + public function getUsageByDataSourceForUser(int $userPersonId, int $limit = 8): array { + $sql = "SELECT ds.pkdspsds_id, + ds.dspsds_title_en, + COUNT(dsu.pkdspsdspused_id) AS usage_count + FROM dsps_tbl_datasource_used dsu + JOIN dsps_tbl_datasource ds ON dsu.fkdspsdsused_id = ds.pkdspsds_id + WHERE dsu.dspsdspused_reg_by = :userPersonId + GROUP BY ds.pkdspsds_id, ds.dspsds_title_en + ORDER BY usage_count DESC + LIMIT :limit"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindValue(':userPersonId', $userPersonId, PDO::PARAM_INT); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching usage by data source for user ($userPersonId): " . $e->getMessage()); + return []; + } + } + + /** + * Retrieves all data sources with owner, type, and category details. + * + * @param string|null $search Optional search across title, owner, or type. + * @param string|null $status Optional status filter. + * @return array + */ + public function getAllDataSourcesDetailed(?string $search = null, ?string $status = null): array { + $sql = "SELECT ds.*, + dspstds.dspstds_name_en AS data_type_name, + dspscate.dspscate_title_en AS category_name, + CONCAT(p.isp_firstname_en, ' ', p.isp_lastname_en) AS owner_name + FROM dsps_tbl_datasource ds + JOIN dsps_tbl_typedatasource dspstds ON ds.fkdspstds_id = dspstds.pkdspstds_id + JOIN dsps_tbl_dspscategory dspscate ON ds.fkdspscate_id = dspscate.pkdspscate_id + JOIN ist_tbl_people p ON ds.fkisp_id_of = p.pkisp_id"; + + $conditions = []; + $params = []; + + if ($status !== null && $status !== '') { + $conditions[] = "ds.dspsds_status = :status"; + $params[':status'] = $status; + } + + if ($search !== null && $search !== '') { + $conditions[] = "(ds.dspsds_title_en LIKE :search OR p.isp_firstname_en LIKE :search OR p.isp_lastname_en LIKE :search OR dspstds.dspstds_name_en LIKE :search)"; + $params[':search'] = '%' . $search . '%'; + } + + if (!empty($conditions)) { + $sql .= " WHERE " . implode(' AND ', $conditions); + } + + $sql .= " ORDER BY ds.dspsds_reg_datetime DESC"; + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => $value) { + $stmt->bindValue($key, $value); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all data sources: " . $e->getMessage()); + return []; + } + } + + /** + * Updates the status of a data source. + * + * @param int $datasourceId + * @param string $newStatus + * @param int $modifyingUserId + * @return bool + */ + public function updateDataSourceStatus(int $datasourceId, string $newStatus, int $modifyingUserId): bool { + $allowed = ['Active', 'Inactive', 'Pending Review', 'Published']; + if (!in_array($newStatus, $allowed, true)) { + throw new InvalidArgumentException("Invalid data source status value."); + } + + $sql = "UPDATE dsps_tbl_datasource + SET dspsds_status = :status, + dspsds_mod_datetime = CURRENT_TIMESTAMP, + dspsds_reg_by = :modBy + WHERE pkdspsds_id = :id"; + + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':status', $newStatus); + $stmt->bindValue(':modBy', $modifyingUserId, PDO::PARAM_INT); + $stmt->bindValue(':id', $datasourceId, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating data source status (ID: $datasourceId): " . $e->getMessage()); + return false; + } + } + + /** + * Retrieves all permissions for a specific user. + * + * @param int $user_person_id The person ID of the user. + * @param string|null $status Optional: Filter by status ('Pending', 'Approved', 'Rejected', 'Revoked'). + * @return array An array of permission data. + * @throws Exception If a database error occurs. + */ + public function getUserPermissions(int $user_person_id, ?string $status = null): array { + $sql = "SELECT dsp.*, ds.dspsds_title_en, ds.dspsds_description, ds.dspsds_filename, + ds.dspsds_filename1, ds.dspsds_filename2, ds.dspsds_filename3, + dspstds.dspstds_name_en AS data_type_name, dspscate.dspscate_title_en AS category_name + FROM dsps_tbl_datasource_permission dsp + JOIN dsps_tbl_datasource ds ON dsp.fkdspsds_id = ds.pkdspsds_id + JOIN dsps_tbl_typedatasource dspstds ON ds.fkdspstds_id = dspstds.pkdspstds_id + JOIN dsps_tbl_dspscategory dspscate ON ds.fkdspscate_id = dspscate.pkdspscate_id + WHERE dsp.fkisp_id_of = :user_person_id"; + $params = [':user_person_id' => $user_person_id]; + + if ($status) { + $sql .= " AND dsp.dspsdsp_status = :status"; + $params[':status'] = $status; + } + + $sql .= " ORDER BY dsp.dspsdsp_reg_datetime DESC"; + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => &$val) { + $stmt->bindParam($key, $val, is_int($val) ? PDO::PARAM_INT : PDO::PARAM_STR); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching user permissions ($user_person_id): " . $e->getMessage()); + throw new Exception("Could not retrieve your permissions. Please try again later."); + } + } + + /** + * Retrieves all approved data sources a user is permitted to analyse/download. + * + * @param int $userPersonId The person ID tied to the current session. + * @return array + * @throws Exception + */ + public function getApprovedDataSourcesForUser(int $userPersonId): array { + return $this->getUserPermissions($userPersonId, 'Approved'); + } + + /** + * Synchronises the approved data sources for a user into a dedicated Jupyter workspace directory. + * Files are symlinked when possible to avoid duplication; if symlinks are not permitted, files are copied. + * + * @param int $userPersonId The person ID of the user. + * @param string $workspaceRoot Absolute path to the shared Jupyter workspace root. + * @return array{synced: array>, missing: array>, workspace_dir: string} + * @throws Exception When the workspace cannot be prepared. + */ + public function prepareJupyterWorkspace(int $userPersonId, string $workspaceRoot): array { + if (!is_dir($workspaceRoot) && !mkdir($workspaceRoot, 0775, true) && !is_dir($workspaceRoot)) { + throw new RuntimeException("Unable to create Jupyter workspace root at {$workspaceRoot}"); + } + + $userFolderName = 'user_' . $userPersonId; + $userWorkspaceDir = rtrim($workspaceRoot, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $userFolderName; + + if (!is_dir($userWorkspaceDir) && !mkdir($userWorkspaceDir, 0775, true) && !is_dir($userWorkspaceDir)) { + throw new RuntimeException("Unable to create user workspace directory at {$userWorkspaceDir}"); + } + + $this->purgeSyncedArtifacts($userWorkspaceDir); + + $approvedSources = $this->getApprovedDataSourcesForUser($userPersonId); + $synced = []; + $missing = []; + + foreach ($approvedSources as $index => $permission) { + $sourceId = (int)($permission['fkdspsds_id'] ?? 0); + $title = $permission['dspsds_title_en'] ?? ('Data Source ' . $sourceId); + $fileColumns = ['dspsds_filename', 'dspsds_filename1', 'dspsds_filename2', 'dspsds_filename3']; + $fileQueue = []; + + foreach ($fileColumns as $column) { + $candidate = trim((string)($permission[$column] ?? '')); + if ($candidate !== '' && !in_array($candidate, $fileQueue, true)) { + $fileQueue[] = $candidate; + } + } + + if (empty($fileQueue)) { + $missing[] = [ + 'datasource_id' => $sourceId, + 'title' => $title, + 'reason' => 'No files associated with this data source.', + ]; + continue; + } + + foreach ($fileQueue as $fileIndex => $filename) { + $sourcePath = $this->uploadDir . $filename; + if (!is_file($sourcePath)) { + $missing[] = [ + 'datasource_id' => $sourceId, + 'title' => $title, + 'reason' => 'File not found on disk: ' . $filename, + ]; + continue; + } + + $extension = strtolower((string) pathinfo($sourcePath, PATHINFO_EXTENSION)); + + if ($extension === 'ipynb') { + $missing[] = [ + 'datasource_id' => $sourceId, + 'title' => $title, + 'reason' => 'Notebook files (.ipynb) are personal workspaces and are not shared via sync.', + ]; + continue; + } + + $safeTitle = $this->sanitizeFileName($title); + $targetBase = sprintf('%03d_%s', $index + 1, $safeTitle ?: ('datasource_' . $sourceId)); + if ($fileIndex > 0) { + $targetBase .= '_file' . ($fileIndex + 1); + } + $targetName = $extension ? "{$targetBase}.{$extension}" : $targetBase; + $targetPath = $userWorkspaceDir . DIRECTORY_SEPARATOR . $targetName; + + if (file_exists($targetPath) || is_link($targetPath)) { + unlink($targetPath); + } + + $linked = @symlink($sourcePath, $targetPath); + if (!$linked) { + $linked = @copy($sourcePath, $targetPath); + } + + if ($linked) { + $synced[] = [ + 'datasource_id' => $sourceId, + 'title' => $title, + 'source_filename' => $filename, + 'relative_path' => $userFolderName . '/' . $targetName, + 'absolute_path' => $targetPath, + 'data_type' => $permission['data_type_name'] ?? null, + 'category' => $permission['category_name'] ?? null, + ]; + } else { + $missing[] = [ + 'datasource_id' => $sourceId, + 'title' => $title, + 'reason' => 'Unable to sync file into workspace: ' . $filename, + ]; + } + } + } + + $readmePath = $userWorkspaceDir . DIRECTORY_SEPARATOR . 'README.txt'; + $readmeBody = "Approved data sources for R in JupyterHub are synced to this folder.\n" + . "Each file is a symlink (or copy) of the original upload.\n" + . "Only data sources with approved permissions for your account appear here.\n" + . "Synced on: " . date('c') . "\n"; + file_put_contents($readmePath, $readmeBody); + + $manifestPath = $userWorkspaceDir . DIRECTORY_SEPARATOR . 'manifest.json'; + file_put_contents($manifestPath, json_encode([ + 'generated_at' => date('c'), + 'synced' => $synced, + 'missing' => $missing, + ], JSON_PRETTY_PRINT)); + + return [ + 'synced' => $synced, + 'missing' => $missing, + 'workspace_dir' => $userWorkspaceDir, + ]; + } + + /** + * Removes previously synced artefacts without touching user-authored notebooks. + * + * @param string $userWorkspaceDir + * @return void + */ + private function purgeSyncedArtifacts(string $userWorkspaceDir): void { + $manifestPath = $userWorkspaceDir . DIRECTORY_SEPARATOR . 'manifest.json'; + + if (is_readable($manifestPath)) { + $manifest = json_decode((string) file_get_contents($manifestPath), true); + if (isset($manifest['synced']) && is_array($manifest['synced'])) { + foreach ($manifest['synced'] as $syncedItem) { + if (empty($syncedItem['relative_path'])) { + continue; + } + + $basename = basename($syncedItem['relative_path']); + if ($basename === '' || $basename === '.' || $basename === '..') { + continue; + } + + $targetPath = $userWorkspaceDir . DIRECTORY_SEPARATOR . $basename; + if (is_file($targetPath) || is_link($targetPath)) { + @unlink($targetPath); + } + } + } + } + + foreach (['README.txt', 'manifest.json'] as $generatedFile) { + $filePath = $userWorkspaceDir . DIRECTORY_SEPARATOR . $generatedFile; + if (is_file($filePath)) { + @unlink($filePath); + } + } + + // Legacy clean-up: remove any auto-synced notebooks that may still exist from older runs. + // The sync process previously generated notebooks using a ###_ prefix; strip those out so + // personal notebooks authored by the user (custom names) remain untouched. + $iterator = new FilesystemIterator($userWorkspaceDir, FilesystemIterator::SKIP_DOTS); + foreach ($iterator as $item) { + if ($item->isFile() && preg_match('/^\d{3}_.+\.ipynb$/i', $item->getFilename())) { + @unlink($item->getPathname()); + } + } + } + + /** + * Removes all files and folders within a directory without deleting the directory itself. + * + * @param string $directory + * @return void + */ + private function clearDirectory(string $directory): void { + if (!is_dir($directory)) { + return; + } + + $iterator = new FilesystemIterator($directory, FilesystemIterator::SKIP_DOTS); + foreach ($iterator as $item) { + if ($item->isDir()) { + $this->deleteDirectory($item->getPathname()); + } else { + unlink($item->getPathname()); + } + } + } + + /** + * Recursively deletes a directory. + * + * @param string $path + * @return void + */ + private function deleteDirectory(string $path): void { + if (!is_dir($path)) { + return; + } + + $items = new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS); + foreach ($items as $item) { + if ($item->isDir()) { + $this->deleteDirectory($item->getPathname()); + } else { + unlink($item->getPathname()); + } + } + rmdir($path); + } + + /** + * Sanitises a string for safe use as a file name. + * + * @param string $name + * @return string + */ + private function sanitizeFileName(string $name): string { + $sanitised = preg_replace('/[^a-zA-Z0-9-_]+/', '_', $name); + return trim($sanitised, '_'); + } + + // --- Usage Logging (dsps_tbl_anonymous, dsps_tbl_datasource_used) --- + + /** + * Logs an anonymous view of a data source introduction. + * + * @param int $fkdspsds_id The ID of the data source viewed. + * @param string|null $client_ip The IP address of the viewer. + * @param string $action The action performed (e.g., 'View Introduction'). + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function logAnonymousView(int $fkdspsds_id, ?string $client_ip, string $action): bool { + $sql = "INSERT INTO dsps_tbl_anonymous (fkdspsds_id, dspsano_client_ip, dspsano_action) + VALUES (:fkdspsds_id, :client_ip, :action)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':fkdspsds_id', $fkdspsds_id, PDO::PARAM_INT); + $stmt->bindParam(':client_ip', $client_ip); + $stmt->bindParam(':action', $action); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error logging anonymous view for data source ($fkdspsds_id): " . $e->getMessage()); + throw new Exception("Could not log anonymous view."); + } + } + + /** + * Logs a registered user's usage of a data source. + * + * @param int $fkdspsdsused_id The ID of the data source used. + * @param int $fkisp_id_of The person ID of the user who used it. + * @param string $action The action performed (e.g., 'Downloaded', 'Accessed API', 'Ran Analysis'). + * @param int $reg_by The user ID who performed the action. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function logDataSourceUsage(int $fkdspsdsused_id, int $fkisp_id_of, string $action, int $reg_by): bool { + $sql = "INSERT INTO dsps_tbl_datasource_used (fkdspsdsused_id, fkisp_id_of, dspsdspused_action, dspsdspused_reg_by) + VALUES (:fkdspsdsused_id, :fkisp_id_of, :action, :reg_by)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':fkdspsdsused_id', $fkdspsdsused_id, PDO::PARAM_INT); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + $stmt->bindParam(':action', $action); + $stmt->bindParam(':reg_by', $reg_by, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error logging data source usage for user ($fkisp_id_of) on data source ($fkdspsdsused_id): " . $e->getMessage()); + throw new Exception("Could not log data source usage."); + } + } + + /** + * Retrieves usage logs for a specific data source. + * + * @param int $data_source_id The ID of the data source. + * @param string|null $action Optional: Filter by action. + * @return array An array of usage log data. + * @throws Exception If a database error occurs. + */ + public function getDataSourceUsageLogs(int $data_source_id, ?string $action = null): array { + $sql = "SELECT dsu.*, p.isp_firstname_en, p.isp_lastname_en + FROM dsps_tbl_datasource_used dsu + JOIN ist_tbl_people p ON dsu.fkisp_id_of = p.pkisp_id + WHERE dsu.fkdspsdsused_id = :data_source_id"; + $params = [':data_source_id' => $data_source_id]; + + if ($action) { + $sql .= " AND dsu.dspsdspused_action = :action"; + $params[':action'] = $action; + } + + $sql .= " ORDER BY dsu.dspsdspused_reg_datetime DESC"; + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => &$val) { + $stmt->bindParam($key, $val, is_int($val) ? PDO::PARAM_INT : PDO::PARAM_STR); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching data source usage logs for ($data_source_id): " . $e->getMessage()); + throw new Exception("Could not retrieve usage logs. Please try again later."); + } + } + + /** + * Retrieves a user's download history. + * + * @param int $user_person_id The person ID of the user. + * @return array An array of downloaded data sources. + * @throws Exception If a database error occurs. + */ + public function getUserDownloads(int $user_person_id): array { + $sql = "SELECT dsu.*, ds.dspsds_title_en, ds.dspsds_filename, + dspstds.dspstds_name_en AS data_type_name, dspscate.dspscate_title_en AS category_name + FROM dsps_tbl_datasource_used dsu + JOIN dsps_tbl_datasource ds ON dsu.fkdspsdsused_id = ds.pkdspsds_id + JOIN dsps_tbl_typedatasource dspstds ON ds.fkdspstds_id = dspstds.pkdspstds_id + JOIN dsps_tbl_dspscategory dspscate ON ds.fkdspscate_id = dspscate.pkdspscate_id + WHERE dsu.fkisp_id_of = :user_person_id AND dsu.dspsdspused_action = 'Downloaded' + ORDER BY dsu.dspsdspused_reg_datetime DESC"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':user_person_id', $user_person_id, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching user downloads for ($user_person_id): " . $e->getMessage()); + throw new Exception("Could not retrieve your downloads. Please try again later."); + } + } + + // --- Classification Methods (Moved from Classifications.php for simplicity, or keep separate) --- + // Assuming these methods are here based on previous discussions. + // If you have a separate Classifications.php, ensure these are in that file. + + /** + * Retrieves all data types. + * @return array + * @throws Exception If a database error occurs. + */ + public function getAllDataTypes(): array { + $sql = "SELECT * FROM dsps_tbl_typedatasource ORDER BY dspstds_name_en ASC"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all data types: " . $e->getMessage()); + throw new Exception("Could not retrieve data types. Please try again later."); + } + } + public function getDataTypeById(int $typeId): ?array { + $sql = "SELECT * FROM dsps_tbl_typedatasource WHERE pkdspstds_id = :type_id"; + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':type_id', $typeId, PDO::PARAM_INT); + $stmt->execute(); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + return $result ?: null; + } + + /** + * Retrieves all data categories. + * @return array + * @throws Exception If a database error occurs. + */ + public function getAllCategories(): array { + $sql = "SELECT * FROM dsps_tbl_dspscategory ORDER BY dspscate_title_en ASC"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all categories: " . $e->getMessage()); + throw new Exception("Could not retrieve categories. Please try again later."); + } + } + + /** + * Get a list of data sources, optionally filtered by category and search query. + * @param int|null $categoryId The ID of the category to filter by. + * @param string|null $searchQuery The search query to filter by title or description. + * @return array An array of data source records. + */ + public function getFilteredDataSources($categoryId = null, $searchQuery = null) + { + try { + // Use LEFT JOIN to get data from related tables. + // All table and column names are now verified against the provided SQL dump. + $sql = " + SELECT + ds.*, + COALESCE(cat.dspscate_title_en, 'Not specified') AS category_name, + COALESCE(dt.dspstds_name_en, 'Not specified') AS data_type_name, + COALESCE(p.isp_firstname_en, 'Not specified') AS isp_firstname_en, + COALESCE(p.isp_lastname_en, 'Not specified') AS isp_lastname_en + FROM dsps_tbl_datasource AS ds + LEFT JOIN dsps_tbl_dspscategory AS cat ON ds.fkdspscate_id = cat.pkdspscate_id + LEFT JOIN dsps_tbl_typedatasource AS dt ON ds.fkdspstds_id = dt.pkdspstds_id + LEFT JOIN ist_tbl_people AS p ON ds.fkisp_id_of = p.pkisp_id + WHERE ds.dspsds_status = 'Active' + "; + + $params = []; + $whereClauses = []; + + if ($categoryId) { + $whereClauses[] = "ds.fkdspscate_id = :category_id"; + $params[':category_id'] = $categoryId; + } + + if ($searchQuery) { + $search = "%" . $searchQuery . "%"; + $whereClauses[] = "(ds.dspsds_title_en LIKE :search OR ds.dspsds_description LIKE :search)"; + $params[':search'] = $search; + } + + if (!empty($whereClauses)) { + $sql .= " AND " . implode(" AND ", $whereClauses); + } + + // Order by title for a consistent display + $sql .= " ORDER BY ds.dspsds_title_en ASC"; + + $stmt = $this->pdo->prepare($sql); + $stmt->execute($params); + + return $stmt->fetchAll(PDO::FETCH_ASSOC); + + } catch (PDOException $e) { + // Log the error and return an empty array to prevent further issues + error_log("Database error in getFilteredDataSources: " . $e->getMessage()); + return []; + } + } + + private function tableColumnExists(string $table, string $column): bool { + $cacheKey = $table . '.' . $column; + if (array_key_exists($cacheKey, $this->columnExistenceCache)) { + return $this->columnExistenceCache[$cacheKey]; + } + + if (!preg_match('/^[a-zA-Z0-9_]+$/', $table)) { + return false; + } + + $sql = sprintf('SHOW COLUMNS FROM `%s` LIKE :column', $table); + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':column', $column, PDO::PARAM_STR); + $stmt->execute(); + $exists = (bool) $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log('Error checking column existence: ' . $e->getMessage()); + // Assume column exists if we cannot verify to avoid silently skipping new features. + $exists = true; + } + + $this->columnExistenceCache[$cacheKey] = $exists; + return $exists; + } + + private function ensurePermissionProofColumn(): bool { + $table = 'dsps_tbl_datasource_permission'; + $column = 'dspsdsp_proof_path'; + $cacheKey = $table . '.' . $column; + + if ($this->tableColumnExists($table, $column)) { + return true; + } + + $alterSql = "ALTER TABLE `{$table}` ADD COLUMN `{$column}` VARCHAR(255) DEFAULT NULL AFTER dspsdsp_notes"; + try { + $this->pdo->exec($alterSql); + $this->columnExistenceCache[$cacheKey] = true; + return true; + } catch (PDOException $e) { + error_log('Failed to add proof column: ' . $e->getMessage()); + return false; + } + } +} diff --git a/classes/Faq.php b/classes/Faq.php new file mode 100644 index 0000000..3c1c2f6 --- /dev/null +++ b/classes/Faq.php @@ -0,0 +1,138 @@ +pdo = $pdo; + } + + /** + * Adds a new FAQ entry to the database. + * + * @param string $title_en The English question for the FAQ. + * @param string $description The English answer for the FAQ. + * @param int $reg_by The ID of the user who registered this entry (from ist_tbl_users). + * @param int $fkisp_id_of The ID of the person associated with this entry (from ist_tbl_people). + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function addFaq(string $title_en, string $description, int $reg_by, int $fkisp_id_of): bool { + $sql = "INSERT INTO dsps_tbl_dspsfaq (dspsfaq_title_en, dspsfaq_description, dspsfaq_reg_by, fkisp_id_of) + VALUES (:title_en, :description, :reg_by, :fkisp_id_of)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':reg_by', $reg_by); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error adding FAQ entry: " . $e->getMessage()); + throw new Exception("Could not add FAQ entry. Please try again later."); + } + } + + /** + * Updates an existing FAQ entry. + * + * @param int $id The ID of the FAQ entry to update. + * @param string $title_en The new English question. + * @param string $description The new English answer. + * @param int $mod_by The ID of the user who modified this entry. + * @param int $fkisp_id_of The ID of the person associated with this entry. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function updateFaq(int $id, string $title_en, string $description, int $mod_by, int $fkisp_id_of): bool { + $sql = "UPDATE dsps_tbl_dspsfaq + SET dspsfaq_title_en = :title_en, dspsfaq_description = :description, + dspsfaq_mod_datetime = CURRENT_TIMESTAMP, dspsfaq_reg_by = :mod_by, fkisp_id_of = :fkisp_id_of + WHERE pkdspsfaq_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':mod_by', $mod_by); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating FAQ entry (ID: $id): " . $e->getMessage()); + throw new Exception("Could not update FAQ entry. Please try again later."); + } + } + + /** + * Deletes an FAQ entry. + * + * @param int $id The ID of the FAQ entry to delete. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function deleteFaq(int $id): bool { + $sql = "DELETE FROM dsps_tbl_dspsfaq WHERE pkdspsfaq_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting FAQ entry (ID: $id): " . $e->getMessage()); + throw new Exception("Could not delete FAQ entry. Please try again later."); + } + } + + /** + * Retrieves a single FAQ entry by its ID. + * + * @param int $id The ID of the FAQ entry. + * @return array|false The entry data as an associative array, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getFaqById(int $id) { + $sql = "SELECT * FROM dsps_tbl_dspsfaq WHERE pkdspsfaq_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching FAQ entry by ID ($id): " . $e->getMessage()); + throw new Exception("Could not retrieve FAQ entry. Please try again later."); + } + } + + /** + * Retrieves all FAQ entries. + * + * @return array An array of FAQ entry data. + * @throws Exception If a database error occurs. + */ + public function getAllFaqs(): array { + $sql = "SELECT * FROM dsps_tbl_dspsfaq ORDER BY dspsfaq_reg_datetime ASC"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all FAQ entries: " . $e->getMessage()); + throw new Exception("Could not retrieve FAQ entries. Please try again later."); + } + } + + /** + * Gets the total count of FAQ entries. + * + * @return int The total number of FAQ entries. + * @throws Exception If a database error occurs. + */ + public function getTotalFaqs(): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_dspsfaq"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total FAQ count: " . $e->getMessage()); + throw new Exception("Could not retrieve FAQ count. Please try again later."); + } + } +} diff --git a/classes/OAuth.php b/classes/OAuth.php new file mode 100644 index 0000000..2638432 --- /dev/null +++ b/classes/OAuth.php @@ -0,0 +1,257 @@ + JupyterHub integration. + */ +class OAuthService +{ + private const AUTH_CODE_TTL = 600; // 10 minutes + private const ACCESS_TOKEN_TTL = 3600; // 1 hour + private const REFRESH_TOKEN_TTL = 2592000; // 30 days + + private PDO $pdo; + + public function __construct(PDO $pdo) + { + $this->pdo = $pdo; + } + + public function getClient(string $clientId): ?array + { + $sql = "SELECT client_id, client_name, client_secret_hash, redirect_uris, allowed_scopes, is_confidential + FROM dsp_oauth_clients + WHERE client_id = :client_id AND is_revoked = 0"; + $stmt = $this->pdo->prepare($sql); + $stmt->execute([':client_id' => $clientId]); + $client = $stmt->fetch(PDO::FETCH_ASSOC); + + return $client ?: null; + } + + public function verifyClientSecret(array $client, string $candidate): bool + { + if (empty($client['client_secret_hash'])) { + return $candidate === ''; + } + + return password_verify($candidate, $client['client_secret_hash']); + } + + public function isRedirectUriAllowed(array $client, string $redirectUri): bool + { + $allowed = array_filter(array_map('trim', preg_split('/[\s,]+/', (string) ($client['redirect_uris'] ?? '')))); + if (empty($allowed)) { + return false; + } + + foreach ($allowed as $prefix) { + if (stripos($redirectUri, $prefix) === 0) { + return true; + } + } + + return false; + } + + public function isScopeAllowed(array $client, ?string $requestedScope): bool + { + $requestedScope = trim((string) $requestedScope); + if ($requestedScope === '') { + return true; + } + + $allowedScopes = array_filter(array_map('trim', explode(' ', (string) ($client['allowed_scopes'] ?? '')))); + + if (empty($allowedScopes)) { + return true; + } + + foreach (explode(' ', $requestedScope) as $scope) { + if (!in_array($scope, $allowedScopes, true)) { + return false; + } + } + + return true; + } + + public function issueAuthorizationCode(string $clientId, int $personId, string $redirectUri, ?string $scope = null): array + { + $code = $this->generateToken(32); + $codeHash = $this->hashToken($code); + $expiresAt = time() + self::AUTH_CODE_TTL; + + $sql = "INSERT INTO dsp_oauth_auth_codes + (code_hash, client_id, person_id, scope, redirect_uri, expires_at, created_at) + VALUES (:code_hash, :client_id, :person_id, :scope, :redirect_uri, FROM_UNIXTIME(:expires_at), NOW())"; + + $stmt = $this->pdo->prepare($sql); + $stmt->execute([ + ':code_hash' => $codeHash, + ':client_id' => $clientId, + ':person_id' => $personId, + ':scope' => $scope, + ':redirect_uri' => $redirectUri, + ':expires_at' => $expiresAt, + ]); + + return [ + 'code' => $code, + 'expires_at' => $expiresAt, + ]; + } + + public function consumeAuthorizationCode(string $code, string $clientId): ?array + { + $codeHash = $this->hashToken($code); + + $sql = "SELECT code_hash, client_id, person_id, scope, redirect_uri, UNIX_TIMESTAMP(expires_at) AS expires_at + FROM dsp_oauth_auth_codes + WHERE code_hash = :code_hash"; + $stmt = $this->pdo->prepare($sql); + $stmt->execute([':code_hash' => $codeHash]); + $record = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$record) { + return null; + } + + // Delete regardless of outcome + $deleteStmt = $this->pdo->prepare("DELETE FROM dsp_oauth_auth_codes WHERE code_hash = :code_hash"); + $deleteStmt->execute([':code_hash' => $codeHash]); + + if ((int) $record['expires_at'] < time()) { + return null; + } + + if ($record['client_id'] !== $clientId) { + return null; + } + + return $record; + } + + public function issueTokens(string $clientId, int $personId, ?string $scope = null, bool $includeRefresh = true): array + { + $accessToken = $this->generateToken(43); + $accessHash = $this->hashToken($accessToken); + $accessExpiresAt = time() + self::ACCESS_TOKEN_TTL; + + $refreshToken = null; + $refreshHash = null; + $refreshExpiresAt = null; + + if ($includeRefresh) { + $refreshToken = $this->generateToken(43); + $refreshHash = $this->hashToken($refreshToken); + $refreshExpiresAt = time() + self::REFRESH_TOKEN_TTL; + } + + $sql = "INSERT INTO dsp_oauth_access_tokens + (token_hash, client_id, person_id, scope, expires_at, refresh_token_hash, refresh_expires_at, created_at) + VALUES (:token_hash, :client_id, :person_id, :scope, FROM_UNIXTIME(:expires_at), + :refresh_hash, " . ($refreshExpiresAt ? "FROM_UNIXTIME(:refresh_expires_at)" : "NULL") . ", NOW())"; + + $stmt = $this->pdo->prepare($sql); + $stmt->execute([ + ':token_hash' => $accessHash, + ':client_id' => $clientId, + ':person_id' => $personId, + ':scope' => $scope, + ':expires_at' => $accessExpiresAt, + ':refresh_hash' => $refreshHash, + ':refresh_expires_at' => $refreshExpiresAt, + ]); + + return [ + 'access_token' => $accessToken, + 'access_expires_at' => $accessExpiresAt, + 'refresh_token' => $refreshToken, + 'refresh_expires_at' => $refreshExpiresAt, + 'token_type' => 'Bearer', + 'scope' => $scope, + ]; + } + + public function exchangeRefreshToken(string $clientId, string $refreshToken): ?array + { + $refreshHash = $this->hashToken($refreshToken); + + $sql = "SELECT token_hash, client_id, person_id, scope, UNIX_TIMESTAMP(refresh_expires_at) AS refresh_expires_at + FROM dsp_oauth_access_tokens + WHERE refresh_token_hash = :refresh_hash AND is_revoked = 0"; + + $stmt = $this->pdo->prepare($sql); + $stmt->execute([':refresh_hash' => $refreshHash]); + $record = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$record) { + return null; + } + + if ($record['client_id'] !== $clientId) { + return null; + } + + if (!empty($record['refresh_expires_at']) && (int) $record['refresh_expires_at'] < time()) { + $this->revokeTokenByHash($record['token_hash']); + return null; + } + + // Revoke old access token + $this->revokeTokenByHash($record['token_hash']); + + // Issue new pair + return $this->issueTokens($clientId, (int) $record['person_id'], $record['scope'], true); + } + + public function getAccessToken(string $token): ?array + { + $hash = $this->hashToken($token); + $sql = "SELECT token_hash, client_id, person_id, scope, + UNIX_TIMESTAMP(expires_at) AS expires_at, + refresh_token_hash, + UNIX_TIMESTAMP(refresh_expires_at) AS refresh_expires_at + FROM dsp_oauth_access_tokens + WHERE token_hash = :hash AND is_revoked = 0"; + $stmt = $this->pdo->prepare($sql); + $stmt->execute([':hash' => $hash]); + $record = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$record) { + return null; + } + + if ((int) $record['expires_at'] < time()) { + $this->revokeTokenByHash($record['token_hash']); + return null; + } + + return $record; + } + + public function revokeTokenByHash(string $hash): void + { + $sql = "UPDATE dsp_oauth_access_tokens SET is_revoked = 1, revoked_at = NOW() + WHERE token_hash = :hash"; + $stmt = $this->pdo->prepare($sql); + $stmt->execute([':hash' => $hash]); + } + + public function recordTokenUsage(string $hash): void + { + $sql = "UPDATE dsp_oauth_access_tokens SET last_used_at = NOW() WHERE token_hash = :hash"; + $stmt = $this->pdo->prepare($sql); + $stmt->execute([':hash' => $hash]); + } + + private function generateToken(int $length): string + { + return rtrim(strtr(base64_encode(random_bytes($length)), '+/', '-_'), '='); + } + + private function hashToken(string $token): string + { + return hash('sha256', $token); + } +} diff --git a/classes/Permission.php b/classes/Permission.php new file mode 100644 index 0000000..0381d12 --- /dev/null +++ b/classes/Permission.php @@ -0,0 +1,144 @@ +pdo = $pdo; + } + + /** + * Checks if a user has a specific permission for a data source. + * @param int $personId The person's ID (fkisp_id). + * @param int $dataSourceId The data source ID (pkdspsds_id). + * @param string $permissionType The type of permission (e.g., 'Read', 'Download'). + * @return bool True if the permission is granted, false otherwise. + */ + public function hasPermission($personId, $dataSourceId, $permissionType) { + $sql = "SELECT COUNT(*) FROM dsps_tbl_datasource_permission + WHERE fkisp_id_of = ? AND fkdspsds_id = ? + AND dspsdsp_permission = ? AND dspsdsp_status = 'Approved'"; + + $stmt = $this->pdo->prepare($sql); + $stmt->execute([$personId, $dataSourceId, $permissionType]); + return $stmt->fetchColumn() > 0; + } + + /** + * Gets a pending request for a user and data source, if one exists. + * @param int $personId The person's ID (fkisp_id). + * @param int $dataSourceId The data source ID (pkdspsds_id). + * @param string $permissionType The type of permission. + * @return array|false The request data as an array, or false if not found. + */ + public function getPendingRequest($personId, $dataSourceId, $permissionType) { + $sql = "SELECT * FROM dsps_tbl_datasource_permission + WHERE fkisp_id_of = ? AND fkdspsds_id = ? + AND dspsdsp_permission = ? AND dspsdsp_status = 'Pending'"; + + $stmt = $this->pdo->prepare($sql); + $stmt->execute([$personId, $dataSourceId, $permissionType]); + return $stmt->fetch(PDO::FETCH_ASSOC); + } + + /** + * Adds a new permission request to the database. + * @param int $personId The person's ID (fkisp_id). + * @param int $dataSourceId The data source ID (pkdspsds_id). + * @param string $permissionType The type of permission requested. + * @param string $status The initial status of the request (e.g., 'Pending'). + * @param string $notes The user's justification for the request. + * @return bool True on success, false on failure. + */ + public function addPermissionRequest($personId, $dataSourceId, $permissionType, $status, $notes, ?string $proofPath = null) { + $hasProofColumn = $this->ensurePermissionProofColumn(); + + if ($hasProofColumn) { + $sql = "INSERT INTO dsps_tbl_datasource_permission (fkisp_id_of, fkdspsds_id, dspsdsp_permission, dspsdsp_notes, dspsdsp_proof_path, dspsdsp_status, dspsdsp_datetime) + VALUES (?, ?, ?, ?, ?, ?, NOW())"; + $params = [$personId, $dataSourceId, $permissionType, $notes, $proofPath, $status]; + } else { + $sql = "INSERT INTO dsps_tbl_datasource_permission (fkisp_id_of, fkdspsds_id, dspsdsp_permission, dspsdsp_notes, dspsdsp_status, dspsdsp_datetime) + VALUES (?, ?, ?, ?, ?, NOW())"; + $params = [$personId, $dataSourceId, $permissionType, $notes, $status]; + } + + $stmt = $this->pdo->prepare($sql); + return $stmt->execute($params); + } + + /** + * Gets all permission requests for a specific user. + * This method is needed for the 'my_permissions.php' script. + * @param int $personId The person's ID (fkisp_id). + * @return array An array of all permission requests for the given person. + */ + public function getPermissionsByPersonId($personId) { + $hasProofColumn = $this->ensurePermissionProofColumn(); + $proofSelect = $hasProofColumn + ? 'pr.dspsdsp_proof_path AS dspspr_proof_path' + : 'NULL AS dspspr_proof_path'; + + $sql = "SELECT + ds.dspsds_title_en AS ds_title, + pr.dspsdsp_permission AS dspspr_permission_type, + pr.dspsdsp_reg_datetime AS dspspr_request_date, + pr.dspsdsp_status AS dspspr_status, + pr.dspsdsp_notes AS dspspr_notes, + $proofSelect + FROM dsps_tbl_datasource_permission pr + JOIN dsps_tbl_datasource ds ON pr.fkdspsds_id = ds.pkdspsds_id + WHERE pr.fkisp_id_of = ?"; + + $stmt = $this->pdo->prepare($sql); + $stmt->execute([$personId]); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } + + private function tableColumnExists(string $table, string $column): bool { + $cacheKey = $table . '.' . $column; + if (array_key_exists($cacheKey, $this->columnExistenceCache)) { + return $this->columnExistenceCache[$cacheKey]; + } + + if (!preg_match('/^[a-zA-Z0-9_]+$/', $table)) { + return false; + } + + $sql = sprintf('SHOW COLUMNS FROM `%s` LIKE :column', $table); + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':column', $column, PDO::PARAM_STR); + $stmt->execute(); + $exists = (bool) $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log('Error checking column existence: ' . $e->getMessage()); + // Assume the column exists if we cannot verify (safer than silently skipping writes) + $exists = true; + } + + $this->columnExistenceCache[$cacheKey] = $exists; + return $exists; + } + + private function ensurePermissionProofColumn(): bool { + $table = 'dsps_tbl_datasource_permission'; + $column = 'dspsdsp_proof_path'; + $cacheKey = $table . '.' . $column; + + if ($this->tableColumnExists($table, $column)) { + return true; + } + + $alterSql = "ALTER TABLE `{$table}` ADD COLUMN `{$column}` VARCHAR(255) DEFAULT NULL AFTER dspsdsp_notes"; + try { + $this->pdo->exec($alterSql); + $this->columnExistenceCache[$cacheKey] = true; + return true; + } catch (PDOException $e) { + error_log('Failed to add proof column: ' . $e->getMessage()); + return false; + } + } +} diff --git a/classes/PermissionManager.php b/classes/PermissionManager.php new file mode 100644 index 0000000..de434c3 --- /dev/null +++ b/classes/PermissionManager.php @@ -0,0 +1,45 @@ +pdo = $pdo; + } + + /** + * Checks if a specific person has a specific permission for a data source. + * @param int $personId The ID of the person. + * @param int $dataSourceId The ID of the data source. + * @param string $permissionType The type of permission to check ('Read' or 'Download'). + * @return bool True if the permission exists, false otherwise. + */ + public function hasPermission($personId, $dataSourceId, $permissionType) + { + try { + // Using a prepared statement to prevent SQL injection + $sql = "SELECT COUNT(*) FROM dspsds_person_permissions + WHERE fk_dspsdspp_person_id = :personId + AND fk_dspsdspp_dspsds_id = :dataSourceId + AND dspsdspp_permission = :permissionType"; + + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':personId', $personId, PDO::PARAM_INT); + $stmt->bindParam(':dataSourceId', $dataSourceId, PDO::PARAM_INT); + $stmt->bindParam(':permissionType', $permissionType, PDO::PARAM_STR); + + $stmt->execute(); + + return $stmt->fetchColumn() > 0; + + } catch (PDOException $e) { + // Log the error but don't expose it to the user + error_log("Database error in hasPermission: " . $e->getMessage()); + return false; + } + } +} diff --git a/classes/Slide.php b/classes/Slide.php new file mode 100644 index 0000000..a446d8e --- /dev/null +++ b/classes/Slide.php @@ -0,0 +1,188 @@ +pdo = $pdo; + $this->uploadDir = __DIR__ . '/../uploads/slides/'; + // Ensure upload directory exists + if (!is_dir($this->uploadDir) && !mkdir($this->uploadDir, 0775, true) && !is_dir($this->uploadDir)) { + throw new RuntimeException('Unable to create slides upload directory.'); + } + } + + /** + * Adds a new slide to the database. + * + * @param string $title_en The English title of the slide. + * @param string $description The full description of the slide. + * @param string $photoname The filename of the uploaded photo. + * @param int $reg_by The ID of the user who registered the slide. + * @param int $fkisp_id_of The person ID of the user who registered the slide. + * @return bool True on success, false on failure. + * @throws Exception If a database error occurs. + */ + public function addSlide(string $title_en, string $description, string $photoname, int $reg_by, int $fkisp_id_of): bool { + $sql = "INSERT INTO dsps_tbl_dspsslide (dspsslide_title_en, dspsslide_description, dspsslide_photoname, dspsslide_reg_by, fkisp_id_of) + VALUES (:title_en, :description, :photoname, :reg_by, :fkisp_id_of)"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':photoname', $photoname); + $stmt->bindParam(':reg_by', $reg_by, PDO::PARAM_INT); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error adding slide: " . $e->getMessage()); + throw new Exception("Could not add slide. Please try again later."); + } + } + + /** + * Updates an existing slide in the database. + * + * @param int $id The ID of the slide to update. + * @param string $title_en The new English title. + * @param string $description The new description. + * @param string $photoname The new filename of the photo. + * @param int $mod_by The ID of the user who modified the slide. + * @param int $fkisp_id_of The person ID of the user who modified the slide. + * @return bool True on success, false on failure. + * @throws Exception If a database error occurs. + */ + public function updateSlide(int $id, string $title_en, string $description, string $photoname, int $mod_by, int $fkisp_id_of): bool { + $sql = "UPDATE dsps_tbl_dspsslide + SET dspsslide_title_en = :title_en, dspsslide_description = :description, dspsslide_photoname = :photoname, + dspsslide_mod_datetime = CURRENT_TIMESTAMP, dspsslide_reg_by = :mod_by, fkisp_id_of = :fkisp_id_of + WHERE pkdspsslide_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':title_en', $title_en); + $stmt->bindParam(':description', $description); + $stmt->bindParam(':photoname', $photoname); + $stmt->bindParam(':mod_by', $mod_by, PDO::PARAM_INT); + $stmt->bindParam(':fkisp_id_of', $fkisp_id_of, PDO::PARAM_INT); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating slide (ID: $id): " . $e->getMessage()); + throw new Exception("Could not update slide. Please try again later."); + } + } + + /** + * Deletes a slide from the database and its associated photo file. + * + * @param int $id The ID of the slide to delete. + * @return bool True on success, false on failure. + * @throws Exception If a database error occurs. + */ + public function deleteSlide(int $id): bool { + // First, get the photo path to delete the file + $slide = $this->getSlideById($id); + if ($slide && !empty($slide['dspsslide_photoname'])) { + $filePath = $this->uploadDir . $slide['dspsslide_photoname']; + if (file_exists($filePath)) { + unlink($filePath); // Delete the file + } + } + + $sql = "DELETE FROM dsps_tbl_dspsslide WHERE pkdspsslide_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error deleting slide (ID: $id): " . $e->getMessage()); + throw new Exception("Could not delete slide. Please try again later."); + } + } + + /** + * Retrieves a single slide by its ID. + * + * @param int $id The ID of the slide. + * @return array|false The slide data as an associative array, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getSlideById(int $id) { + $sql = "SELECT * FROM dsps_tbl_dspsslide WHERE pkdspsslide_id = :id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching slide by ID ($id): " . $e->getMessage()); + throw new Exception("Could not retrieve slide. Please try again later."); + } + } + + /** + * Retrieves all slides. + * + * @return array An array of slide data. + * @throws Exception If a database error occurs. + */ + public function getAllSlides(): array { + $sql = "SELECT * FROM dsps_tbl_dspsslide ORDER BY pkdspsslide_id ASC"; // Order by ID or a custom sort order + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all slides: " . $e->getMessage()); + throw new Exception("Could not retrieve slides. Please try again later."); + } + } + + /** + * Gets the total count of slides. + * + * @return int The total number of slides. + * @throws Exception If a database error occurs. + */ + public function getTotalSlides(): int { + $sql = "SELECT COUNT(*) FROM dsps_tbl_dspsslide"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total slides count: " . $e->getMessage()); + throw new Exception("Could not retrieve slide count. Please try again later."); + } + } + + /** + * Handles the upload of a slide photo. + * + * @param array $file The $_FILES array for the uploaded photo. + * @return string The unique filename of the uploaded photo. + * @throws Exception If the upload fails or file type is invalid. + */ + public function handlePhotoUpload(array $file): string { + if ($file['error'] !== UPLOAD_ERR_OK) { + throw new Exception('File upload error: ' . $file['error']); + } + + $allowedTypes = ['image/jpeg', 'image/png', 'image/gif']; + $finfo = new finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->file($file['tmp_name']); + + if (!in_array($mimeType, $allowedTypes)) { + throw new Exception('Invalid file type. Only JPEG, PNG, and GIF images are allowed.'); + } + + $extension = pathinfo($file['name'], PATHINFO_EXTENSION); + $uniqueFilename = uniqid('slide_') . '.' . $extension; + $destination = $this->uploadDir . $uniqueFilename; + + if (!move_uploaded_file($file['tmp_name'], $destination)) { + throw new Exception('Failed to move uploaded file.'); + } + + return $uniqueFilename; + } +} diff --git a/classes/User.php b/classes/User.php new file mode 100644 index 0000000..24366a9 --- /dev/null +++ b/classes/User.php @@ -0,0 +1,386 @@ +pdo = $pdo; + } + + /** + * Registers a new user and their personal information in the database. + * @param array $person_data An array of personal information. + * @param array $user_data An array of user account data. + * @return bool True on success, false on failure. + */ + public function registerUser($person_data, $user_data) + { + // Start a transaction to ensure both person and user data are saved or neither is + $this->pdo->beginTransaction(); + + try { + // Check for duplicate ID card, phone, or email before inserting + $dupConditions = []; + $dupParams = []; + $duplicateLabels = []; + if (!empty($person_data['id_card'])) { + $dupConditions[] = "isp_idcard = :id_card"; + $dupParams[':id_card'] = $person_data['id_card']; + $duplicateLabels[] = 'ID card'; + } + if (!empty($person_data['phone_number'])) { + $dupConditions[] = "isp_phone_number = :phone"; + $dupParams[':phone'] = $person_data['phone_number']; + $duplicateLabels[] = 'phone number'; + } + if (!empty($person_data['email'])) { + $dupConditions[] = "isp_email = :email"; + $dupParams[':email'] = $person_data['email']; + $duplicateLabels[] = 'email'; + } + + if (!empty($dupConditions)) { + $check_sql = "SELECT pkisp_id FROM ist_tbl_people WHERE " . implode(' OR ', $dupConditions); + $check_stmt = $this->pdo->prepare($check_sql); + $check_stmt->execute($dupParams); + + if ($check_stmt->fetch(PDO::FETCH_ASSOC)) { + $this->pdo->rollBack(); + $duplicateMessage = 'information'; + if (!empty($duplicateLabels)) { + if (count($duplicateLabels) === 1) { + $duplicateMessage = $duplicateLabels[0]; + } elseif (count($duplicateLabels) === 2) { + $duplicateMessage = implode(' or ', $duplicateLabels); + } else { + $last = array_pop($duplicateLabels); + $duplicateMessage = implode(', ', $duplicateLabels) . ", or {$last}"; + } + } + set_message("A user with this {$duplicateMessage} already exists.", "danger"); + return false; + } + } + + // Check for duplicate username + $check_username_sql = "SELECT pkisu_id FROM ist_tbl_users WHERE isu_name = :username"; + $check_username_stmt = $this->pdo->prepare($check_username_sql); + $check_username_stmt->execute([':username' => $user_data['username']]); + + if ($check_username_stmt->fetch(PDO::FETCH_ASSOC)) { + $this->pdo->rollBack(); + set_message("This username is already taken. Please choose another one.", "danger"); + return false; + } + + // 1. Insert into ist_tbl_people + $person_sql = " + INSERT INTO ist_tbl_people ( + isp_idcard, isp_firstname_en, isp_lastname_en, isp_sex, + isp_dob, isp_pob, isp_nationality, isp_marital_status, + isp_phone_number, isp_email, isp_telegram, isp_note + ) VALUES ( + :id_card, :first_name_en, :last_name_en, :sex, + :dob, :pob, :nationality, :marital_status, + :phone_number, :email, :telegram, :note + ) + "; + $person_stmt = $this->pdo->prepare($person_sql); + $person_stmt->execute([ + ':id_card' => ($person_data['id_card'] ?? '') !== '' ? $person_data['id_card'] : null, + ':first_name_en' => $person_data['first_name_en'], + ':last_name_en' => $person_data['last_name_en'], + ':sex' => $person_data['sex'], + ':dob' => $person_data['dob'], + ':pob' => $person_data['pob'], + ':nationality' => $person_data['nationality'], + ':marital_status' => $person_data['marital_status'], + ':phone_number' => $person_data['phone_number'], + ':email' => $person_data['email'], + ':telegram' => $person_data['telegram'], + ':note' => $person_data['note'] + ]); + + // Get the ID of the newly inserted person record + $person_id = $this->pdo->lastInsertId(); + + // 2. Insert into ist_tbl_users + $user_sql = " + INSERT INTO ist_tbl_users ( + fkisp_id_of, isu_name, isu_password, isu_status, isu_can_run_r + ) VALUES ( + :fkisp_id_of, :username, :password, :status, :can_run_r + ) + "; + + $user_stmt = $this->pdo->prepare($user_sql); + $user_stmt->execute([ + ':fkisp_id_of' => $person_id, + ':username' => $user_data['username'], + ':password' => password_hash($user_data['password'], PASSWORD_DEFAULT), // Hash the password + ':status' => $user_data['status'], + ':can_run_r' => empty($user_data['can_run_r']) ? 0 : 1 + ]); + + // Commit the transaction + $this->pdo->commit(); + return true; + + } catch (PDOException $e) { + // Roll back the transaction on any error + $this->pdo->rollBack(); + // Log the detailed error + error_log("Registration failed: " . $e->getMessage()); + set_message("Registration failed due to a database error. Please try again.", "danger"); + return false; + } + } + + /** + * Authenticates a user based on username and password. + * + * @param string $username The user's username. + * @param string $password The user's plain-text password. + * @return array|false User data (pkisu_id, fkisp_id_of, isu_name, isu_status) on success, false on failure. + * @throws Exception If a database error occurs. + */ + public function authenticateUser(string $username, string $password) { + $sql = "SELECT pkisu_id, fkisp_id_of, isu_name, isu_password, isu_status, isu_can_run_r + FROM ist_tbl_users + WHERE isu_name = :username AND isu_status != 'Inactive'"; // Do not allow login for inactive users + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':username', $username); + $stmt->execute(); + $user = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($user && password_verify($password, $user['isu_password'])) { + // Remove password hash before returning user data + unset($user['isu_password']); + return $user; + } + return false; + } catch (PDOException $e) { + error_log("Error authenticating user: " . $e->getMessage()); + throw new Exception("Authentication failed due to a server error. Please try again later."); + } + } + + /** + * Retrieves full user details by user ID (pkisu_id). + * + * @param int $user_id The pkisu_id of the user. + * @return array|false The combined user and person data, or false if not found. + * @throws Exception If a database error occurs. + */ + public function getUserDetails(int $user_id) { + $sql = "SELECT u.*, p.* + FROM ist_tbl_users u + JOIN ist_tbl_people p ON u.fkisp_id_of = p.pkisp_id + WHERE u.pkisu_id = :user_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetch(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching user details for ID ($user_id): " . $e->getMessage()); + throw new Exception("Could not retrieve user details. Please try again later."); + } + } + + /** + * Retrieves all users, optionally filtered by status and/or search query. + * + * @param string|null $search_query Optional search term for username, first name, last name, email, phone. + * @param string|null $status_filter Optional status to filter by (e.g., 'Data Owner'). + * @return array An array of user data. + * @throws Exception If a database error occurs. + */ + public function getAllUsers(?string $search_query = null, ?string $status_filter = null): array { + $sql = "SELECT u.pkisu_id, u.isu_name, u.isu_status, u.isu_reg_datetime, u.isu_mod_datetime, + u.isu_can_run_r, + p.isp_firstname_en, p.isp_lastname_en, p.isp_email, p.isp_phone_number + FROM ist_tbl_users u + JOIN ist_tbl_people p ON u.fkisp_id_of = p.pkisp_id"; + $conditions = []; + $params = []; + + if ($status_filter) { + $conditions[] = "u.isu_status = :status_filter"; + $params[':status_filter'] = $status_filter; + } + + if ($search_query) { + $search_term = '%' . $search_query . '%'; + $conditions[] = "(u.isu_name LIKE :search_query OR + p.isp_firstname_en LIKE :search_query OR + p.isp_lastname_en LIKE :search_query OR + p.isp_email LIKE :search_query OR + p.isp_phone_number LIKE :search_query)"; + $params[':search_query'] = $search_term; + } + + if (!empty($conditions)) { + $sql .= " WHERE " . implode(" AND ", $conditions); + } + + $sql .= " ORDER BY u.isu_reg_datetime DESC"; + + try { + $stmt = $this->pdo->prepare($sql); + foreach ($params as $key => &$val) { + // Use PDO::PARAM_STR for all search/filter parameters, as they are strings + $stmt->bindParam($key, $val, PDO::PARAM_STR); + } + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException $e) { + error_log("Error fetching all users: " . $e->getMessage()); + throw new Exception("Could not retrieve user list. Please try again later."); + } + } + + /** + * Gets the total count of registered users. + * + * @return int The total number of users. + * @throws Exception If a database error occurs. + */ + public function getTotalUsers(): int { + $sql = "SELECT COUNT(*) FROM ist_tbl_users"; + try { + $stmt = $this->pdo->query($sql); + return $stmt->fetchColumn(); + } catch (PDOException $e) { + error_log("Error getting total users count: " . $e->getMessage()); + throw new Exception("Could not retrieve user count. Please try again later."); + } + } + + /** + * Updates a user's status (role). + * + * @param int $user_id The ID of the user to update. + * @param string $new_status The new status ('DAC Staff', 'Data Owner', 'Data User', 'Inactive'). + * @param int $mod_by The ID of the user performing the modification. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function updateUserStatus(int $user_id, string $new_status, int $mod_by): bool { + $sql = "UPDATE ist_tbl_users + SET isu_status = :new_status, isu_mod_datetime = CURRENT_TIMESTAMP, isu_regby_id = :mod_by + WHERE pkisu_id = :user_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':new_status', $new_status); + $stmt->bindParam(':mod_by', $mod_by, PDO::PARAM_INT); + $stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating user status (ID: $user_id): " . $e->getMessage()); + throw new Exception("Could not update user status. Please try again later."); + } + } + + /** + * Grants or revokes R/Jupyter access for a user. + * + * @param int $user_id The pkisu_id of the user. + * @param bool $can_run_r Whether the user should have access. + * @param int $mod_by The ID of the admin performing the change. + * @return bool True on success. + * @throws Exception If a database error occurs. + */ + public function updateUserRJupyterAccess(int $user_id, bool $can_run_r, int $mod_by): bool { + $sql = "UPDATE ist_tbl_users + SET isu_can_run_r = :can_run_r, isu_mod_datetime = CURRENT_TIMESTAMP, isu_regby_id = :mod_by + WHERE pkisu_id = :user_id"; + try { + $stmt = $this->pdo->prepare($sql); + $flag = $can_run_r ? 1 : 0; + $stmt->bindParam(':can_run_r', $flag, PDO::PARAM_INT); + $stmt->bindParam(':mod_by', $mod_by, PDO::PARAM_INT); + $stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error updating R/Jupyter access (ID: $user_id): " . $e->getMessage()); + throw new Exception("Could not update R/Jupyter access. Please try again later."); + } + } + + /** + * Updates a user's personal information. + * + * @param int $person_id The pkisp_id of the person to update. + * @param array $person_data Associative array with fields to update (e.g., isp_firstname_en, isp_phone_number). + * @param int $mod_by The ID of the user performing the modification. + * @return bool True on success. + * @throws Exception If a database error occurs or duplicate entry. + */ + public function updatePersonInfo(int $person_id, array $person_data, int $mod_by): bool { + $setClauses = []; + $params = [':person_id' => $person_id, ':mod_by' => $mod_by]; + + foreach ($person_data as $key => $value) { + // Only allow specific fields to be updated + if (in_array($key, [ + 'isp_idcard', 'isp_firstname_en', 'isp_lastname_en', 'isp_sex', 'isp_dob', + 'isp_pob', 'isp_nationality', 'isp_marital_status', 'isp_phone_number', + 'isp_email', 'isp_telegram', 'isp_note' + ])) { + $setClauses[] = "$key = :$key"; + $params[":$key"] = ($value === '' ? null : $value); + } + } + + if (empty($setClauses)) { + return false; // No fields to update + } + + $sql = "UPDATE ist_tbl_people + SET " . implode(', ', $setClauses) . ", isp_mod_datetime = CURRENT_TIMESTAMP, isp_regby_id = :mod_by + WHERE pkisp_id = :person_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->execute($params); + return $stmt->rowCount() > 0; + } catch (PDOException $e) { + if ($e->getCode() == '23000') { + throw new Exception("A duplicate entry was found for ID card, email, or phone number."); + } + error_log("Error updating person info (ID: $person_id): " . $e->getMessage()); + throw new Exception("Could not update personal information. Please try again later."); + } + } + + /** + * Changes a user's password. + * + * @param int $user_id The pkisu_id of the user. + * @param string $new_password The new plain-text password. + * @param int $mod_by The ID of the user performing the modification. + * @return bool True on success. + * @throws Exception If password hashing fails or database error. + */ + public function changePassword(int $user_id, string $new_password, int $mod_by): bool { + $hashed_password = password_hash($new_password, PASSWORD_DEFAULT); + if ($hashed_password === false) { + throw new Exception("Failed to hash new password."); + } + + $sql = "UPDATE ist_tbl_users + SET isu_password = :hashed_password, isu_mod_datetime = CURRENT_TIMESTAMP, isu_regby_id = :mod_by + WHERE pkisu_id = :user_id"; + try { + $stmt = $this->pdo->prepare($sql); + $stmt->bindParam(':hashed_password', $hashed_password); + $stmt->bindParam(':mod_by', $mod_by, PDO::PARAM_INT); + $stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT); + return $stmt->execute(); + } catch (PDOException $e) { + error_log("Error changing password for user (ID: $user_id): " . $e->getMessage()); + throw new Exception("Could not change password. Please try again later."); + } + } +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..37452d3 --- /dev/null +++ b/composer.json @@ -0,0 +1,25 @@ +{ + "name": "niph/dsp", + "type": "project", + "description": "Data Sharing Platform (DSP) with JupyterHub integration", + "require": { + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "scripts": { + "test": "phpunit" + }, + "autoload": { + "classmap": [ + "classes/" + ], + "files": [ + "includes/jupyter_helpers.php", + "includes/auth.php" + ] + }, + "config": { + "sort-packages": true + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..7f06f40 --- /dev/null +++ b/composer.lock @@ -0,0 +1,1688 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "84f31793da49f1c6a5f28bf7e1143119", + "packages": [], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" + }, + "time": "2025-10-21T19:32:17+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.16", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:31:57+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.58", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e24fb46da450d8e6a5788670513c1af1424f16ca", + "reference": "e24fb46da450d8e6a5788670513c1af1424f16ca", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.16", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.4", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.4", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.1", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.58" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-09-28T12:04:46+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:12:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e8e53097718d2b53cfb2aa859b06a41abf58c62e", + "reference": "e8e53097718d2b53cfb2aa859b06a41abf58c62e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2025-09-07T05:25:07+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:15:17+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-23T08:47:14+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "0735b90f4da94969541dac1da743446e276defa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0735b90f4da94969541dac1da743446e276defa6", + "reference": "0735b90f4da94969541dac1da743446e276defa6", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:09:11+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:19:19+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/47e34210757a2f37a97dcd207d032e1b01e64c7a", + "reference": "47e34210757a2f37a97dcd207d032e1b01e64c7a", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-10T07:50:56+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config.php b/config.php new file mode 100644 index 0000000..93131d1 --- /dev/null +++ b/config.php @@ -0,0 +1,35 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); +} catch (PDOException $e) { + // In a production environment, log the error and show a generic message + error_log("Database connection failed: " . $e->getMessage()); + die("A problem occurred with the database connection. Please try again later."); +} +?> diff --git a/data_hybrid/browse_datasources.php b/data_hybrid/browse_datasources.php new file mode 100644 index 0000000..9ff90aa --- /dev/null +++ b/data_hybrid/browse_datasources.php @@ -0,0 +1,341 @@ +getUserDetails($user_id) : null; + +$uploadsWebPath = '../uploads/datasources/'; + +// Get filter parameters from GET request +$filter_category_id = $_GET['category_id'] ?? null; +if ($filter_category_id !== null) { + $filter_category_id = filter_var($filter_category_id, FILTER_VALIDATE_INT); + if ($filter_category_id === false) { + $filter_category_id = null; + } +} +$search_query = htmlspecialchars($_GET['search'] ?? '', ENT_QUOTES, 'UTF-8'); + +// Fetch data sources based on filters +$data_sources = []; +try { + $data_sources = $dataSourceManager->getDataSources( + null, // No owner filter for public browsing + 'Active', + $filter_category_id, + $search_query + ); +} catch (Exception $e) { + set_message('Error retrieving data sources: ' . $e->getMessage(), 'danger'); +} + +// Fetch all categories for the filter dropdown +$all_categories = []; +try { + $all_categories = $classificationManager->getAllCategories(); +} catch (Exception $e) { + error_log("Error fetching categories for browse_datasources: " . $e->getMessage()); +} +?> + + + + + +
+ + + +
+ + + + + + + + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + +
+ + +
+
+
+
+
Category:
+
Type:
+

150 ? '...' : ''); ?>

+
+
    +
  • Data Owner:
  • +
  • Published: + + + + Not specified + +
  • +
+ ['label' => 'Questionnaire / Data Dictionary', 'icon' => 'fa-clipboard-list'], + 'dspsds_filename2' => ['label' => 'Protocol / User Guide', 'icon' => 'fa-book'], + 'dspsds_filename3' => ['label' => 'Other Supporting Document', 'icon' => 'fa-file-alt'], + ]; + ?> +
+ Supporting Documents +
    + $meta): ?> + +
  • + + + + + + + + (Not provided) + +
  • + +
+
+ + hasPermission($person_id, $ds['pkdspsds_id'], 'Read'); + $has_download_permission = $permissionManager->hasPermission($person_id, $ds['pkdspsds_id'], 'Download'); + } catch (Exception $e) { + error_log("Permission check error for user " . $person_id . " on DS " . $ds['pkdspsds_id'] . ": " . $e->getMessage()); + } + ?> + + + Read Access Granted + + + + + + + + Download File + + + + + + + +
+
+
+
+ + +
+
+ No active data sources found matching your criteria. +
+
+ +
+
+
+ + + + + + + + + + + + diff --git a/data_hybrid/dashboard.php b/data_hybrid/dashboard.php new file mode 100644 index 0000000..af4a76b --- /dev/null +++ b/data_hybrid/dashboard.php @@ -0,0 +1,213 @@ +getDataSources($person_id)); +$pending_permissions_count = count($data_source_manager->getPermissionRequestsForOwner($person_id, 'Pending')); +$usageByDataSource = $data_source_manager->getUsageByDataSourceForUser($person_id, 8); +$data_accesses_last_30_days = 0; +if (!empty($usageByDataSource)) { + foreach ($usageByDataSource as $row) { + $data_accesses_last_30_days += (int) ($row['usage_count'] ?? 0); + } +} + +?> + + + + + + +
+ + + + +
+ + + + + + + +
+
+
+
+
My Data Sources
+

+
+
+
+
+
+
+
Pending Permissions
+

+
+
+
+
+
+
+
Data Accesses (Last 30 Days)
+

+
+
+
+
+ + + +
+
+
+
+
Usage of Data Sources
+
+
+ + + +
No usage recorded yet for your account.
+ +
+
+
+
+ + + + +
+

Recent Activity on My Data Sources

+
    + 'User John Doe requested access to \'Population Census 2023\'.', 'time' => 'Just now', 'type' => 'info'], + ['text' => '\'Health Data Q1 2024\' was downloaded 5 times today.', 'time' => '2 hours ago', 'type' => 'success'], + ['text' => 'You updated \'Education Statistics 2022\'.', 'time' => 'Yesterday', 'type' => 'secondary'], + ]; + foreach ($recent_activities as $activity) { + echo '
  • '; + echo htmlspecialchars($activity['text']); + echo '' . htmlspecialchars($activity['time']) . ''; + echo '
  • '; + } + ?> +
+
+ +
+
+ + + + + + diff --git a/data_hybrid/download.php b/data_hybrid/download.php new file mode 100644 index 0000000..3bba306 --- /dev/null +++ b/data_hybrid/download.php @@ -0,0 +1,111 @@ +prepare($sql_insert); + $action = "Downloaded"; + $stmt_insert->execute([$datasource_id, $person_id, $action]); + +} catch (PDOException $e) { + // We now log the error and set a user-facing message + error_log("Error logging download: " . $e->getMessage()); + // Redirect with an error message, but still try to serve the file + set_message("An error occurred while logging the download.", "danger"); + // We do not die here, as we still want to try and serve the file +} + +// --- 3. Retrieve File Path and Name --- +$file_path = null; +$file_name = null; +try { + $sql_select = " + SELECT dspsds_filename, dspsds_title_en + FROM dsps_tbl_datasource + WHERE pkdspsds_id = ? + "; + $stmt = $pdo->prepare($sql_select); + $stmt->execute([$datasource_id]); + $row = $stmt->fetch(); + + if ($row) { + $file_name = $row['dspsds_filename']; + $download_label = $row['dspsds_title_en'] ?: 'datasource_' . $datasource_id; + } +} catch (PDOException $e) { + error_log("Error retrieving file info: " . $e->getMessage()); + die("An error occurred while retrieving file information."); +} + +if (empty($file_name)) { + die("File not found in the database."); +} + +// Handle external URLs +if (preg_match('/^https?:\\/\\//i', $file_name)) { + header('Location: ' . $file_name); + exit; +} + +$uploadsDir = realpath(__DIR__ . '/../uploads/datasources'); +if (!$uploadsDir) { + error_log('Uploads directory not found for download.'); + die('File storage directory is unavailable.'); +} + +$file_path = $uploadsDir . '/' . $file_name; + +// --- 4. Serve the File to the User --- +// Check if the file exists on the server +if (file_exists($file_path)) { + // Set headers to force a download + header('Content-Description: File Transfer'); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . basename($download_label . '_' . $file_name) . '"'); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($file_path)); + + // Clear output buffer + if (ob_get_level()) { + ob_clean(); + } + flush(); + + // Read the file and send it to the output buffer + readfile($file_path); + exit; +} else { + die("The file could not be found on the server at the specified path."); +} +?> diff --git a/data_hybrid/manage_my_datasources.php b/data_hybrid/manage_my_datasources.php new file mode 100644 index 0000000..8aab596 --- /dev/null +++ b/data_hybrid/manage_my_datasources.php @@ -0,0 +1,537 @@ +getAllDataTypes(); +$categories = $data_source_manager->getAllCategories(); +$primaryRulesMap = []; +foreach ($data_types as $type) { + $typeName = $type['dspstds_name_en'] ?? null; + $rules = $data_source_manager->getPrimaryFileRulesForType($typeName); + $acceptList = []; + foreach ($rules['extensions'] ?? [] as $ext) { + $acceptList[] = '.' . strtolower($ext); + } + $primaryRulesMap[$type['pkdspstds_id']] = [ + 'accept' => $acceptList, + 'description' => $rules['description'] ?? 'CSV, JSON, PDF, XLS, XLSX', + ]; +} +$defaultPrimaryRules = $data_source_manager->getPrimaryFileRulesForType(null); +$defaultPrimaryAccept = []; +foreach ($defaultPrimaryRules['extensions'] ?? [] as $ext) { + $defaultPrimaryAccept[] = '.' . strtolower($ext); +} +$initialPrimaryDescription = $defaultPrimaryRules['description'] ?? 'CSV, JSON, PDF, XLS, XLSX'; + + +// Handle form submissions +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $title_en = trim($_POST['title_en'] ?? ''); + $title_kh = trim($_POST['title_kh'] ?? ''); + $description = trim($_POST['description'] ?? ''); + $type_id = filter_var($_POST['type_id'] ?? '', FILTER_SANITIZE_NUMBER_INT); + $category_id = filter_var($_POST['category_id'] ?? '', FILTER_SANITIZE_NUMBER_INT); + $public_date = trim($_POST['public_date'] ?? ''); + $status = trim($_POST['status'] ?? 'Pending Review'); + $selectedDataType = null; + if (!empty($type_id)) { + $selectedDataType = $data_source_manager->getDataTypeById((int)$type_id); + } + $current_files = [ + 'dspsds_filename' => trim($_POST['current_filename'] ?? ''), + 'dspsds_filename1' => trim($_POST['current_filename1'] ?? ''), + 'dspsds_filename2' => trim($_POST['current_filename2'] ?? ''), + 'dspsds_filename3' => trim($_POST['current_filename3'] ?? ''), + ]; + + $final_files = $current_files; + $file_inputs = [ + 'dspsds_filename' => 'data_file', + 'dspsds_filename1' => 'data_file1', + 'dspsds_filename2' => 'data_file2', + 'dspsds_filename3' => 'data_file3', + ]; + $file_labels = [ + 'dspsds_filename' => 'Primary Data File', + 'dspsds_filename1' => 'Questionnaire / Data Dictionary', + 'dspsds_filename2' => 'Protocol / User Guide', + 'dspsds_filename3' => 'Other Supporting Document', + ]; + $remove_files = $_POST['remove_files'] ?? []; + if (!is_array($remove_files)) { + $remove_files = [$remove_files]; + } + + foreach ($file_inputs as $column => $inputName) { + if (!isset($_FILES[$inputName]) || $_FILES[$inputName]['error'] === UPLOAD_ERR_NO_FILE) { + continue; + } + + try { + if ($_FILES[$inputName]['error'] !== UPLOAD_ERR_OK) { + throw new Exception('Upload error code: ' . $_FILES[$inputName]['error']); + } + $fileRules = null; + if ($column === 'dspsds_filename') { + $fileRules = $data_source_manager->getPrimaryFileRulesForType($selectedDataType['dspstds_name_en'] ?? null); + } + $uploadedName = $data_source_manager->handleDataSourceFileUpload($_FILES[$inputName], $fileRules); + if ($uploadedName) { + if (!empty($current_files[$column]) && $current_files[$column] !== $uploadedName) { + $oldPath = $data_source_manager->getUploadDir() . $current_files[$column]; + if (is_file($oldPath)) { + unlink($oldPath); + } + } + $final_files[$column] = $uploadedName; + } + } catch (Exception $e) { + $friendlyLabel = $file_labels[$column] ?? $inputName; + set_message('File upload failed for ' . htmlspecialchars($friendlyLabel) . ': ' . $e->getMessage(), 'danger'); + $final_files[$column] = $current_files[$column]; + } + } + + foreach ($remove_files as $column) { + if (!array_key_exists($column, $final_files)) { + continue; + } + if (!empty($current_files[$column])) { + $oldPath = $data_source_manager->getUploadDir() . $current_files[$column]; + if (is_file($oldPath)) { + unlink($oldPath); + } + } + $final_files[$column] = ''; + } + + // Basic validation for required fields + if (empty($title_en) || empty($type_id) || empty($category_id)) { + set_message("Title, Data Type, and Category are required.", "danger"); + // Redirect to preserve form data or re-display form with errors + // For now, we'll just redirect to list, but a better UX would be to stay on the form + header("Location: manage_my_datasources.php?action=" . ($action === 'add_submit' ? 'add' : 'edit&id=' . $ds_id)); + exit(); + } + + // Determine the public date to pass to the add/update methods + // The DataSource class's add/update methods have logic for this, so we'll pass it as a string or null + $final_public_date = (!empty($public_date) && $status === 'Active') ? $public_date : null; + + + if ($action === 'add_submit') { + try { + // Corrected call to addDataSource + if ($data_source_manager->addDataSource( + $type_id, + $category_id, + $owner_person_id, // Data owner is the logged-in person + $final_files['dspsds_filename'], + $title_en, + $title_kh, + $description, + $status, + $user_id, // User who registered it (logged-in user) + $final_files['dspsds_filename1'], + $final_files['dspsds_filename2'], + $final_files['dspsds_filename3'] + )) { + set_message("Data source added successfully!", "success"); + } else { + set_message("Failed to add data source.", "danger"); + } + } catch (Exception $e) { + set_message("Error adding data source: " . $e->getMessage(), "danger"); + } + } elseif ($action === 'edit_submit' && $ds_id) { + try { + // Corrected call to updateDataSource + if ($data_source_manager->updateDataSource( + $ds_id, + $type_id, + $category_id, + $owner_person_id, // Data owner is the logged-in person + $final_files['dspsds_filename'], + $title_en, + $title_kh, + $description, + $status, + $user_id, // User who modified it (logged-in user) + $final_files['dspsds_filename1'], + $final_files['dspsds_filename2'], + $final_files['dspsds_filename3'] + )) { + set_message("Data source updated successfully!", "success"); + } else { + set_message("Failed to update data source.", "danger"); + } + } catch (Exception $e) { + set_message("Error updating data source: " . $e->getMessage(), "danger"); + } + } + // Redirect after POST to prevent form resubmission + header("Location: manage_my_datasources.php"); + exit(); +} + +// Handle GET actions +if ($action === 'edit' && $ds_id) { + $datasource_data = $data_source_manager->getDataSourceById($ds_id); + // Crucial security check: Ensure the logged-in owner actually owns this data source + if (!$datasource_data || $datasource_data['fkisp_id_of'] != $owner_person_id) { + set_message("Data source not found or you don't have permission to edit it.", "danger"); + header("Location: manage_my_datasources.php"); + exit(); + } +} elseif ($action === 'delete' && $ds_id) { + $datasource = $data_source_manager->getDataSourceById($ds_id); + // Crucial security check: Ensure the logged-in owner actually owns this data source + if ($datasource && $datasource['fkisp_id_of'] == $owner_person_id) { + // Delete associated file on the server + $fileColumns = ['dspsds_filename', 'dspsds_filename1', 'dspsds_filename2', 'dspsds_filename3']; + foreach ($fileColumns as $column) { + if (!empty($datasource[$column])) { + $filePath = $data_source_manager->getUploadDir() . $datasource[$column]; + if (is_file($filePath)) { + unlink($filePath); // Delete the file + } + } + } + if ($data_source_manager->deleteDataSource($ds_id)) { + set_message("Data source deleted successfully!", "success"); + } else { + set_message("Failed to delete data source.", "danger"); + } + } else { + set_message("Data source not found or you don't have permission to delete it.", "warning"); + } + header("Location: manage_my_datasources.php"); + exit(); +} + +// Fetch data sources for the current owner for display +$my_data_sources = $data_source_manager->getDataSources($owner_person_id); +$uploadsWebPath = '../uploads/datasources/'; + +?> + + + + + +
+ + + + +
+ + + + + + + + + + +
+
+
Data Source
+
+
+
+ + + + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ 'Primary Data File', + 'id' => 'dsDataFile', + 'name' => 'data_file', + 'column' => 'dspsds_filename', + 'help' => 'Upload a file that matches the selected data type.', + ], + [ + 'label' => 'Questionnaire / Data Dictionary', + 'id' => 'dsDataFile1', + 'name' => 'data_file1', + 'column' => 'dspsds_filename1', + 'help' => 'Upload a supporting document (PDF, XLSX, etc.)', + ], + [ + 'label' => 'Protocol / User Guide', + 'id' => 'dsDataFile2', + 'name' => 'data_file2', + 'column' => 'dspsds_filename2', + 'help' => 'Upload a protocol or user guide (PDF, DOCX, etc.)', + ], + [ + 'label' => 'Other Supporting Document', + 'id' => 'dsDataFile3', + 'name' => 'data_file3', + 'column' => 'dspsds_filename3', + 'help' => 'Optional additional document.', + ], + ]; + ?> + + + +
+ + + + + Allowed formats: + + + + + + Current file: + +
+ + +
+ + + + +
+ +
+ + +
+
+ + +
+
+ Cancel + +
+
+
+
+ + +
+
+
My Data Sources
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + '; + if (!empty($primaryFile)) { + $isUrlPrimary = preg_match('/^https?:\/\//i', $primaryFile) === 1; + $primaryTarget = $isUrlPrimary ? $primaryFile : $uploadsWebPath . rawurlencode($primaryFile); + $primaryTitle = $isUrlPrimary ? 'External link' : 'Download Data Source'; + echo ''; + } else { + echo '—'; + } + echo ''; + ?> + 'Questionnaire / Data Dictionary', + 'dspsds_filename2' => 'Protocol / User Guide', + 'dspsds_filename3' => 'Other Supporting Document', + ]; + foreach ($fileCells as $column => $label) { + $fileName = $ds[$column] ?? ''; + echo ''; + } + ?> + + + + + +
IDTitle (EN)TypeCategoryStatusData SourceQuestionnaireUser GuideSupporting DocRegistered DateActions
+ + + + '; + if (!empty($fileName)) { + $isUrl = preg_match('/^https?:\/\//i', $fileName) === 1; + $linkTarget = $isUrl ? $fileName : $uploadsWebPath . rawurlencode($fileName); + $titleAttr = $isUrl ? 'External link' : 'Download ' . $label; + echo ''; + } else { + echo '—'; + } + echo ' + + +
+
+ +
You have not added any data sources yet.
+ +
+
+
+
+ + + + + + diff --git a/data_hybrid/manage_permissions.php b/data_hybrid/manage_permissions.php new file mode 100644 index 0000000..f5f8ee0 --- /dev/null +++ b/data_hybrid/manage_permissions.php @@ -0,0 +1,252 @@ +updatePermissionStatus($permission_id_to_update, $new_status, $user_id, $notes)) { + set_message("Permission request updated successfully!", "success"); + } else { + set_message("Failed to update permission request.", "danger"); + } + header("Location: manage_permissions.php"); + exit(); +} + +$pending_requests = $data_source_manager->getPermissionRequestsForOwner($owner_person_id, 'Pending'); +$all_requests = $data_source_manager->getPermissionRequestsForOwner($owner_person_id); // All statuses +?> + + + + + +
+ + + + +
+ + + + + + + +

Pending Requests

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDData SourceRequested ByPermission TypeRequested DateNotesProofActions
+ —'; + ?> + + + + + View + + + N/A + + +
+ + + + +
+
+ + + + +
+
+
+ +
No pending permission requests.
+ +
+
+ +

All Permission Requests

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDData SourceRequested ByPermission TypeStatusRequested DateNotesProofActions
+ + + + + —'; + ?> + + + + + View + + + N/A + + + +
+ + + + +
+ + No action + +
+
+ +
No permission requests found.
+ +
+
+ +
+
+ + + + diff --git a/data_hybrid/my_downloads.php b/data_hybrid/my_downloads.php new file mode 100644 index 0000000..11a081a --- /dev/null +++ b/data_hybrid/my_downloads.php @@ -0,0 +1,134 @@ +prepare(" + SELECT dsu.*, + ds.dspsds_title_en, + ds.dspsds_filename, + tds.dspstds_name_en + FROM dsps_tbl_datasource_used dsu + JOIN dsps_tbl_datasource ds + ON dsu.fkdspsdsused_id = ds.pkdspsds_id + JOIN dsps_tbl_typedatasource tds + ON ds.fkdspstds_id = tds.pkdspstds_id + WHERE dsu.fkisp_id_of = :person_id + AND dsu.dspsdspused_action = 'Downloaded' + ORDER BY dsu.dspsdspused_datetime DESC + "); + $stmt->execute(['person_id' => $person_id]); + $download_history = $stmt->fetchAll(); +} catch (PDOException $e) { + error_log("Error fetching download history: " . $e->getMessage()); + set_message("Error fetching download history.", "danger"); +} + +?> + + + + + +
+ + + +
+ + + + + + + +
+
+
Downloaded Data Sources
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Data SourceTypeDownload DateFile
+ + + + Download Again + + + N/A (API or no direct file) + +
+
+ +
You have not downloaded any data sources yet.
+ +
+
+ +
+
+ + + + diff --git a/data_hybrid/my_permissions.php b/data_hybrid/my_permissions.php new file mode 100644 index 0000000..49c8187 --- /dev/null +++ b/data_hybrid/my_permissions.php @@ -0,0 +1,140 @@ +getUserDetails($user_id); + +// Fetch all permission requests for the logged-in user +$permissionRequests = []; +try { + $permissionRequests = $permissionManager->getPermissionsByPersonId($person_id); +} catch (Exception $e) { + set_message('Error retrieving permission requests: ' . $e->getMessage(), 'danger'); +} +?> + + + + + +
+ + + +
+ + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Data SourceRequested ForDate SubmittedStatus
+ + +
+
+ +
+ You have not submitted any permission requests yet. Browse data sources to get started. +
+ +
+
+
+
+ + + + + diff --git a/data_hybrid/r_in_jupyter.php b/data_hybrid/r_in_jupyter.php new file mode 100644 index 0000000..eb8c1f6 --- /dev/null +++ b/data_hybrid/r_in_jupyter.php @@ -0,0 +1,162 @@ + [], 'missing' => [], 'workspace_dir' => null]; +$workspaceRelativeDir = null; +$workspaceError = null; + +if ($hasRJupyterAccess && isset($_SESSION['person_id'])) { + $dataSourceManager = new DataSource($pdo); + try { + $workspaceSync = $dataSourceManager->prepareJupyterWorkspace( + (int) $_SESSION['person_id'], + dirname(__DIR__) . '/uploads/jupyter_workspace' + ); + $workspaceRelativeDir = 'datasources/user_' . (int) $_SESSION['person_id']; + } catch (Exception $e) { + $workspaceError = $e->getMessage(); + } +} + +$jupyterBaseUrl = dsp_jupyter_base_url(); +$jupyterToken = dsp_jupyter_token(); +$jupyterIframeUrl = dsp_jupyter_iframe_url( + $jupyterBaseUrl, + $jupyterToken, + isset($_SESSION['person_id']) ? (int) $_SESSION['person_id'] : null +); +?> + + + + +
+ + +
+ + + + + + + +
+
+
Collaborative R Workspace
+ + Enabled + + Disabled + +
+
+ + +
+ Workspace error: +
+ +

+ Only Approved data sources are copied into + + inside Jupyter. Use these files when collaborating with Data Owners. +

+ +
+ + + + + + + + + + + + $syncedItem): ?> + + + + + + + + + +
#Data SourceData TypeCategoryFilename
+
+ +
+ You do not have any Approved data sources yet. Once your requests are approved, refresh this page. +
+ + +
+ Some items were skipped: +
    + +
  • —
  • + +
+
+ + +

+ Launch the embedded JupyterLab environment to build notebooks, explore shared datasets, and collaborate with Data Owners. + Use the Files panel to open existing work or create a new R Notebook from the launcher. +

+
+ +
+

+ Prefer a dedicated window? Open Jupyter in a new tab. +

+ +
+ +
+ R in JupyterHub is currently disabled for your account.
+ Contact a DAC Staff administrator to enable R/Jupyter access so you can analyse data directly from this workspace. +
+
+

+ Once access is enabled, refresh this page to launch the JupyterLab environment. +

+ +
+
+
+
+ + + diff --git a/data_owner/dashboard.php b/data_owner/dashboard.php new file mode 100644 index 0000000..9da47c6 --- /dev/null +++ b/data_owner/dashboard.php @@ -0,0 +1,214 @@ +getDataSources($person_id)); +$pending_permissions_count = count($data_source_manager->getPermissionRequestsForOwner($person_id, 'Pending')); +$usageByUser = $data_source_manager->getUsageByUserForOwner($person_id, 6); +$data_accesses_last_30_days = 0; +if (!empty($usageByUser)) { + foreach ($usageByUser as $row) { + $data_accesses_last_30_days += (int) ($row['usage_count'] ?? 0); + } +} + +?> + + + + + + +
+ + + + +
+ + + + + + + +
+
+
+
+
My Data Sources
+

+
+
+
+
+
+
+
Pending Permissions
+

+
+
+
+
+
+
+
Data Accesses (Last 30 Days)
+

+
+
+
+
+ + + +
+
+
+
+
Usage Breakdown by User
+
+
+ + + +
No data usage recorded yet.
+ +
+
+
+
+ + + + +
+

Recent Activity on My Data Sources

+
    + 'User John Doe requested access to \'Population Census 2023\'.', 'time' => 'Just now', 'type' => 'info'], + ['text' => '\'Health Data Q1 2024\' was downloaded 5 times today.', 'time' => '2 hours ago', 'type' => 'success'], + ['text' => 'You updated \'Education Statistics 2022\'.', 'time' => 'Yesterday', 'type' => 'secondary'], + ]; + foreach ($recent_activities as $activity) { + echo '
  • '; + echo htmlspecialchars($activity['text']); + echo '' . htmlspecialchars($activity['time']) . ''; + echo '
  • '; + } + ?> +
+
+ +
+
+ + + + + + diff --git a/data_owner/manage_my_datasources.php b/data_owner/manage_my_datasources.php new file mode 100644 index 0000000..797ca77 --- /dev/null +++ b/data_owner/manage_my_datasources.php @@ -0,0 +1,542 @@ +getAllDataTypes(); +$categories = $data_source_manager->getAllCategories(); +$primaryRulesMap = []; +foreach ($data_types as $type) { + $typeName = $type['dspstds_name_en'] ?? null; + $rules = $data_source_manager->getPrimaryFileRulesForType($typeName); + $acceptList = []; + foreach ($rules['extensions'] ?? [] as $ext) { + $acceptList[] = '.' . strtolower($ext); + } + $primaryRulesMap[$type['pkdspstds_id']] = [ + 'accept' => $acceptList, + 'description' => $rules['description'] ?? 'CSV, JSON, PDF, XLS, XLSX', + ]; +} +$defaultPrimaryRules = $data_source_manager->getPrimaryFileRulesForType(null); +$defaultPrimaryAccept = []; +foreach ($defaultPrimaryRules['extensions'] ?? [] as $ext) { + $defaultPrimaryAccept[] = '.' . strtolower($ext); +} +$initialPrimaryDescription = $defaultPrimaryRules['description'] ?? 'CSV, JSON, PDF, XLS, XLSX'; + + +// Handle form submissions +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $title_en = trim($_POST['title_en'] ?? ''); + $title_kh = trim($_POST['title_kh'] ?? ''); + $description = trim($_POST['description'] ?? ''); + $type_id = filter_var($_POST['type_id'] ?? '', FILTER_SANITIZE_NUMBER_INT); + $category_id = filter_var($_POST['category_id'] ?? '', FILTER_SANITIZE_NUMBER_INT); + $public_date = trim($_POST['public_date'] ?? ''); + $status = trim($_POST['status'] ?? 'Pending Review'); + $selectedDataType = null; + if (!empty($type_id)) { + $selectedDataType = $data_source_manager->getDataTypeById((int)$type_id); + } + $current_files = [ + 'dspsds_filename' => trim($_POST['current_filename'] ?? ''), + 'dspsds_filename1' => trim($_POST['current_filename1'] ?? ''), + 'dspsds_filename2' => trim($_POST['current_filename2'] ?? ''), + 'dspsds_filename3' => trim($_POST['current_filename3'] ?? ''), + ]; + + $final_files = $current_files; + $file_inputs = [ + 'dspsds_filename' => 'data_file', + 'dspsds_filename1' => 'data_file1', + 'dspsds_filename2' => 'data_file2', + 'dspsds_filename3' => 'data_file3', + ]; + $file_labels = [ + 'dspsds_filename' => 'Primary Data File', + 'dspsds_filename1' => 'Questionnaire / Data Dictionary', + 'dspsds_filename2' => 'Protocol / User Guide', + 'dspsds_filename3' => 'Other Supporting Document', + ]; + $remove_files = $_POST['remove_files'] ?? []; + if (!is_array($remove_files)) { + $remove_files = [$remove_files]; + } + + foreach ($file_inputs as $column => $inputName) { + if (!isset($_FILES[$inputName]) || $_FILES[$inputName]['error'] === UPLOAD_ERR_NO_FILE) { + continue; + } + + try { + if ($_FILES[$inputName]['error'] !== UPLOAD_ERR_OK) { + throw new Exception('Upload error code: ' . $_FILES[$inputName]['error']); + } + $fileRules = null; + if ($column === 'dspsds_filename') { + $fileRules = $data_source_manager->getPrimaryFileRulesForType($selectedDataType['dspstds_name_en'] ?? null); + } + $uploadedName = $data_source_manager->handleDataSourceFileUpload($_FILES[$inputName], $fileRules); + if ($uploadedName) { + if (!empty($current_files[$column]) && $current_files[$column] !== $uploadedName) { + $oldPath = $data_source_manager->getUploadDir() . $current_files[$column]; + if (is_file($oldPath)) { + unlink($oldPath); + } + } + $final_files[$column] = $uploadedName; + } + } catch (Exception $e) { + $friendlyLabel = $file_labels[$column] ?? $inputName; + set_message('File upload failed for ' . htmlspecialchars($friendlyLabel) . ': ' . $e->getMessage(), 'danger'); + $final_files[$column] = $current_files[$column]; + } + } + + foreach ($remove_files as $column) { + if (!array_key_exists($column, $final_files)) { + continue; + } + if (!empty($current_files[$column])) { + $oldPath = $data_source_manager->getUploadDir() . $current_files[$column]; + if (is_file($oldPath)) { + unlink($oldPath); + } + } + $final_files[$column] = ''; + } + + // Basic validation for required fields + if (empty($title_en) || empty($type_id) || empty($category_id)) { + set_message("Title, Data Type, and Category are required.", "danger"); + // Redirect to preserve form data or re-display form with errors + // For now, we'll just redirect to list, but a better UX would be to stay on the form + header("Location: manage_my_datasources.php?action=" . ($action === 'add_submit' ? 'add' : 'edit&id=' . $ds_id)); + exit(); + } + + // Determine the public date to pass to the add/update methods + // The DataSource class's add/update methods have logic for this, so we'll pass it as a string or null + $final_public_date = (!empty($public_date) && $status === 'Active') ? $public_date : null; + + + if ($action === 'add_submit') { + try { + // Corrected call to addDataSource + if ($data_source_manager->addDataSource( + $type_id, + $category_id, + $owner_person_id, // Data owner is the logged-in person + $final_files['dspsds_filename'], + $title_en, + $title_kh, + $description, + $status, + $user_id, // User who registered it (logged-in user) + $final_files['dspsds_filename1'], + $final_files['dspsds_filename2'], + $final_files['dspsds_filename3'] + )) { + set_message("Data source added successfully!", "success"); + } else { + set_message("Failed to add data source.", "danger"); + } + } catch (Exception $e) { + set_message("Error adding data source: " . $e->getMessage(), "danger"); + } + } elseif ($action === 'edit_submit' && $ds_id) { + try { + // Corrected call to updateDataSource + if ($data_source_manager->updateDataSource( + $ds_id, + $type_id, + $category_id, + $owner_person_id, // Data owner is the logged-in person + $final_files['dspsds_filename'], + $title_en, + $title_kh, + $description, + $status, + $user_id, // User who modified it (logged-in user) + $final_files['dspsds_filename1'], + $final_files['dspsds_filename2'], + $final_files['dspsds_filename3'] + )) { + set_message("Data source updated successfully!", "success"); + } else { + set_message("Failed to update data source.", "danger"); + } + } catch (Exception $e) { + set_message("Error updating data source: " . $e->getMessage(), "danger"); + } + } + // Redirect after POST to prevent form resubmission + header("Location: manage_my_datasources.php"); + exit(); +} + +// Handle GET actions +if ($action === 'edit' && $ds_id) { + $datasource_data = $data_source_manager->getDataSourceById($ds_id); + // Crucial security check: Ensure the logged-in owner actually owns this data source + if (!$datasource_data || $datasource_data['fkisp_id_of'] != $owner_person_id) { + set_message("Data source not found or you don't have permission to edit it.", "danger"); + header("Location: manage_my_datasources.php"); + exit(); + } +} elseif ($action === 'delete' && $ds_id) { + $datasource = $data_source_manager->getDataSourceById($ds_id); + // Crucial security check: Ensure the logged-in owner actually owns this data source + if ($datasource && $datasource['fkisp_id_of'] == $owner_person_id) { + // Delete associated file on the server + $fileColumns = ['dspsds_filename', 'dspsds_filename1', 'dspsds_filename2', 'dspsds_filename3']; + foreach ($fileColumns as $column) { + if (!empty($datasource[$column])) { + $filePath = $data_source_manager->getUploadDir() . $datasource[$column]; + if (is_file($filePath)) { + unlink($filePath); + } + } + } + if ($data_source_manager->deleteDataSource($ds_id)) { + set_message("Data source deleted successfully!", "success"); + } else { + set_message("Failed to delete data source.", "danger"); + } + } else { + set_message("Data source not found or you don't have permission to delete it.", "warning"); + } + header("Location: manage_my_datasources.php"); + exit(); +} + +// Fetch data sources for the current owner for display +$my_data_sources = $data_source_manager->getDataSources($owner_person_id); +$uploadsWebPath = '../uploads/datasources/'; + +?> + + + + + +
+ + + + +
+ + + + + + + + + + +
+
+
Data Source
+
+
+
+ + + + +
+ + +
+ +
+ + +
+
+ + +
+
+ + +
+ + + 'Primary Data File', + 'id' => 'dsDataFile', + 'name' => 'data_file', + 'column' => 'dspsds_filename', + 'help' => 'Upload a file that matches the selected data type.', + ], + [ + 'label' => 'Questionnaire / Data Dictionary', + 'id' => 'dsDataFile1', + 'name' => 'data_file1', + 'column' => 'dspsds_filename1', + 'help' => 'Upload a supporting document (PDF, XLSX, etc.)', + ], + [ + 'label' => 'Protocol / User Guide', + 'id' => 'dsDataFile2', + 'name' => 'data_file2', + 'column' => 'dspsds_filename2', + 'help' => 'Upload a protocol or user guide (PDF, DOCX, etc.)', + ], + [ + 'label' => 'Other Supporting Document', + 'id' => 'dsDataFile3', + 'name' => 'data_file3', + 'column' => 'dspsds_filename3', + 'help' => 'Optional additional document.', + ], + ]; + ?> + + + +
+ + + + + Allowed formats: + + + + + + Current file: + +
+ + +
+ + + + +
+ + +
+ + +
+
+ + +
+
+ Cancel + +
+
+
+
+ + +
+
+
My Data Sources
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + '; + if (!empty($primaryFile)) { + $isUrlPrimary = preg_match('/^https?:\/\//i', $primaryFile) === 1; + $primaryTarget = $isUrlPrimary ? $primaryFile : $uploadsWebPath . rawurlencode($primaryFile); + $primaryTitle = $isUrlPrimary ? 'External link' : 'Download Data Source'; + echo ''; + } else { + echo '—'; + } + echo ''; + ?> + 'Questionnaire / Data Dictionary', + 'dspsds_filename2' => 'Protocol / User Guide', + 'dspsds_filename3' => 'Other Supporting Document', + ]; + foreach ($fileCells as $column => $label) { + $fileName = $ds[$column] ?? ''; + echo ''; + } + ?> + + + + + +
IDTitle (EN)TypeCategoryStatusData SourceQuestionnaireUser GuideSupporting DocRegistered DateActions
+ + + + '; + if (!empty($fileName)) { + $isUrl = preg_match('/^https?:\/\//i', $fileName) === 1; + $linkTarget = $isUrl ? $fileName : $uploadsWebPath . rawurlencode($fileName); + $titleAttr = $isUrl ? 'External link' : 'Download ' . $label; + echo ''; + } else { + echo '—'; + } + echo ' + + +
+
+ +
You have not added any data sources yet.
+ +
+
+
+
+ + + + + + diff --git a/data_owner/manage_permissions.php b/data_owner/manage_permissions.php new file mode 100644 index 0000000..c956f9a --- /dev/null +++ b/data_owner/manage_permissions.php @@ -0,0 +1,252 @@ +updatePermissionStatus($permission_id_to_update, $new_status, $user_id, $notes)) { + set_message("Permission request updated successfully!", "success"); + } else { + set_message("Failed to update permission request.", "danger"); + } + header("Location: manage_permissions.php"); + exit(); +} + +$pending_requests = $data_source_manager->getPermissionRequestsForOwner($owner_person_id, 'Pending'); +$all_requests = $data_source_manager->getPermissionRequestsForOwner($owner_person_id); // All statuses +?> + + + + + +
+ + + + +
+ + + + + + + +

Pending Requests

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDData SourceRequested ByPermission TypeRequested DateNotesProofActions
+ —'; + ?> + + + + + View + + + N/A + + +
+ + + + +
+
+ + + + +
+
+
+ +
No pending permission requests.
+ +
+
+ +

All Permission Requests

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDData SourceRequested ByPermission TypeStatusRequested DateNotesProofActions
+ + + + + —'; + ?> + + + + + View + + + N/A + + + +
+ + + + +
+ + No action + +
+
+ +
No permission requests found.
+ +
+
+ +
+
+ + + + diff --git a/data_owner/my_analytics.php b/data_owner/my_analytics.php new file mode 100644 index 0000000..8a07fd3 --- /dev/null +++ b/data_owner/my_analytics.php @@ -0,0 +1,140 @@ +prepare(" + SELECT COUNT(dsu.pkdspsdspused_id) + FROM dsps_tbl_datasource_used dsu + JOIN dsps_tbl_datasource ds ON dsu.fkdspsdsused_id = ds.pkdspsds_id + WHERE ds.fkisp_id_of = :owner_person_id AND dsu.dspsdspused_action = 'Downloaded' + "); + $stmt->execute(['owner_person_id' => $owner_person_id]); + $total_downloads = $stmt->fetchColumn(); +} catch (PDOException $e) { + error_log("Error fetching total downloads: " . $e->getMessage()); +} + +// Example: Most viewed data sources (from anonymous views or usage logs) +$most_viewed_datasources = []; +try { + $stmt = $pdo->prepare(" + SELECT ds.dspsds_title_en, COUNT(da.pkdspsano_id) AS view_count + FROM dsps_tbl_anonymous da + JOIN dsps_tbl_datasource ds ON da.fkdspsds_id = ds.pkdspsds_id + WHERE ds.fkisp_id_of = :owner_person_id + GROUP BY ds.pkdspsds_id, ds.dspsds_title_en + ORDER BY view_count DESC + LIMIT 5 + "); + $stmt->execute(['owner_person_id' => $owner_person_id]); + $most_viewed_datasources = $stmt->fetchAll(); +} catch (PDOException $e) { + error_log("Error fetching most viewed data sources: " . $e->getMessage()); +} + +?> + + + + + +
+ + + + +
+ + + + + + + +
+
+
+
+
Total Downloads of My Data
+

+
+
+
+
+
+
+
Total Views of My Data Introductions
+

1500

+
+
+
+
+ +
+
+
Most Viewed Data Sources (Top 5)
+
+
+ +
    + +
  • + + Views +
  • + +
+ +
No view data available for your sources yet.
+ +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/data_owner/run_r_scripts.php b/data_owner/run_r_scripts.php new file mode 100644 index 0000000..f2d7058 --- /dev/null +++ b/data_owner/run_r_scripts.php @@ -0,0 +1,166 @@ + [], 'missing' => [], 'workspace_dir' => null]; +$workspaceRelativeDir = null; +$workspaceError = null; + +if ($hasRJupyterAccess && isset($_SESSION['person_id'])) { + $dataSourceManager = new DataSource($pdo); + try { + $workspaceSync = $dataSourceManager->prepareJupyterWorkspace( + (int) $_SESSION['person_id'], + dirname(__DIR__) . '/uploads/jupyter_workspace' + ); + $workspaceRelativeDir = 'datasources/user_' . (int) $_SESSION['person_id']; + } catch (Exception $e) { + $workspaceError = $e->getMessage(); + } +} +?> + + + + + +
+ + + + +
+ + +
+
+
Work with R inside JupyterLab
+ + Enabled + + Disabled + +
+
+ + +
+ Workspace error: +
+ +

+ Approved data sources you manage or have access to are synced to + inside Jupyter. + Only datasets with Approved permissions appear here. +

+ +
+ + + + + + + + + + + + $syncedItem): ?> + + + + + + + + + +
#Data SourceData TypeCategoryFilename
+
+ +
+ You do not currently have any Approved data sources. Approve requests in the permissions panel to make them available here. +
+ + +
+ Some files were skipped: +
    + +
  • —
  • + +
+
+ + +

+ Launch the embedded Jupyter environment below to build, run, and share your R notebooks. Use the + toolbar menu inside Jupyter to create new R notebooks and access saved work under Files. +

+
+ +
+

+ Need more room? Open Jupyter in a new tab. +

+ +
+ +
+ R in JupyterHub is currently disabled for your account.
+ Contact a DAC Staff administrator to enable R/Jupyter access so you can analyse datasets directly from this workspace. +
+
+

+ After your access is approved, refresh this page to launch the embedded notebook environment. +

+ +
+
+ +
+
+ + + + diff --git a/data_user/browse_datasources.php b/data_user/browse_datasources.php new file mode 100644 index 0000000..65ed065 --- /dev/null +++ b/data_user/browse_datasources.php @@ -0,0 +1,341 @@ +getUserDetails($user_id) : null; + +$uploadsWebPath = '../uploads/datasources/'; + +// Get filter parameters from GET request +$filter_category_id = $_GET['category_id'] ?? null; +if ($filter_category_id !== null) { + $filter_category_id = filter_var($filter_category_id, FILTER_VALIDATE_INT); + if ($filter_category_id === false) { + $filter_category_id = null; + } +} +$search_query = htmlspecialchars($_GET['search'] ?? '', ENT_QUOTES, 'UTF-8'); + +// Fetch data sources based on filters +$data_sources = []; +try { + $data_sources = $dataSourceManager->getDataSources( + null, // No owner filter for public browsing + 'Active', + $filter_category_id, + $search_query + ); +} catch (Exception $e) { + set_message('Error retrieving data sources: ' . $e->getMessage(), 'danger'); +} + +// Fetch all categories for the filter dropdown +$all_categories = []; +try { + $all_categories = $classificationManager->getAllCategories(); +} catch (Exception $e) { + error_log("Error fetching categories for browse_datasources: " . $e->getMessage()); +} +?> + + + + + +
+ + + +
+ + + + + + + + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + +
+ + +
+
+
+
+
Category:
+
Type:
+

150 ? '...' : ''); ?>

+
+
    +
  • Data Owner:
  • +
  • Published: + + + + Not specified + +
  • +
+ ['label' => 'Questionnaire / Data Dictionary', 'icon' => 'fa-clipboard-list'], + 'dspsds_filename2' => ['label' => 'Protocol / User Guide', 'icon' => 'fa-book'], + 'dspsds_filename3' => ['label' => 'Other Supporting Document', 'icon' => 'fa-file-alt'], + ]; + ?> +
+ Supporting Documents +
    + $meta): ?> + +
  • + + + + + + + + (Not provided) + +
  • + +
+
+ + hasPermission($person_id, $ds['pkdspsds_id'], 'Read'); + $has_download_permission = $permissionManager->hasPermission($person_id, $ds['pkdspsds_id'], 'Download'); + } catch (Exception $e) { + error_log("Permission check error for user " . $person_id . " on DS " . $ds['pkdspsds_id'] . ": " . $e->getMessage()); + } + ?> + + + Read Access Granted + + + + + + + + Download File + + + + + + + +
+
+
+
+ + +
+
+ No active data sources found matching your criteria. +
+
+ +
+
+
+ + + + + + + + + + + + diff --git a/data_user/dashboard.php b/data_user/dashboard.php new file mode 100644 index 0000000..bf88f2d --- /dev/null +++ b/data_user/dashboard.php @@ -0,0 +1,166 @@ +prepare(" + SELECT COUNT(DISTINCT dp.fkdspsds_id) + FROM dsps_tbl_datasource_permission dp + WHERE dp.fkisp_id_of = :person_id AND dp.dspsdsp_status = 'Approved' + "); + $stmt->execute(['person_id' => $person_id]); + $approved_datasources_count = $stmt->fetchColumn(); +} catch (PDOException $e) { + error_log("Error fetching approved datasources count: " . $e->getMessage()); +} + +$pending_requests_count = 0; +try { + $stmt = $pdo->prepare(" + SELECT COUNT(dp.pkdspsdsp_id) + FROM dsps_tbl_datasource_permission dp + WHERE dp.fkisp_id_of = :person_id AND dp.dspsdsp_status = 'Pending' + "); + $stmt->execute(['person_id' => $person_id]); + $pending_requests_count = $stmt->fetchColumn(); +} catch (PDOException $e) { + error_log("Error fetching pending requests count: " . $e->getMessage()); +} + +$my_downloads_count = 0; +try { + $stmt = $pdo->prepare(" + SELECT COUNT(*) FROM dsps_tbl_datasource_used + WHERE fkisp_id_of = :person_id AND dspsdspused_action = 'Downloaded' + "); + $stmt->execute(['person_id' => $person_id]); + $my_downloads_count = $stmt->fetchColumn(); +} catch (PDOException $e) { + error_log("Error fetching my downloads count: " . $e->getMessage()); +} + +?> + + + + + +
+ + + +
+ + + + + + + +
+
+
+
+
Approved Data Sources
+

+
+
+
+
+
+
+
Pending Requests
+

+
+
+
+
+
+
+
My Total Downloads
+

+
+
+
+
+ + + + +
+

Recently Accessed Data Sources

+
    + 'Health Survey 2023', 'action' => 'Downloaded', 'time' => '1 hour ago'], + ['title' => 'Education Statistics 2022', 'action' => 'Viewed Details', 'time' => 'Yesterday'], + ['title' => 'Climate Data Phnom Penh', 'action' => 'Ran Analysis', 'time' => '3 days ago'], + ]; + if (!empty($recent_accesses)) { + foreach ($recent_accesses as $access) { + echo '
  • '; + echo htmlspecialchars($access['title']) . ' - ' . htmlspecialchars($access['action']); + echo '' . htmlspecialchars($access['time']) . ''; + echo '
  • '; + } + } else { + echo '
  • No recent activity.
  • '; + } + ?> +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/data_user/download.php b/data_user/download.php new file mode 100644 index 0000000..e6efc16 --- /dev/null +++ b/data_user/download.php @@ -0,0 +1,109 @@ +prepare($sql_insert); + $action = "Downloaded"; + $stmt_insert->execute([$datasource_id, $person_id, $action]); + +} catch (PDOException $e) { + // We now log the error and set a user-facing message + error_log("Error logging download: " . $e->getMessage()); + // Redirect with an error message, but still try to serve the file + set_message("An error occurred while logging the download.", "danger"); + // We do not die here, as we still want to try and serve the file +} + +// --- 3. Retrieve File Path and Name --- +$file_path = null; +$file_name = null; +try { + $sql_select = " + SELECT dspsds_filename, dspsds_title_en + FROM dsps_tbl_datasource + WHERE pkdspsds_id = ? + "; + $stmt = $pdo->prepare($sql_select); + $stmt->execute([$datasource_id]); + $row = $stmt->fetch(); + + if ($row) { + $file_name = $row['dspsds_filename']; + $download_label = $row['dspsds_title_en'] ?: 'datasource_' . $datasource_id; + } +} catch (PDOException $e) { + error_log("Error retrieving file info: " . $e->getMessage()); + die("An error occurred while retrieving file information."); +} + +if (empty($file_name)) { + die("File not found in the database."); +} + +if (preg_match('/^https?:\\/\\//i', $file_name)) { + header('Location: ' . $file_name); + exit; +} + +$uploadsDir = realpath(__DIR__ . '/../uploads/datasources'); +if (!$uploadsDir) { + error_log('Uploads directory not found for download.'); + die('File storage directory is unavailable.'); +} + +$file_path = $uploadsDir . '/' . $file_name; + +// --- 4. Serve the File to the User --- +// Check if the file exists on the server +if (file_exists($file_path)) { + // Set headers to force a download + header('Content-Description: File Transfer'); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . basename($download_label . '_' . $file_name) . '"'); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($file_path)); + + if (ob_get_level()) { + ob_clean(); + } + flush(); + + // Read the file and send it to the output buffer + readfile($file_path); + exit; +} else { + die("The file could not be found on the server at the specified path."); +} +?> diff --git a/data_user/indexTesting.php b/data_user/indexTesting.php new file mode 100644 index 0000000..0b8e325 --- /dev/null +++ b/data_user/indexTesting.php @@ -0,0 +1,58 @@ + diff --git a/data_user/my_downloads.php b/data_user/my_downloads.php new file mode 100644 index 0000000..1fbf012 --- /dev/null +++ b/data_user/my_downloads.php @@ -0,0 +1,134 @@ +prepare(" + SELECT dsu.*, + ds.dspsds_title_en, + ds.dspsds_filename, + tds.dspstds_name_en + FROM dsps_tbl_datasource_used dsu + JOIN dsps_tbl_datasource ds + ON dsu.fkdspsdsused_id = ds.pkdspsds_id + JOIN dsps_tbl_typedatasource tds + ON ds.fkdspstds_id = tds.pkdspstds_id + WHERE dsu.fkisp_id_of = :person_id + AND dsu.dspsdspused_action = 'Downloaded' + ORDER BY dsu.dspsdspused_datetime DESC + "); + $stmt->execute(['person_id' => $person_id]); + $download_history = $stmt->fetchAll(); +} catch (PDOException $e) { + error_log("Error fetching download history: " . $e->getMessage()); + set_message("Error fetching download history.", "danger"); +} + +?> + + + + + +
+ + + +
+ + + + + + + +
+
+
Downloaded Data Sources
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Data SourceTypeDownload DateFile
+ + + + Download Again + + + N/A (API or no direct file) + +
+
+ +
You have not downloaded any data sources yet.
+ +
+
+ +
+
+ + + + diff --git a/data_user/my_permissions.php b/data_user/my_permissions.php new file mode 100644 index 0000000..2bf19d3 --- /dev/null +++ b/data_user/my_permissions.php @@ -0,0 +1,150 @@ +getUserDetails($user_id); + +// Fetch all permission requests for the logged-in user +$permissionRequests = []; +try { + $permissionRequests = $permissionManager->getPermissionsByPersonId($person_id); +} catch (Exception $e) { + set_message('Error retrieving permission requests: ' . $e->getMessage(), 'danger'); +} +?> + + + + + +
+ + + +
+ + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
Data SourceRequested ForDate SubmittedProofStatus
+ + + View + + + N/A + + + + +
+
+ +
+ You have not submitted any permission requests yet. Browse data sources to get started. +
+ +
+
+
+
+ + + + + diff --git a/data_user/process_request_permission.php b/data_user/process_request_permission.php new file mode 100644 index 0000000..4f90ce9 --- /dev/null +++ b/data_user/process_request_permission.php @@ -0,0 +1,147 @@ + $maxSize) { + set_and_redirect('Proof files must be smaller than 10 MB.', 'danger'); + } + + $finfo = new finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->file($file['tmp_name']) ?: ''; + if ($mimeType !== 'application/pdf') { + set_and_redirect('Only PDF files are accepted as proof.', 'danger'); + } + + $uploadDir = __DIR__ . '/../uploads/permission_proofs'; + if (!is_dir($uploadDir) && !mkdir($uploadDir, 0775, true)) { + set_and_redirect('Unable to create the proof upload directory. Contact an administrator.', 'danger'); + } + + if (!is_writable($uploadDir)) { + set_and_redirect('The proof upload directory is not writable. Contact an administrator.', 'danger'); + } + + $random = bin2hex(random_bytes(8)); + $filename = sprintf('%d_%s.pdf', $personId, $random); + $destination = $uploadDir . '/' . $filename; + + if (!move_uploaded_file($file['tmp_name'], $destination)) { + set_and_redirect('Failed to store your proof document. Please try again.', 'danger'); + } + + return 'permission_proofs/' . $filename; +} + +// A helper function to set a session message and redirect +function set_and_redirect($message, $type, $page = 'browse_datasources.php') { + $_SESSION['message'] = $message; + $_SESSION['message_type'] = $type; + // Check if headers have already been sent. + // This is the most common reason for redirects to fail. + if (headers_sent()) { + echo "
Redirect failed. Headers already sent. Please go back to the previous page to view the message.
"; + echo "Message: " . htmlspecialchars($message); + exit; + } else { + header('Location: ' . $page); + exit; + } +} + +// 1. Check if the user is logged in +if (!isset($_SESSION['person_id']) || !isset($_SESSION['user_id'])) { + set_and_redirect('You must be logged in to request permission.', 'danger'); +} + +$user_id = $_SESSION['user_id']; +$person_id = $_SESSION['person_id']; + +// 2. Validate and sanitize POST data +$dataSourceId = filter_input(INPUT_POST, 'data_source_id', FILTER_VALIDATE_INT); + +// Replace deprecated FILTER_SANITIZE_STRING +$permissionType = trim(filter_input(INPUT_POST, 'permission_type', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW)); +$notes = trim(filter_input(INPUT_POST, 'notes', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW)); + +// Check if required fields are missing or invalid +if (!$dataSourceId || empty($permissionType) || empty($notes)) { + set_and_redirect('Invalid or missing request details. Please try again.', 'danger'); +} + +$proofPath = handle_proof_upload($_FILES['proof_file'] ?? null, $person_id); + +// 3. Instantiate the Permission class and process the request +try { + $permissionManager = new Permission($pdo); + + // Check if a similar request (for the same user, DS, and type) already exists. + $existingRequest = $permissionManager->getPendingRequest($person_id, $dataSourceId, $permissionType); + + if ($existingRequest) { + set_and_redirect('A request for this permission type is already pending.', 'warning'); + } + + // Attempt to add the new permission request to the database. + $success = $permissionManager->addPermissionRequest( + $person_id, + $dataSourceId, + $permissionType, + 'Pending', // Set status to Pending + $notes, + $proofPath + ); + + if ($success) { + set_and_redirect('Your request for ' . htmlspecialchars($permissionType) . ' access has been submitted successfully.', 'success'); + } else { + set_and_redirect('Failed to submit your request. Please try again later.', 'danger'); + } + +} catch (Exception $e) { + // Log the detailed error for debugging, but show a generic message to the user. + error_log("Error submitting permission request: " . $e->getMessage()); + set_and_redirect('An unexpected error occurred. Please try again.', 'danger'); +} + +?> diff --git a/data_user/r_in_jupyter.php b/data_user/r_in_jupyter.php new file mode 100644 index 0000000..f18c344 --- /dev/null +++ b/data_user/r_in_jupyter.php @@ -0,0 +1,161 @@ + [], 'missing' => [], 'workspace_dir' => null]; +$workspaceRelativeDir = null; +$workspaceError = null; + +if ($hasRJupyterAccess && isset($_SESSION['person_id'])) { + $dataSourceManager = new DataSource($pdo); + try { + $workspaceSync = $dataSourceManager->prepareJupyterWorkspace( + (int) $_SESSION['person_id'], + dirname(__DIR__) . '/uploads/jupyter_workspace' + ); + $workspaceRelativeDir = 'datasources/user_' . (int) $_SESSION['person_id']; + } catch (Exception $e) { + $workspaceError = $e->getMessage(); + } +} + +$jupyterBaseUrl = dsp_jupyter_base_url(); +$jupyterToken = dsp_jupyter_token(); +$jupyterIframeUrl = dsp_jupyter_iframe_url( + $jupyterBaseUrl, + $jupyterToken, + isset($_SESSION['person_id']) ? (int) $_SESSION['person_id'] : null +); +?> + + + + +
+ + +
+ + + + + + + +
+
+
R Notebook Workspace
+ + Enabled + + Disabled + +
+
+ + +
+ Workspace error: +
+ +

+ Approved datasets are available inside Jupyter at + . + Only data sources you have Approved access to will appear. +

+ +
+ + + + + + + + + + + + $syncedItem): ?> + + + + + + + + + +
#Data SourceData TypeCategoryFilename
+
+ +
+ You currently have no Approved data sources. Request access from DAC Staff or Data Owners to populate this workspace. +
+ + +
+ Some datasets were skipped: +
    + +
  • —
  • + +
+
+ + +

+ Use the embedded JupyterLab session to explore approved datasets, run R notebooks, or collaborate with Data Owners and DAC Staff. +

+
+ +
+

+ Need more space? Open Jupyter in a new tab. +

+ +
+ +
+ R in JupyterHub is currently disabled for your account.
+ Request R/Jupyter access from DAC Staff so you can run notebooks directly from this portal. +
+
+

+ After your access is approved, revisit this page to launch the notebook workspace. +

+ +
+
+
+
+ + + diff --git a/db/migrations/20241103_oauth_tables.sql b/db/migrations/20241103_oauth_tables.sql new file mode 100644 index 0000000..9f01c4a --- /dev/null +++ b/db/migrations/20241103_oauth_tables.sql @@ -0,0 +1,83 @@ +-- +-- DSP OAuth schema for JupyterHub integration +-- +-- Run inside the MySQL container, e.g.: +-- docker-compose exec db mysql -u root -p niph_dsps < db/migrations/20241103_oauth_tables.sql +-- + +START TRANSACTION; + +CREATE TABLE IF NOT EXISTS `dsp_oauth_clients` ( + `client_id` varchar(128) NOT NULL, + `client_name` varchar(255) NOT NULL, + `client_secret_hash` varchar(255) DEFAULT NULL, + `redirect_uris` text NOT NULL, + `allowed_scopes` varchar(255) DEFAULT NULL, + `is_confidential` tinyint(1) NOT NULL DEFAULT 1, + `is_revoked` tinyint(1) NOT NULL DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT NULL, + PRIMARY KEY (`client_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE IF NOT EXISTS `dsp_oauth_auth_codes` ( + `code_hash` char(64) NOT NULL, + `client_id` varchar(128) NOT NULL, + `person_id` int(11) NOT NULL, + `scope` varchar(255) DEFAULT NULL, + `redirect_uri` varchar(2000) NOT NULL, + `expires_at` datetime NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`code_hash`), + KEY `idx_oauth_auth_client` (`client_id`), + KEY `idx_oauth_auth_expires` (`expires_at`), + CONSTRAINT `dsp_oauth_auth_codes_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `dsp_oauth_clients` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `dsp_oauth_auth_codes_ibfk_2` FOREIGN KEY (`person_id`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE IF NOT EXISTS `dsp_oauth_access_tokens` ( + `token_hash` char(64) NOT NULL, + `client_id` varchar(128) NOT NULL, + `person_id` int(11) NOT NULL, + `scope` varchar(255) DEFAULT NULL, + `expires_at` datetime NOT NULL, + `refresh_token_hash` char(64) DEFAULT NULL, + `refresh_expires_at` datetime DEFAULT NULL, + `is_revoked` tinyint(1) NOT NULL DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `last_used_at` datetime DEFAULT NULL, + `revoked_at` datetime DEFAULT NULL, + PRIMARY KEY (`token_hash`), + KEY `idx_oauth_access_client` (`client_id`), + KEY `idx_oauth_access_person` (`person_id`), + KEY `idx_oauth_access_refresh` (`refresh_token_hash`), + KEY `idx_oauth_access_expires` (`expires_at`), + CONSTRAINT `dsp_oauth_access_tokens_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `dsp_oauth_clients` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `dsp_oauth_access_tokens_ibfk_2` FOREIGN KEY (`person_id`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +COMMIT; + +-- +-- Optional helper to register the JupyterHub client. +-- Replace the placeholder secret/redirects before running. +-- +-- INSERT INTO dsp_oauth_clients ( +-- client_id, +-- client_name, +-- client_secret_hash, +-- redirect_uris, +-- allowed_scopes +-- ) VALUES ( +-- 'hub-client', +-- 'DSP JupyterHub', +-- '$2y$10$replace_this_with_password_hash', +-- 'https://hub.example.com/hub/oauth_callback', +-- 'profile' +-- ) +-- ON DUPLICATE KEY UPDATE +-- client_name = VALUES(client_name), +-- client_secret_hash = VALUES(client_secret_hash), +-- redirect_uris = VALUES(redirect_uris), +-- allowed_scopes = VALUES(allowed_scopes), +-- updated_at = NOW(); diff --git a/db/migrations/20250114_add_permission_proof_path.sql b/db/migrations/20250114_add_permission_proof_path.sql new file mode 100644 index 0000000..dd82303 --- /dev/null +++ b/db/migrations/20250114_add_permission_proof_path.sql @@ -0,0 +1,2 @@ +ALTER TABLE dsps_tbl_datasource_permission + ADD COLUMN dspsdsp_proof_path VARCHAR(255) DEFAULT NULL AFTER dspsdsp_notes; diff --git a/db/niph_dsps.sql b/db/niph_dsps.sql new file mode 100644 index 0000000..b74dc59 --- /dev/null +++ b/db/niph_dsps.sql @@ -0,0 +1,782 @@ +-- phpMyAdmin SQL Dump +-- version 5.2.1 +-- https://www.phpmyadmin.net/ +-- +-- Host: localhost +-- Generation Time: Oct 04, 2025 at 08:56 AM +-- Server version: 10.4.28-MariaDB +-- PHP Version: 8.2.4 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `niph_dsps` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_announcement` +-- + +CREATE TABLE `dsps_tbl_announcement` ( + `pkdspsann_id` int(11) NOT NULL, + `dspsann_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsann_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspsann_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users', + `dspsann_title` varchar(255) NOT NULL, + `dspsann_description` text NOT NULL, + `dspsann_photopath` varchar(255) DEFAULT NULL COMMENT 'Optional image path for announcement', + `dspsann_status` enum('Published','Draft','Archived') NOT NULL DEFAULT 'Draft' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_announcement` +-- + +INSERT INTO `dsps_tbl_announcement` (`pkdspsann_id`, `dspsann_reg_datetime`, `dspsann_mod_datetime`, `dspsann_reg_by`, `dspsann_title`, `dspsann_description`, `dspsann_photopath`, `dspsann_status`) VALUES +(1, '2025-07-19 16:31:56', '2025-07-19 16:33:19', 1, 'Important Policy Update for Data Access', 'We have updated our data access policy to streamline the request process. Please review the new guidelines in the \"My Permissions\" section for Data Users and \"Manage Permissions\" for Data Owners.', NULL, 'Published'), +(2, '2025-07-19 16:31:56', '2025-07-19 16:33:23', 1, 'New Research Datasets on Infectious Diseases', 'Exciting new datasets related to recent infectious disease outbreaks are now available for approved researchers. These include anonymized patient data and epidemiological trends.', NULL, 'Published'), +(3, '2025-07-19 16:31:56', '2025-07-19 16:31:56', 1, 'Platform Maintenance Scheduled for July 25th', 'Please be advised that the DSPS will undergo scheduled maintenance on July 25th, 2025, from 10:00 PM to 2:00 AM (ICT). During this period, the platform may be temporarily unavailable.', NULL, 'Published'), +(4, '2025-07-19 16:31:56', '2025-08-11 08:47:22', 1, 'Call for Data Sharing Proposals', 'NIPH is inviting proposals from researchers and institutions interested in sharing their public health datasets through our platform. Visit the \"Data Owner\" section for more details.', '', 'Archived'), +(5, '2025-07-19 16:31:56', '2025-08-11 08:47:15', 1, 'Draft Announcement - Internal Review', 'This is a draft announcement for internal review only. It is not visible to the public.', '', 'Archived'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_anonymous` +-- + +CREATE TABLE `dsps_tbl_anonymous` ( + `pkdspsano_id` int(11) NOT NULL, + `dspsano_reg_datetime` datetime DEFAULT current_timestamp(), + `fkdspsds_id` int(11) NOT NULL COMMENT 'FK to dsps_tbl_datasource', + `dspsano_client_ip` varchar(45) DEFAULT NULL COMMENT 'IPv4 or IPv6 address', + `dspsano_datetime` datetime DEFAULT current_timestamp(), + `dspsano_action` varchar(100) DEFAULT NULL COMMENT 'e.g., View Introduction, Clicked Link' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_datasource` +-- + +CREATE TABLE `dsps_tbl_datasource` ( + `pkdspsds_id` int(11) NOT NULL, + `dspsds_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsds_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspsds_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users (who registered this data source)', + `fkdspstds_id` int(11) NOT NULL COMMENT 'FK to dsps_tbl_typedatasource', + `fkdspscate_id` int(11) NOT NULL COMMENT 'FK to dsps_tbl_dspscategory', + `fkisp_id_of` int(11) NOT NULL COMMENT 'FK to ist_tbl_people (Data Owner of this source)', + `dspsds_filename` varchar(255) DEFAULT NULL COMMENT 'File path/name for CSV/JSON/PDF, or API endpoint URL', + `dspsds_title_en` varchar(255) NOT NULL, + `dspsds_title_kh` varchar(255) DEFAULT NULL, + `dspsds_description` text DEFAULT NULL, + `dspsds_public_date` date DEFAULT NULL COMMENT 'Date when data source was made public', + `dspsds_status` varchar(20) NOT NULL DEFAULT 'Pending Review', + `dspsds_filename1` varchar(250) DEFAULT NULL, + `dspsds_filename2` varchar(250) DEFAULT NULL, + `dspsds_filename3` varchar(250) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_datasource` +-- + +INSERT INTO `dsps_tbl_datasource` (`pkdspsds_id`, `dspsds_reg_datetime`, `dspsds_mod_datetime`, `dspsds_reg_by`, `fkdspstds_id`, `fkdspscate_id`, `fkisp_id_of`, `dspsds_filename`, `dspsds_title_en`, `dspsds_title_kh`, `dspsds_description`, `dspsds_public_date`, `dspsds_status`, `dspsds_filename1`, `dspsds_filename2`, `dspsds_filename3`) VALUES +(4, '2025-07-20 12:43:12', '2025-07-20 13:01:06', 2, 1, 3, 2, 'population_health_2023.csv', 'National Population Health Survey 2023', 'ការស្ទង់មážáž·ážŸáž»ážáž—ាពប្រជាជនជាážáž·áž†áŸ’នាំ២០២៣', 'Comprehensive dataset on health indicators, demographics, and disease prevalence across Cambodia. Data collected in 2023.', NULL, 'Active', '', NULL, ''), +(9, '2025-07-20 12:46:56', '2025-07-26 10:26:42', 2, 1, 1, 2, 'infectious_disease_api_endpoint.json', 'API Endpoint for Infectious Disease Trends', 'ចំណុចបញ្ចប់ API សម្រាប់និន្នាការជំងឺឆ្លង', 'Real-time data access for common infectious diseases, including incidence rates and geographical distribution. Requires API key.', NULL, 'Active', '', NULL, ''), +(10, '2025-08-09 12:36:52', '2025-08-09 12:36:52', 2, 1, 2, 2, 'datasource_6896de743a3f0.csv', 'TEST001', 'test001', 'test', NULL, 'Active', '', NULL, ''), +(11, '2025-08-30 13:55:40', '2025-08-30 13:55:40', 206, 4, 1, 104, 'datasource_68b2a06c7245e.pdf', 'test for Contributor', 'test', 'test for Contributor', NULL, 'Active', '', NULL, ''), +(12, '2025-09-06 15:55:39', '2025-09-06 15:55:39', 2, 1, 2, 2, 'datasource_68bbf70b91bc0.xlsx', 'Test5555', '', 'Test5555', NULL, 'Active', NULL, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_datasource_permission` +-- + +CREATE TABLE `dsps_tbl_datasource_permission` ( + `pkdspsdsp_id` int(11) NOT NULL, + `dspsdsp_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsdsp_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspsdsp_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users (who granted permission, usually Data Owner)', + `fkdspsds_id` int(11) NOT NULL COMMENT 'FK to dsps_tbl_datasource', + `fkisp_id_of` int(11) NOT NULL COMMENT 'FK to ist_tbl_people (User who is granted permission)', + `dspsdsp_datetime` datetime DEFAULT current_timestamp() COMMENT 'When permission was granted/requested', + `dspsdsp_permission` enum('Read','Download','Analyze') NOT NULL, + `dspsdsp_notes` text DEFAULT NULL, + `dspsdsp_proof_path` varchar(255) DEFAULT NULL, + `dspsdsp_status` enum('Approved','Pending','Rejected','Revoked') NOT NULL DEFAULT 'Pending' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_datasource_permission` +-- + +INSERT INTO `dsps_tbl_datasource_permission` (`pkdspsdsp_id`, `dspsdsp_reg_datetime`, `dspsdsp_mod_datetime`, `dspsdsp_reg_by`, `fkdspsds_id`, `fkisp_id_of`, `dspsdsp_datetime`, `dspsdsp_permission`, `dspsdsp_notes`, `dspsdsp_proof_path`, `dspsdsp_status`) VALUES +(1, '2025-08-09 11:23:07', '2025-08-09 11:46:06', 2, 9, 3, '2025-08-09 11:23:07', 'Download', '', NULL, 'Approved'), +(4, '2025-08-09 11:39:22', '2025-08-09 11:46:03', 2, 4, 3, '2025-08-09 11:39:22', 'Read', '', NULL, 'Approved'), +(5, '2025-08-09 12:48:09', '2025-08-09 12:48:39', 2, 10, 3, '2025-08-09 12:48:09', 'Download', '', NULL, 'Approved'), +(6, '2025-08-30 14:00:25', '2025-08-30 14:01:09', 206, 11, 105, '2025-08-30 14:00:25', 'Download', '', NULL, 'Approved'), +(7, '2025-08-30 14:26:17', '2025-08-30 14:29:27', 2, 10, 104, '2025-08-30 14:26:17', 'Download', '', NULL, 'Approved'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_datasource_used` +-- + +CREATE TABLE `dsps_tbl_datasource_used` ( + `pkdspsdspused_id` int(11) NOT NULL, + `dspsdspused_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsdspused_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspsdspused_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users (who performed the action)', + `fkdspsdsused_id` int(11) NOT NULL COMMENT 'FK to dsps_tbl_datasource (the data source that was used)', + `fkisp_id_of` int(11) NOT NULL COMMENT 'FK to ist_tbl_people (the user who used it)', + `dspsdspused_datetime` datetime DEFAULT current_timestamp(), + `dspsdspused_action` varchar(100) DEFAULT NULL COMMENT 'e.g., Downloaded, Accessed API, Ran Analysis' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_datasource_used` +-- + +INSERT INTO `dsps_tbl_datasource_used` (`pkdspsdspused_id`, `dspsdspused_reg_datetime`, `dspsdspused_mod_datetime`, `dspsdspused_reg_by`, `fkdspsdsused_id`, `fkisp_id_of`, `dspsdspused_datetime`, `dspsdspused_action`) VALUES +(1, '2025-08-09 13:08:06', '2025-08-09 13:08:06', NULL, 10, 3, '2025-08-09 13:08:06', 'Downloaded'), +(2, '2025-08-09 13:09:06', '2025-08-09 13:09:06', NULL, 9, 3, '2025-08-09 13:09:06', 'Downloaded'), +(3, '2025-08-09 14:34:08', '2025-08-09 14:34:08', NULL, 10, 3, '2025-08-09 14:34:08', 'Downloaded'), +(4, '2025-08-09 14:34:15', '2025-08-09 14:34:15', NULL, 10, 3, '2025-08-09 14:34:15', 'Downloaded'), +(5, '2025-08-30 14:30:39', '2025-08-30 14:30:39', NULL, 10, 104, '2025-08-30 14:30:39', 'Downloaded'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_dspsabout` +-- + +CREATE TABLE `dsps_tbl_dspsabout` ( + `pkdspsabout_id` int(11) NOT NULL, + `dspsabout_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsabout_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspsabout_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users', + `fkisp_id_of` int(11) NOT NULL COMMENT 'FK to ist_tbl_people (who created/modified this about entry)', + `dspsabout_title_en` varchar(255) NOT NULL, + `dspsabout_description` text DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_dspsabout` +-- + +INSERT INTO `dsps_tbl_dspsabout` (`pkdspsabout_id`, `dspsabout_reg_datetime`, `dspsabout_mod_datetime`, `dspsabout_reg_by`, `fkisp_id_of`, `dspsabout_title_en`, `dspsabout_description`) VALUES +(1, '2025-07-19 16:35:41', '2025-07-19 16:35:41', 1, 1, 'Our Vision', 'To be a leading institution in public health, fostering a healthier and more resilient community through evidence-based practices and collaborative data sharing.'), +(2, '2025-07-19 16:35:41', '2025-07-19 16:35:41', 1, 1, 'Our Mission', 'To protect and promote the health of the population through scientific research, education, and effective public health interventions, facilitated by accessible and secure data.'), +(3, '2025-07-19 16:35:41', '2025-07-19 16:35:41', 1, 1, 'Our Goals', '1. Enhance data accessibility for public health research. 2. Promote data-driven decision-making. 3. Strengthen collaboration among health stakeholders. 4. Ensure data security and privacy.'), +(4, '2025-07-19 16:35:41', '2025-07-19 16:35:41', 1, 1, 'About NIPH', 'The National Institute of Public Health (NIPH) is a governmental institution under the Ministry of Health, Cambodia. Established to conduct research, provide training, and offer public health services, NIPH plays a crucial role in improving the health status of the Cambodian population. This data sharing platform is an initiative to further our mission by enabling secure and efficient data exchange.'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_dspscategory` +-- + +CREATE TABLE `dsps_tbl_dspscategory` ( + `pkdspscate_id` int(11) NOT NULL, + `dspscate_reg_datetime` datetime DEFAULT current_timestamp(), + `dspscate_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspscate_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users', + `dspscate_title_en` varchar(255) NOT NULL, + `dspscate_details` text DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_dspscategory` +-- + +INSERT INTO `dsps_tbl_dspscategory` (`pkdspscate_id`, `dspscate_reg_datetime`, `dspscate_mod_datetime`, `dspscate_reg_by`, `dspscate_title_en`, `dspscate_details`) VALUES +(1, '2025-07-12 16:54:58', '2025-07-19 14:50:31', NULL, 'Public Health', 'Data related to public health, diseases, and demographics.'), +(2, '2025-07-12 16:54:58', '2025-07-19 14:50:38', NULL, 'Education Statistics', 'Statistical data on schools, students, and educational outcomes.'), +(3, '2025-07-12 16:54:58', '2025-07-19 14:50:41', NULL, 'Environmental Data', 'Data concerning climate, pollution, and natural resources.'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_dspsfaq` +-- + +CREATE TABLE `dsps_tbl_dspsfaq` ( + `pkdspsfaq_id` int(11) NOT NULL, + `dspsfaq_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsfaq_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspsfaq_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users', + `fkisp_id_of` int(11) NOT NULL COMMENT 'FK to ist_tbl_people (who created/modified this FAQ)', + `dspsfaq_title_en` varchar(255) NOT NULL COMMENT 'Question', + `dspsfaq_description` text NOT NULL COMMENT 'Answer' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_dspsfaq` +-- + +INSERT INTO `dsps_tbl_dspsfaq` (`pkdspsfaq_id`, `dspsfaq_reg_datetime`, `dspsfaq_mod_datetime`, `dspsfaq_reg_by`, `fkisp_id_of`, `dspsfaq_title_en`, `dspsfaq_description`) VALUES +(1, '2025-07-19 16:38:29', '2025-07-26 22:23:24', 1, 1, 'What is the NIPH Data Sharing Platform?', 'The NIPH Data Sharing Platform (DSP) is a secure online portal designed to facilitate the sharing and access of public health data among authorized researchers, policymakers, and the public. It aims to promote data-driven decision-making and collaborative research.'), +(2, '2025-07-19 16:38:29', '2025-07-19 16:38:29', 1, 1, 'How can I request access to data?', 'Data Users can browse available data sources and submit a formal request for access through the platform. The request will be reviewed by the respective Data Owner, who will approve or deny access based on the data\'s sensitivity and the user\'s justification.'), +(3, '2025-07-19 16:38:29', '2025-07-19 16:38:29', 1, 1, 'What types of data are available?', 'The platform hosts various types of public health data, including but not limited to epidemiological surveillance data, survey results, laboratory data, and research findings. Data formats may include CSV, JSON, PDF, and potentially API access.'), +(4, '2025-07-19 16:38:29', '2025-07-19 16:38:29', 1, 1, 'Is my data secure on this platform?', 'Yes, data security and privacy are paramount. The platform employs robust security measures, including secure authentication, role-based access control, and data encryption. All sensitive data is handled in compliance with national data protection regulations.'), +(5, '2025-07-19 16:38:29', '2025-07-19 16:38:29', 1, 1, 'How can I contribute my data?', 'If you are a Data Owner (e.g., a researcher or institution with relevant public health data), you can register on the platform and use the \"Manage My Data Sources\" section to upload and describe your datasets. All contributions are subject to review by DAC Staff.'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_dspsslide` +-- + +CREATE TABLE `dsps_tbl_dspsslide` ( + `pkdspsslide_id` int(11) NOT NULL, + `dspsslide_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsslide_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspsslide_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users', + `fkisp_id_of` int(11) NOT NULL COMMENT 'FK to ist_tbl_people (who created/modified this slide)', + `dspsslide_title_en` varchar(255) NOT NULL, + `dspsslide_description` text DEFAULT NULL, + `dspsslide_photoname` varchar(255) NOT NULL COMMENT 'File path/name of the slide image' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_dspsslide` +-- + +INSERT INTO `dsps_tbl_dspsslide` (`pkdspsslide_id`, `dspsslide_reg_datetime`, `dspsslide_mod_datetime`, `dspsslide_reg_by`, `fkisp_id_of`, `dspsslide_title_en`, `dspsslide_description`, `dspsslide_photoname`) VALUES +(1, '2025-07-20 10:24:56', '2025-08-12 10:01:29', 1, 1, 'Welcome to NIPH Data Sharing Platform', 'Your central hub for public health data and collaborative research.', 'slide_689aae8993e8c.jpg'), +(2, '2025-07-20 10:24:56', '2025-07-20 10:29:44', 1, 1, 'Explore Diverse Datasets', 'Access a wide range of epidemiological, clinical, and environmental health data.', 'slide_68f5da6a43a8d.jpg'), +(3, '2025-07-20 10:24:56', '2025-07-20 10:29:46', 1, 1, 'Empowering Data-Driven Decisions', 'Facilitating informed policy-making and public health interventions.', 'slide_68f5da6a43a8a.jpg'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_feedback` +-- + +CREATE TABLE `dsps_tbl_feedback` ( + `pkdspsfb_id` int(11) NOT NULL, + `dspsfb_reg_datetime` datetime DEFAULT current_timestamp(), + `dspsfb_res_datetime` datetime DEFAULT NULL COMMENT 'Response datetime', + `dspsfb_res_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users (who responded)', + `dspsfb_client_ip` varchar(45) DEFAULT NULL COMMENT 'IP of the feedback submitter', + `dspsfb_name` varchar(255) NOT NULL, + `dspsfb_email` varchar(255) DEFAULT NULL, + `dspsfb_body_text` text NOT NULL, + `dspsfb_respond_text` text DEFAULT NULL COMMENT 'Response from DAC staff/admin', + `dspsfb_status` enum('New','In Progress','Resolved','Archived') NOT NULL DEFAULT 'New' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_social` +-- + +CREATE TABLE `dsps_tbl_social` ( + `pkdspssocial_id` int(11) NOT NULL, + `dspssocial_reg_datetime` datetime DEFAULT current_timestamp(), + `dspssocial_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspssocial_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users', + `dspssocial_name` varchar(100) NOT NULL COMMENT 'e.g., Facebook, YouTube, Telegram', + `dspssocial_link` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dsps_tbl_typedatasource` +-- + +CREATE TABLE `dsps_tbl_typedatasource` ( + `pkdspstds_id` int(11) NOT NULL, + `dspstds_reg_datetime` datetime DEFAULT current_timestamp(), + `dspstds_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `dspstds_reg_by` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users', + `dspstds_name_en` varchar(100) NOT NULL, + `dspstds_name_kh` varchar(100) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `dsps_tbl_typedatasource` +-- + +INSERT INTO `dsps_tbl_typedatasource` (`pkdspstds_id`, `dspstds_reg_datetime`, `dspstds_mod_datetime`, `dspstds_reg_by`, `dspstds_name_en`, `dspstds_name_kh`) VALUES +(1, '2025-07-12 16:54:58', '2025-07-12 16:54:58', NULL, 'CSV', 'ស៊ីអáŸážŸážœáž¸'), +(2, '2025-07-12 16:54:58', '2025-07-12 16:54:58', NULL, 'JSON', 'ជáŸážŸáž¢áž·áž“'), +(3, '2025-07-12 16:54:58', '2025-07-12 16:54:58', NULL, 'API', 'អáŸáž—ីអាយ'), +(4, '2025-07-12 16:54:58', '2025-07-12 16:54:58', NULL, 'PDF', 'ភីឌីអáŸáž áŸ’ážœ'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `ist_tbl_people` +-- + +CREATE TABLE `ist_tbl_people` ( + `pkisp_id` int(11) NOT NULL, + `isp_reg_datetime` datetime DEFAULT current_timestamp(), + `isp_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `isp_regby_id` int(11) DEFAULT NULL COMMENT 'FK to ist_tbl_users if registered by another user, or NULL if self-registered', + `isp_idcard` varchar(50) DEFAULT NULL, + `isp_firstname_en` varchar(100) NOT NULL, + `isp_lastname_en` varchar(100) NOT NULL, + `isp_sex` enum('Male','Female','Other') NOT NULL, + `isp_dob` date NOT NULL, + `isp_pob` varchar(255) DEFAULT NULL COMMENT 'Place of Birth', + `isp_nationality` varchar(100) DEFAULT 'Cambodian', + `isp_marital_status` enum('Single','Married','Divorced','Widowed') DEFAULT 'Single', + `isp_phone_number` varchar(20) DEFAULT NULL, + `isp_email` varchar(255) DEFAULT NULL, + `isp_telegram` varchar(255) DEFAULT NULL, + `isp_note` text DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `ist_tbl_people` +-- + +INSERT INTO `ist_tbl_people` (`pkisp_id`, `isp_reg_datetime`, `isp_mod_datetime`, `isp_regby_id`, `isp_idcard`, `isp_firstname_en`, `isp_lastname_en`, `isp_sex`, `isp_dob`, `isp_pob`, `isp_nationality`, `isp_marital_status`, `isp_phone_number`, `isp_email`, `isp_telegram`, `isp_note`) VALUES +(1, '2025-07-12 16:16:55', '2025-07-12 16:16:55', NULL, '123456789', 'Admin', 'User', 'Male', '1990-01-01', NULL, 'Cambodian', 'Single', '0123456789', 'admin@example.com', NULL, NULL), +(2, '2025-07-12 16:16:55', '2025-07-12 16:16:55', NULL, '987654321', 'Data', 'Owner', 'Female', '1985-05-10', NULL, 'Cambodian', 'Single', '0987654321', 'owner@example.com', NULL, NULL), +(3, '2025-07-12 16:16:55', '2025-07-12 16:16:55', NULL, '112233445', 'Data', 'User', 'Male', '1992-11-20', NULL, 'Cambodian', 'Single', '0112233445', 'user@example.com', NULL, NULL), +(101, '2025-07-20 12:43:02', '2025-07-20 12:43:02', NULL, '1234567890', 'Mock', 'Owner', 'Male', '1980-01-01', NULL, 'Cambodian', 'Single', '111222333', 'mock.owner@example.com', NULL, NULL), +(102, '2025-08-30 08:34:25', '2025-08-30 08:34:25', NULL, '11', '11', '111', 'Male', '2025-08-30', NULL, 'Cambodian', 'Single', '', '', NULL, NULL), +(103, '2025-08-30 08:37:51', '2025-08-30 08:37:51', NULL, 'N001', 'Pisey', 'Um', 'Female', '2025-08-22', NULL, 'Cambodian', 'Single', '012', 'pisey@gmail.com', NULL, NULL), +(104, '2025-08-30 09:07:13', '2025-08-30 09:07:13', NULL, 'N002', 'sp', 'ch', 'Male', '2025-08-30', NULL, 'Cambodian', 'Single', '092', 'sp@gmail.com', NULL, NULL), +(105, '2025-08-30 10:46:55', '2025-08-30 10:46:55', NULL, 'p001', 'pp', 'ppp', 'Male', '2025-08-30', NULL, 'Cambodian', 'Single', '123', 'pp@gmail.com', NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `ist_tbl_users` +-- + +CREATE TABLE `ist_tbl_users` ( + `pkisu_id` int(11) NOT NULL, + `isu_reg_datetime` datetime DEFAULT current_timestamp(), + `isu_mod_datetime` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(), + `isu_regby_id` int(11) DEFAULT NULL COMMENT 'FK to pkisu_id if registered by another user, or NULL if self-registered', + `fkisp_id_of` int(11) NOT NULL COMMENT 'FK to ist_tbl_people', + `isu_name` varchar(100) NOT NULL COMMENT 'Username', + `isu_password` varchar(255) NOT NULL COMMENT 'Hashed password', + `isu_status` enum('DAC Staff','Data Contributor','Data Owner','Data User','Inactive') NOT NULL DEFAULT 'Data User', + `isu_can_run_r` tinyint(1) NOT NULL DEFAULT 0 COMMENT '1 if user may run R/Jupyter integrations' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Dumping data for table `ist_tbl_users` +-- + +INSERT INTO `ist_tbl_users` (`pkisu_id`, `isu_reg_datetime`, `isu_mod_datetime`, `isu_regby_id`, `fkisp_id_of`, `isu_name`, `isu_password`, `isu_status`, `isu_can_run_r`) VALUES +(1, '2025-07-12 16:16:55', '2025-07-20 10:48:49', 1, 1, 'admin', '$2y$10$2h/CFUM6D8d0nFSOgUQebOL/ow5pyTAsDRcqZAv0XrkAmyhVs2fIe', 'DAC Staff', 1), +(2, '2025-07-12 16:16:55', '2025-07-20 12:05:18', 1, 2, 'owner', '$2y$10$2h/CFUM6D8d0nFSOgUQebOL/ow5pyTAsDRcqZAv0XrkAmyhVs2fIe', 'Data Owner', 1), +(3, '2025-07-12 16:16:55', '2025-08-11 08:41:57', 1, 3, 'user', '$2y$10$2h/CFUM6D8d0nFSOgUQebOL/ow5pyTAsDRcqZAv0XrkAmyhVs2fIe', 'Data User', 0), +(203, '2025-07-12 16:16:55', '2025-08-11 08:41:57', 3, 101, 'mockup', '$2y$10$2h/CFUM6D8d0nFSOgUQebOL/ow5pyTAsDRcqZAv0XrkAmyhVs2fIe', 'Data User', 0), +(204, '2025-08-30 08:34:25', '2025-08-30 08:34:25', NULL, 102, 'ttt', '$2y$10$aOBNcCE9b1Jh.c.g7tP5gOSoD6RKujzPVV3AMGJH02jm.Uom0.GxS', 'Data User', 0), +(205, '2025-08-30 08:37:51', '2025-08-30 09:10:33', 1, 103, 'pisey', '$2y$10$DYdxGJLZ3XFJWZI.Tcq2IO18DOhXw2KBwnzAXZ3SD8zD0Bw/vtyOO', 'Data Owner', 1), +(206, '2025-08-30 09:07:14', '2025-08-30 10:37:43', NULL, 104, 'sp', '$2y$10$yy9L1fK5Il2e3sSw03pyTukxGRRxU5bxc4Zp09fSZ4GvfhkdcZy4W', 'Data Contributor', 0), +(207, '2025-08-30 10:46:56', '2025-08-30 10:46:56', NULL, 105, 'pp', '$2y$10$JBTBNdWoifyQ3kodJjJfc.c8CQlbVNKVvfJ.lSKiBcVU5W8PkyVom', 'Data User', 0); + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `dsps_tbl_announcement` +-- +ALTER TABLE `dsps_tbl_announcement` + ADD PRIMARY KEY (`pkdspsann_id`), + ADD KEY `dspsann_reg_by` (`dspsann_reg_by`), + ADD KEY `idx_dspsann_status` (`dspsann_status`); + +-- +-- Indexes for table `dsps_tbl_anonymous` +-- +ALTER TABLE `dsps_tbl_anonymous` + ADD PRIMARY KEY (`pkdspsano_id`), + ADD KEY `fkdspsds_id` (`fkdspsds_id`); + +-- +-- Indexes for table `dsps_tbl_datasource` +-- +ALTER TABLE `dsps_tbl_datasource` + ADD PRIMARY KEY (`pkdspsds_id`), + ADD KEY `dspsds_reg_by` (`dspsds_reg_by`), + ADD KEY `fkdspstds_id` (`fkdspstds_id`), + ADD KEY `fkdspscate_id` (`fkdspscate_id`), + ADD KEY `fkisp_id_of` (`fkisp_id_of`), + ADD KEY `idx_dspsds_status` (`dspsds_status`); + +-- +-- Indexes for table `dsps_tbl_datasource_permission` +-- +ALTER TABLE `dsps_tbl_datasource_permission` + ADD PRIMARY KEY (`pkdspsdsp_id`), + ADD UNIQUE KEY `fkdspsds_id` (`fkdspsds_id`,`fkisp_id_of`), + ADD KEY `dspsdsp_reg_by` (`dspsdsp_reg_by`), + ADD KEY `fkisp_id_of` (`fkisp_id_of`), + ADD KEY `idx_dspsdsp_status` (`dspsdsp_status`); + +-- +-- Indexes for table `dsps_tbl_datasource_used` +-- +ALTER TABLE `dsps_tbl_datasource_used` + ADD PRIMARY KEY (`pkdspsdspused_id`), + ADD KEY `dspsdspused_reg_by` (`dspsdspused_reg_by`), + ADD KEY `fkdspsdsused_id` (`fkdspsdsused_id`), + ADD KEY `fkisp_id_of` (`fkisp_id_of`); + +-- +-- Indexes for table `dsps_tbl_dspsabout` +-- +ALTER TABLE `dsps_tbl_dspsabout` + ADD PRIMARY KEY (`pkdspsabout_id`), + ADD KEY `fkisp_id_of` (`fkisp_id_of`), + ADD KEY `dspsabout_reg_by` (`dspsabout_reg_by`), + ADD KEY `idx_dspsabout_title` (`dspsabout_title_en`); + +-- +-- Indexes for table `dsps_tbl_dspscategory` +-- +ALTER TABLE `dsps_tbl_dspscategory` + ADD PRIMARY KEY (`pkdspscate_id`), + ADD UNIQUE KEY `dspscate_title_en` (`dspscate_title_en`), + ADD KEY `dspscate_reg_by` (`dspscate_reg_by`); + +-- +-- Indexes for table `dsps_tbl_dspsfaq` +-- +ALTER TABLE `dsps_tbl_dspsfaq` + ADD PRIMARY KEY (`pkdspsfaq_id`), + ADD KEY `fkisp_id_of` (`fkisp_id_of`), + ADD KEY `dspsfaq_reg_by` (`dspsfaq_reg_by`); + +-- +-- Indexes for table `dsps_tbl_dspsslide` +-- +ALTER TABLE `dsps_tbl_dspsslide` + ADD PRIMARY KEY (`pkdspsslide_id`), + ADD KEY `fkisp_id_of` (`fkisp_id_of`), + ADD KEY `dspsslide_reg_by` (`dspsslide_reg_by`); + +-- +-- Indexes for table `dsps_tbl_feedback` +-- +ALTER TABLE `dsps_tbl_feedback` + ADD PRIMARY KEY (`pkdspsfb_id`), + ADD KEY `dspsfb_res_by` (`dspsfb_res_by`), + ADD KEY `idx_dspsfb_status` (`dspsfb_status`); + +-- +-- Indexes for table `dsps_tbl_social` +-- +ALTER TABLE `dsps_tbl_social` + ADD PRIMARY KEY (`pkdspssocial_id`), + ADD UNIQUE KEY `dspssocial_name` (`dspssocial_name`), + ADD KEY `dspssocial_reg_by` (`dspssocial_reg_by`); + +-- +-- Indexes for table `dsps_tbl_typedatasource` +-- +ALTER TABLE `dsps_tbl_typedatasource` + ADD PRIMARY KEY (`pkdspstds_id`), + ADD UNIQUE KEY `dspstds_name_en` (`dspstds_name_en`), + ADD UNIQUE KEY `dspstds_name_kh` (`dspstds_name_kh`), + ADD KEY `dspstds_reg_by` (`dspstds_reg_by`); + +-- +-- Indexes for table `ist_tbl_people` +-- +ALTER TABLE `ist_tbl_people` + ADD PRIMARY KEY (`pkisp_id`), + ADD UNIQUE KEY `isp_idcard` (`isp_idcard`), + ADD UNIQUE KEY `isp_phone_number` (`isp_phone_number`), + ADD UNIQUE KEY `isp_email` (`isp_email`), + ADD KEY `idx_isp_idcard` (`isp_idcard`), + ADD KEY `idx_isp_name` (`isp_firstname_en`,`isp_lastname_en`); + +-- +-- Indexes for table `ist_tbl_users` +-- +ALTER TABLE `ist_tbl_users` + ADD PRIMARY KEY (`pkisu_id`), + ADD UNIQUE KEY `fkisp_id_of` (`fkisp_id_of`), + ADD UNIQUE KEY `isu_name` (`isu_name`), + ADD KEY `isu_regby_id` (`isu_regby_id`), + ADD KEY `idx_isu_name` (`isu_name`), + ADD KEY `idx_isu_status` (`isu_status`); + +-- +-- Table structure for table `dsp_oauth_clients` +-- + +DROP TABLE IF EXISTS `dsp_oauth_clients`; +CREATE TABLE `dsp_oauth_clients` ( + `client_id` varchar(128) NOT NULL, + `client_name` varchar(255) NOT NULL, + `client_secret_hash` varchar(255) DEFAULT NULL, + `redirect_uris` text NOT NULL, + `allowed_scopes` varchar(255) DEFAULT NULL, + `is_confidential` tinyint(1) NOT NULL DEFAULT 1, + `is_revoked` tinyint(1) NOT NULL DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT NULL, + PRIMARY KEY (`client_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Table structure for table `dsp_oauth_auth_codes` +-- + +DROP TABLE IF EXISTS `dsp_oauth_auth_codes`; +CREATE TABLE `dsp_oauth_auth_codes` ( + `code_hash` char(64) NOT NULL, + `client_id` varchar(128) NOT NULL, + `person_id` int(11) NOT NULL, + `scope` varchar(255) DEFAULT NULL, + `redirect_uri` varchar(2000) NOT NULL, + `expires_at` datetime NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`code_hash`), + KEY `idx_oauth_auth_client` (`client_id`), + KEY `idx_oauth_auth_expires` (`expires_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Table structure for table `dsp_oauth_access_tokens` +-- + +DROP TABLE IF EXISTS `dsp_oauth_access_tokens`; +CREATE TABLE `dsp_oauth_access_tokens` ( + `token_hash` char(64) NOT NULL, + `client_id` varchar(128) NOT NULL, + `person_id` int(11) NOT NULL, + `scope` varchar(255) DEFAULT NULL, + `expires_at` datetime NOT NULL, + `refresh_token_hash` char(64) DEFAULT NULL, + `refresh_expires_at` datetime DEFAULT NULL, + `is_revoked` tinyint(1) NOT NULL DEFAULT 0, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `last_used_at` datetime DEFAULT NULL, + `revoked_at` datetime DEFAULT NULL, + PRIMARY KEY (`token_hash`), + KEY `idx_oauth_access_client` (`client_id`), + KEY `idx_oauth_access_person` (`person_id`), + KEY `idx_oauth_access_refresh` (`refresh_token_hash`), + KEY `idx_oauth_access_expires` (`expires_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `dsps_tbl_announcement` +-- +ALTER TABLE `dsps_tbl_announcement` + MODIFY `pkdspsann_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_anonymous` +-- +ALTER TABLE `dsps_tbl_anonymous` + MODIFY `pkdspsano_id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_datasource` +-- +ALTER TABLE `dsps_tbl_datasource` + MODIFY `pkdspsds_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_datasource_permission` +-- +ALTER TABLE `dsps_tbl_datasource_permission` + MODIFY `pkdspsdsp_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_datasource_used` +-- +ALTER TABLE `dsps_tbl_datasource_used` + MODIFY `pkdspsdspused_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_dspsabout` +-- +ALTER TABLE `dsps_tbl_dspsabout` + MODIFY `pkdspsabout_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_dspscategory` +-- +ALTER TABLE `dsps_tbl_dspscategory` + MODIFY `pkdspscate_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_dspsfaq` +-- +ALTER TABLE `dsps_tbl_dspsfaq` + MODIFY `pkdspsfaq_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_dspsslide` +-- +ALTER TABLE `dsps_tbl_dspsslide` + MODIFY `pkdspsslide_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_feedback` +-- +ALTER TABLE `dsps_tbl_feedback` + MODIFY `pkdspsfb_id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_social` +-- +ALTER TABLE `dsps_tbl_social` + MODIFY `pkdspssocial_id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `dsps_tbl_typedatasource` +-- +ALTER TABLE `dsps_tbl_typedatasource` + MODIFY `pkdspstds_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `ist_tbl_people` +-- +ALTER TABLE `ist_tbl_people` + MODIFY `pkisp_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=106; + +-- +-- AUTO_INCREMENT for table `ist_tbl_users` +-- +ALTER TABLE `ist_tbl_users` + MODIFY `pkisu_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=208; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `dsps_tbl_announcement` +-- +ALTER TABLE `dsps_tbl_announcement` + ADD CONSTRAINT `dsps_tbl_announcement_ibfk_1` FOREIGN KEY (`dspsann_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_anonymous` +-- +ALTER TABLE `dsps_tbl_anonymous` + ADD CONSTRAINT `dsps_tbl_anonymous_ibfk_1` FOREIGN KEY (`fkdspsds_id`) REFERENCES `dsps_tbl_datasource` (`pkdspsds_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_datasource` +-- +ALTER TABLE `dsps_tbl_datasource` + ADD CONSTRAINT `dsps_tbl_datasource_ibfk_1` FOREIGN KEY (`dspsds_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_datasource_ibfk_2` FOREIGN KEY (`fkdspstds_id`) REFERENCES `dsps_tbl_typedatasource` (`pkdspstds_id`) ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_datasource_ibfk_3` FOREIGN KEY (`fkdspscate_id`) REFERENCES `dsps_tbl_dspscategory` (`pkdspscate_id`) ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_datasource_ibfk_4` FOREIGN KEY (`fkisp_id_of`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_datasource_permission` +-- +ALTER TABLE `dsps_tbl_datasource_permission` + ADD CONSTRAINT `dsps_tbl_datasource_permission_ibfk_1` FOREIGN KEY (`dspsdsp_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_datasource_permission_ibfk_2` FOREIGN KEY (`fkdspsds_id`) REFERENCES `dsps_tbl_datasource` (`pkdspsds_id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_datasource_permission_ibfk_3` FOREIGN KEY (`fkisp_id_of`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_datasource_used` +-- +ALTER TABLE `dsps_tbl_datasource_used` + ADD CONSTRAINT `dsps_tbl_datasource_used_ibfk_1` FOREIGN KEY (`dspsdspused_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_datasource_used_ibfk_2` FOREIGN KEY (`fkdspsdsused_id`) REFERENCES `dsps_tbl_datasource` (`pkdspsds_id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_datasource_used_ibfk_3` FOREIGN KEY (`fkisp_id_of`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_dspsabout` +-- +ALTER TABLE `dsps_tbl_dspsabout` + ADD CONSTRAINT `dsps_tbl_dspsabout_ibfk_1` FOREIGN KEY (`fkisp_id_of`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_dspsabout_ibfk_2` FOREIGN KEY (`dspsabout_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_dspscategory` +-- +ALTER TABLE `dsps_tbl_dspscategory` + ADD CONSTRAINT `dsps_tbl_dspscategory_ibfk_1` FOREIGN KEY (`dspscate_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_dspsfaq` +-- +ALTER TABLE `dsps_tbl_dspsfaq` + ADD CONSTRAINT `dsps_tbl_dspsfaq_ibfk_1` FOREIGN KEY (`fkisp_id_of`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_dspsfaq_ibfk_2` FOREIGN KEY (`dspsfaq_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_dspsslide` +-- +ALTER TABLE `dsps_tbl_dspsslide` + ADD CONSTRAINT `dsps_tbl_dspsslide_ibfk_1` FOREIGN KEY (`fkisp_id_of`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON UPDATE CASCADE, + ADD CONSTRAINT `dsps_tbl_dspsslide_ibfk_2` FOREIGN KEY (`dspsslide_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_feedback` +-- +ALTER TABLE `dsps_tbl_feedback` + ADD CONSTRAINT `dsps_tbl_feedback_ibfk_1` FOREIGN KEY (`dspsfb_res_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_social` +-- +ALTER TABLE `dsps_tbl_social` + ADD CONSTRAINT `dsps_tbl_social_ibfk_1` FOREIGN KEY (`dspssocial_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsps_tbl_typedatasource` +-- +ALTER TABLE `dsps_tbl_typedatasource` + ADD CONSTRAINT `dsps_tbl_typedatasource_ibfk_1` FOREIGN KEY (`dspstds_reg_by`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- +-- Constraints for table `dsp_oauth_auth_codes` +-- +ALTER TABLE `dsp_oauth_auth_codes` + ADD CONSTRAINT `dsp_oauth_auth_codes_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `dsp_oauth_clients` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `dsp_oauth_auth_codes_ibfk_2` FOREIGN KEY (`person_id`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `dsp_oauth_access_tokens` +-- +ALTER TABLE `dsp_oauth_access_tokens` + ADD CONSTRAINT `dsp_oauth_access_tokens_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `dsp_oauth_clients` (`client_id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `dsp_oauth_access_tokens_ibfk_2` FOREIGN KEY (`person_id`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Constraints for table `ist_tbl_users` +-- +ALTER TABLE `ist_tbl_users` + ADD CONSTRAINT `ist_tbl_users_ibfk_1` FOREIGN KEY (`fkisp_id_of`) REFERENCES `ist_tbl_people` (`pkisp_id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `ist_tbl_users_ibfk_2` FOREIGN KEY (`isu_regby_id`) REFERENCES `ist_tbl_users` (`pkisu_id`) ON DELETE SET NULL ON UPDATE CASCADE; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3a9e145 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,78 @@ +version: '3.9' + +services: + app: + build: . + container_name: dsp_app + restart: unless-stopped + env_file: + - .env + ports: + - "4010:80" + - "8082:80" + environment: + DB_HOST: db + DB_PORT: 3306 + DB_NAME: niph_dsps + DB_USER: dsp_user + DB_PASS: dsp_pass + JUPYTER_EXTERNAL_URL: ${JUPYTER_EXTERNAL_URL:-} + JUPYTER_PORT: ${JUPYTER_PORT:-443} + DSP_APP_ORIGINS: ${DSP_APP_ORIGINS:-} + DSP_FRAME_ANCESTORS: ${DSP_FRAME_ANCESTORS:-} + volumes: + - ./:/var/www/html + depends_on: + - db + + db: + image: mysql:8.0 + container_name: dsp_db + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: rootpassword + MYSQL_DATABASE: niph_dsps + MYSQL_USER: dsp_user + MYSQL_PASSWORD: dsp_pass + ports: + - "3307:3306" + volumes: + - mysql_data:/var/lib/mysql + - ./db/niph_dsps.sql:/docker-entrypoint-initdb.d/01-init.sql:ro + + phpmyadmin: + image: phpmyadmin:latest + container_name: dsp_phpmyadmin + restart: unless-stopped + ports: + - "8081:80" + environment: + PMA_HOST: db + PMA_USER: dsp_user + PMA_PASSWORD: dsp_pass + UPLOAD_LIMIT: 64M + depends_on: + - db + + jupyterhub: + build: + context: ./docker/jupyterhub + container_name: dsp_jupyterhub + restart: unless-stopped + env_file: + - .env + ports: + - "${JUPYTERHUB_PORT:-443}:8000" + - "8888:8000" + environment: + DSP_JH_NETWORK: dsp_default + DSP_APP_CONTAINER: dsp_app + DSP_WORKSPACE_ROOT: ${DSP_WORKSPACE_ROOT:-/var/www/html/uploads/jupyter_workspace} + volumes: + - ./uploads/jupyter_workspace:/var/www/html/uploads/jupyter_workspace + - /var/run/docker.sock:/var/run/docker.sock + depends_on: + - app + +volumes: + mysql_data: diff --git a/docker/app-entrypoint.sh b/docker/app-entrypoint.sh new file mode 100644 index 0000000..15a545c --- /dev/null +++ b/docker/app-entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +# Ensure uploads subdirectories exist and are writable +UPLOAD_ROOT="/var/www/html/uploads" +mkdir -p "$UPLOAD_ROOT/announcements" "$UPLOAD_ROOT/slides" "$UPLOAD_ROOT/datasources" + +# Relax permissions so Apache (www-data) can write when using bind mounts +chown -R www-data:www-data "$UPLOAD_ROOT" +chmod -R 775 "$UPLOAD_ROOT" + +exec apache2-foreground diff --git a/docker/custom.ini b/docker/custom.ini new file mode 100644 index 0000000..3156476 --- /dev/null +++ b/docker/custom.ini @@ -0,0 +1,2 @@ +upload_max_filesize=2048M +post_max_size=2048M diff --git a/docker/jupyter/jupyter_server_config.py b/docker/jupyter/jupyter_server_config.py new file mode 100644 index 0000000..0c2813a --- /dev/null +++ b/docker/jupyter/jupyter_server_config.py @@ -0,0 +1,45 @@ +"""Jupyter Server configuration for DSP docker stack.""" +from __future__ import annotations + +import os +import re + +c = get_config() # noqa: F821 - provided by Jupyter at runtime + +default_app_origins = [ + "http://localhost:8082", + "http://127.0.0.1:8082", +] +extra_app_origins = [ + value.rstrip("/") for value in os.getenv("DSP_APP_ORIGINS", "").split() if value +] +allowed_app_origins = list( + dict.fromkeys([origin.rstrip("/") for origin in default_app_origins + extra_app_origins]) +) + +if allowed_app_origins: + c.ServerApp.allow_origin = allowed_app_origins[0] + if len(allowed_app_origins) > 1: + escaped_origins = [re.escape(origin) for origin in allowed_app_origins] + pattern = "^(" + "|".join(escaped_origins) + ")$" + c.ServerApp.allow_origin_pat = pattern + +c.ServerApp.allow_remote_access = True +c.ServerApp.disable_check_xsrf = True + +default_frame_ancestors = [ + "'self'", + "http://localhost:8082", + "http://127.0.0.1:8082", +] +extra_frame_ancestors = [value for value in os.getenv("DSP_FRAME_ANCESTORS", "").split() if value] +frame_ancestors = " ".join( + dict.fromkeys(default_frame_ancestors + [origin.rstrip("/") for origin in extra_frame_ancestors]) +) + +c.ServerApp.tornado_settings = { + "headers": { + "Content-Security-Policy": f"frame-ancestors {frame_ancestors}", + "X-Frame-Options": "ALLOWALL", + } +} diff --git a/docker/jupyterhub/Dockerfile b/docker/jupyterhub/Dockerfile new file mode 100644 index 0000000..66ea215 --- /dev/null +++ b/docker/jupyterhub/Dockerfile @@ -0,0 +1,9 @@ +FROM jupyterhub/jupyterhub:4.1 + +# Install required Python packages and Docker CLI for pre-spawn syncing +RUN pip install --no-cache-dir oauthenticator dockerspawner jupyterhub-idle-culler && \ + apt-get update && \ + apt-get install -y --no-install-recommends docker.io && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +COPY jupyterhub_config.py /srv/jupyterhub/jupyterhub_config.py diff --git a/docker/jupyterhub/jupyterhub_config.py b/docker/jupyterhub/jupyterhub_config.py new file mode 100644 index 0000000..5ed29a2 --- /dev/null +++ b/docker/jupyterhub/jupyterhub_config.py @@ -0,0 +1,144 @@ +import logging +import os +import re +import subprocess +from typing import Dict, Optional + +from oauthenticator.generic import GenericOAuthenticator +from jupyterhub.auth import DummyAuthenticator +from dockerspawner import DockerSpawner + +c = get_config() + +# Authenticator selection (environment-driven) +c.Authenticator.enable_auth_state = False +auth_strategy = os.environ.get("JUPYTERHUB_AUTH_STRATEGY", "oauth").strip().lower() + +if auth_strategy == "dummy": + c.JupyterHub.authenticator_class = DummyAuthenticator + dummy_password = os.environ.get("JUPYTERHUB_DUMMY_PASSWORD") + if dummy_password: + c.DummyAuthenticator.password = dummy_password +else: + c.JupyterHub.authenticator_class = GenericOAuthenticator + c.GenericOAuthenticator.client_id = os.environ.get("DSP_OAUTH_CLIENT_ID", "") + c.GenericOAuthenticator.client_secret = os.environ.get("DSP_OAUTH_CLIENT_SECRET", "") + c.GenericOAuthenticator.authorize_url = os.environ.get("DSP_OAUTH_AUTHORIZE_URL", "") + c.GenericOAuthenticator.token_url = os.environ.get("DSP_OAUTH_TOKEN_URL", "") + c.GenericOAuthenticator.userdata_url = os.environ.get("DSP_OAUTH_USERINFO_URL", "") + c.GenericOAuthenticator.oauth_callback_url = os.environ.get("JUPYTERHUB_OAUTH_CALLBACK", "") + c.GenericOAuthenticator.scope = ["profile"] + c.GenericOAuthenticator.username_claim = "hub_username" + c.GenericOAuthenticator.username_key = "hub_username" + c.GenericOAuthenticator.auto_login = True + +# Explicitly acknowledge HTTP when running behind an external TLS terminator. +c.JupyterHub.confirm_no_ssl = True +c.Spawner.http_timeout = int(os.getenv("JUPYTERHUB_HTTP_TIMEOUT", "90")) +c.Spawner.start_timeout = int(os.getenv("JUPYTERHUB_START_TIMEOUT", "90")) + +def _env_bool(name: str, default: bool = False) -> bool: + value = os.getenv(name) + if value is None: + return default + return value.strip().lower() in {"1", "true", "yes", "on"} + + +tornado_settings = getattr(c.JupyterHub, "tornado_settings", {}) +if isinstance(tornado_settings, dict): + merged_settings = tornado_settings.copy() +else: + merged_settings = {} + +default_frame_ancestors = ["'self'", "http://localhost:8082", "http://127.0.0.1:8082"] +app_origin_values = [value.rstrip("/") for value in os.getenv("DSP_APP_ORIGINS", "").split() if value] +extra_frame_ancestors = [value.rstrip("/") for value in os.getenv("DSP_FRAME_ANCESTORS", "").split() if value] +frame_ancestors = " ".join( + dict.fromkeys(default_frame_ancestors + app_origin_values + extra_frame_ancestors) +) + +header_settings = { + "Content-Security-Policy": f"frame-ancestors {frame_ancestors}", + "X-Frame-Options": "ALLOWALL", +} + +existing_headers = merged_settings.get("headers", {}) +existing_headers.update(header_settings) +merged_settings["headers"] = existing_headers + +external_url = os.getenv("JUPYTER_EXTERNAL_URL", "") +cookie_secure_default = external_url.startswith("https://") +merged_settings["cookie_options"] = { + "SameSite": "None", + "Secure": _env_bool("JUPYTERHUB_COOKIE_SECURE", cookie_secure_default), +} +c.JupyterHub.tornado_settings = merged_settings + +# Single-user server configuration +c.JupyterHub.spawner_class = DockerSpawner +c.DockerSpawner.image = os.environ.get("DSP_JH_IMAGE", "jupyter/minimal-notebook:python-3.11") +c.DockerSpawner.remove_containers = True +c.DockerSpawner.cmd = ["start-singleuser.sh"] +c.DockerSpawner.notebook_dir = "/home/jovyan/work" +c.DockerSpawner.network_name = os.environ.get("DSP_JH_NETWORK", "dsp_default") + + +def _workspace_volume(username: str) -> Dict[str, str]: + safe = re.sub(r"[^a-zA-Z0-9._-]+", "-", username) + host_root = os.environ.get("DSP_WORKSPACE_ROOT", "/var/www/html/uploads/jupyter_workspace") + volumes: Dict[str, str] = {f"{host_root}/{safe}": "/home/jovyan/work"} + + r_scripts_root = os.environ.get("DSP_R_SCRIPTS_ROOT", "/var/www/html/r_scripts") + if os.path.isdir(r_scripts_root): + volumes[r_scripts_root] = "/home/jovyan/work/r_scripts" + + return volumes + + +def _extract_person_id(username: str) -> Optional[str]: + match = re.search(r"(\d+)$", username or "") + return match.group(1) if match else None + + +def _run_sync(person_id: str) -> None: + command = [ + "docker", + "exec", + os.environ.get("DSP_APP_CONTAINER", "dsp_app"), + "php", + "/var/www/html/scripts/trigger_workspace_sync.php", + person_id, + ] + subprocess.run(command, check=False) + + +async def pre_spawn_hook(spawner): + username = spawner.user.name + spawner.volumes = _workspace_volume(username) + person_id = _extract_person_id(username) + if person_id: + _run_sync(person_id) + + +c.DockerSpawner.pre_spawn_hook = pre_spawn_hook + +_cull_token = os.environ.get("JUPYTERHUB_CULL_API_TOKEN") + +if _cull_token: + c.JupyterHub.services = [ + { + "name": "cull-idle", + "command": [ + "python", + "-m", + "jupyterhub_idle_culler", + "--timeout=3600", + "--cull-every=600", + "--concurrency=10", + ], + "api_token": _cull_token, + "admin": True, + } + ] +else: + logging.warning("JUPYTERHUB_CULL_API_TOKEN not set; idle culler disabled.") diff --git a/includes/auth.php b/includes/auth.php new file mode 100644 index 0000000..d6a3520 --- /dev/null +++ b/includes/auth.php @@ -0,0 +1,88 @@ + diff --git a/includes/footer_admin.php b/includes/footer_admin.php new file mode 100644 index 0000000..c680983 --- /dev/null +++ b/includes/footer_admin.php @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/includes/footer_contributor.php b/includes/footer_contributor.php new file mode 100644 index 0000000..c680983 --- /dev/null +++ b/includes/footer_contributor.php @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/includes/footer_owner.php b/includes/footer_owner.php new file mode 100644 index 0000000..c680983 --- /dev/null +++ b/includes/footer_owner.php @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/includes/footer_public.php b/includes/footer_public.php new file mode 100644 index 0000000..7239eaa --- /dev/null +++ b/includes/footer_public.php @@ -0,0 +1,67 @@ +
+
+
+
+
Introduction to NIPH
+

The National Institute of Public Health (NIPH) is dedicated to advancing public health through research, education, laboratories, and services. Our data sharing platform aims to provide accessible and reliable health data for informed decision-making.

+
+
+
Contact Us
+
    +
  • St.(289), Phnom Penh, Cambodia
  • +
  • +855 12 345 678
  • +
  • dac@niph.org.kh
  • +
+
    + + + +
+
+
+
Quick Links
+ +
+
+
+

© NIPH Data Sharing Platform. All rights reserved.

+
+ + +
+ + +
+
+ + + \ No newline at end of file diff --git a/includes/footer_user.php b/includes/footer_user.php new file mode 100644 index 0000000..c680983 --- /dev/null +++ b/includes/footer_user.php @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/includes/header_admin.php b/includes/header_admin.php new file mode 100644 index 0000000..9973719 --- /dev/null +++ b/includes/header_admin.php @@ -0,0 +1,163 @@ + + + + + NIPH Data Sharing Platform + + + + + + + + + + + \ No newline at end of file diff --git a/includes/header_contributor.php b/includes/header_contributor.php new file mode 100644 index 0000000..11a782d --- /dev/null +++ b/includes/header_contributor.php @@ -0,0 +1,150 @@ + + + + + NIPH Data Sharing Platform + + + + + + + + + + + \ No newline at end of file diff --git a/includes/header_owner.php b/includes/header_owner.php new file mode 100644 index 0000000..11a782d --- /dev/null +++ b/includes/header_owner.php @@ -0,0 +1,150 @@ + + + + + NIPH Data Sharing Platform + + + + + + + + + + + \ No newline at end of file diff --git a/includes/header_public.php b/includes/header_public.php new file mode 100644 index 0000000..cb0a6ff --- /dev/null +++ b/includes/header_public.php @@ -0,0 +1,107 @@ + + + + NIPH Data Sharing Platform + + + + + + + + \ No newline at end of file diff --git a/includes/header_user.php b/includes/header_user.php new file mode 100644 index 0000000..64356e7 --- /dev/null +++ b/includes/header_user.php @@ -0,0 +1,149 @@ + + + + + Data User Dashboard - NIPH DSP + + + + + + + + + + \ No newline at end of file diff --git a/includes/jupyter_config_reference.php b/includes/jupyter_config_reference.php new file mode 100644 index 0000000..70e0035 --- /dev/null +++ b/includes/jupyter_config_reference.php @@ -0,0 +1,63 @@ + +
+
+
+

Jupyter Service Reference

+

+ Configuration guidance (defaults, overrides, and security notes) now lives on the + Install & Configuration + page under R in JupyterHub Service. +

+

+ Use the snapshot below to confirm how this environment is currently resolving the notebook endpoint. +

+
+
Notebook Base URL
+
+ +
Published Port
+
+ +
Authentication Token
+
+ +
Workspace Mount
+
+
+

Active Environment Overrides

+ $value !== null && $value !== ''); + ?> + +
    + $value): ?> +
  • :
  • + +
+ +

No overrides detected; defaults from the Docker stack are in effect.

+ +
+
+
diff --git a/includes/jupyter_helpers.php b/includes/jupyter_helpers.php new file mode 100644 index 0000000..ab28322 --- /dev/null +++ b/includes/jupyter_helpers.php @@ -0,0 +1,203 @@ + + */ +function dsp_jupyter_defaults(): array { + return [ + 'base_url' => 'https://localhost', + 'token' => 'dsp-token', + 'workspace_root' => 'datasources', + 'port' => '443', + ]; +} + +/** + * Determines the external base URL for the Jupyter service. + * + * @return string + */ +function dsp_jupyter_base_url(): string { + $configured = getenv('JUPYTER_EXTERNAL_URL'); + if ($configured) { + return rtrim($configured, '/'); + } + + $defaults = dsp_jupyter_defaults(); + $scheme = (!empty($_SERVER['HTTPS']) && strtolower((string) $_SERVER['HTTPS']) !== 'off') ? 'https' : 'http'; + $hostHeader = $_SERVER['HTTP_HOST'] ?? ''; + + if ($hostHeader) { + $hostname = explode(':', $hostHeader)[0]; + $port = dsp_jupyter_port(); + $authority = $hostname; + + $portIsDefault = ($scheme === 'http' && $port === '80') || ($scheme === 'https' && $port === '443'); + if (!$portIsDefault) { + $authority .= ':' . $port; + } + + return sprintf('%s://%s', $scheme, $authority); + } + + return rtrim($defaults['base_url'], '/'); +} + +/** + * Retrieves the token used to authenticate with Jupyter. + * + * @return string + */ +function dsp_jupyter_token(): string { + $authStrategy = strtolower((string) getenv('JUPYTERHUB_AUTH_STRATEGY')); + if ($authStrategy === 'oauth') { + return ''; + } + + $defaults = dsp_jupyter_defaults(); + + $envToken = getenv('JUPYTER_TOKEN'); + if ($envToken !== false) { + return $envToken; + } + + return $defaults['token']; +} + +/** + * Resolves the username JupyterHub should use for the active user. + * + * The template can be customised via JUPYTERHUB_USERNAME_TEMPLATE. + * Supported placeholders: + * {person_id} - numeric person identifier from the session + * {username} - DSP username from the session + * {email} - Session email if available + * + * @param int|null $personId Optional explicit person ID + * @return string|null Sanitised username or null when it cannot be determined. + */ +function dsp_resolve_jupyterhub_username(?int $personId, ?string $username = null, ?string $email = null): ?string { + if ($personId === null || $personId <= 0) { + return null; + } + + $template = getenv('JUPYTERHUB_USERNAME_TEMPLATE') ?: 'user_{person_id}'; + $usernameRaw = str_replace( + ['{person_id}', '{username}', '{email}'], + [ + (string) $personId, + (string) $username, + (string) $email, + ], + $template + ); + + $usernameSanitised = preg_replace('/[^a-zA-Z0-9._-]+/', '-', $usernameRaw); + $usernameSanitised = trim((string) $usernameSanitised, "-_."); + + return $usernameSanitised !== '' ? $usernameSanitised : null; +} + +function dsp_jupyterhub_username(?int $personId = null): ?string { + if ($personId === null) { + $personId = isset($_SESSION['person_id']) ? (int) $_SESSION['person_id'] : null; + } + + $username = $_SESSION['username'] ?? null; + $email = $_SESSION['email'] ?? null; + + return dsp_resolve_jupyterhub_username($personId, $username, $email); +} + +/** + * Builds the per-user route served by JupyterHub. + * + * The path template can be overridden with JUPYTERHUB_USER_PATH (e.g. "user/{username}/lab"). + * + * @param string $baseUrl Hub base URL. + * @param int|null $personId Optional explicit person ID. + * @return string Absolute path including the user segment, without trailing slash. + */ +function dsp_jupyterhub_user_route(string $baseUrl, ?int $personId = null): string { + $baseUrl = rtrim($baseUrl, '/'); + + $pathTemplate = getenv('JUPYTERHUB_USER_PATH'); + if ($pathTemplate === false || $pathTemplate === '') { + return $baseUrl; + } + + $personId = $personId ?? (isset($_SESSION['person_id']) ? (int) $_SESSION['person_id'] : null); + $username = dsp_jupyterhub_username($personId); + + if ($username === null) { + return $baseUrl; + } + + $relativePath = str_replace( + ['{username}', '{person_id}'], + [$username, (string) $personId], + ltrim($pathTemplate, '/') + ); + + return rtrim($baseUrl . '/' . $relativePath, '/'); +} + +/** + * Builds the iframe URL using the resolved base URL and token. + * + * @param string|null $baseUrl Optional override of the base URL. + * @param string|null $token Optional override of the token. + * @param int|null $personId Optional override of the person ID used for the route. + * + * @return string + */ +function dsp_jupyter_iframe_url(?string $baseUrl = null, ?string $token = null, ?int $personId = null): string { + $resolvedBase = rtrim($baseUrl ?: dsp_jupyter_base_url(), '/'); + $userRoute = dsp_jupyterhub_user_route($resolvedBase, $personId); + $finalToken = $token ?: dsp_jupyter_token(); + + return $finalToken + ? sprintf('%s?token=%s', $userRoute, urlencode($finalToken)) + : $userRoute; +} + +/** + * Determines the host port the Jupyter service is published on. + * + * @return string + */ +function dsp_jupyter_port(): string { + $configured = getenv('JUPYTER_PORT'); + if ($configured === false || $configured === '') { + $configured = getenv('JUPYTERHUB_PORT'); + } + if ($configured) { + return (string) $configured; + } + + $defaults = dsp_jupyter_defaults(); + + return $defaults['port']; +} + +/** + * Captures the environment overrides impacting the embedded Jupyter configuration. + * + * @return array + */ +function dsp_jupyter_env_overrides(): array { + return [ + 'JUPYTER_EXTERNAL_URL' => getenv('JUPYTER_EXTERNAL_URL') ?: null, + 'JUPYTER_TOKEN' => getenv('JUPYTER_TOKEN') ?: null, + 'JUPYTER_PORT' => getenv('JUPYTER_PORT') ?: null, + 'JUPYTERHUB_PORT' => getenv('JUPYTERHUB_PORT') ?: null, + 'DSP_APP_ORIGINS' => getenv('DSP_APP_ORIGINS') ?: null, + 'DSP_FRAME_ANCESTORS' => getenv('DSP_FRAME_ANCESTORS') ?: null, + 'JUPYTERHUB_USERNAME_TEMPLATE' => getenv('JUPYTERHUB_USERNAME_TEMPLATE') ?: null, + 'JUPYTERHUB_USER_PATH' => getenv('JUPYTERHUB_USER_PATH') ?: null, + ]; +} diff --git a/includes/nav_admin.php b/includes/nav_admin.php new file mode 100644 index 0000000..ea32c92 --- /dev/null +++ b/includes/nav_admin.php @@ -0,0 +1,119 @@ + + + +
+

DSP ADMIN

+ +
+ + +
+ + + diff --git a/includes/nav_contributor.php b/includes/nav_contributor.php new file mode 100644 index 0000000..1bb0c26 --- /dev/null +++ b/includes/nav_contributor.php @@ -0,0 +1,109 @@ + + + +
+

DSP DATA Contributor

+ +
+ + +
+ + + diff --git a/includes/nav_owner.php b/includes/nav_owner.php new file mode 100644 index 0000000..29ccb06 --- /dev/null +++ b/includes/nav_owner.php @@ -0,0 +1,108 @@ + + + +
+

DSP DATA OWNER

+ +
+ + +
+ + + diff --git a/includes/nav_public.php b/includes/nav_public.php new file mode 100644 index 0000000..cf55074 --- /dev/null +++ b/includes/nav_public.php @@ -0,0 +1,85 @@ + + + diff --git a/includes/nav_user.php b/includes/nav_user.php new file mode 100644 index 0000000..181a3e7 --- /dev/null +++ b/includes/nav_user.php @@ -0,0 +1,108 @@ + + + +
+

DSP DATA USER

+ +
+ + +
+ + + diff --git a/index.php b/index.php new file mode 100644 index 0000000..975612f --- /dev/null +++ b/index.php @@ -0,0 +1,562 @@ +getAllSlides(); // NEW: Get slides from database +// If no slides from DB, use placeholders +if (empty($slides)) { + $slides = [ + ['dspsslide_title_en' => 'Welcome to NIPH DSPS', 'dspsslide_description' => 'Your gateway to public health data and insights.', 'dspsslide_photoname' => 'https://placehold.co/1200x400/007bff/ffffff?text=Slide+1+-+Welcome'], + ['dspsslide_title_en' => 'Discover Research Data', 'dspsslide_description' => 'Access a wide range of datasets for your studies.', 'dspsslide_photoname' => 'https://placehold.co/1200x400/28a745/ffffff?text=Slide+2+-+Data+Insights'], + ['dspsslide_title_en' => 'Stay Informed', 'dspsslide_description' => 'Read the latest announcements and updates from NIPH.', 'dspsslide_photoname' => 'https://placehold.co/1200x400/ffc107/ffffff?text=Slide+3+-+Announcements'], + ]; +} else { + // Adjust photo path for display if coming from DB + foreach ($slides as &$slide) { + $slide['dspsslide_photoname'] = 'uploads/slides/' . $slide['dspsslide_photoname']; + } + unset($slide); // Unset reference +} + +$announcements = $announcement_manager->getAllAnnouncements('Published', 3); // Get 3 latest published announcements +// If no announcements from DB, use placeholders +if (empty($announcements)) { + $announcements = [ + ['dspsann_title' => 'Important Update on Data Policy', 'dspsann_description' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', 'dspsann_photopath' => 'https://placehold.co/400x250/6c757d/ffffff?text=Announcement+1'], + ['dspsann_title' => 'New Data Sources Available', 'dspsann_description' => 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.', 'dspsann_photopath' => 'https://placehold.co/400x250/6c757d/ffffff?text=Announcement+2'], + ['dspsann_title' => 'Upcoming Maintenance Schedule', 'dspsann_description' => 'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.', 'dspsann_photopath' => 'https://placehold.co/400x250/6c757d/ffffff?text=Announcement+3'], + ]; +} else { + // Adjust photo path for display if coming from DB + foreach ($announcements as &$ann) { + if (!empty($ann['dspsann_photopath'])) { + $ann['dspsann_photopath'] = 'uploads/announcements/' . $ann['dspsann_photopath']; + } else { + $ann['dspsann_photopath'] = 'https://placehold.co/400x250/6c757d/ffffff?text=No+Image'; + } + } + unset($ann); // Unset reference +} + + +// Fetch data types for classifications section +$data_types = $classification_manager->getAllDataTypes(); // Use Classifications manager +if (empty($data_types)) { + $data_types = [ + ['dspstds_name_en' => 'CSV Data', 'icon' => 'fas fa-file-csv', 'color' => 'text-primary', 'description' => 'Explore tabular data in CSV format.'], + ['dspstds_name_en' => 'JSON Data', 'icon' => 'fas fa-file-code', 'color' => 'text-success', 'description' => 'Access structured data in JSON format.'], + ['dspstds_name_en' => 'API Endpoints', 'icon' => 'fas fa-code-branch', 'color' => 'text-warning', 'description' => 'Integrate with data via API interfaces.'], + ['dspstds_name_en' => 'PDF Documents', 'icon' => 'fas fa-file-pdf', 'color' => 'text-danger', 'description' => 'View reports and documents in PDF.'], + ]; +} else { + // Map DB data to include placeholder icons/colors if not stored in DB + foreach ($data_types as &$type) { + switch ($type['dspstds_name_en']) { + case 'CSV': $type['icon'] = 'fas fa-file-csv'; $type['color'] = 'text-primary'; break; + case 'JSON': $type['icon'] = 'fas fa-file-code'; $type['color'] = 'text-success'; break; + case 'API': $type['icon'] = 'fas fa-code-branch'; $type['color'] = 'text-warning'; break; + case 'PDF': $type['icon'] = 'fas fa-file-pdf'; $type['color'] = 'text-danger'; break; + default: $type['icon'] = 'fas fa-file'; $type['color'] = 'text-secondary'; break; + } + $type['description'] = "Explore data of type " . htmlspecialchars($type['dspstds_name_en']) . "."; + } + unset($type); // Unset reference +} + +// Fetch all categories for the filter dropdown +$all_categories = $classification_manager->getAllCategories(); + +/** + * Sanitises rich text content by allowing a limited subset of HTML tags. + * + * @param string|null $value + * @return string + */ +function dsp_render_rich_text(?string $value): string { + if ($value === null) { + return ''; + } + + $allowed = '