From 7784f4c23d8da16ccdc4af416ba24a80e7edad3a Mon Sep 17 00:00:00 2001 From: Pantheon Automation Date: Tue, 17 Nov 2015 13:42:33 -0800 Subject: [PATCH] Update to Drupal 8.0-dev-2015-11-17. Commits through da81cd220, Tue Nov 17 15:53:49 2015 +0000, Issue #2617224 by Wim Leers: Move around/fix some documentation. --- .gitignore | 4 + .htaccess | 3 - composer.json | 2 +- composer.lock | 222 +- core/CHANGELOG.txt | 139 +- core/MAINTAINERS.txt | 1 + core/composer.json | 2 +- core/core.libraries.yml | 1 - core/core.services.yml | 8 +- core/includes/errors.inc | 12 +- core/includes/install.core.inc | 3 + core/includes/theme.inc | 2 +- core/includes/theme.maintenance.inc | 14 +- core/lib/Drupal.php | 18 +- .../Component/PhpStorage/FileStorage.php | 3 +- core/lib/Drupal/Core/Asset/AssetResolver.php | 27 +- core/lib/Drupal/Core/Cache/CacheCollector.php | 27 +- core/lib/Drupal/Core/Composer/Composer.php | 46 +- .../Drupal/Core/Config/ConfigInstaller.php | 62 +- .../Core/Config/Entity/ConfigEntityBase.php | 11 + .../Drupal/Core/Controller/ControllerBase.php | 24 + core/lib/Drupal/Core/Datetime/DateHelper.php | 16 +- .../DependencyInjection/ContainerBuilder.php | 27 - core/lib/Drupal/Core/DrupalKernel.php | 7 - .../Entity/Element/EntityAutocomplete.php | 66 +- core/lib/Drupal/Core/Entity/Entity.php | 41 +- .../Drupal/Core/Entity/EntityInterface.php | 66 +- .../SelectionInterface.php | 4 +- .../SelectionWithAutocreateInterface.php | 52 + .../Core/Entity/EntityTypeBundleInfo.php | 18 +- .../DefaultSelection.php | 36 +- .../Constraint/ValidReferenceConstraint.php | 18 +- .../ValidReferenceConstraintValidator.php | 133 +- .../Routing/DefaultHtmlRouteProvider.php | 69 +- core/lib/Drupal/Core/Entity/entity.api.php | 10 +- .../ContentControllerSubscriber.php | 48 - .../DefaultExceptionHtmlSubscriber.php | 7 +- ...lResponsePlaceholderStrategySubscriber.php | 4 - .../HtmlResponseSubscriber.php | 4 - .../Drupal/Core/Extension/ThemeHandler.php | 14 + .../Core/Extension/ThemeHandlerInterface.php | 14 + .../Field/EntityReferenceFieldItemList.php | 10 + .../Field/FieldType/EntityReferenceItem.php | 17 - .../Field/Plugin/Field/FieldType/UriItem.php | 14 + .../lib/Drupal/Core/Menu/LocalTaskManager.php | 4 +- core/lib/Drupal/Core/Menu/MenuLinkManager.php | 7 +- core/lib/Drupal/Core/Menu/MenuLinkTree.php | 1 + core/lib/Drupal/Core/Path/AliasStorage.php | 106 +- .../Core/Path/AliasStorageInterface.php | 20 +- .../OutboundPathProcessorInterface.php | 23 +- .../Core/Render/Element/RenderElement.php | 5 + .../Routing/Enhancer/FormRouteEnhancer.php | 33 + .../Enhancer/ParamConversionEnhancer.php | 8 +- .../lib/Drupal/Core/Routing/RouteProvider.php | 4 +- core/lib/Drupal/Core/Routing/UrlGenerator.php | 3 + .../Core/Routing/UrlGeneratorInterface.php | 4 + .../ReverseProxyMiddleware.php | 29 +- .../StringTranslation/TranslationManager.php | 5 + core/lib/Drupal/Core/Template/Attribute.php | 7 +- .../Theme/MissingThemeDependencyException.php | 47 + .../Drupal/Core/Theme/ThemeInitialization.php | 10 + .../Theme/ThemeInitializationInterface.php | 7 +- .../Core/Utility/LinkGeneratorInterface.php | 7 + core/misc/ajax.js | 27 + core/misc/drupalSettingsLoader.js | 3 +- core/misc/progress.js | 1 + core/misc/tabledrag.js | 30 +- .../Migrate/MigrateAggregatorStubTest.php | 63 + core/modules/block/block.module | 5 +- .../block/src/Controller/BlockController.php | 5 + .../src/Controller/BlockListController.php | 33 + .../src/Plugin/Derivative/ThemeLocalTask.php | 2 +- .../block/src/Tests/BlockHiddenRegionTest.php | 4 +- core/modules/block/src/Tests/BlockTest.php | 4 +- core/modules/block/src/Tests/BlockUiTest.php | 26 + .../src/Tests/NewDefaultThemeBlocksTest.php | 8 + .../src/Unit/Menu/BlockLocalTasksTest.php | 13 +- .../block_content/block_content.routing.yml | 3 + .../src/Tests/BlockContentTypeTest.php | 8 +- .../Migrate/MigrateBlockContentStubTest.php | 63 + core/modules/book/book.routing.yml | 3 + .../ckeditor/js/plugins/drupallink/plugin.js | 92 +- core/modules/comment/comment.routing.yml | 5 + .../CommentSelection.php | 28 + .../migrate/destination/EntityComment.php | 37 +- .../src/Tests/CommentValidationTest.php | 2 +- .../Tests/Migrate/MigrateCommentStubTest.php | 78 + .../Tests/Migrate/d6/MigrateCommentTest.php | 8 +- .../Tests/ConfigImportInstallProfileTest.php | 1 + .../ConfigInstallProfileOverrideTest.php | 4 +- ...figInstallProfileUnmetDependenciesTest.php | 1 + core/modules/contact/contact.routing.yml | 1 + .../content_translation.install | 16 + .../content_translation.module | 8 +- .../src/ContentTranslationHandler.php | 4 +- .../ContentTranslationController.php | 6 +- .../ContentTranslationRouteSubscriber.php | 6 +- .../Tests/ContentTranslationEnableTest.php | 18 +- .../Tests/ContentTranslationUITestBase.php | 19 +- .../Tests/ContentTranslationWorkflowsTest.php | 8 +- core/modules/editor/editor.module | 6 +- core/modules/editor/src/Annotation/Editor.php | 32 + core/modules/editor/src/EditorController.php | 3 + core/modules/editor/src/Plugin/EditorBase.php | 26 +- .../editor/src/Tests/EditorFileUsageTest.php | 121 +- .../migrate/source/d6/FieldInstance.php | 2 +- .../EntityReferenceItemTest.php | 114 +- .../field/src/Tests/Uri/UriItemTest.php | 5 + .../config/schema/file.destination.schema.yml | 3 + core/modules/file/file.field.inc | 21 - core/modules/file/file.js | 4 +- core/modules/file/file.module | 4 - .../file/migration_templates/d6_file.yml | 1 + .../file/migration_templates/d7_file.yml | 1 + .../FileSelection.php | 35 +- .../src/Plugin/Field/FieldType/FileItem.php | 2 +- .../Plugin/Field/FieldWidget/FileWidget.php | 19 +- .../Constraint/FileValidationConstraint.php | 22 + .../FileValidationConstraintValidator.php | 34 + .../Plugin/migrate/destination/EntityFile.php | 46 +- .../src/Plugin/migrate/process/d6/FileUri.php | 5 + .../file/src/Tests/FileFieldValidateTest.php | 31 + .../src/Tests/Migrate/MigrateFileStubTest.php | 42 + .../file/templates/file-widget.html.twig | 17 - .../src/Kernel/FileItemValidationTest.php | 119 + core/modules/history/history.routing.yml | 1 + .../views/filter/HistoryUserTimestamp.php | 3 +- .../src/Tests/Views/HistoryTimestampTest.php | 9 + .../src/Plugin/Field/FieldType/ImageItem.php | 6 +- core/modules/language/language.install | 13 + core/modules/language/language.services.yml | 2 +- .../src/EventSubscriber/ConfigSubscriber.php | 40 +- .../src/Form/ContentLanguageSettingsForm.php | 2 +- .../src/HttpKernel/PathProcessorLanguage.php | 32 +- .../language/src/LanguageServiceProvider.php | 4 +- .../LanguageNegotiationContentEntity.php | 294 +++ .../src/Tests/EntityUrlLanguageTest.php | 116 +- .../LanguageNegotiationContentEntityTest.php | 182 ++ .../LanguageSelectorTranslatableTest.php | 2 +- .../LanguageUILanguageNegotiationTest.php | 7 +- ...guage-negotiation-configure-form.html.twig | 39 +- .../src/Plugin/Field/FieldType/LinkItem.php | 37 +- ...NotExistingInternalConstraintValidator.php | 10 + core/modules/link/src/Tests/LinkFieldTest.php | 4 +- core/modules/link/src/Tests/LinkItemTest.php | 41 +- .../LocaleConfigTranslationImportTest.php | 4 + .../src/Tests/LocalePluralFormatTest.php | 65 + .../MigrateMenuLinkContentStubTest.php | 42 + .../modules/migrate/src/MigrateExecutable.php | 4 +- .../src/Plugin/MigrateSourceInterface.php | 8 +- .../src/Plugin/migrate/destination/Entity.php | 13 - .../migrate/destination/EntityContentBase.php | 66 +- .../migrate/src/Plugin/migrate/id_map/Sql.php | 1 + .../migrate/source/SourcePluginBase.php | 2 +- core/modules/migrate/src/Row.php | 13 +- .../tests/src/Unit/MigrateSourceTest.php | 188 ++ .../tests/src/Unit/MigrateTestCase.php | 5 + .../destination/EntityContentBaseTest.php | 118 + .../Unit/destination/EntityRevisionTest.php | 10 +- .../src/Tests/StubTestTrait.php | 80 + .../migrate_drupal/tests/fixtures/drupal7.php | 20 + core/modules/node/node.module | 8 + core/modules/node/node.routing.yml | 5 + .../node/src/Controller/NodeController.php | 2 +- .../node/src/Entity/NodeRouteProvider.php | 3 + .../NodeSelection.php | 28 + .../node/src/Plugin/views/wizard/Node.php | 4 +- .../src/Tests/Migrate/MigrateNodeStubTest.php | 48 + .../src/Tests/NodeAccessAutoBubblingTest.php | 72 + .../node/src/Tests/NodeRevisionsTest.php | 27 + .../node/src/Tests/NodeTranslationUITest.php | 3 +- core/modules/node/src/Tests/NodeTypeTest.php | 6 + .../node_access_test_auto_bubbling.info.yml | 6 + ...node_access_test_auto_bubbling.routing.yml | 6 + .../NodeAccessTestAutoBubblingController.php | 61 + core/modules/path/src/Form/PathFormBase.php | 16 +- core/modules/path/src/Tests/PathAliasTest.php | 62 +- .../src/Plugin/views/display/RestExport.php | 2 +- .../src/Tests/Views/StyleSerializerTest.php | 62 +- ...ew.test_serializer_node_exposed_filter.yml | 172 ++ .../d7_search_settings.yml | 8 + .../Migrate/d7/MigrateSearchSettingsTest.php | 1 + .../src/Tests/NormalizerTestBase.php | 8 +- core/modules/shortcut/shortcut.routing.yml | 5 + .../Tests/Migrate/MigrateShortcutStubTest.php | 44 + core/modules/simpletest/simpletest.module | 19 +- core/modules/simpletest/src/TestBase.php | 38 +- .../system/src/Controller/ThemeController.php | 15 +- .../system/src/Form/ThemeSettingsForm.php | 8 +- .../src/Plugin/Derivative/ThemeLocalTask.php | 2 +- .../system/src/SystemConfigSubscriber.php | 32 + .../EntityAutocompleteElementFormTest.php | 1 + .../src/Tests/Entity/EntityFieldTest.php | 8 +- .../Tests/Entity/EntityReferenceFieldTest.php | 2 +- .../src/Tests/File/HtaccessUnitTest.php | 9 +- .../Tests/Installer/StandardInstallerTest.php | 13 + .../system/src/Tests/Menu/MenuRouterTest.php | 1 + .../src/Tests/Routing/RouteProviderTest.php | 12 +- .../System/DefaultMobileMetaTagsTest.php | 5 - .../src/Tests/System/ErrorHandlerTest.php | 1 + .../system/src/Tests/System/ThemeTest.php | 44 +- .../Tests/System/UncaughtExceptionTest.php | 8 +- .../Tests/Theme/StableLibraryOverrideTest.php | 185 ++ .../UpdatePathRC1TestBaseFilledTest.php | 3 +- .../Update/UpdatePathRC1TestBaseTest.php | 9 +- core/modules/system/system.install | 47 +- core/modules/system/system.services.yml | 1 + .../block--local-actions-block.html.twig | 2 +- .../update/drupal-8-rc1.bare.standard.php.gz | Bin 0 -> 119576 bytes .../drupal-8-rc1.filled.standard.php.gz | Bin 0 -> 623241 bytes .../test_page_test/src/Controller/Test.php | 11 + .../test_page_test/test_page_test.routing.yml | 8 + .../tests/src/Unit/Menu/MenuLinkTreeTest.php | 1 + .../src/Unit/Menu/SystemLocalTasksTest.php | 4 + .../test_basetheme/test_basetheme.info.yml | 2 + .../themes/test_theme/test_theme.info.yml | 4 +- .../d6_vocabulary_field_instance.yml | 1 + .../destination/EntityTaxonomyTerm.php | 30 - .../Migrate/MigrateTaxonomyTermStubTest.php | 118 + .../d6/MigrateVocabularyFieldInstanceTest.php | 2 + core/modules/taxonomy/taxonomy.routing.yml | 3 + .../toolbar/js/views/ToolbarVisualView.js | 2 +- .../toolbar/src/Menu/ToolbarMenuLinkTree.php | 1 + core/modules/tracker/tracker.routing.yml | 2 + ...pdate_settings.yml => update_settings.yml} | 3 +- .../Migrate/d6/MigrateUpdateConfigsTest.php | 2 +- .../user/config/schema/user.source.schema.yml | 4 +- .../user/src/Entity/UserRouteProvider.php | 3 + .../UserSelection.php | 36 + .../Plugin/migrate/destination/EntityUser.php | 38 +- .../Migrate/MigrateUserAdminPassTest.php | 116 + .../src/Tests/Migrate/MigrateUserStubTest.php | 43 + .../src/Tests/Migrate/d6/MigrateUserTest.php | 7 +- .../user/src/Tests/UserValidationTest.php | 2 +- core/modules/user/user.routing.yml | 1 + .../src/Plugin/views/argument_default/Raw.php | 6 +- .../views/src/Tests/DefaultViewsTest.php | 7 + .../views/src/Tests/Plugin/StyleGridTest.php | 2 +- .../src/Tests/Plugin/StyleSummaryTest.php | 77 + .../views/src/Tests/Plugin/StyleTestBase.php | 2 +- .../views/src/Tests/Wizard/BasicTest.php | 5 +- core/modules/views/src/ViewExecutable.php | 14 +- .../test_views/views.view.test_summary.yml | 127 + .../argument_default/QueryParameterTest.php | 50 +- .../Unit/Plugin/argument_default/RawTest.php | 36 +- .../tests/src/Unit/ViewExecutableTest.php | 96 + core/modules/views_ui/src/ViewPreviewForm.php | 1 + core/modules/views_ui/src/ViewUI.php | 14 + .../install/block.block.classy_page_title.yml | 17 - core/scripts/run-tests.sh | 252 +- .../Core/Cache/CacheCollectorTest.php | 79 + .../Core/Path/AliasStorageTest.php | 86 + .../Core/Theme/MaintenanceThemeTest.php | 43 + .../Core/Theme/StableTemplateOverrideTest.php | 108 + .../RedirectOnExceptionTest.php | 50 + .../Tests/Core/Asset/AssetResolverTest.php | 168 ++ .../Core/Asset/LibraryDiscoveryParserTest.php | 48 +- .../Tests/Core/Common/AttributesTest.php | 16 + .../Tests/Core/Datetime/DateHelperTest.php | 112 + core/tests/Drupal/Tests/Core/DrupalTest.php | 10 + .../Enhancer/ParamConversionEnhancerTest.php | 8 +- .../Tests/Core/Entity/EntityLinkTest.php | 62 +- .../Core/Entity/EntityTypeBundleInfoTest.php | 53 +- .../Tests/Core/Entity/EntityUrlTest.php | 126 +- .../Routing/DefaultHtmlRouteProviderTest.php | 155 ++ .../Core/PathProcessor/PathProcessorTest.php | 7 +- .../TranslationManagerTest.php | 7 +- core/themes/classy/classy.info.yml | 2 +- .../block--local-actions-block.html.twig | 2 +- .../block/block--local-tasks-block.html.twig | 2 +- .../content-edit/file-widget.html.twig | 16 - .../classy/templates/layout/html.html.twig | 2 +- core/themes/stable/css/block/block.admin.css | 42 + .../stable/css/ckeditor/ckeditor-iframe.css | 23 + .../stable/css/ckeditor/ckeditor.admin.css | 328 +++ core/themes/stable/css/ckeditor/ckeditor.css | 39 + .../ckeditor.drupalimagecaption.css | 21 + core/themes/stable/css/color/color.admin.css | 150 ++ .../config_translation.admin.css | 24 + .../content_translation.admin.css | 33 + .../css/contextual/contextual.icons.theme.css | 39 + .../css/contextual/contextual.module.css | 18 + .../css/contextual/contextual.theme.css | 112 + .../css/contextual/contextual.toolbar.css | 24 + .../stable/css/core/dropbutton/dropbutton.css | 164 ++ core/themes/stable/css/core/print.css | 25 + core/themes/stable/css/core/vertical-tabs.css | 69 + core/themes/stable/css/dblog/dblog.module.css | 37 + .../stable/css/field_ui/field_ui.admin.css | 53 + core/themes/stable/css/file/file.admin.css | 18 + .../themes/stable/css/filter/filter.admin.css | 81 + .../stable/css/filter/filter.caption.css | 30 + core/themes/stable/css/image/image.admin.css | 74 + .../stable/css/language/language.admin.css | 11 + .../themes/stable/css/locale/locale.admin.css | 135 ++ .../stable/css/menu_ui/menu_ui.admin.css | 6 + core/themes/stable/css/node/node.admin.css | 11 + core/themes/stable/css/node/node.module.css | 76 + core/themes/stable/css/node/node.preview.css | 22 + .../css/quickedit/quickedit.icons.theme.css | 74 + .../stable/css/quickedit/quickedit.module.css | 123 + .../stable/css/quickedit/quickedit.theme.css | 254 ++ .../css/shortcut/shortcut.icons.theme.css | 40 + .../stable/css/shortcut/shortcut.theme.css | 62 + .../css/simpletest/simpletest.module.css | 93 + .../components/ajax-progress.module.css | 49 + .../css/system/components/align.module.css | 32 + .../autocomplete-loading.module.css | 22 + .../css/system/components/clearfix.module.css | 15 + .../components/container-inline.module.css | 13 + .../css/system/components/details.module.css | 10 + .../system/components/fieldgroup.module.css | 9 + .../css/system/components/hidden.module.css | 53 + .../system/components/item-list.module.css | 19 + .../css/system/components/js.module.css | 22 + .../css/system/components/nowrap.module.css | 8 + .../components/position-container.module.css | 8 + .../css/system/components/progress.module.css | 51 + .../components/reset-appearance.module.css | 15 + .../css/system/components/resize.module.css | 21 + .../components/sticky-header.module.css | 13 + .../system/components/tabledrag.module.css | 88 + .../system/components/tablesort.module.css | 19 + .../system/components/tree-child.module.css | 18 + .../themes/stable/css/system/system.admin.css | 389 +++ core/themes/stable/css/system/system.diff.css | 42 + .../stable/css/system/system.maintenance.css | 56 + .../stable/css/taxonomy/taxonomy.theme.css | 10 + .../css/toolbar/toolbar.icons.theme.css | 300 +++ .../stable/css/toolbar/toolbar.menu.css | 103 + .../stable/css/toolbar/toolbar.module.css | 260 ++ .../stable/css/toolbar/toolbar.theme.css | 168 ++ core/themes/stable/css/tour/tour.module.css | 142 ++ .../stable/css/update/update.admin.theme.css | 63 + core/themes/stable/css/user/user.admin.css | 22 + .../stable/css/user/user.icons.admin.css | 15 + core/themes/stable/css/user/user.module.css | 21 + core/themes/stable/css/views/views.module.css | 19 + .../stable/css/views_ui/views_ui.admin.css | 208 ++ .../css/views_ui/views_ui.admin.theme.css | 838 +++++++ .../css/views_ui/views_ui.contextual.css | 57 + core/themes/stable/images/color/hook-rtl.png | Bin 0 -> 116 bytes core/themes/stable/images/color/hook.png | Bin 0 -> 116 bytes core/themes/stable/images/color/lock.png | Bin 0 -> 230 bytes core/themes/stable/images/core/druplicon.png | Bin 0 -> 3905 bytes core/themes/stable/images/core/feed.svg | 8 + core/themes/stable/images/core/help.png | Bin 0 -> 294 bytes .../images/core/icons/000000/barchart.svg | 1 + .../images/core/icons/000000/chevron-left.svg | 1 + .../core/icons/000000/chevron-right.svg | 2 + .../stable/images/core/icons/000000/ex.svg | 1 + .../stable/images/core/icons/000000/file.svg | 1 + .../stable/images/core/icons/000000/move.svg | 1 + .../images/core/icons/000000/orgchart.svg | 1 + .../images/core/icons/000000/paintbrush.svg | 1 + .../images/core/icons/000000/people.svg | 1 + .../images/core/icons/000000/puzzlepiece.svg | 1 + .../core/icons/000000/questionmark-disc.svg | 1 + .../images/core/icons/000000/wrench.svg | 1 + .../images/core/icons/004875/twistie-down.svg | 1 + .../images/core/icons/004875/twistie-up.svg | 1 + .../images/core/icons/0074bd/chevron-left.svg | 1 + .../core/icons/0074bd/chevron-right.svg | 1 + .../images/core/icons/008ee6/twistie-down.svg | 1 + .../images/core/icons/008ee6/twistie-up.svg | 1 + .../images/core/icons/333333/caret-down.svg | 1 + .../stable/images/core/icons/424242/loupe.svg | 1 + .../stable/images/core/icons/505050/loupe.svg | 1 + .../core/icons/5181c6/chevron-disc-down.svg | 1 + .../core/icons/5181c6/chevron-disc-up.svg | 1 + .../images/core/icons/5181c6/pencil.svg | 1 + .../images/core/icons/5181c6/twistie-down.svg | 1 + .../images/core/icons/5181c6/twistie-up.svg | 1 + .../stable/images/core/icons/73b355/check.svg | 1 + .../images/core/icons/787878/barchart.svg | 1 + .../core/icons/787878/chevron-disc-down.svg | 1 + .../core/icons/787878/chevron-disc-up.svg | 1 + .../stable/images/core/icons/787878/cog.svg | 1 + .../stable/images/core/icons/787878/ex.svg | 1 + .../stable/images/core/icons/787878/file.svg | 1 + .../stable/images/core/icons/787878/key.svg | 1 + .../stable/images/core/icons/787878/move.svg | 1 + .../images/core/icons/787878/orgchart.svg | 1 + .../images/core/icons/787878/paintbrush.svg | 1 + .../images/core/icons/787878/pencil.svg | 1 + .../images/core/icons/787878/people.svg | 1 + .../images/core/icons/787878/push-left.svg | 1 + .../images/core/icons/787878/push-right.svg | 1 + .../images/core/icons/787878/push-up.svg | 1 + .../images/core/icons/787878/puzzlepiece.svg | 1 + .../core/icons/787878/questionmark-disc.svg | 1 + .../images/core/icons/787878/twistie-down.svg | 1 + .../images/core/icons/787878/twistie-up.svg | 1 + .../images/core/icons/787878/wrench.svg | 1 + .../core/icons/bebebe/chevron-disc-left.svg | 1 + .../core/icons/bebebe/chevron-disc-right.svg | 1 + .../stable/images/core/icons/bebebe/cog.svg | 1 + .../stable/images/core/icons/bebebe/ex.svg | 1 + .../images/core/icons/bebebe/hamburger.svg | 1 + .../stable/images/core/icons/bebebe/house.svg | 1 + .../stable/images/core/icons/bebebe/key.svg | 1 + .../stable/images/core/icons/bebebe/move.svg | 1 + .../images/core/icons/bebebe/pencil.svg | 1 + .../images/core/icons/bebebe/person.svg | 1 + .../images/core/icons/bebebe/push-left.svg | 1 + .../images/core/icons/bebebe/push-right.svg | 1 + .../images/core/icons/bebebe/push-up.svg | 1 + .../core/icons/bebebe/questionmark-disc.svg | 1 + .../images/core/icons/bebebe/star-empty.svg | 1 + .../stable/images/core/icons/bebebe/star.svg | 1 + .../images/core/icons/e29700/warning.svg | 1 + .../stable/images/core/icons/e32700/error.svg | 1 + .../images/core/icons/ee0000/required.svg | 1 + .../stable/images/core/icons/ffffff/ex.svg | 1 + .../images/core/icons/ffffff/hamburger.svg | 1 + .../stable/images/core/icons/ffffff/house.svg | 1 + .../images/core/icons/ffffff/pencil.svg | 1 + .../images/core/icons/ffffff/person.svg | 1 + .../core/icons/ffffff/questionmark-disc.svg | 1 + .../images/core/icons/ffffff/star-empty.svg | 1 + .../stable/images/core/icons/ffffff/star.svg | 1 + .../images/core/icons/ffffff/twistie-down.svg | 1 + .../images/core/icons/ffffff/twistie-up.svg | 1 + .../stable/images/core/icons/license.md | 9 + .../stable/images/core/loading-small.gif | Bin 0 -> 2112 bytes core/themes/stable/images/core/loading.gif | Bin 0 -> 6733 bytes .../stable/images/core/menu-collapsed-rtl.png | Bin 0 -> 107 bytes .../stable/images/core/menu-collapsed.png | Bin 0 -> 105 bytes .../stable/images/core/menu-expanded.png | Bin 0 -> 106 bytes core/themes/stable/images/core/menu-leaf.png | Bin 0 -> 126 bytes .../stable/images/core/throbber-active.gif | Bin 0 -> 230 bytes .../stable/images/core/throbber-inactive.png | Bin 0 -> 356 bytes .../themes/stable/images/core/tree-bottom.png | Bin 0 -> 129 bytes core/themes/stable/images/core/tree.png | Bin 0 -> 130 bytes .../stable/images/quickedit/icon-throbber.gif | Bin 0 -> 1032 bytes .../stable/images/shortcut/favstar-rtl.svg | 19 + .../themes/stable/images/shortcut/favstar.svg | 1 + .../themes/stable/images/views_ui/sprites.png | Bin 0 -> 1777 bytes core/themes/stable/stable.info.yml | 230 +- .../admin/admin-block-content.html.twig | 32 + .../templates/admin/admin-block.html.twig | 24 + .../templates/admin/admin-page.html.twig | 25 + .../admin/authorize-report.html.twig | 21 + .../admin/block-content-add-list.html.twig | 22 + .../templates/admin/block-list.html.twig | 21 + .../admin/ckeditor-settings-toolbar.html.twig | 73 + .../admin/color-scheme-form.html.twig | 24 + ..._translation_manage_form_element.html.twig | 22 + .../templates/admin/field-ui-table.html.twig | 45 + .../templates/admin/image-anchor.html.twig | 12 + .../admin/image-crop-summary.html.twig | 30 + .../admin/image-resize-summary.html.twig | 28 + .../admin/image-rotate-summary.html.twig | 25 + .../admin/image-scale-summary.html.twig | 35 + .../admin/image-style-preview.html.twig | 55 + .../templates/admin/indentation.html.twig | 12 + .../language-content-settings-table.html.twig | 14 + ...guage-negotiation-configure-form.html.twig | 38 + .../locale-translation-last-check.html.twig | 23 + .../locale-translation-update-info.html.twig | 57 + .../admin/maintenance-task-list.html.twig | 23 + .../admin/simpletest-result-summary.html.twig | 20 + .../templates/admin/status-report.html.twig | 39 + .../admin/system-admin-index.html.twig | 25 + .../admin/system-config-form.html.twig | 15 + .../admin/system-modules-details.html.twig | 74 + .../admin/system-modules-uninstall.html.twig | 73 + .../admin/system-themes-page.html.twig | 74 + .../admin/tablesort-indicator.html.twig | 26 + .../admin/update-last-check.html.twig | 21 + .../admin/update-project-status.html.twig | 104 + .../templates/admin/update-report.html.twig | 23 + .../templates/admin/update-version.html.twig | 36 + ...views-ui-build-group-filter-form.html.twig | 55 + .../admin/views-ui-container.html.twig | 13 + .../views-ui-display-tab-bucket.html.twig | 33 + .../views-ui-display-tab-setting.html.twig | 35 + .../views-ui-expose-filter-form.html.twig | 65 + .../views-ui-rearrange-filter-form.html.twig | 25 + .../views-ui-style-plugin-table.html.twig | 16 + .../admin/views-ui-view-info.html.twig | 26 + .../views-ui-view-preview-section.html.twig | 18 + .../block--local-actions-block.html.twig | 12 + .../block--system-branding-block.html.twig | 26 + .../block/block--system-menu-block.html.twig | 48 + .../block--system-messages-block.html.twig | 13 + .../stable/templates/block/block.html.twig | 37 + .../content-edit/file-managed-file.html.twig | 21 + .../content-edit/file-upload-help.html.twig | 12 + .../file-widget-multiple.html.twig | 14 + .../content-edit/filter-caption.html.twig | 18 + .../content-edit/filter-guidelines.html.twig | 23 + .../content-edit/filter-tips.html.twig | 44 + .../content-edit/image-widget.html.twig | 17 + .../content-edit/node-add-list.html.twig | 30 + .../content-edit/node-edit-form.html.twig | 18 + .../text-format-wrapper.html.twig | 21 + .../content/aggregator-item.html.twig | 24 + .../content/book-node-export-html.html.twig | 20 + .../templates/content/comment.html.twig | 100 + .../stable/templates/content/mark.html.twig | 20 + .../stable/templates/content/node.html.twig | 90 + .../templates/content/page-title.html.twig | 21 + .../templates/content/search-result.html.twig | 69 + .../templates/content/taxonomy-term.html.twig | 33 + .../dataset/aggregator-feed.html.twig | 25 + .../templates/dataset/forum-icon.html.twig | 24 + .../templates/dataset/forum-list.html.twig | 75 + .../stable/templates/dataset/forums.html.twig | 21 + .../templates/dataset/item-list.html.twig | 39 + .../stable/templates/dataset/table.html.twig | 103 + .../templates/field/field--comment.html.twig | 43 + .../field/field--node--created.html.twig | 26 + .../field/field--node--title.html.twig | 26 + .../field/field--node--uid.html.twig | 26 + .../stable/templates/field/field.html.twig | 65 + .../templates/field/file-link.html.twig | 13 + .../templates/field/image-formatter.html.twig | 18 + .../templates/field/image-style.html.twig | 18 + .../stable/templates/field/image.html.twig | 13 + .../link-formatter-link-separate.html.twig | 18 + .../responsive-image-formatter.html.twig | 17 + .../field/responsive-image.html.twig | 34 + .../stable/templates/field/time.html.twig | 22 + .../templates/form/checkboxes.html.twig | 15 + .../templates/form/confirm-form.html.twig | 13 + .../stable/templates/form/container.html.twig | 26 + .../templates/form/datetime-form.html.twig | 15 + .../templates/form/datetime-wrapper.html.twig | 31 + .../stable/templates/form/details.html.twig | 31 + .../form/dropbutton-wrapper.html.twig | 21 + .../form/field-multiple-value-form.html.twig | 36 + .../stable/templates/form/fieldset.html.twig | 60 + .../form/form-element-label.html.twig | 25 + .../templates/form/form-element.html.twig | 94 + .../stable/templates/form/form.html.twig | 15 + .../stable/templates/form/input.html.twig | 13 + .../stable/templates/form/radios.html.twig | 13 + .../stable/templates/form/select.html.twig | 27 + .../stable/templates/form/textarea.html.twig | 18 + .../layout/book-export-html.html.twig | 45 + .../stable/templates/layout/html.html.twig | 43 + .../templates/layout/install-page.html.twig | 53 + .../layout/maintenance-page.html.twig | 58 + .../stable/templates/layout/page.html.twig | 93 + .../stable/templates/layout/region.html.twig | 19 + .../stable/templates/misc/feed-icon.html.twig | 15 + .../templates/misc/progress-bar.html.twig | 21 + .../templates/misc/rdf-metadata.html.twig | 20 + .../templates/misc/rdf-wrapper.html.twig | 11 + .../templates/misc/status-messages.html.twig | 47 + .../navigation/book-all-books-block.html.twig | 22 + .../navigation/book-navigation.html.twig | 55 + .../templates/navigation/book-tree.html.twig | 47 + .../templates/navigation/breadcrumb.html.twig | 25 + .../templates/navigation/links.html.twig | 56 + .../navigation/menu--toolbar.html.twig | 55 + .../navigation/menu-local-action.html.twig | 13 + .../navigation/menu-local-task.html.twig | 17 + .../navigation/menu-local-tasks.html.twig | 23 + .../templates/navigation/menu.html.twig | 47 + .../templates/navigation/pager.html.twig | 98 + .../templates/navigation/toolbar.html.twig | 46 + .../navigation/vertical-tabs.html.twig | 13 + .../templates/user/forum-submitted.html.twig | 21 + .../stable/templates/user/user.html.twig | 23 + .../stable/templates/user/username.html.twig | 23 + .../views/views-exposed-form.html.twig | 19 + .../views/views-mini-pager.html.twig | 41 + .../views/views-view-field.html.twig | 21 + .../views/views-view-fields.html.twig | 52 + .../templates/views/views-view-grid.html.twig | 76 + .../views/views-view-grouping.html.twig | 18 + .../templates/views/views-view-list.html.twig | 36 + .../views/views-view-mapping-test.html.twig | 12 + .../templates/views/views-view-opml.html.twig | 23 + .../views/views-view-row-opml.html.twig | 12 + .../views/views-view-row-rss.html.twig | 28 + .../templates/views/views-view-rss.html.twig | 28 + .../views-view-summary-unformatted.html.twig | 31 + .../views/views-view-summary.html.twig | 29 + .../views/views-view-table.html.twig | 124 + .../views/views-view-unformatted.html.twig | 30 + .../templates/views/views-view.html.twig | 66 + sites/default/default.settings.php | 17 +- sites/default/settings.php | 29 +- vendor/.htaccess | 3 +- vendor/composer/installed.json | 2142 ++++++++--------- vendor/symfony/browser-kit/Client.php | 43 +- vendor/symfony/browser-kit/Cookie.php | 26 - vendor/symfony/browser-kit/CookieJar.php | 10 - vendor/symfony/browser-kit/README.md | 2 +- vendor/symfony/browser-kit/Request.php | 18 - vendor/symfony/browser-kit/Response.php | 10 - vendor/symfony/browser-kit/composer.json | 3 +- .../symfony/class-loader/ApcClassLoader.php | 4 - .../class-loader/ApcUniversalClassLoader.php | 4 - .../class-loader/ClassCollectionLoader.php | 2 +- vendor/symfony/class-loader/ClassLoader.php | 14 +- .../symfony/class-loader/DebugClassLoader.php | 4 - .../class-loader/UniversalClassLoader.php | 16 - .../class-loader/XcacheClassLoader.php | 4 - vendor/symfony/class-loader/composer.json | 1 - vendor/symfony/console/Application.php | 40 - vendor/symfony/console/Command/Command.php | 49 +- .../Descriptor/ApplicationDescription.php | 8 +- .../console/Formatter/OutputFormatter.php | 16 - .../Formatter/OutputFormatterInterface.php | 14 - .../Formatter/OutputFormatterStyle.php | 10 - .../OutputFormatterStyleInterface.php | 8 - .../console/Helper/HelperInterface.php | 8 - vendor/symfony/console/Helper/ProgressBar.php | 44 +- vendor/symfony/console/Input/ArgvInput.php | 4 - vendor/symfony/console/Input/ArrayInput.php | 4 - vendor/symfony/console/Input/Input.php | 11 +- .../symfony/console/Input/InputArgument.php | 4 - .../symfony/console/Input/InputDefinition.php | 30 - vendor/symfony/console/Input/InputOption.php | 4 - vendor/symfony/console/Input/StringInput.php | 4 - .../symfony/console/Output/ConsoleOutput.php | 12 +- vendor/symfony/console/Output/NullOutput.php | 2 - vendor/symfony/console/Output/Output.php | 4 - .../console/Output/OutputInterface.php | 18 - .../symfony/console/Output/StreamOutput.php | 8 +- vendor/symfony/console/Question/Question.php | 4 +- vendor/symfony/console/Style/SymfonyStyle.php | 2 +- vendor/symfony/console/composer.json | 1 - vendor/symfony/css-selector/CssSelector.php | 4 - vendor/symfony/css-selector/composer.json | 3 - vendor/symfony/debug/DebugClassLoader.php | 4 - vendor/symfony/debug/composer.json | 1 - vendor/symfony/dependency-injection/Alias.php | 11 - .../Compiler/CheckReferenceValidityPass.php | 1 - .../Compiler/Compiler.php | 10 - .../Compiler/CompilerPassInterface.php | 4 - .../Compiler/ExtensionCompilerPass.php | 9 + .../Compiler/PassConfig.php | 30 - .../dependency-injection/Container.php | 32 - .../dependency-injection/ContainerAware.php | 6 - .../ContainerAwareInterface.php | 4 - .../dependency-injection/ContainerBuilder.php | 80 +- .../ContainerInterface.php | 24 - .../dependency-injection/Definition.php | 89 - .../DefinitionDecorator.php | 27 - .../dependency-injection/Dumper/Dumper.php | 4 - .../Dumper/DumperInterface.php | 4 - .../dependency-injection/Dumper/PhpDumper.php | 6 - .../dependency-injection/Dumper/XmlDumper.php | 4 - .../Dumper/YamlDumper.php | 10 +- .../Extension/ExtensionInterface.php | 10 - .../dependency-injection/Parameter.php | 2 - .../ParameterBag/FrozenParameterBag.php | 12 - .../ParameterBag/ParameterBag.php | 18 - .../ParameterBag/ParameterBagInterface.php | 14 - .../dependency-injection/Reference.php | 2 - vendor/symfony/dependency-injection/Scope.php | 11 - .../dependency-injection/ScopeInterface.php | 8 - .../TaggedContainerInterface.php | 4 - .../dependency-injection/composer.json | 1 - vendor/symfony/dom-crawler/Crawler.php | 111 +- .../dom-crawler/Field/ChoiceFormField.php | 8 - .../dom-crawler/Field/FileFormField.php | 4 - .../symfony/dom-crawler/Field/FormField.php | 2 - .../dom-crawler/Field/InputFormField.php | 2 - .../dom-crawler/Field/TextareaFormField.php | 2 - vendor/symfony/dom-crawler/Form.php | 28 - vendor/symfony/dom-crawler/Link.php | 8 - vendor/symfony/dom-crawler/composer.json | 1 - vendor/symfony/event-dispatcher/Event.php | 14 - .../event-dispatcher/EventDispatcher.php | 2 - .../EventDispatcherInterface.php | 8 - .../EventSubscriberInterface.php | 4 - vendor/symfony/event-dispatcher/composer.json | 1 - vendor/symfony/http-foundation/Cookie.php | 20 - vendor/symfony/http-foundation/File/File.php | 10 - .../http-foundation/File/UploadedFile.php | 16 - vendor/symfony/http-foundation/FileBag.php | 10 - vendor/symfony/http-foundation/HeaderBag.php | 24 - vendor/symfony/http-foundation/IpUtils.php | 13 +- .../symfony/http-foundation/ParameterBag.php | 28 - .../http-foundation/RedirectResponse.php | 4 - vendor/symfony/http-foundation/Request.php | 102 +- .../http-foundation/RequestMatcher.php | 4 - .../RequestMatcherInterface.php | 4 - vendor/symfony/http-foundation/Response.php | 100 +- .../http-foundation/ResponseHeaderBag.php | 18 - .../http-foundation/Session/Session.php | 2 - .../Session/SessionInterface.php | 26 - .../Storage/Handler/NullSessionHandler.php | 2 - .../Session/Storage/NativeSessionStorage.php | 12 +- .../Storage/SessionStorageInterface.php | 14 - .../http-foundation/StreamedResponse.php | 4 - vendor/symfony/http-foundation/composer.json | 1 - vendor/symfony/http-kernel/Bundle/Bundle.php | 12 - .../http-kernel/Bundle/BundleInterface.php | 18 - vendor/symfony/http-kernel/Client.php | 2 - .../Controller/ControllerResolver.php | 8 +- .../ControllerResolverInterface.php | 6 - .../DataCollector/DataCollectorInterface.php | 6 - .../DataCollector/DumpDataCollector.php | 1 + .../ConfigurableExtension.php | 8 +- .../Event/FilterControllerEvent.php | 8 - .../http-kernel/Event/FilterResponseEvent.php | 6 - .../http-kernel/Event/GetResponseEvent.php | 8 - .../GetResponseForControllerResultEvent.php | 6 - .../Event/GetResponseForExceptionEvent.php | 6 - .../symfony/http-kernel/Event/KernelEvent.php | 10 - vendor/symfony/http-kernel/HttpCache/Esi.php | 1 - .../http-kernel/HttpCache/HttpCache.php | 8 +- vendor/symfony/http-kernel/HttpCache/Ssi.php | 1 - vendor/symfony/http-kernel/HttpKernel.php | 8 - .../http-kernel/HttpKernelInterface.php | 4 - vendor/symfony/http-kernel/Kernel.php | 42 +- vendor/symfony/http-kernel/KernelEvents.php | 12 - .../symfony/http-kernel/KernelInterface.php | 36 - .../http-kernel/Log/LoggerInterface.php | 10 - vendor/symfony/http-kernel/Log/NullLogger.php | 14 - .../http-kernel/TerminableInterface.php | 4 - vendor/symfony/http-kernel/composer.json | 1 - vendor/symfony/process/ExecutableFinder.php | 3 +- vendor/symfony/process/PhpProcess.php | 18 +- vendor/symfony/process/Pipes/WindowsPipes.php | 7 +- vendor/symfony/process/Process.php | 28 +- vendor/symfony/process/README.md | 16 +- vendor/symfony/process/composer.json | 3 - .../routing/Exception/ExceptionInterface.php | 2 - .../Exception/InvalidParameterException.php | 2 - .../Exception/MethodNotAllowedException.php | 2 - .../MissingMandatoryParametersException.php | 2 - .../Exception/ResourceNotFoundException.php | 2 - .../Exception/RouteNotFoundException.php | 2 - .../Dumper/GeneratorDumperInterface.php | 2 - .../Generator/Dumper/PhpGeneratorDumper.php | 4 - .../routing/Generator/UrlGenerator.php | 4 - .../Generator/UrlGeneratorInterface.php | 4 - .../symfony/routing/Loader/ClosureLoader.php | 6 - .../symfony/routing/Loader/PhpFileLoader.php | 6 - .../symfony/routing/Loader/XmlFileLoader.php | 6 - .../symfony/routing/Loader/YamlFileLoader.php | 14 +- .../Matcher/Dumper/DumperCollection.php | 2 + .../Matcher/Dumper/DumperPrefixCollection.php | 2 + .../routing/Matcher/Dumper/DumperRoute.php | 2 + .../Matcher/RedirectableUrlMatcher.php | 2 - .../RedirectableUrlMatcherInterface.php | 4 - vendor/symfony/routing/Matcher/UrlMatcher.php | 4 - .../routing/Matcher/UrlMatcherInterface.php | 4 - vendor/symfony/routing/RequestContext.php | 20 - .../routing/RequestContextAwareInterface.php | 7 - vendor/symfony/routing/Route.php | 10 - vendor/symfony/routing/RouteCollection.php | 8 - vendor/symfony/routing/composer.json | 1 - .../Mapping/Loader/AnnotationLoader.php | 2 +- .../Normalizer/AbstractNormalizer.php | 2 +- vendor/symfony/serializer/composer.json | 1 - .../translation/DataCollectorTranslator.php | 4 - .../Exception/ExceptionInterface.php | 2 - .../Exception/InvalidResourceException.php | 2 - .../Exception/NotFoundResourceException.php | 2 - .../translation/IdentityTranslator.php | 12 - .../translation/Loader/ArrayLoader.php | 4 - .../translation/Loader/CsvFileLoader.php | 16 +- .../translation/Loader/LoaderInterface.php | 4 - .../translation/Loader/PhpFileLoader.php | 4 - .../translation/Loader/QtFileLoader.php | 4 - .../translation/Loader/XliffFileLoader.php | 4 - .../translation/Loader/YamlFileLoader.php | 4 - .../symfony/translation/LoggingTranslator.php | 4 - .../symfony/translation/MessageCatalogue.php | 30 - .../translation/MessageCatalogueInterface.php | 30 - .../symfony/translation/MessageSelector.php | 4 - .../translation/PluralizationRules.php | 4 +- vendor/symfony/translation/Translator.php | 22 - .../translation/TranslatorInterface.php | 10 - vendor/symfony/translation/composer.json | 1 - vendor/symfony/validator/Constraint.php | 14 - .../symfony/validator/ConstraintValidator.php | 2 - .../ConstraintValidatorInterface.php | 4 - .../ConstraintViolationInterface.php | 14 - .../ConstraintViolationListInterface.php | 14 - vendor/symfony/validator/Constraints/All.php | 2 - .../validator/Constraints/AllValidator.php | 2 - .../symfony/validator/Constraints/Blank.php | 2 - .../validator/Constraints/BlankValidator.php | 2 - .../validator/Constraints/Callback.php | 2 - .../Constraints/CallbackValidator.php | 2 - .../symfony/validator/Constraints/Choice.php | 2 - .../validator/Constraints/ChoiceValidator.php | 2 - .../validator/Constraints/Collection.php | 2 - .../Constraints/CollectionValidator.php | 2 - .../symfony/validator/Constraints/Count.php | 2 - .../symfony/validator/Constraints/Country.php | 2 - .../Constraints/CountryValidator.php | 2 - .../validator/Constraints/Currency.php | 2 - .../Constraints/CurrencyValidator.php | 2 - vendor/symfony/validator/Constraints/Date.php | 2 - .../validator/Constraints/DateTime.php | 2 - .../Constraints/DateTimeValidator.php | 2 - .../validator/Constraints/DateValidator.php | 2 - .../symfony/validator/Constraints/Email.php | 2 - .../validator/Constraints/EmailValidator.php | 2 - vendor/symfony/validator/Constraints/File.php | 2 - .../validator/Constraints/FileValidator.php | 2 - .../validator/Constraints/GroupSequence.php | 2 - .../symfony/validator/Constraints/Image.php | 2 - vendor/symfony/validator/Constraints/Ip.php | 2 - .../validator/Constraints/IpValidator.php | 2 - .../symfony/validator/Constraints/IsFalse.php | 2 - .../Constraints/IsFalseValidator.php | 2 - .../symfony/validator/Constraints/IsNull.php | 2 - .../validator/Constraints/IsNullValidator.php | 2 - .../symfony/validator/Constraints/IsTrue.php | 2 - .../validator/Constraints/IsTrueValidator.php | 2 - .../validator/Constraints/Language.php | 2 - .../Constraints/LanguageValidator.php | 2 - .../symfony/validator/Constraints/Length.php | 2 - .../symfony/validator/Constraints/Locale.php | 2 - .../validator/Constraints/LocaleValidator.php | 2 - .../validator/Constraints/NotBlank.php | 2 - .../Constraints/NotBlankValidator.php | 2 - .../symfony/validator/Constraints/NotNull.php | 2 - .../Constraints/NotNullValidator.php | 2 - .../symfony/validator/Constraints/Range.php | 2 - .../symfony/validator/Constraints/Regex.php | 2 - .../validator/Constraints/RegexValidator.php | 2 - vendor/symfony/validator/Constraints/Time.php | 2 - .../validator/Constraints/TimeValidator.php | 2 - vendor/symfony/validator/Constraints/Type.php | 2 - .../validator/Constraints/TypeValidator.php | 2 - vendor/symfony/validator/Constraints/Url.php | 2 - .../validator/Constraints/UrlValidator.php | 10 +- .../symfony/validator/Constraints/Valid.php | 2 - .../validator/ExecutionContextInterface.php | 8 - .../validator/ObjectInitializerInterface.php | 4 - .../Resources/translations/validators.de.xlf | 2 +- .../Resources/translations/validators.it.xlf | 12 + .../RecursiveContextualValidator.php | 10 + .../symfony/validator/ValidatorInterface.php | 12 - vendor/symfony/validator/composer.json | 2 +- .../symfony/yaml/Exception/DumpException.php | 2 - .../yaml/Exception/ExceptionInterface.php | 2 - .../symfony/yaml/Exception/ParseException.php | 2 - .../yaml/Exception/RuntimeException.php | 2 - vendor/symfony/yaml/Inline.php | 4 +- vendor/symfony/yaml/Parser.php | 40 +- vendor/symfony/yaml/Yaml.php | 6 - vendor/symfony/yaml/composer.json | 3 - vendor/twig/twig/CHANGELOG | 21 + vendor/twig/twig/composer.json | 2 +- .../twig/twig/lib/Twig/Cache/Filesystem.php | 6 +- vendor/twig/twig/lib/Twig/Environment.php | 81 +- vendor/twig/twig/lib/Twig/Error.php | 22 + vendor/twig/twig/lib/Twig/Error/Syntax.php | 33 + .../twig/twig/lib/Twig/ExpressionParser.php | 36 +- vendor/twig/twig/lib/Twig/Extension.php | 34 +- vendor/twig/twig/lib/Twig/Extension/Core.php | 52 +- vendor/twig/twig/lib/Twig/Extension/Debug.php | 10 - .../twig/twig/lib/Twig/Extension/Escaper.php | 20 - .../lib/Twig/Extension/GlobalsInterface.php | 22 + .../Twig/Extension/InitRuntimeInterface.php | 22 + .../twig/lib/Twig/Extension/Optimizer.php | 6 - .../twig/twig/lib/Twig/Extension/Profiler.php | 6 - .../twig/twig/lib/Twig/Extension/Sandbox.php | 15 - .../twig/twig/lib/Twig/Extension/Staging.php | 21 - .../twig/lib/Twig/Extension/StringLoader.php | 6 - .../twig/twig/lib/Twig/ExtensionInterface.php | 12 +- vendor/twig/twig/lib/Twig/Lexer.php | 16 +- vendor/twig/twig/lib/Twig/Node.php | 2 +- vendor/twig/twig/lib/Twig/Node/AutoEscape.php | 5 - vendor/twig/twig/lib/Twig/Node/Block.php | 5 - .../twig/lib/Twig/Node/BlockReference.php | 5 - vendor/twig/twig/lib/Twig/Node/Do.php | 5 - .../twig/lib/Twig/Node/Expression/Array.php | 5 - .../lib/Twig/Node/Expression/AssignName.php | 5 - .../twig/lib/Twig/Node/Expression/Binary.php | 5 - .../Twig/Node/Expression/Binary/FloorDiv.php | 5 - .../lib/Twig/Node/Expression/Binary/In.php | 5 - .../lib/Twig/Node/Expression/Binary/NotIn.php | 5 - .../lib/Twig/Node/Expression/Binary/Power.php | 5 - .../lib/Twig/Node/Expression/Binary/Range.php | 5 - .../Twig/Node/Expression/BlockReference.php | 5 - .../Node/Expression/ExtensionReference.php | 5 - .../twig/lib/Twig/Node/Expression/Parent.php | 5 - .../lib/Twig/Node/Expression/Test/Defined.php | 2 +- vendor/twig/twig/lib/Twig/Node/Flush.php | 5 - vendor/twig/twig/lib/Twig/Node/For.php | 5 - vendor/twig/twig/lib/Twig/Node/ForLoop.php | 5 - vendor/twig/twig/lib/Twig/Node/If.php | 5 - vendor/twig/twig/lib/Twig/Node/Import.php | 5 - vendor/twig/twig/lib/Twig/Node/Include.php | 5 - vendor/twig/twig/lib/Twig/Node/Macro.php | 7 +- vendor/twig/twig/lib/Twig/Node/Module.php | 5 - vendor/twig/twig/lib/Twig/Node/Print.php | 5 - vendor/twig/twig/lib/Twig/Node/Sandbox.php | 5 - .../twig/lib/Twig/Node/SandboxedPrint.php | 10 - vendor/twig/twig/lib/Twig/Node/Set.php | 5 - vendor/twig/twig/lib/Twig/Node/Spaceless.php | 5 - vendor/twig/twig/lib/Twig/Node/Text.php | 5 - vendor/twig/twig/lib/Twig/Parser.php | 27 +- .../lib/Twig/Test/IntegrationTestCase.php | 8 +- .../twig/twig/lib/Twig/Test/NodeTestCase.php | 12 +- .../twig/lib/Twig/TokenParser/AutoEscape.php | 14 +- .../twig/twig/lib/Twig/TokenParser/Block.php | 16 +- vendor/twig/twig/lib/Twig/TokenParser/Do.php | 12 - .../twig/twig/lib/Twig/TokenParser/Embed.php | 12 - .../twig/lib/Twig/TokenParser/Extends.php | 16 +- .../twig/twig/lib/Twig/TokenParser/Filter.php | 12 - .../twig/twig/lib/Twig/TokenParser/Flush.php | 12 - vendor/twig/twig/lib/Twig/TokenParser/For.php | 16 +- .../twig/twig/lib/Twig/TokenParser/From.php | 14 +- vendor/twig/twig/lib/Twig/TokenParser/If.php | 14 +- .../twig/twig/lib/Twig/TokenParser/Import.php | 12 - .../twig/lib/Twig/TokenParser/Include.php | 12 - .../twig/twig/lib/Twig/TokenParser/Macro.php | 14 +- .../twig/lib/Twig/TokenParser/Sandbox.php | 14 +- vendor/twig/twig/lib/Twig/TokenParser/Set.php | 12 - .../twig/lib/Twig/TokenParser/Spaceless.php | 12 - vendor/twig/twig/lib/Twig/TokenParser/Use.php | 12 - .../twig/twig/lib/Twig/TokenParserBroker.php | 9 +- vendor/twig/twig/lib/Twig/TokenStream.php | 6 +- .../composer-merge-plugin/.arcconfig | 6 + .../wikimedia/composer-merge-plugin/.arclint | 13 + .../wikimedia/composer-merge-plugin/README.md | 126 +- .../composer-merge-plugin/composer.json | 3 +- .../composer-merge-plugin/src/Logger.php | 56 +- .../src/Merge/ExtraPackage.php | 342 +-- .../src/Merge/MissingFileException.php | 18 + .../src/Merge/PluginState.php | 55 +- .../src/Merge/StabilityFlags.php | 181 ++ .../composer-merge-plugin/src/MergePlugin.php | 80 +- 929 files changed, 19798 insertions(+), 5304 deletions(-) create mode 100644 core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionWithAutocreateInterface.php delete mode 100644 core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php create mode 100644 core/lib/Drupal/Core/Routing/Enhancer/FormRouteEnhancer.php create mode 100644 core/lib/Drupal/Core/Theme/MissingThemeDependencyException.php create mode 100644 core/modules/aggregator/src/Tests/Migrate/MigrateAggregatorStubTest.php create mode 100644 core/modules/block_content/src/Tests/Migrate/MigrateBlockContentStubTest.php create mode 100644 core/modules/comment/src/Tests/Migrate/MigrateCommentStubTest.php create mode 100644 core/modules/file/src/Plugin/Validation/Constraint/FileValidationConstraint.php create mode 100644 core/modules/file/src/Plugin/Validation/Constraint/FileValidationConstraintValidator.php create mode 100644 core/modules/file/src/Tests/Migrate/MigrateFileStubTest.php delete mode 100644 core/modules/file/templates/file-widget.html.twig create mode 100644 core/modules/file/tests/src/Kernel/FileItemValidationTest.php create mode 100644 core/modules/language/language.install create mode 100644 core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationContentEntity.php create mode 100644 core/modules/language/src/Tests/LanguageNegotiationContentEntityTest.php create mode 100644 core/modules/menu_link_content/src/Tests/Migrate/MigrateMenuLinkContentStubTest.php create mode 100644 core/modules/migrate/tests/src/Unit/Plugin/migrate/destination/EntityContentBaseTest.php create mode 100644 core/modules/migrate_drupal/src/Tests/StubTestTrait.php create mode 100644 core/modules/node/src/Tests/Migrate/MigrateNodeStubTest.php create mode 100644 core/modules/node/src/Tests/NodeAccessAutoBubblingTest.php create mode 100644 core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.info.yml create mode 100644 core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.routing.yml create mode 100644 core/modules/node/tests/node_access_test_auto_bubbling/src/Controller/NodeAccessTestAutoBubblingController.php create mode 100644 core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_exposed_filter.yml create mode 100644 core/modules/shortcut/src/Tests/Migrate/MigrateShortcutStubTest.php create mode 100644 core/modules/system/src/Tests/Theme/StableLibraryOverrideTest.php create mode 100644 core/modules/system/tests/fixtures/update/drupal-8-rc1.bare.standard.php.gz create mode 100644 core/modules/system/tests/fixtures/update/drupal-8-rc1.filled.standard.php.gz delete mode 100644 core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyTerm.php create mode 100644 core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php rename core/modules/update/migration_templates/{d6_update_settings.yml => update_settings.yml} (94%) create mode 100644 core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php create mode 100644 core/modules/user/src/Tests/Migrate/MigrateUserStubTest.php create mode 100644 core/modules/views/src/Tests/Plugin/StyleSummaryTest.php create mode 100644 core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml delete mode 100644 core/profiles/standard/config/install/block.block.classy_page_title.yml create mode 100644 core/tests/Drupal/KernelTests/Core/Cache/CacheCollectorTest.php create mode 100644 core/tests/Drupal/KernelTests/Core/Path/AliasStorageTest.php create mode 100644 core/tests/Drupal/KernelTests/Core/Theme/MaintenanceThemeTest.php create mode 100644 core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php create mode 100644 core/tests/Drupal/KernelTests/RequestProcessing/RedirectOnExceptionTest.php create mode 100644 core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php create mode 100644 core/tests/Drupal/Tests/Core/Datetime/DateHelperTest.php create mode 100644 core/tests/Drupal/Tests/Core/Entity/Routing/DefaultHtmlRouteProviderTest.php delete mode 100644 core/themes/classy/templates/content-edit/file-widget.html.twig create mode 100644 core/themes/stable/css/block/block.admin.css create mode 100644 core/themes/stable/css/ckeditor/ckeditor-iframe.css create mode 100644 core/themes/stable/css/ckeditor/ckeditor.admin.css create mode 100644 core/themes/stable/css/ckeditor/ckeditor.css create mode 100644 core/themes/stable/css/ckeditor/plugins/drupalimagecaption/ckeditor.drupalimagecaption.css create mode 100644 core/themes/stable/css/color/color.admin.css create mode 100644 core/themes/stable/css/config_translation/config_translation.admin.css create mode 100644 core/themes/stable/css/content_translation/content_translation.admin.css create mode 100644 core/themes/stable/css/contextual/contextual.icons.theme.css create mode 100644 core/themes/stable/css/contextual/contextual.module.css create mode 100644 core/themes/stable/css/contextual/contextual.theme.css create mode 100644 core/themes/stable/css/contextual/contextual.toolbar.css create mode 100644 core/themes/stable/css/core/dropbutton/dropbutton.css create mode 100644 core/themes/stable/css/core/print.css create mode 100644 core/themes/stable/css/core/vertical-tabs.css create mode 100644 core/themes/stable/css/dblog/dblog.module.css create mode 100644 core/themes/stable/css/field_ui/field_ui.admin.css create mode 100644 core/themes/stable/css/file/file.admin.css create mode 100644 core/themes/stable/css/filter/filter.admin.css create mode 100644 core/themes/stable/css/filter/filter.caption.css create mode 100644 core/themes/stable/css/image/image.admin.css create mode 100644 core/themes/stable/css/language/language.admin.css create mode 100644 core/themes/stable/css/locale/locale.admin.css create mode 100644 core/themes/stable/css/menu_ui/menu_ui.admin.css create mode 100644 core/themes/stable/css/node/node.admin.css create mode 100644 core/themes/stable/css/node/node.module.css create mode 100644 core/themes/stable/css/node/node.preview.css create mode 100644 core/themes/stable/css/quickedit/quickedit.icons.theme.css create mode 100644 core/themes/stable/css/quickedit/quickedit.module.css create mode 100644 core/themes/stable/css/quickedit/quickedit.theme.css create mode 100644 core/themes/stable/css/shortcut/shortcut.icons.theme.css create mode 100644 core/themes/stable/css/shortcut/shortcut.theme.css create mode 100644 core/themes/stable/css/simpletest/simpletest.module.css create mode 100644 core/themes/stable/css/system/components/ajax-progress.module.css create mode 100644 core/themes/stable/css/system/components/align.module.css create mode 100644 core/themes/stable/css/system/components/autocomplete-loading.module.css create mode 100644 core/themes/stable/css/system/components/clearfix.module.css create mode 100644 core/themes/stable/css/system/components/container-inline.module.css create mode 100644 core/themes/stable/css/system/components/details.module.css create mode 100644 core/themes/stable/css/system/components/fieldgroup.module.css create mode 100644 core/themes/stable/css/system/components/hidden.module.css create mode 100644 core/themes/stable/css/system/components/item-list.module.css create mode 100644 core/themes/stable/css/system/components/js.module.css create mode 100644 core/themes/stable/css/system/components/nowrap.module.css create mode 100644 core/themes/stable/css/system/components/position-container.module.css create mode 100644 core/themes/stable/css/system/components/progress.module.css create mode 100644 core/themes/stable/css/system/components/reset-appearance.module.css create mode 100644 core/themes/stable/css/system/components/resize.module.css create mode 100644 core/themes/stable/css/system/components/sticky-header.module.css create mode 100644 core/themes/stable/css/system/components/tabledrag.module.css create mode 100644 core/themes/stable/css/system/components/tablesort.module.css create mode 100644 core/themes/stable/css/system/components/tree-child.module.css create mode 100644 core/themes/stable/css/system/system.admin.css create mode 100644 core/themes/stable/css/system/system.diff.css create mode 100644 core/themes/stable/css/system/system.maintenance.css create mode 100644 core/themes/stable/css/taxonomy/taxonomy.theme.css create mode 100644 core/themes/stable/css/toolbar/toolbar.icons.theme.css create mode 100644 core/themes/stable/css/toolbar/toolbar.menu.css create mode 100644 core/themes/stable/css/toolbar/toolbar.module.css create mode 100644 core/themes/stable/css/toolbar/toolbar.theme.css create mode 100644 core/themes/stable/css/tour/tour.module.css create mode 100644 core/themes/stable/css/update/update.admin.theme.css create mode 100644 core/themes/stable/css/user/user.admin.css create mode 100644 core/themes/stable/css/user/user.icons.admin.css create mode 100644 core/themes/stable/css/user/user.module.css create mode 100644 core/themes/stable/css/views/views.module.css create mode 100644 core/themes/stable/css/views_ui/views_ui.admin.css create mode 100644 core/themes/stable/css/views_ui/views_ui.admin.theme.css create mode 100644 core/themes/stable/css/views_ui/views_ui.contextual.css create mode 100644 core/themes/stable/images/color/hook-rtl.png create mode 100644 core/themes/stable/images/color/hook.png create mode 100644 core/themes/stable/images/color/lock.png create mode 100644 core/themes/stable/images/core/druplicon.png create mode 100644 core/themes/stable/images/core/feed.svg create mode 100644 core/themes/stable/images/core/help.png create mode 100644 core/themes/stable/images/core/icons/000000/barchart.svg create mode 100644 core/themes/stable/images/core/icons/000000/chevron-left.svg create mode 100644 core/themes/stable/images/core/icons/000000/chevron-right.svg create mode 100644 core/themes/stable/images/core/icons/000000/ex.svg create mode 100644 core/themes/stable/images/core/icons/000000/file.svg create mode 100644 core/themes/stable/images/core/icons/000000/move.svg create mode 100644 core/themes/stable/images/core/icons/000000/orgchart.svg create mode 100644 core/themes/stable/images/core/icons/000000/paintbrush.svg create mode 100644 core/themes/stable/images/core/icons/000000/people.svg create mode 100644 core/themes/stable/images/core/icons/000000/puzzlepiece.svg create mode 100644 core/themes/stable/images/core/icons/000000/questionmark-disc.svg create mode 100644 core/themes/stable/images/core/icons/000000/wrench.svg create mode 100644 core/themes/stable/images/core/icons/004875/twistie-down.svg create mode 100644 core/themes/stable/images/core/icons/004875/twistie-up.svg create mode 100644 core/themes/stable/images/core/icons/0074bd/chevron-left.svg create mode 100644 core/themes/stable/images/core/icons/0074bd/chevron-right.svg create mode 100644 core/themes/stable/images/core/icons/008ee6/twistie-down.svg create mode 100644 core/themes/stable/images/core/icons/008ee6/twistie-up.svg create mode 100644 core/themes/stable/images/core/icons/333333/caret-down.svg create mode 100644 core/themes/stable/images/core/icons/424242/loupe.svg create mode 100644 core/themes/stable/images/core/icons/505050/loupe.svg create mode 100644 core/themes/stable/images/core/icons/5181c6/chevron-disc-down.svg create mode 100644 core/themes/stable/images/core/icons/5181c6/chevron-disc-up.svg create mode 100644 core/themes/stable/images/core/icons/5181c6/pencil.svg create mode 100644 core/themes/stable/images/core/icons/5181c6/twistie-down.svg create mode 100644 core/themes/stable/images/core/icons/5181c6/twistie-up.svg create mode 100644 core/themes/stable/images/core/icons/73b355/check.svg create mode 100644 core/themes/stable/images/core/icons/787878/barchart.svg create mode 100644 core/themes/stable/images/core/icons/787878/chevron-disc-down.svg create mode 100644 core/themes/stable/images/core/icons/787878/chevron-disc-up.svg create mode 100644 core/themes/stable/images/core/icons/787878/cog.svg create mode 100644 core/themes/stable/images/core/icons/787878/ex.svg create mode 100644 core/themes/stable/images/core/icons/787878/file.svg create mode 100644 core/themes/stable/images/core/icons/787878/key.svg create mode 100644 core/themes/stable/images/core/icons/787878/move.svg create mode 100644 core/themes/stable/images/core/icons/787878/orgchart.svg create mode 100644 core/themes/stable/images/core/icons/787878/paintbrush.svg create mode 100644 core/themes/stable/images/core/icons/787878/pencil.svg create mode 100644 core/themes/stable/images/core/icons/787878/people.svg create mode 100644 core/themes/stable/images/core/icons/787878/push-left.svg create mode 100644 core/themes/stable/images/core/icons/787878/push-right.svg create mode 100644 core/themes/stable/images/core/icons/787878/push-up.svg create mode 100644 core/themes/stable/images/core/icons/787878/puzzlepiece.svg create mode 100644 core/themes/stable/images/core/icons/787878/questionmark-disc.svg create mode 100644 core/themes/stable/images/core/icons/787878/twistie-down.svg create mode 100644 core/themes/stable/images/core/icons/787878/twistie-up.svg create mode 100644 core/themes/stable/images/core/icons/787878/wrench.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/chevron-disc-left.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/chevron-disc-right.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/cog.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/ex.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/hamburger.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/house.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/key.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/move.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/pencil.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/person.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/push-left.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/push-right.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/push-up.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/questionmark-disc.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/star-empty.svg create mode 100644 core/themes/stable/images/core/icons/bebebe/star.svg create mode 100644 core/themes/stable/images/core/icons/e29700/warning.svg create mode 100644 core/themes/stable/images/core/icons/e32700/error.svg create mode 100644 core/themes/stable/images/core/icons/ee0000/required.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/ex.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/hamburger.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/house.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/pencil.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/person.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/questionmark-disc.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/star-empty.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/star.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/twistie-down.svg create mode 100644 core/themes/stable/images/core/icons/ffffff/twistie-up.svg create mode 100644 core/themes/stable/images/core/icons/license.md create mode 100644 core/themes/stable/images/core/loading-small.gif create mode 100644 core/themes/stable/images/core/loading.gif create mode 100644 core/themes/stable/images/core/menu-collapsed-rtl.png create mode 100644 core/themes/stable/images/core/menu-collapsed.png create mode 100644 core/themes/stable/images/core/menu-expanded.png create mode 100644 core/themes/stable/images/core/menu-leaf.png create mode 100644 core/themes/stable/images/core/throbber-active.gif create mode 100644 core/themes/stable/images/core/throbber-inactive.png create mode 100644 core/themes/stable/images/core/tree-bottom.png create mode 100644 core/themes/stable/images/core/tree.png create mode 100644 core/themes/stable/images/quickedit/icon-throbber.gif create mode 100644 core/themes/stable/images/shortcut/favstar-rtl.svg create mode 100644 core/themes/stable/images/shortcut/favstar.svg create mode 100644 core/themes/stable/images/views_ui/sprites.png create mode 100644 core/themes/stable/templates/admin/admin-block-content.html.twig create mode 100644 core/themes/stable/templates/admin/admin-block.html.twig create mode 100644 core/themes/stable/templates/admin/admin-page.html.twig create mode 100644 core/themes/stable/templates/admin/authorize-report.html.twig create mode 100644 core/themes/stable/templates/admin/block-content-add-list.html.twig create mode 100644 core/themes/stable/templates/admin/block-list.html.twig create mode 100644 core/themes/stable/templates/admin/ckeditor-settings-toolbar.html.twig create mode 100644 core/themes/stable/templates/admin/color-scheme-form.html.twig create mode 100644 core/themes/stable/templates/admin/config_translation_manage_form_element.html.twig create mode 100644 core/themes/stable/templates/admin/field-ui-table.html.twig create mode 100644 core/themes/stable/templates/admin/image-anchor.html.twig create mode 100644 core/themes/stable/templates/admin/image-crop-summary.html.twig create mode 100644 core/themes/stable/templates/admin/image-resize-summary.html.twig create mode 100644 core/themes/stable/templates/admin/image-rotate-summary.html.twig create mode 100644 core/themes/stable/templates/admin/image-scale-summary.html.twig create mode 100644 core/themes/stable/templates/admin/image-style-preview.html.twig create mode 100644 core/themes/stable/templates/admin/indentation.html.twig create mode 100644 core/themes/stable/templates/admin/language-content-settings-table.html.twig create mode 100644 core/themes/stable/templates/admin/language-negotiation-configure-form.html.twig create mode 100644 core/themes/stable/templates/admin/locale-translation-last-check.html.twig create mode 100644 core/themes/stable/templates/admin/locale-translation-update-info.html.twig create mode 100644 core/themes/stable/templates/admin/maintenance-task-list.html.twig create mode 100644 core/themes/stable/templates/admin/simpletest-result-summary.html.twig create mode 100644 core/themes/stable/templates/admin/status-report.html.twig create mode 100644 core/themes/stable/templates/admin/system-admin-index.html.twig create mode 100644 core/themes/stable/templates/admin/system-config-form.html.twig create mode 100644 core/themes/stable/templates/admin/system-modules-details.html.twig create mode 100644 core/themes/stable/templates/admin/system-modules-uninstall.html.twig create mode 100644 core/themes/stable/templates/admin/system-themes-page.html.twig create mode 100644 core/themes/stable/templates/admin/tablesort-indicator.html.twig create mode 100644 core/themes/stable/templates/admin/update-last-check.html.twig create mode 100644 core/themes/stable/templates/admin/update-project-status.html.twig create mode 100644 core/themes/stable/templates/admin/update-report.html.twig create mode 100644 core/themes/stable/templates/admin/update-version.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-build-group-filter-form.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-container.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-display-tab-bucket.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-display-tab-setting.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-expose-filter-form.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-rearrange-filter-form.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-style-plugin-table.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-view-info.html.twig create mode 100644 core/themes/stable/templates/admin/views-ui-view-preview-section.html.twig create mode 100644 core/themes/stable/templates/block/block--local-actions-block.html.twig create mode 100644 core/themes/stable/templates/block/block--system-branding-block.html.twig create mode 100644 core/themes/stable/templates/block/block--system-menu-block.html.twig create mode 100644 core/themes/stable/templates/block/block--system-messages-block.html.twig create mode 100644 core/themes/stable/templates/block/block.html.twig create mode 100644 core/themes/stable/templates/content-edit/file-managed-file.html.twig create mode 100644 core/themes/stable/templates/content-edit/file-upload-help.html.twig create mode 100644 core/themes/stable/templates/content-edit/file-widget-multiple.html.twig create mode 100644 core/themes/stable/templates/content-edit/filter-caption.html.twig create mode 100644 core/themes/stable/templates/content-edit/filter-guidelines.html.twig create mode 100644 core/themes/stable/templates/content-edit/filter-tips.html.twig create mode 100644 core/themes/stable/templates/content-edit/image-widget.html.twig create mode 100644 core/themes/stable/templates/content-edit/node-add-list.html.twig create mode 100644 core/themes/stable/templates/content-edit/node-edit-form.html.twig create mode 100644 core/themes/stable/templates/content-edit/text-format-wrapper.html.twig create mode 100644 core/themes/stable/templates/content/aggregator-item.html.twig create mode 100644 core/themes/stable/templates/content/book-node-export-html.html.twig create mode 100644 core/themes/stable/templates/content/comment.html.twig create mode 100644 core/themes/stable/templates/content/mark.html.twig create mode 100644 core/themes/stable/templates/content/node.html.twig create mode 100644 core/themes/stable/templates/content/page-title.html.twig create mode 100644 core/themes/stable/templates/content/search-result.html.twig create mode 100644 core/themes/stable/templates/content/taxonomy-term.html.twig create mode 100644 core/themes/stable/templates/dataset/aggregator-feed.html.twig create mode 100644 core/themes/stable/templates/dataset/forum-icon.html.twig create mode 100644 core/themes/stable/templates/dataset/forum-list.html.twig create mode 100644 core/themes/stable/templates/dataset/forums.html.twig create mode 100644 core/themes/stable/templates/dataset/item-list.html.twig create mode 100644 core/themes/stable/templates/dataset/table.html.twig create mode 100644 core/themes/stable/templates/field/field--comment.html.twig create mode 100644 core/themes/stable/templates/field/field--node--created.html.twig create mode 100644 core/themes/stable/templates/field/field--node--title.html.twig create mode 100644 core/themes/stable/templates/field/field--node--uid.html.twig create mode 100644 core/themes/stable/templates/field/field.html.twig create mode 100644 core/themes/stable/templates/field/file-link.html.twig create mode 100644 core/themes/stable/templates/field/image-formatter.html.twig create mode 100644 core/themes/stable/templates/field/image-style.html.twig create mode 100644 core/themes/stable/templates/field/image.html.twig create mode 100644 core/themes/stable/templates/field/link-formatter-link-separate.html.twig create mode 100644 core/themes/stable/templates/field/responsive-image-formatter.html.twig create mode 100644 core/themes/stable/templates/field/responsive-image.html.twig create mode 100644 core/themes/stable/templates/field/time.html.twig create mode 100644 core/themes/stable/templates/form/checkboxes.html.twig create mode 100644 core/themes/stable/templates/form/confirm-form.html.twig create mode 100644 core/themes/stable/templates/form/container.html.twig create mode 100644 core/themes/stable/templates/form/datetime-form.html.twig create mode 100644 core/themes/stable/templates/form/datetime-wrapper.html.twig create mode 100644 core/themes/stable/templates/form/details.html.twig create mode 100644 core/themes/stable/templates/form/dropbutton-wrapper.html.twig create mode 100644 core/themes/stable/templates/form/field-multiple-value-form.html.twig create mode 100644 core/themes/stable/templates/form/fieldset.html.twig create mode 100644 core/themes/stable/templates/form/form-element-label.html.twig create mode 100644 core/themes/stable/templates/form/form-element.html.twig create mode 100644 core/themes/stable/templates/form/form.html.twig create mode 100644 core/themes/stable/templates/form/input.html.twig create mode 100644 core/themes/stable/templates/form/radios.html.twig create mode 100644 core/themes/stable/templates/form/select.html.twig create mode 100644 core/themes/stable/templates/form/textarea.html.twig create mode 100644 core/themes/stable/templates/layout/book-export-html.html.twig create mode 100644 core/themes/stable/templates/layout/html.html.twig create mode 100644 core/themes/stable/templates/layout/install-page.html.twig create mode 100644 core/themes/stable/templates/layout/maintenance-page.html.twig create mode 100644 core/themes/stable/templates/layout/page.html.twig create mode 100644 core/themes/stable/templates/layout/region.html.twig create mode 100644 core/themes/stable/templates/misc/feed-icon.html.twig create mode 100644 core/themes/stable/templates/misc/progress-bar.html.twig create mode 100644 core/themes/stable/templates/misc/rdf-metadata.html.twig create mode 100644 core/themes/stable/templates/misc/rdf-wrapper.html.twig create mode 100644 core/themes/stable/templates/misc/status-messages.html.twig create mode 100644 core/themes/stable/templates/navigation/book-all-books-block.html.twig create mode 100644 core/themes/stable/templates/navigation/book-navigation.html.twig create mode 100644 core/themes/stable/templates/navigation/book-tree.html.twig create mode 100644 core/themes/stable/templates/navigation/breadcrumb.html.twig create mode 100644 core/themes/stable/templates/navigation/links.html.twig create mode 100644 core/themes/stable/templates/navigation/menu--toolbar.html.twig create mode 100644 core/themes/stable/templates/navigation/menu-local-action.html.twig create mode 100644 core/themes/stable/templates/navigation/menu-local-task.html.twig create mode 100644 core/themes/stable/templates/navigation/menu-local-tasks.html.twig create mode 100644 core/themes/stable/templates/navigation/menu.html.twig create mode 100644 core/themes/stable/templates/navigation/pager.html.twig create mode 100644 core/themes/stable/templates/navigation/toolbar.html.twig create mode 100644 core/themes/stable/templates/navigation/vertical-tabs.html.twig create mode 100644 core/themes/stable/templates/user/forum-submitted.html.twig create mode 100644 core/themes/stable/templates/user/user.html.twig create mode 100644 core/themes/stable/templates/user/username.html.twig create mode 100644 core/themes/stable/templates/views/views-exposed-form.html.twig create mode 100644 core/themes/stable/templates/views/views-mini-pager.html.twig create mode 100644 core/themes/stable/templates/views/views-view-field.html.twig create mode 100644 core/themes/stable/templates/views/views-view-fields.html.twig create mode 100644 core/themes/stable/templates/views/views-view-grid.html.twig create mode 100644 core/themes/stable/templates/views/views-view-grouping.html.twig create mode 100644 core/themes/stable/templates/views/views-view-list.html.twig create mode 100644 core/themes/stable/templates/views/views-view-mapping-test.html.twig create mode 100644 core/themes/stable/templates/views/views-view-opml.html.twig create mode 100644 core/themes/stable/templates/views/views-view-row-opml.html.twig create mode 100644 core/themes/stable/templates/views/views-view-row-rss.html.twig create mode 100644 core/themes/stable/templates/views/views-view-rss.html.twig create mode 100644 core/themes/stable/templates/views/views-view-summary-unformatted.html.twig create mode 100644 core/themes/stable/templates/views/views-view-summary.html.twig create mode 100644 core/themes/stable/templates/views/views-view-table.html.twig create mode 100644 core/themes/stable/templates/views/views-view-unformatted.html.twig create mode 100644 core/themes/stable/templates/views/views-view.html.twig create mode 100644 vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php create mode 100644 vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php create mode 100644 vendor/wikimedia/composer-merge-plugin/.arcconfig create mode 100644 vendor/wikimedia/composer-merge-plugin/.arclint create mode 100644 vendor/wikimedia/composer-merge-plugin/src/Merge/MissingFileException.php create mode 100644 vendor/wikimedia/composer-merge-plugin/src/Merge/StabilityFlags.php diff --git a/.gitignore b/.gitignore index 25a11e1df..66de35ab4 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,7 @@ Thumbs.db # SASS # ########## .sass-cache + +# Things in the core directory that Drupal 8 commits in the repository. +!core/**/*.gz + diff --git a/.htaccess b/.htaccess index b26c63bb5..01c63af98 100644 --- a/.htaccess +++ b/.htaccess @@ -15,9 +15,6 @@ # Don't show directory listings for URLs which map to a directory. Options -Indexes -# Follow symbolic links in this directory. -Options +FollowSymLinks - # Set the default handler. DirectoryIndex index.php index.html index.htm diff --git a/composer.json b/composer.json index 04e1806ee..7f170ce71 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "license": "GPL-2.0+", "require": { "composer/installers": "^1.0.21", - "wikimedia/composer-merge-plugin": "^1.3.0" + "wikimedia/composer-merge-plugin": "~1.3" }, "replace": { "drupal/core": "~8.0" diff --git a/composer.lock b/composer.lock index 58be85866..32535367b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "2be29019515c847055593ea41b88475d", - "content-hash": "f38613812a285c03a1a18458384fe0b1", + "hash": "dac77f10c1f7585fd1f7344c6a376338", + "content-hash": "73cbcb262208c5d802cb528279f2a95c", "packages": [ { "name": "composer/installers", @@ -1107,24 +1107,23 @@ }, { "name": "symfony/class-loader", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "d957ea6295d7016e20d7eff33a6c1deef819c0d4" + "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/d957ea6295d7016e20d7eff33a6c1deef819c0d4", - "reference": "d957ea6295d7016e20d7eff33a6c1deef819c0d4", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/320f8d2a9cdbcbeb24be602c124aae9d998474a4", + "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "symfony/finder": "~2.0,>=2.0.5", - "symfony/phpunit-bridge": "~2.7" + "symfony/finder": "~2.0,>=2.0.5" }, "type": "library", "extra": { @@ -1153,20 +1152,20 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2015-08-26 17:56:37" + "time": "2015-10-23 14:47:27" }, { "name": "symfony/console", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "06cb17c013a82f94a3d840682b49425cd00a2161" + "reference": "5efd632294c8320ea52492db22292ff853a43766" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/06cb17c013a82f94a3d840682b49425cd00a2161", - "reference": "06cb17c013a82f94a3d840682b49425cd00a2161", + "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766", + "reference": "5efd632294c8320ea52492db22292ff853a43766", "shasum": "" }, "require": { @@ -1175,7 +1174,6 @@ "require-dev": { "psr/log": "~1.0", "symfony/event-dispatcher": "~2.1", - "symfony/phpunit-bridge": "~2.7", "symfony/process": "~2.1" }, "suggest": { @@ -1210,20 +1208,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-09-25 08:32:23" + "time": "2015-10-20 14:38:46" }, { "name": "symfony/debug", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "c79c361bca8e5ada6a47603875a3c964d03b67b1" + "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/c79c361bca8e5ada6a47603875a3c964d03b67b1", - "reference": "c79c361bca8e5ada6a47603875a3c964d03b67b1", + "url": "https://api.github.com/repos/symfony/debug/zipball/fb9e6887db716939f41af0ba8ef38a1582eb501b", + "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b", "shasum": "" }, "require": { @@ -1235,8 +1233,7 @@ }, "require-dev": { "symfony/class-loader": "~2.2", - "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2", - "symfony/phpunit-bridge": "~2.7" + "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2" }, "type": "library", "extra": { @@ -1265,20 +1262,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2015-09-14 08:41:38" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/dependency-injection", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "422c3819b110f610d79c6f1dc38af23787dc790e" + "reference": "af284e795ec8a08c80d1fc47518fd23004b89847" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/422c3819b110f610d79c6f1dc38af23787dc790e", - "reference": "422c3819b110f610d79c6f1dc38af23787dc790e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/af284e795ec8a08c80d1fc47518fd23004b89847", + "reference": "af284e795ec8a08c80d1fc47518fd23004b89847", "shasum": "" }, "require": { @@ -1290,7 +1287,6 @@ "require-dev": { "symfony/config": "~2.2", "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", "symfony/yaml": "~2.1" }, "suggest": { @@ -1325,20 +1321,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2015-09-15 08:30:42" + "time": "2015-10-27 15:38:06" }, { "name": "symfony/event-dispatcher", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9" + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae4dcc2a8d3de98bd794167a3ccda1311597c5d9", - "reference": "ae4dcc2a8d3de98bd794167a3ccda1311597c5d9", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8", + "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8", "shasum": "" }, "require": { @@ -1349,7 +1345,6 @@ "symfony/config": "~2.0,>=2.0.5", "symfony/dependency-injection": "~2.6", "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", "symfony/stopwatch": "~2.3" }, "suggest": { @@ -1383,28 +1378,27 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-09-22 13:49:29" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/http-foundation", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e1509119f164a0d0a940d7d924d693a7a28a5470" + "reference": "7598eea151ae3d4134df1f9957364b17809eea75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e1509119f164a0d0a940d7d924d693a7a28a5470", - "reference": "e1509119f164a0d0a940d7d924d693a7a28a5470", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7598eea151ae3d4134df1f9957364b17809eea75", + "reference": "7598eea151ae3d4134df1f9957364b17809eea75", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "symfony/expression-language": "~2.4", - "symfony/phpunit-bridge": "~2.7" + "symfony/expression-language": "~2.4" }, "type": "library", "extra": { @@ -1436,20 +1430,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2015-09-22 13:49:29" + "time": "2015-10-23 14:47:27" }, { "name": "symfony/http-kernel", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "353aa457424262d7d4e4289ea483145921cffcb5" + "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/353aa457424262d7d4e4289ea483145921cffcb5", - "reference": "353aa457424262d7d4e4289ea483145921cffcb5", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4260f2273a446a6715063dc9ca89fd0c475c2f77", + "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77", "shasum": "" }, "require": { @@ -1472,7 +1466,6 @@ "symfony/dom-crawler": "~2.0,>=2.0.5", "symfony/expression-language": "~2.4", "symfony/finder": "~2.0,>=2.0.5", - "symfony/phpunit-bridge": "~2.7", "symfony/process": "~2.0,>=2.0.5", "symfony/routing": "~2.2", "symfony/stopwatch": "~2.3", @@ -1516,28 +1509,25 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2015-09-25 11:16:52" + "time": "2015-10-27 19:07:21" }, { "name": "symfony/process", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9" + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b27c8e317922cd3cdd3600850273cf6b82b2e8e9", - "reference": "b27c8e317922cd3cdd3600850273cf6b82b2e8e9", + "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7", + "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "type": "library", "extra": { "branch-alias": { @@ -1565,7 +1555,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2015-09-19 19:59:23" + "time": "2015-10-23 14:47:27" }, { "name": "symfony/psr-http-message-bridge", @@ -1623,16 +1613,16 @@ }, { "name": "symfony/routing", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "6c5fae83efa20baf166fcf4582f57094e9f60f16" + "reference": "f353e1f588679c3ec987624e6c617646bd01ba38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/6c5fae83efa20baf166fcf4582f57094e9f60f16", - "reference": "6c5fae83efa20baf166fcf4582f57094e9f60f16", + "url": "https://api.github.com/repos/symfony/routing/zipball/f353e1f588679c3ec987624e6c617646bd01ba38", + "reference": "f353e1f588679c3ec987624e6c617646bd01ba38", "shasum": "" }, "require": { @@ -1648,7 +1638,6 @@ "symfony/config": "~2.7", "symfony/expression-language": "~2.4", "symfony/http-foundation": "~2.3", - "symfony/phpunit-bridge": "~2.7", "symfony/yaml": "~2.0,>=2.0.5" }, "suggest": { @@ -1690,20 +1679,20 @@ "uri", "url" ], - "time": "2015-09-14 14:14:09" + "time": "2015-10-27 15:38:06" }, { "name": "symfony/serializer", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "baf24f86a8656eea9c80988f332e51461bfcb67f" + "reference": "14056684acad23b8815eb336bccc0b4ac76bd823" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/baf24f86a8656eea9c80988f332e51461bfcb67f", - "reference": "baf24f86a8656eea9c80988f332e51461bfcb67f", + "url": "https://api.github.com/repos/symfony/serializer/zipball/14056684acad23b8815eb336bccc0b4ac76bd823", + "reference": "14056684acad23b8815eb336bccc0b4ac76bd823", "shasum": "" }, "require": { @@ -1713,7 +1702,6 @@ "doctrine/annotations": "~1.0", "doctrine/cache": "~1.0", "symfony/config": "~2.2", - "symfony/phpunit-bridge": "~2.7", "symfony/property-access": "~2.3", "symfony/yaml": "~2.0,>=2.0.5" }, @@ -1751,20 +1739,20 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2015-08-31 16:44:53" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/translation", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "485877661835e188cd78345c6d4eef1290d17571" + "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/485877661835e188cd78345c6d4eef1290d17571", - "reference": "485877661835e188cd78345c6d4eef1290d17571", + "url": "https://api.github.com/repos/symfony/translation/zipball/6ccd9289ec1c71d01a49d83480de3b5293ce30c8", + "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8", "shasum": "" }, "require": { @@ -1777,7 +1765,6 @@ "psr/log": "~1.0", "symfony/config": "~2.7", "symfony/intl": "~2.4", - "symfony/phpunit-bridge": "~2.7", "symfony/yaml": "~2.2" }, "suggest": { @@ -1812,20 +1799,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2015-09-06 08:36:38" + "time": "2015-10-27 15:38:06" }, { "name": "symfony/validator", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "b359dc71e253ce6eb69eefbd5088032241e7a66f" + "reference": "df9021e689aa3d08367881e7f8917219fabe5e64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/b359dc71e253ce6eb69eefbd5088032241e7a66f", - "reference": "b359dc71e253ce6eb69eefbd5088032241e7a66f", + "url": "https://api.github.com/repos/symfony/validator/zipball/df9021e689aa3d08367881e7f8917219fabe5e64", + "reference": "df9021e689aa3d08367881e7f8917219fabe5e64", "shasum": "" }, "require": { @@ -1835,12 +1822,12 @@ "require-dev": { "doctrine/annotations": "~1.0", "doctrine/cache": "~1.0", + "doctrine/common": "~2.3", "egulias/email-validator": "~1.2,>=1.2.1", "symfony/config": "~2.2", "symfony/expression-language": "~2.4", "symfony/http-foundation": "~2.1", "symfony/intl": "~2.4", - "symfony/phpunit-bridge": "~2.7", "symfony/property-access": "~2.3", "symfony/yaml": "~2.0,>=2.0.5" }, @@ -1882,28 +1869,25 @@ ], "description": "Symfony Validator Component", "homepage": "https://symfony.com", - "time": "2015-09-23 11:13:27" + "time": "2015-10-18 20:23:18" }, { "name": "symfony/yaml", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770" + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770", - "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770", + "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d", + "reference": "eca9019c88fbe250164affd107bc8057771f3f4d", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "type": "library", "extra": { "branch-alias": { @@ -1931,20 +1915,20 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-09-14 14:14:09" + "time": "2015-10-11 09:39:48" }, { "name": "twig/twig", - "version": "v1.22.2", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "79249fc8c9ff62e41e217e0c630e2e00bcadda6a" + "reference": "d9b6333ae8dd2c8e3fd256e127548def0bc614c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/79249fc8c9ff62e41e217e0c630e2e00bcadda6a", - "reference": "79249fc8c9ff62e41e217e0c630e2e00bcadda6a", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/d9b6333ae8dd2c8e3fd256e127548def0bc614c6", + "reference": "d9b6333ae8dd2c8e3fd256e127548def0bc614c6", "shasum": "" }, "require": { @@ -1957,7 +1941,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.22-dev" + "dev-master": "1.23-dev" } }, "autoload": { @@ -1992,20 +1976,20 @@ "keywords": [ "templating" ], - "time": "2015-09-22 13:59:32" + "time": "2015-11-05 12:49:06" }, { "name": "wikimedia/composer-merge-plugin", - "version": "dev-master", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/wikimedia/composer-merge-plugin.git", - "reference": "47bb3388cfeae41a38087ac8465a7d08fa92ea2e" + "reference": "bfed1f8d4eb97e9ba80eee57ea46229d7e5364d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wikimedia/composer-merge-plugin/zipball/6196fdb001faf681f92db2ae10abafb5815affde", - "reference": "47bb3388cfeae41a38087ac8465a7d08fa92ea2e", + "url": "https://api.github.com/repos/wikimedia/composer-merge-plugin/zipball/bfed1f8d4eb97e9ba80eee57ea46229d7e5364d9", + "reference": "bfed1f8d4eb97e9ba80eee57ea46229d7e5364d9", "shasum": "" }, "require": { @@ -2015,8 +1999,7 @@ "require-dev": { "composer/composer": "1.0.*@dev", "jakub-onderka/php-parallel-lint": "~0.8", - "phpspec/prophecy-phpunit": "~1.0", - "phpunit/phpunit": "~4.0", + "phpunit/phpunit": "~4.8|~5.0", "squizlabs/php_codesniffer": "~2.1.0" }, "type": "composer-plugin", @@ -2042,7 +2025,7 @@ } ], "description": "Composer plugin to merge multiple composer.json files", - "time": "2015-09-22 21:14:25" + "time": "2015-11-06 20:31:16" }, { "name": "zendframework/zend-diactoros", @@ -3599,16 +3582,16 @@ }, { "name": "symfony/browser-kit", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "277a2457776d4cc25706fbdd9d1e4ab2dac884e4" + "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/277a2457776d4cc25706fbdd9d1e4ab2dac884e4", - "reference": "277a2457776d4cc25706fbdd9d1e4ab2dac884e4", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/07d664a052572ccc28eb2ab7dbbe82155b1ad367", + "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367", "shasum": "" }, "require": { @@ -3617,8 +3600,7 @@ }, "require-dev": { "symfony/css-selector": "~2.0,>=2.0.5", - "symfony/phpunit-bridge": "~2.7", - "symfony/process": "~2.0,>=2.0.5" + "symfony/process": "~2.3.34|~2.7,>=2.7.6" }, "suggest": { "symfony/process": "" @@ -3650,28 +3632,25 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2015-09-06 08:36:38" + "time": "2015-10-23 14:47:27" }, { "name": "symfony/css-selector", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "abe19cc0429a06be0c133056d1f9859854860970" + "reference": "e1b865b26be4a56d22a8dee398375044a80c865b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/abe19cc0429a06be0c133056d1f9859854860970", - "reference": "abe19cc0429a06be0c133056d1f9859854860970", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b", + "reference": "e1b865b26be4a56d22a8dee398375044a80c865b", "shasum": "" }, "require": { "php": ">=5.3.9" }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, "type": "library", "extra": { "branch-alias": { @@ -3703,28 +3682,27 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2015-09-22 13:49:29" + "time": "2015-10-11 09:39:48" }, { "name": "symfony/dom-crawler", - "version": "v2.7.5", + "version": "v2.7.6", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "2e185ca136399f902b948694987e62c80099c052" + "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2e185ca136399f902b948694987e62c80099c052", - "reference": "2e185ca136399f902b948694987e62c80099c052", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5fef7d8b80d8f9992df99d8ee283f420484c9612", + "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612", "shasum": "" }, "require": { "php": ">=5.3.9" }, "require-dev": { - "symfony/css-selector": "~2.3", - "symfony/phpunit-bridge": "~2.7" + "symfony/css-selector": "~2.3" }, "suggest": { "symfony/css-selector": "" @@ -3756,7 +3734,7 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2015-09-20 21:13:58" + "time": "2015-10-11 09:39:48" } ], "aliases": [], diff --git a/core/CHANGELOG.txt b/core/CHANGELOG.txt index df80cfbb8..1c5f8a588 100644 --- a/core/CHANGELOG.txt +++ b/core/CHANGELOG.txt @@ -1,24 +1,69 @@ -Drupal 8.0, xxxx-xx-xx (development version) +Drupal 8.0.x, xxxx-xx-xx (development version) ---------------------- -- Added Twig as the default template engine and converted all .tpl.php templates - to .html.twig. +- Dramatically improved the front end: + * Made all built-in themes responsive. + * Added support for responsive images. + * Added Twig as the default template engine and converted all .tpl.php + templates and theme functions to .html.twig. + * Removed the PHPTemplate engine. + * Several large scale cleanups of the markup produced by Drupal. + * Added Classy as a base theme to maintain CSS classes and wrappers. + * Added Stable as the default base theme to maintain backwards compatibility + for core template and CSS changes, because templates and CSS outside + Stable can be improved in minor releases (8.1.0, 8.2.0 …). + * Redesigned several key elements of the Seven theme. + * Added support for HTML5 elements. + * Included the HTML5 Shiv library to support HTML5 elements in IE 8 and + below. + * Included Backbone.js and Underscore.js JavaScript frameworks. + * Updated to jQuery 2.1.4. + * Updated to jQuery UI 1.11.4. + * Removed jquery.bbq. + * Removed the Garland theme from core. + * Removed the Overlay module from core. + * Improved the asset library system to manage CSS and JavaScript files and + their dependencies. Allowing for smaller AJAX request payloads. + * jQuery is no longer loaded on all pages, only when another asset needs it. + * No JavaScript is loaded at all for anonymous users by default, for faster + page loads. + * Implemented SMACSS-style categorization for CSS files. + * Removed most support for Internet Explorer 8 and below. + * Added Modernizr for making styling changes based on browser support. + * All page template variables converted to blocks. - Added tour module. Provides highly contextual tips for UI elements. - Improved entity system. * Added support for saving and deleting entities through the controller. + * Base entity fields (such as labels) support widgets, formatters and + translation. + * Form modes introduced, similar to display modes. * Entities are now classed objects, implementing EntityInterface. * Drupal now understands the concept of a "default" revision, tracked independently from the latest revision, allowing for the creation of drafts while the current revision stays published. * All entity types, not just nodes, now have support for revisions. -- Replaced the core routing system with one built on the Symfony2 framework. +- Refactored routing system based on Symfony2 components. +- Reworked menu links, local actions, and local tasks based upon the new routing + system. +- Added plugin system to standardize implementation of several core APIs. - Configuration: * Added a centralized file-based configuration system. * Allows module authors to provide configuration in a standard format. * Implements functionality to get, set, add and remove configuration. * Includes ability to override configuration values with language variants and other runtime values. -- Added the CKEditor WYSIWYG editor. Provides a drag-and-drop configuration UI. -- Included the HTML5 Shiv library to support HTML5 elements in IE 8 and below. + * Supports configuration schema, dependencies, and validation to maintain + data-integrity between deployments and updates. +- Improved authoring experience: + * Added the CKEditor WYSIWYG editor. Clean markup guaranteed thanks to tight + integration with the filter system. + * Includes uploading, aligning and captioning of images. + * Correspondingly modernized the default text formats. + * Provides a drag-and-drop configuration UI, which automatically updates the + HTML filter settings, making configuring text formats trivial for typical + use cases. + * Added align and caption filters that can be applied to any element: + images, blockquotes, code snippets, videos… + * In-place editing of any entity: nodes, blocks… - Included the following Symfony2 components: * ClassLoader - PSR-0-compatible autoload routines. * DependencyInjection - Flexible dependency injection container. @@ -28,10 +73,13 @@ Drupal 8.0, xxxx-xx-xx (development version) * Process - Allows for executing commands in a sub-process. * Routing - Framework for mapping incoming requests to controller information. + * Serialization - Serialize complex nested objects into JSON/XML etc. + * Validator - Ensure that an object is in a valid state based upon some + validation rules defined for it. * Yaml - Parser for YAML files. -- Included the Assetic asset management framework for PHP. -- Included Backbone.js and Underscore.js JavaScript frameworks. -- Support added for making HTTP requests through a proxy server. +- Added routing component from Symfony CMF. +- Added Guzzle HTTP library. +- Added Zend Feed component. - Removed modules from core. * The following modules have been removed from core, because contributed modules with similar functionality are available: @@ -42,35 +90,30 @@ Drupal 8.0, xxxx-xx-xx (development version) * Poll * Profile * Trigger -- Removed the Overlay module from core. -- Removed the Garland theme from core. - Removed the Statistics module's accesslog functionality and reports from core. - Removed XML-RPC functionality from core. - Removed user signatures support from core. -- Removed backwards-compatibility with 'magic_quotes_gpc'/'magic_quotes_runtime' - PHP configuration settings. Both are required to be disabled. - Universally Unique IDentifier (UUID): * Support for generating and validating UUIDs. -- JavaScript changes: - * Updated to jQuery 2.1.0 - * Updated to jQuery UI 1.10.2 - * Removed jquery.bbq - Tremendously improved language support all around. * Great language improvements for users: * Improved language selection with user preference detection in the - installer. + installer based on browser settings. + * The installer is presented in the user's native language. * Moved base language support to Language module. * Greatly simplified the interface for setting up languages. * Improved browser language detection considerably. - * Language domain and path prefix configuraton simplified and centralized; - path prefix detection is now default. + * Language domain and path prefix configuration simplified and + centralized; path prefix detection is now default. * Added HTML 5 language markup; language information added in markup in several more places. * Made it possible to assign external language codes to local languages. * Introduced the possibility of an administration-specific language preference for users. + * Language selection fallback language is now independently configurable + without needing to change the site default language. * Simplified and added new features in interface translation: - * Made interface translation directly accessible from language list. + * Made interface translation directly accessible from the language list. * Centralized interface translation import to one directory. * Drupal can now be translated to English and English can be deleted. * Much improved built-in translation interface. @@ -79,6 +122,7 @@ Drupal 8.0, xxxx-xx-xx (development version) be identified and protected from translation update overwrites. * All Gettext files are now imported in chunks, better for low resource environments. + * Automated import and update of translations in the installer and later. * Improved content language support: * Made it possible to assign language to taxonomy terms, vocabularies, menu items, and files. @@ -107,29 +151,64 @@ Drupal 8.0, xxxx-xx-xx (development version) developers. * Made it possible for users to have a preferred language separate from their user entity language. - * The text formatter from t() is now available as format_string(). + * The text formatter from t() is now available as FormattableMarkup. * Added support for interface translation contexts in Drupal.t(), - Drupal.formatPlural() as well as routing, tabs, actions, and contextual - links. + Drupal.formatPlural() as well as routing, tabs, actions, shipped + menu items and contextual links. * Removed textgroups support from interface translation in favor of native configuration language support. * Added configuration schema system to support generating translation forms for any configuration. * Reworked Gettext PO support to use pluggable read/write handlers. * Added language select form element in the Form API. -- Added Email field type to core. -- Added Link field type to core. -- Added Phone number field type to core. + * Added a transliteration API. (Only used for machine names in core.) +- New field types added to core: + - Email + - Link + - Phone number + - Entity reference + - Date + - Comment (allows comment threads on entity types other than node). - Added local image input filter, to enable secure image posting. -- Added Views and Views UI module to core. -- Added Entity Reference field type to core. -- Added Date field type to core. +- Added Views and Views UI module to core: + * Various core listings: /node, /admin/content/node, /admin/people etc. are + now served by views. + * REST API support built in. + * Rewrote caching integration for better performance. +- Custom blocks are now fieldable, revisionable, and translatable entities. +- An accessible modal API based on improvements made in collaboration with the + jQuery UI team and the Views team. +- Fieldable contact forms allowing site-builders to easily build custom forms + for soliciting feedback from users. - Added a Web Services module package. * Added a RESTful web services provider module. * Added a serialization module using the Symfony serialization component. * Added a Hypertext Application Language (HAL) serialization module. * Added a HTTP Basic authentication provider module. +- Significant performance/scalability improvements: + * Cache tags, which allow content to be invalidated accurately and instantly, + including reverse proxies and CDNs. + * Cache contexts, which allow content to be cached correctly, and placeholdered + to improve cache hit rates. + * Cacheability bubbling, which allows strict tracking of assets and + cacheability throughout page rendering. + * Page caching has been factored out to its own module and is enabled by + default. + * Authenticated page caching has been added to core via the Dynamic Page Cache + module and is enabled by default. + * APCu, memory, and PHP file caching backends added to core, alongside support + for a chained, consistent cache backend to support correctly using fast + local cache implementations with multiple web servers. - When using MySQL, the MyISAM engine is no longer supported. +- Testing improvements + * Added PHPUnit for proper unit testing, see + https://phpunit.de/manual/4.8/en/index.html so you can run tests via + your IDE. + * Added BrowserTestBase as an alternative to simpletest for browser + testing (JavaScript support to be included in the future) + * Added KernelTestBase to provide a fast API testing of integration of + different components + * Core branch nightly tests include PHP 5.5, 5.6, 7, sqlite and PostgreSQL. Drupal 7.0, 2011-01-05 ---------------------- diff --git a/core/MAINTAINERS.txt b/core/MAINTAINERS.txt index 5d00d6650..1fa3118a6 100644 --- a/core/MAINTAINERS.txt +++ b/core/MAINTAINERS.txt @@ -283,6 +283,7 @@ Breakpoint module CKEditor module - Wim Leers 'Wim Leers' https://www.drupal.org/u/wim-leers +- Marek 'mlewand' Lewandowski https://www.drupal.org/u/mlewand Color module - ? diff --git a/core/composer.json b/core/composer.json index fd33b45b7..afb170ad5 100644 --- a/core/composer.json +++ b/core/composer.json @@ -17,7 +17,7 @@ "symfony/validator": "2.7.*", "symfony/process": "2.7.*", "symfony/yaml": "2.7.*", - "twig/twig": "^1.22.2", + "twig/twig": "^1.23.1", "doctrine/common": "2.5.*", "doctrine/annotations": "1.2.*", "guzzlehttp/guzzle": "~6.1", diff --git a/core/core.libraries.yml b/core/core.libraries.yml index a05f09410..2d16fc975 100644 --- a/core/core.libraries.yml +++ b/core/core.libraries.yml @@ -260,7 +260,6 @@ drupal.tabledrag: misc/tabledrag.js: { weight: -1 } dependencies: - core/jquery - - core/modernizr - core/drupal - core/drupalSettings - core/jquery.once diff --git a/core/core.services.yml b/core/core.services.yml index a83af3460..afccb3177 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -949,14 +949,14 @@ services: tags: - { name: route_enhancer } - { name: event_subscriber } + route_enhancer.form: + class: Drupal\Core\Routing\Enhancer\FormRouteEnhancer + tags: + - { name: route_enhancer } route_enhancer.entity: class: Drupal\Core\Entity\Enhancer\EntityRouteEnhancer tags: - { name: route_enhancer, priority: 20 } - route_content_controller_subscriber: - class: Drupal\Core\EventSubscriber\ContentControllerSubscriber - tags: - - { name: event_subscriber } route_special_attributes_subscriber: class: Drupal\Core\EventSubscriber\SpecialAttributesRouteSubscriber tags: diff --git a/core/includes/errors.inc b/core/includes/errors.inc index 479548065..39d8ffd03 100644 --- a/core/includes/errors.inc +++ b/core/includes/errors.inc @@ -119,8 +119,11 @@ function error_displayable($error = NULL) { * %line, severity_level, and backtrace. All the parameters are plain-text, * with the exception of @message, which needs to be an HTML string, and * backtrace, which is a standard PHP backtrace. - * @param $fatal - * TRUE if the error is fatal. + * @param bool $fatal + * TRUE for: + * - An exception is thrown and not caught by something else. + * - A recoverable fatal error, which is a fatal error. + * Non-recoverable fatal errors cannot be logged by Drupal. */ function _drupal_log_error($error, $fatal = FALSE) { $is_installer = drupal_installation_attempted(); @@ -169,6 +172,11 @@ function _drupal_log_error($error, $fatal = FALSE) { } } + // Log fatal errors, so developers can find and debug them. + if ($fatal) { + error_log(sprintf('%s: %s in %s on line %d', $error['%type'], $error['@message'], $error['%file'], $error['%line'])); + } + if (PHP_SAPI === 'cli') { if ($fatal) { // When called from CLI, simply output a plain text message. diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc index 60ef2d7cd..7b669114e 100644 --- a/core/includes/install.core.inc +++ b/core/includes/install.core.inc @@ -15,6 +15,7 @@ use Drupal\Core\Language\LanguageManager; use Drupal\Core\Logger\LoggerChannelFactory; use Drupal\Core\Site\Settings; use Drupal\Core\StringTranslation\Translator\FileTranslation; +use Drupal\Core\StackMiddleware\ReverseProxyMiddleware; use Drupal\Core\Extension\ExtensionDiscovery; use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\Url; @@ -403,6 +404,8 @@ function install_begin_request($class_loader, &$install_state) { $kernel->setSitePath($site_path); $kernel->boot(); $container = $kernel->getContainer(); + // If Drupal is being installed behind a proxy, configure the request. + ReverseProxyMiddleware::setSettingsOnRequest($request, Settings::getInstance()); // Register the file translation service. if (isset($GLOBALS['config']['locale.settings']['translation']['path'])) { diff --git a/core/includes/theme.inc b/core/includes/theme.inc index e8cff8ba6..62f2d6ff7 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -1778,7 +1778,7 @@ function drupal_common_theme() { ), // From menu.inc. 'menu' => array( - 'variables' => array('items' => array(), 'attributes' => array()), + 'variables' => array('menu_name' => NULL, 'items' => array(), 'attributes' => array()), ), 'menu_local_task' => array( 'render element' => 'element', diff --git a/core/includes/theme.maintenance.inc b/core/includes/theme.maintenance.inc index b98d28af7..80cc52cb8 100644 --- a/core/includes/theme.maintenance.inc +++ b/core/includes/theme.maintenance.inc @@ -82,19 +82,21 @@ function _drupal_maintenance_theme() { $theme = $custom_theme; // Find all our ancestor themes and put them in an array. - $base_theme = array(); + // @todo This is just a workaround. Find a better way how to handle themes + // on maintenance pages, see https://www.drupal.org/node/2322619. + // This code is basically a duplicate of + // \Drupal\Core\Theme\ThemeInitialization::getActiveThemeByName. + $base_themes = []; $ancestor = $theme; while ($ancestor && isset($themes[$ancestor]->base_theme)) { - $base_theme[] = $themes[$themes[$ancestor]->base_theme]; + $base_themes[] = $themes[$themes[$ancestor]->base_theme]; $ancestor = $themes[$ancestor]->base_theme; if ($ancestor) { - // Ensure that the base theme is added. + // Ensure that the base theme is added and installed. $theme_handler->addTheme($themes[$ancestor]); } } - // @todo This is just a workaround. Find a better way how to handle themes - // on maintenance pages, see https://www.drupal.org/node/2322619. - \Drupal::theme()->setActiveTheme($theme_init->getActiveTheme($themes[$custom_theme], array_reverse($base_theme))); + \Drupal::theme()->setActiveTheme($theme_init->getActiveTheme($themes[$custom_theme], $base_themes)); // Prime the theme registry. Drupal::service('theme.registry'); } diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php index b2edb81da..d75f50b72 100644 --- a/core/lib/Drupal.php +++ b/core/lib/Drupal.php @@ -81,7 +81,7 @@ class Drupal { /** * The current system version. */ - const VERSION = '8.0.0-rc3'; + const VERSION = '8.0.0-dev-2015-11-17'; /** * Core API compatibility. @@ -252,11 +252,27 @@ class Drupal { * * @return \Drupal\Core\Entity\EntityManagerInterface * The entity manager service. + * + * @deprecated in Drupal 8.0.0 and will be removed before Drupal 9.0.0. + * Use \Drupal::entityTypeManager() instead in most cases. If the needed + * method is not on \Drupal\Core\Entity\EntityTypeManagerInterface, see the + * deprecated \Drupal\Core\Entity\EntityManager to find the + * correct interface or service. */ public static function entityManager() { return static::getContainer()->get('entity.manager'); } + /** + * Retrieves the entity type manager. + * + * @return \Drupal\Core\Entity\EntityTypeManagerInterface + * The entity type manager. + */ + public static function entityTypeManager() { + return static::getContainer()->get('entity_type.manager'); + } + /** * Returns the current primary database. * diff --git a/core/lib/Drupal/Component/PhpStorage/FileStorage.php b/core/lib/Drupal/Component/PhpStorage/FileStorage.php index e4e7fde44..b6a2a9dc2 100644 --- a/core/lib/Drupal/Component/PhpStorage/FileStorage.php +++ b/core/lib/Drupal/Component/PhpStorage/FileStorage.php @@ -79,8 +79,7 @@ class FileStorage implements PhpStorageInterface { public static function htaccessLines($private = TRUE) { $lines = <<themeManager->getActiveTheme(); // Add the theme name to the cache key since themes may implement - // hook_css_alter(). - $cid = 'css:' . $theme_info->getName() . ':' . Crypt::hashBase64(serialize($assets)) . (int) $optimize; + // hook_library_info_alter(). + $libraries_to_load = $this->getLibrariesToLoad($assets); + $cid = 'css:' . $theme_info->getName() . ':' . Crypt::hashBase64(serialize($libraries_to_load)) . (int) $optimize; if ($cached = $this->cache->get($cid)) { return $cached->data; } @@ -132,7 +133,7 @@ class AssetResolver implements AssetResolverInterface { 'browsers' => [], ]; - foreach ($this->getLibrariesToLoad($assets) as $library) { + foreach ($libraries_to_load as $library) { list($extension, $name) = explode('/', $library, 2); $definition = $this->libraryDiscovery->getLibraryByName($extension, $name); if (isset($definition['css'])) { @@ -187,9 +188,7 @@ class AssetResolver implements AssetResolverInterface { * Returns the JavaScript settings assets for this response's libraries. * * Gathers all drupalSettings from all libraries in the attached assets - * collection and merges them, then it merges individual attached settings, - * and finally invokes hook_js_settings_alter() to allow alterations of - * JavaScript settings by modules and themes. + * collection and merges them. * * @param \Drupal\Core\Asset\AttachedAssetsInterface $assets * The assets attached to the current response. @@ -207,9 +206,6 @@ class AssetResolver implements AssetResolverInterface { } } - // Attached settings win over settings in libraries. - $settings = NestedArray::mergeDeepArray([$settings, $assets->getSettings()], TRUE); - return $settings; } @@ -219,9 +215,10 @@ class AssetResolver implements AssetResolverInterface { public function getJsAssets(AttachedAssetsInterface $assets, $optimize) { $theme_info = $this->themeManager->getActiveTheme(); // Add the theme name to the cache key since themes may implement - // hook_js_alter(). Additionally add the current language to support - // translation of JavaScript files. - $cid = 'js:' . $theme_info->getName() . ':' . $this->languageManager->getCurrentLanguage()->getId() . ':' . Crypt::hashBase64(serialize($assets)) . (int) $optimize; + // hook_library_info_alter(). Additionally add the current language to + // support translation of JavaScript files via hook_js_alter(). + $libraries_to_load = $this->getLibrariesToLoad($assets); + $cid = 'js:' . $theme_info->getName() . ':' . $this->languageManager->getCurrentLanguage()->getId() . ':' . Crypt::hashBase64(serialize($libraries_to_load)) . (int) (count($assets->getSettings()) > 0) . (int) $optimize; if ($cached = $this->cache->get($cid)) { list($js_assets_header, $js_assets_footer, $settings, $settings_in_header) = $cached->data; @@ -239,8 +236,6 @@ class AssetResolver implements AssetResolverInterface { 'browsers' => [], ]; - $libraries_to_load = $this->getLibrariesToLoad($assets); - // Collect all libraries that contain JS assets and are in the header. $header_js_libraries = []; foreach ($libraries_to_load as $library) { @@ -329,8 +324,10 @@ class AssetResolver implements AssetResolverInterface { $this->cache->set($cid, [$js_assets_header, $js_assets_footer, $settings, $settings_in_header], CacheBackendInterface::CACHE_PERMANENT, ['library_info']); } - if ($settings !== FALSE) { + // Attached settings override both library definitions and + // hook_js_settings_build(). + $settings = NestedArray::mergeDeepArray([$settings, $assets->getSettings()], TRUE); // Allow modules and themes to alter the JavaScript settings. $this->moduleHandler->alter('js_settings', $settings, $assets); $this->themeManager->alter('js_settings', $settings, $assets); diff --git a/core/lib/Drupal/Core/Cache/CacheCollector.php b/core/lib/Drupal/Core/Cache/CacheCollector.php index eb1ca57a5..9755c1abb 100644 --- a/core/lib/Drupal/Core/Cache/CacheCollector.php +++ b/core/lib/Drupal/Core/Cache/CacheCollector.php @@ -7,6 +7,7 @@ namespace Drupal\Core\Cache; +use Drupal\Component\Utility\Crypt; use Drupal\Core\DestructableInterface; use Drupal\Core\Lock\LockBackendInterface; @@ -232,7 +233,7 @@ abstract class CacheCollector implements CacheCollectorInterface, DestructableIn // Lock cache writes to help avoid stampedes. $cid = $this->getCid(); - $lock_name = $cid . ':' . __CLASS__; + $lock_name = $this->normalizeLockName($cid . ':' . __CLASS__); if (!$lock || $this->lock->acquire($lock_name)) { // Set and delete operations invalidate the cache item. Try to also load // an eventually invalidated cache entry, only update an invalidated cache @@ -264,6 +265,30 @@ abstract class CacheCollector implements CacheCollectorInterface, DestructableIn $this->keysToRemove = array(); } + /** + * Normalizes a cache ID in order to comply with database limitations. + * + * @param string $cid + * The passed in cache ID. + * + * @return string + * An ASCII-encoded cache ID that is at most 255 characters long. + */ + protected function normalizeLockName($cid) { + // Nothing to do if the ID is a US ASCII string of 255 characters or less. + $cid_is_ascii = mb_check_encoding($cid, 'ASCII'); + if (strlen($cid) <= 255 && $cid_is_ascii) { + return $cid; + } + // Return a string that uses as much as possible of the original cache ID + // with the hash appended. + $hash = Crypt::hashBase64($cid); + if (!$cid_is_ascii) { + return $hash; + } + return substr($cid, 0, 255 - strlen($hash)) . $hash; + } + /** * {@inheritdoc} */ diff --git a/core/lib/Drupal/Core/Composer/Composer.php b/core/lib/Drupal/Core/Composer/Composer.php index 50e694256..0d5b6aacd 100644 --- a/core/lib/Drupal/Core/Composer/Composer.php +++ b/core/lib/Drupal/Core/Composer/Composer.php @@ -10,6 +10,7 @@ namespace Drupal\Core\Composer; use Drupal\Component\PhpStorage\FileStorage; use Composer\Script\Event; use Composer\Installer\PackageEvent; +use Composer\Semver\Constraint\Constraint; /** * Provides static functions for composer script events. @@ -71,23 +72,38 @@ class Composer { ]; /** - * Add vendor classes to composers static classmap. + * Add vendor classes to Composer's static classmap. */ public static function preAutoloadDump(Event $event) { - $composer = $event->getComposer(); - $package = $composer->getPackage(); - $autoload = $package->getAutoload(); - $autoload['classmap'] = array_merge($autoload['classmap'], array( - 'vendor/symfony/http-foundation/Request.php', - 'vendor/symfony/http-foundation/ParameterBag.php', - 'vendor/symfony/http-foundation/FileBag.php', - 'vendor/symfony/http-foundation/ServerBag.php', - 'vendor/symfony/http-foundation/HeaderBag.php', - 'vendor/symfony/http-kernel/HttpKernel.php', - 'vendor/symfony/http-kernel/HttpKernelInterface.php', - 'vendor/symfony/http-kernel/TerminableInterface.php', - )); - $package->setAutoload($autoload); + // We need the root package so we can add our classmaps to its loader. + $package = $event->getComposer()->getPackage(); + // We need the local repository so that we can query and see if it's likely + // that our files are present there. + $repository = $event->getComposer()->getRepositoryManager()->getLocalRepository(); + // This is, essentially, a null constraint. We only care whether the package + // is present in vendor/ yet, but findPackage() requires it. + $constraint = new Constraint('>', ''); + // Check for our packages, and then optimize them if they're present. + if ($repository->findPackage('symfony/http-foundation', $constraint)) { + $autoload = $package->getAutoload(); + $autoload['classmap'] = array_merge($autoload['classmap'], array( + 'vendor/symfony/http-foundation/Request.php', + 'vendor/symfony/http-foundation/ParameterBag.php', + 'vendor/symfony/http-foundation/FileBag.php', + 'vendor/symfony/http-foundation/ServerBag.php', + 'vendor/symfony/http-foundation/HeaderBag.php', + )); + $package->setAutoload($autoload); + } + if ($repository->findPackage('symfony/http-kernel', $constraint)) { + $autoload = $package->getAutoload(); + $autoload['classmap'] = array_merge($autoload['classmap'], array( + 'vendor/symfony/http-kernel/HttpKernel.php', + 'vendor/symfony/http-kernel/HttpKernelInterface.php', + 'vendor/symfony/http-kernel/TerminableInterface.php', + )); + $package->setAutoload($autoload); + } } /** diff --git a/core/lib/Drupal/Core/Config/ConfigInstaller.php b/core/lib/Drupal/Core/Config/ConfigInstaller.php index 7209030dd..ae12c9186 100644 --- a/core/lib/Drupal/Core/Config/ConfigInstaller.php +++ b/core/lib/Drupal/Core/Config/ConfigInstaller.php @@ -112,13 +112,13 @@ class ConfigInstaller implements ConfigInstallerInterface { $prefix = $name . '.'; } - // Gets a profile storage to search for overrides if necessary. - $profile_storage = $this->getProfileStorage($name); + // Gets profile storages to search for overrides if necessary. + $profile_storages = $this->getProfileStorages($name); // Gather information about all the supported collections. $collection_info = $this->configManager->getConfigCollectionInfo(); foreach ($collection_info->getCollectionNames() as $collection) { - $config_to_create = $this->getConfigToCreate($storage, $collection, $prefix, $profile_storage); + $config_to_create = $this->getConfigToCreate($storage, $collection, $prefix, $profile_storages); // If we're installing a profile ensure configuration that is overriding // is excluded. if ($name == $this->drupalGetProfile()) { @@ -223,19 +223,22 @@ class ConfigInstaller implements ConfigInstallerInterface { * The configuration collection to use. * @param string $prefix * (optional) Limit to configuration starting with the provided string. + * @param \Drupal\Core\Config\StorageInterface[] $profile_storages + * An array of storage interfaces containing profile configuration to check + * for overrides. * * @return array * An array of configuration data read from the source storage keyed by the * configuration object name. */ - protected function getConfigToCreate(StorageInterface $storage, $collection, $prefix = '', StorageInterface $profile_storage = NULL) { + protected function getConfigToCreate(StorageInterface $storage, $collection, $prefix = '', array $profile_storages = []) { if ($storage->getCollectionName() != $collection) { $storage = $storage->createCollection($collection); } $data = $storage->readMultiple($storage->listAll($prefix)); // Check to see if the corresponding override storage has any overrides. - if ($profile_storage) { + foreach ($profile_storages as $profile_storage) { if ($profile_storage->getCollectionName() != $collection) { $profile_storage = $profile_storage->createCollection($collection); } @@ -435,11 +438,11 @@ class ConfigInstaller implements ConfigInstallerInterface { $enabled_extensions = $this->getEnabledExtensions(); // Add the extension that will be enabled to the list of enabled extensions. $enabled_extensions[] = $name; - // Gets a profile storage to search for overrides if necessary. - $profile_storage = $this->getProfileStorage($name); + // Gets profile storages to search for overrides if necessary. + $profile_storages = $this->getProfileStorages($name); // Check the dependencies of configuration provided by the module. - $invalid_default_config = $this->findDefaultConfigWithUnmetDependencies($storage, $enabled_extensions, $profile_storage); + $invalid_default_config = $this->findDefaultConfigWithUnmetDependencies($storage, $enabled_extensions, $profile_storages); if (!empty($invalid_default_config)) { throw UnmetDependenciesException::create($name, $invalid_default_config); } @@ -460,14 +463,19 @@ class ConfigInstaller implements ConfigInstallerInterface { /** * Finds default configuration with unmet dependencies. * + * @param \Drupal\Core\Config\StorageInterface $storage + * The storage containing the default configuration. * @param array $enabled_extensions * A list of all the currently enabled modules and themes. + * @param \Drupal\Core\Config\StorageInterface[] $profile_storages + * An array of storage interfaces containing profile configuration to check + * for overrides. * * @return array * List of configuration that has unmet dependencies */ - protected function findDefaultConfigWithUnmetDependencies(StorageInterface $storage, array $enabled_extensions, StorageInterface $profile_storage = NULL) { - $config_to_create = $this->getConfigToCreate($storage, StorageInterface::DEFAULT_COLLECTION, '', $profile_storage); + protected function findDefaultConfigWithUnmetDependencies(StorageInterface $storage, array $enabled_extensions, array $profile_storages = []) { + $config_to_create = $this->getConfigToCreate($storage, StorageInterface::DEFAULT_COLLECTION, '', $profile_storages); $all_config = array_merge($this->configFactory->listAll(), array_keys($config_to_create)); return array_filter(array_keys($config_to_create), function($config_name) use ($enabled_extensions, $all_config, $config_to_create) { return !$this->validateDependencies($config_name, $config_to_create[$config_name], $enabled_extensions, $all_config); @@ -550,27 +558,31 @@ class ConfigInstaller implements ConfigInstallerInterface { /** * Gets the profile storage to use to check for profile overrides. * + * The install profile can override module configuration during a module + * install. Both the install and optional directories are checked for matching + * configuration. This allows profiles to override default configuration for + * modules they do not depend on. + * * @param string $installing_name * (optional) The name of the extension currently being installed. * - * @return \Drupal\Core\Config\StorageInterface|null - * A storage to access configuration from the installation profile. If a - * Drupal installation is not in progress or we're installing the profile - * itself, then it will return NULL as the profile storage should not be - * used. + * @return \Drupal\Core\Config\StorageInterface[]|null + * Storages to access configuration from the installation profile. If we're + * installing the profile itself, then it will return an empty array as the + * profile storage should not be used. */ - protected function getProfileStorage($installing_name = '') { + protected function getProfileStorages($installing_name = '') { $profile = $this->drupalGetProfile(); - if ($this->drupalInstallationAttempted() && $profile != $installing_name) { - // Profiles should not contain optional configuration so always use the - // install directory. - $profile_install_path = $this->getDefaultConfigDirectory('module', $profile); - $profile_storage = new FileStorage($profile_install_path, StorageInterface::DEFAULT_COLLECTION); + $profile_storages = []; + if ($profile && $profile != $installing_name) { + $profile_path = $this->drupalGetPath('module', $profile); + foreach ([InstallStorage::CONFIG_INSTALL_DIRECTORY, InstallStorage::CONFIG_OPTIONAL_DIRECTORY] as $directory) { + if (is_dir($profile_path . '/' . $directory)) { + $profile_storages[] = new FileStorage($profile_path . '/' . $directory, StorageInterface::DEFAULT_COLLECTION); + } + } } - else { - $profile_storage = NULL; - } - return $profile_storage; + return $profile_storages; } /** diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php index ab2fb1058..bb396e6d4 100644 --- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php +++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php @@ -387,6 +387,7 @@ abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface * {@inheritdoc} */ public function url($rel = 'edit-form', $options = array()) { + // Do not remove this override: the default value of $rel is different. return parent::url($rel, $options); } @@ -394,9 +395,19 @@ abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface * {@inheritdoc} */ public function link($text = NULL, $rel = 'edit-form', array $options = []) { + // Do not remove this override: the default value of $rel is different. return parent::link($text, $rel, $options); } + /** + * {@inheritdoc} + */ + public function toUrl($rel = 'edit-form', array $options = []) { + // Unless language was already provided, avoid setting an explicit language. + $options += ['language' => NULL]; + return parent::toUrl($rel, $options); + } + /** * {@inheritdoc} */ diff --git a/core/lib/Drupal/Core/Controller/ControllerBase.php b/core/lib/Drupal/Core/Controller/ControllerBase.php index ce0354ff2..544e247fe 100644 --- a/core/lib/Drupal/Core/Controller/ControllerBase.php +++ b/core/lib/Drupal/Core/Controller/ControllerBase.php @@ -49,6 +49,13 @@ abstract class ControllerBase implements ContainerInjectionInterface { */ protected $entityManager; + /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + /** * The entity form builder. * @@ -117,6 +124,10 @@ abstract class ControllerBase implements ContainerInjectionInterface { * * @return \Drupal\Core\Entity\EntityManagerInterface * The entity manager service. + * + * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0. + * Most of the time static::entityTypeManager() is supposed to be used + * instead. */ protected function entityManager() { if (!$this->entityManager) { @@ -125,6 +136,19 @@ abstract class ControllerBase implements ContainerInjectionInterface { return $this->entityManager; } + /** + * Retrieves the entity type manager. + * + * @return \Drupal\Core\Entity\EntityTypeManagerInterface + * The entity type manager. + */ + protected function entityTypeManager() { + if (!isset($this->entityTypeManager)) { + $this->entityTypeManager = $this->container()->get('entity_type.manager'); + } + return $this->entityTypeManager; + } + /** * Retrieves the entity form builder. * diff --git a/core/lib/Drupal/Core/Datetime/DateHelper.php b/core/lib/Drupal/Core/Datetime/DateHelper.php index ad49016c0..4cfc74640 100644 --- a/core/lib/Drupal/Core/Datetime/DateHelper.php +++ b/core/lib/Drupal/Core/Datetime/DateHelper.php @@ -254,14 +254,24 @@ class DateHelper { * An array of weekdays. * * @return array - * An array of weekdays reordered to match the first day of the week. + * An array of weekdays reordered to match the first day of the week. The + * keys will remain unchanged. For example, if the first day of the week is + * set to be Monday, the array keys will be [1, 2, 3, 4, 5, 6, 0]. */ public static function weekDaysOrdered($weekdays) { $first_day = \Drupal::config('system.date')->get('first_day'); if ($first_day > 0) { for ($i = 1; $i <= $first_day; $i++) { - $last = array_shift($weekdays); - array_push($weekdays, $last); + // Reset the array to the first element. + reset($weekdays); + // Retrieve the first week day value. + $last = current($weekdays); + // Store the corresponding key. + $key = key($weekdays); + // Remove this week day from the beginning of the array. + unset($weekdays[$key]); + // Add this week day to the end of the array. + $weekdays[$key] = $last; } } return $weekdays; diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php index e00426fc4..1edaec363 100644 --- a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php +++ b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php @@ -72,33 +72,6 @@ class ContainerBuilder extends SymfonyContainerBuilder { parent::setParameter($name, $value); } - /** - * Synchronizes a service change. - * - * This method is a copy of the ContainerBuilder of symfony. - * - * This method updates all services that depend on the given - * service by calling all methods referencing it. - * - * @param string $id A service id - */ - private function synchronize($id) { - foreach ($this->getDefinitions() as $definitionId => $definition) { - // only check initialized services - if (!$this->initialized($definitionId)) { - continue; - } - - foreach ($definition->getMethodCalls() as $call) { - foreach ($call[1] as $argument) { - if ($argument instanceof Reference && $id == (string) $argument) { - $this->callMethod($this->get($definitionId), $call); - } - } - } - } - } - /** * A 1to1 copy of parent::callMethod. */ diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php index 4b56db2d6..278826e0f 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -821,13 +821,6 @@ class DrupalKernel implements DrupalKernelInterface, TerminableInterface { // If there is no container and no cached container definition, build a new // one from scratch. if (!isset($container) && !isset($container_definition)) { - if (version_compare(phpversion(), '7.0.0-dev') >= 0) { - // The service graph implementation is prone to corruption during GC. - // Collect cycles now then disable the GC for the time of the compiler - // run. - // @see https://bugs.php.net/bug.php?id=70805 - gc_collect_cycles(); - } $container = $this->compileContainer(); // Only dump the container if dumping is allowed. This is useful for diff --git a/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php b/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php index 2a52b79b3..6dd6e10cf 100644 --- a/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php +++ b/core/lib/Drupal/Core/Entity/Element/EntityAutocomplete.php @@ -10,10 +10,10 @@ namespace Drupal\Core\Entity\Element; use Drupal\Component\Utility\Crypt; use Drupal\Component\Utility\Tags; use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityReferenceSelection\SelectionWithAutocreateInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element\Textfield; use Drupal\Core\Site\Settings; -use Drupal\user\EntityOwnerInterface; /** * Provides an entity autocomplete form element. @@ -147,7 +147,7 @@ class EntityAutocomplete extends Textfield { 'handler_settings' => $element['#selection_settings'], ); $handler = \Drupal::service('plugin.manager.entity_reference_selection')->getInstance($options); - $autocreate = (bool) $element['#autocreate']; + $autocreate = (bool) $element['#autocreate'] && $handler instanceof SelectionWithAutocreateInterface; $input_values = $element['#tags'] ? Tags::explode($element['#value']) : array($element['#value']); foreach ($input_values as $input) { @@ -167,13 +167,14 @@ class EntityAutocomplete extends Textfield { // Auto-create item. See an example of how this is handled in // \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::presave(). $value[] = array( - 'entity' => static::createNewEntity($element['#target_type'], $element['#autocreate']['bundle'], $input, $element['#autocreate']['uid']) + 'entity' => $handler->createNewEntity($element['#target_type'], $element['#autocreate']['bundle'], $input, $element['#autocreate']['uid']), ); } } // Check that the referenced entities are valid, if needed. - if ($element['#validate_reference'] && !$autocreate && !empty($value)) { + if ($element['#validate_reference'] && !empty($value)) { + // Validate existing entities. $ids = array_reduce($value, function ($return, $item) { if (isset($item['target_id'])) { $return[] = $item['target_id']; @@ -189,6 +190,30 @@ class EntityAutocomplete extends Textfield { } } } + + // Validate newly created entities. + $new_entities = array_reduce($value, function ($return, $item) { + if (isset($item['entity'])) { + $return[] = $item['entity']; + } + return $return; + }); + + if ($new_entities) { + if ($autocreate) { + $valid_new_entities = $handler->validateReferenceableNewEntities($new_entities); + $invalid_new_entities = array_diff_key($new_entities, $valid_new_entities); + } + else { + // If the selection handler does not support referencing newly + // created entities, all of them should be invalidated. + $invalid_new_entities = $new_entities; + } + + foreach ($invalid_new_entities as $entity) { + $form_state->setError($element, t('This entity (%type: %label) cannot be referenced.', array('%type' => $element['#target_type'], '%label' => $entity->label()))); + } + } } // Use only the last value if the form element does not support multiple @@ -310,37 +335,4 @@ class EntityAutocomplete extends Textfield { return $match; } - /** - * Creates a new entity from a label entered in the autocomplete input. - * - * @param string $entity_type_id - * The entity type ID. - * @param string $bundle - * The bundle name. - * @param string $label - * The entity label. - * @param int $uid - * The entity owner ID. - * - * @return \Drupal\Core\Entity\EntityInterface - */ - protected static function createNewEntity($entity_type_id, $bundle, $label, $uid) { - $entity_manager = \Drupal::entityManager(); - - $entity_type = $entity_manager->getDefinition($entity_type_id); - $bundle_key = $entity_type->getKey('bundle'); - $label_key = $entity_type->getKey('label'); - - $entity = $entity_manager->getStorage($entity_type_id)->create(array( - $bundle_key => $bundle, - $label_key => $label, - )); - - if ($entity instanceof EntityOwnerInterface) { - $entity->setOwnerId($uid); - } - - return $entity; - } - } diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php index 2a4b199ee..8164d7c1a 100644 --- a/core/lib/Drupal/Core/Entity/Entity.php +++ b/core/lib/Drupal/Core/Entity/Entity.php @@ -72,11 +72,26 @@ abstract class Entity implements EntityInterface { * Gets the entity manager. * * @return \Drupal\Core\Entity\EntityManagerInterface + * + * @deprecated in Drupal 8.0.0 and will be removed before Drupal 9.0.0. + * Use \Drupal::entityTypeManager() instead in most cases. If the needed + * method is not on \Drupal\Core\Entity\EntityTypeManagerInterface, see the + * deprecated \Drupal\Core\Entity\EntityManager to find the + * correct interface or service. */ protected function entityManager() { return \Drupal::entityManager(); } + /** + * Gets the entity type manager. + * + * @return \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected function entityTypeManager() { + return \Drupal::entityTypeManager(); + } + /** * Gets the language manager. * @@ -158,6 +173,13 @@ abstract class Entity implements EntityInterface { * {@inheritdoc} */ public function urlInfo($rel = 'canonical', array $options = []) { + return $this->toUrl($rel, $options); + } + + /** + * {@inheritdoc} + */ + public function toUrl($rel = 'canonical', array $options = []) { if ($this->id() === NULL) { throw new EntityMalformedException(sprintf('The "%s" entity cannot have a URI as it does not have an ID', $this->getEntityTypeId())); } @@ -237,26 +259,33 @@ abstract class Entity implements EntityInterface { * {@inheritdoc} */ public function link($text = NULL, $rel = 'canonical', array $options = []) { - if (is_null($text)) { + return $this->toLink($text, $rel, $options)->toString(); + } + + /** + * {@inheritdoc} + */ + public function toLink($text = NULL, $rel = 'canonical', array $options = []) { + if (!isset($text)) { $text = $this->label(); } - $url = $this->urlInfo($rel); + $url = $this->toUrl($rel); $options += $url->getOptions(); $url->setOptions($options); - return (new Link($text, $url))->toString(); + return new Link($text, $url); } /** * {@inheritdoc} */ public function url($rel = 'canonical', $options = array()) { - // While self::urlInfo() will throw an exception if the entity is new, + // While self::toUrl() will throw an exception if the entity has no id, // the expected result for a URL is always a string. - if ($this->isNew() || !$this->hasLinkTemplate($rel)) { + if ($this->id() === NULL || !$this->hasLinkTemplate($rel)) { return ''; } - $uri = $this->urlInfo($rel); + $uri = $this->toUrl($rel); $options += $uri->getOptions(); $uri->setOptions($options); return $uri->toString(); diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php index 1f476e583..62a8f4476 100644 --- a/core/lib/Drupal/Core/Entity/EntityInterface.php +++ b/core/lib/Drupal/Core/Entity/EntityInterface.php @@ -101,7 +101,29 @@ interface EntityInterface extends AccessibleInterface, CacheableDependencyInterf public function label(); /** - * Gets the URI elements of the entity. + * Gets the URL object for the entity. + * + * @param string $rel + * The link relationship type, for example: canonical or edit-form. + * @param array $options + * See \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute() for + * the available options. + * + * @return \Drupal\Core\Url + * The URL object. + * + * @deprecated in Drupal 8.0.0, intended to be removed in Drupal 9.0.0 + * Use toUrl() instead. + * + * @see \Drupal\Core\Entity\EntityInterface::toUrl + */ + public function urlInfo($rel = 'canonical', array $options = array()); + + /** + * Gets the URL object for the entity. + * + * The entity must have an id already. Content entities usually get their IDs + * by saving them. * * URI templates might be set in the links array in an annotation, for * example: @@ -128,8 +150,12 @@ interface EntityInterface extends AccessibleInterface, CacheableDependencyInterf * the available options. * * @return \Drupal\Core\Url + * The URL object. + * + * @throws \Drupal\Core\Entity\EntityMalformedException + * @throws \Drupal\Core\Entity\Exception\UndefinedLinkTemplateException */ - public function urlInfo($rel = 'canonical', array $options = array()); + public function toUrl($rel = 'canonical', array $options = array()); /** * Gets the public URL for this entity. @@ -142,9 +168,36 @@ interface EntityInterface extends AccessibleInterface, CacheableDependencyInterf * * @return string * The URL for this entity. + * + * @deprecated in Drupal 8.0.0, intended to be removed in Drupal 9.0.0 + * Please use toUrl() instead. + * + * @see \Drupal\Core\Entity\EntityInterface::toUrl */ public function url($rel = 'canonical', $options = array()); + /** + * Deprecated way of generating a link to the entity. See toLink(). + * + * @param string|null $text + * (optional) The link text for the anchor tag as a translated string. + * If NULL, it will use the entity's label. Defaults to NULL. + * @param string $rel + * (optional) The link relationship type. Defaults to 'canonical'. + * @param array $options + * See \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute() for + * the available options. + * + * @return string + * An HTML string containing a link to the entity. + * + * @deprecated in Drupal 8.0.0, intended to be removed in Drupal 9.0.0 + * Please use toLink() instead. + * + * @see \Drupal\Core\Entity\EntityInterface::toLink + */ + public function link($text = NULL, $rel = 'canonical', array $options = []); + /** * Generates the HTML for a link to this entity. * @@ -157,10 +210,13 @@ interface EntityInterface extends AccessibleInterface, CacheableDependencyInterf * See \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute() for * the available options. * - * @return string - * An HTML string containing a link to the entity. + * @return \Drupal\Core\Link + * A Link to the entity. + * + * @throws \Drupal\Core\Entity\EntityMalformedException + * @throws \Drupal\Core\Entity\Exception\UndefinedLinkTemplateException */ - public function link($text = NULL, $rel = 'canonical', array $options = []); + public function toLink($text = NULL, $rel = 'canonical', array $options = []); /** * Indicates if a link template exists for a given key. diff --git a/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionInterface.php b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionInterface.php index 83120d195..132b9a7b2 100644 --- a/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionInterface.php +++ b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionInterface.php @@ -30,7 +30,7 @@ interface SelectionInterface extends PluginFormInterface { public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0); /** - * Counts entities that are referenceable by a given field. + * Counts entities that are referenceable. * * @return int * The number of referenceable entities. @@ -38,7 +38,7 @@ interface SelectionInterface extends PluginFormInterface { public function countReferenceableEntities($match = NULL, $match_operator = 'CONTAINS'); /** - * Validates that entities can be referenced by this field. + * Validates which existing entities can be referenced. * * @return array * An array of valid entity IDs. diff --git a/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionWithAutocreateInterface.php b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionWithAutocreateInterface.php new file mode 100644 index 000000000..7010b91ad --- /dev/null +++ b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionWithAutocreateInterface.php @@ -0,0 +1,52 @@ +bundleInfo = $this->moduleHandler->invokeAll('entity_bundle_info'); - // First look for entity types that act as bundles for others, load them - // and add them as bundles. foreach ($this->entityTypeManager->getDefinitions() as $type => $entity_type) { - if ($entity_type->getBundleOf()) { - foreach ($this->entityTypeManager->getStorage($type)->loadMultiple() as $entity) { - $this->bundleInfo[$entity_type->getBundleOf()][$entity->id()]['label'] = $entity->label(); + // First look for entity types that act as bundles for others, load them + // and add them as bundles. + if ($bundle_entity_type = $entity_type->getBundleEntityType()) { + foreach ($this->entityTypeManager->getStorage($bundle_entity_type)->loadMultiple() as $entity) { + $this->bundleInfo[$type][$entity->id()]['label'] = $entity->label(); } } - } - foreach ($this->entityTypeManager->getDefinitions() as $type => $entity_type) { - // If no bundles are provided, use the entity type name and label. - if (!isset($this->bundleInfo[$type])) { + // If entity type bundles are not supported and + // hook_entity_bundle_info() has not already set up bundle + // information, use the entity type name and label. + elseif (!isset($this->bundleInfo[$type])) { $this->bundleInfo[$type][$type]['label'] = $entity_type->getLabel(); } } diff --git a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php index e25b92496..59d502bdb 100644 --- a/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php +++ b/core/lib/Drupal/Core/Entity/Plugin/EntityReferenceSelection/DefaultSelection.php @@ -11,6 +11,7 @@ use Drupal\Component\Utility\Html; use Drupal\Core\Database\Query\AlterableInterface; use Drupal\Core\Database\Query\SelectInterface; use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\Entity\EntityReferenceSelection\SelectionWithAutocreateInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem; use Drupal\Core\Form\FormStateInterface; @@ -18,6 +19,7 @@ use Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface; use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Plugin\PluginBase; use Drupal\Core\Session\AccountInterface; +use Drupal\user\EntityOwnerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -40,7 +42,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; * deriver = "Drupal\Core\Entity\Plugin\Derivative\DefaultSelectionDeriver" * ) */ -class DefaultSelection extends PluginBase implements SelectionInterface, ContainerFactoryPluginInterface { +class DefaultSelection extends PluginBase implements SelectionInterface, SelectionWithAutocreateInterface, ContainerFactoryPluginInterface { /** * The entity manager. @@ -288,6 +290,38 @@ class DefaultSelection extends PluginBase implements SelectionInterface, Contain return $result; } + /** + * {@inheritdoc} + */ + public function createNewEntity($entity_type_id, $bundle, $label, $uid) { + $entity_type = $this->entityManager->getDefinition($entity_type_id); + $bundle_key = $entity_type->getKey('bundle'); + $label_key = $entity_type->getKey('label'); + + $entity = $this->entityManager->getStorage($entity_type_id)->create(array( + $bundle_key => $bundle, + $label_key => $label, + )); + + if ($entity instanceof EntityOwnerInterface) { + $entity->setOwnerId($uid); + } + + return $entity; + } + + /** + * {@inheritdoc} + */ + public function validateReferenceableNewEntities(array $entities) { + return array_filter($entities, function ($entity) { + if (isset($this->configuration['handler_settings']['target_bundles'])) { + return in_array($entity->bundle(), $this->configuration['handler_settings']['target_bundles']); + } + return TRUE; + }); + } + /** * Builds an EntityQuery to get referenceable entities. * diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php index bf8658aa6..f27c22d17 100644 --- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php +++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php @@ -26,10 +26,24 @@ class ValidReferenceConstraint extends Constraint { * * @var string */ - public $message = 'The referenced entity (%type: %id) does not exist.'; + public $message = 'This entity (%type: %id) cannot be referenced.'; /** - * Validation message when the target_id is empty. + * Violation message when the entity does not exist. + * + * @var string + */ + public $nonExistingMessage = 'The referenced entity (%type: %id) does not exist.'; + + /** + * Violation message when a new entity ("autocreate") is invalid. + * + * @var string + */ + public $invalidAutocreateMessage = 'This entity (%type: %label) cannot be referenced.'; + + /** + * Violation message when the target_id is empty. * * @var string */ diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php index 8f704c1c7..f228bbcef 100644 --- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php +++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php @@ -7,39 +7,142 @@ namespace Drupal\Core\Entity\Plugin\Validation\Constraint; +use Drupal\Core\DependencyInjection\ContainerInjectionInterface; +use Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface; +use Drupal\Core\Entity\EntityReferenceSelection\SelectionWithAutocreateInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; /** * Checks if referenced entities are valid. */ -class ValidReferenceConstraintValidator extends ConstraintValidator { +class ValidReferenceConstraintValidator extends ConstraintValidator implements ContainerInjectionInterface { + + /** + * The selection plugin manager. + * + * @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface + */ + protected $selectionManager; + + /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + + /** + * Constructs a ValidReferenceConstraintValidator object. + * + * @param \Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginManagerInterface $selection_manager + * The selection plugin manager. + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. + */ + public function __construct(SelectionPluginManagerInterface $selection_manager, EntityTypeManagerInterface $entity_type_manager) { + $this->selectionManager = $selection_manager; + $this->entityTypeManager = $entity_type_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.entity_reference_selection'), + $container->get('entity_type.manager') + ); + } /** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { - /** @var \Drupal\Core\Field\FieldItemInterface $value */ + /** @var \Drupal\Core\Field\FieldItemListInterface $value */ /** @var ValidReferenceConstraint $constraint */ if (!isset($value)) { return; } - // We don't use a regular NotNull constraint for the target_id property as - // a NULL value is valid if the entity property contains an unsaved entity. - // @see \Drupal\Core\TypedData\DataReferenceTargetDefinition::getConstraints - if (!$value->isEmpty() && $value->target_id === NULL && !$value->entity->isNew()) { - $this->context->addViolation($constraint->nullMessage); + + // Collect new entities and IDs of existing entities across the field items. + $new_entities = []; + $target_ids = []; + foreach ($value as $delta => $item) { + $target_id = $item->target_id; + // We don't use a regular NotNull constraint for the target_id property as + // NULL is allowed if the entity property contains an unsaved entity. + // @see \Drupal\Core\TypedData\DataReferenceTargetDefinition::getConstraints() + if (!$item->isEmpty() && $target_id === NULL) { + if (!$item->entity->isNew()) { + $this->context->buildViolation($constraint->nullMessage) + ->atPath((string) $delta) + ->addViolation(); + return; + } + $new_entities[$delta] = $item->entity; + } + + // '0' or NULL are considered valid empty references. + if (!empty($target_id)) { + $target_ids[$delta] = $target_id; + } + } + + // Early opt-out if nothing to validate. + if (!$new_entities && !$target_ids) { return; } - $id = $value->get('target_id')->getValue(); - // '0' or NULL are considered valid empty references. - if (empty($id)) { - return; + + /** @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface $handler * */ + $handler = $this->selectionManager->getSelectionHandler($value->getFieldDefinition()); + $target_type_id = $value->getFieldDefinition()->getSetting('target_type'); + + // Add violations on deltas with a new entity that is not valid. + if ($new_entities) { + if ($handler instanceof SelectionWithAutocreateInterface) { + $valid_new_entities = $handler->validateReferenceableNewEntities($new_entities); + $invalid_new_entities = array_diff_key($new_entities, $valid_new_entities); + } + else { + // If the selection handler does not support referencing newly created + // entities, all of them should be invalidated. + $invalid_new_entities = $new_entities; + } + + foreach ($invalid_new_entities as $delta => $entity) { + $this->context->buildViolation($constraint->invalidAutocreateMessage) + ->setParameter('%type', $target_type_id) + ->setParameter('%label', $entity->label()) + ->atPath((string) $delta . '.entity') + ->setInvalidValue($entity) + ->addViolation(); + } } - $referenced_entity = $value->get('entity')->getValue(); - if (!$referenced_entity) { - $type = $value->getFieldDefinition()->getSetting('target_type'); - $this->context->addViolation($constraint->message, array('%type' => $type, '%id' => $id)); + + // Add violations on deltas with a target_id that is not valid. + if ($target_ids) { + $valid_target_ids = $handler->validateReferenceableEntities($target_ids); + if ($invalid_target_ids = array_diff($target_ids, $valid_target_ids)) { + // For accuracy of the error message, differentiate non-referenceable + // and non-existent entities. + $target_type = $this->entityTypeManager->getDefinition($target_type_id); + $existing_ids = $this->entityTypeManager->getStorage($target_type_id)->getQuery() + ->condition($target_type->getKey('id'), $invalid_target_ids, 'IN') + ->execute(); + foreach ($invalid_target_ids as $delta => $target_id) { + $message = in_array($target_id, $existing_ids) ? $constraint->message : $constraint->nonExistingMessage; + $this->context->buildViolation($message) + ->setParameter('%type', $target_type_id) + ->setParameter('%id', $target_id) + ->atPath((string) $delta . '.target_id') + ->setInvalidValue($target_id) + ->addViolation(); + } + } } } + } diff --git a/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php b/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php index f0b5907de..6a8ed399a 100644 --- a/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php +++ b/core/lib/Drupal/Core/Entity/Routing/DefaultHtmlRouteProvider.php @@ -7,7 +7,11 @@ namespace Drupal\Core\Entity\Routing; +use Drupal\Core\Entity\EntityHandlerInterface; +use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityTypeInterface; +use Drupal\Core\Entity\FieldableEntityInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; @@ -24,7 +28,33 @@ use Symfony\Component\Routing\RouteCollection; * * @internal */ -class DefaultHtmlRouteProvider implements EntityRouteProviderInterface { +class DefaultHtmlRouteProvider implements EntityRouteProviderInterface, EntityHandlerInterface { + + /** + * The entity manager. + * + * @var \Drupal\Core\Entity\EntityManagerInterface + */ + protected $entityManager; + + /** + * Constructs a new DefaultHtmlRouteProvider. + * + * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * The entity manager. + */ + public function __construct(EntityManagerInterface $entity_manager) { + $this->entityManager = $entity_manager; + } + + /** + * {@inheritdoc} + */ + public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { + return new static( + $container->get('entity.manager') + ); + } /** * {@inheritdoc} @@ -71,6 +101,12 @@ class DefaultHtmlRouteProvider implements EntityRouteProviderInterface { ->setOption('parameters', [ $entity_type_id => ['type' => 'entity:' . $entity_type_id], ]); + + // Entity types with serial IDs can specify this in their route + // requirements, improving the matching process. + if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') { + $route->setRequirement($entity_type_id, '\d+'); + } return $route; } } @@ -102,6 +138,12 @@ class DefaultHtmlRouteProvider implements EntityRouteProviderInterface { ->setOption('parameters', [ $entity_type_id => ['type' => 'entity:' . $entity_type_id], ]); + + // Entity types with serial IDs can specify this in their route + // requirements, improving the matching process. + if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') { + $route->setRequirement($entity_type_id, '\d+'); + } return $route; } } @@ -128,8 +170,33 @@ class DefaultHtmlRouteProvider implements EntityRouteProviderInterface { ->setOption('parameters', [ $entity_type_id => ['type' => 'entity:' . $entity_type_id], ]); + + // Entity types with serial IDs can specify this in their route + // requirements, improving the matching process. + if ($this->getEntityTypeIdKeyType($entity_type) === 'integer') { + $route->setRequirement($entity_type_id, '\d+'); + } return $route; } } + /** + * Gets the type of the ID key for a given entity type. + * + * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type + * An entity type. + * + * @return string|null + * The type of the ID key for a given entity type, or NULL if the entity + * type does not support fields. + */ + protected function getEntityTypeIdKeyType(EntityTypeInterface $entity_type) { + if (!$entity_type->isSubclassOf(FieldableEntityInterface::class)) { + return NULL; + } + + $field_storage_definitions = $this->entityManager->getFieldStorageDefinitions($entity_type->id()); + return $field_storage_definitions[$entity_type->getKey('id')]->getType(); + } + } diff --git a/core/lib/Drupal/Core/Entity/entity.api.php b/core/lib/Drupal/Core/Entity/entity.api.php index 8883f78d0..077c48473 100644 --- a/core/lib/Drupal/Core/Entity/entity.api.php +++ b/core/lib/Drupal/Core/Entity/entity.api.php @@ -1916,16 +1916,16 @@ function hook_entity_extra_field_info() { // Visibility of the ordering of the language selector is the same as on the // node/add form. if ($module_language_enabled) { - $configuration = ContentLanguageSettings::loadByEntityTypeBundle('node', $bundle->type); + $configuration = ContentLanguageSettings::loadByEntityTypeBundle('node', $bundle->id()); if ($configuration->isLanguageAlterable()) { - $extra['node'][$bundle->type]['form']['language'] = array( + $extra['node'][$bundle->id()]['form']['language'] = array( 'label' => t('Language'), 'description' => $description, 'weight' => 0, ); } } - $extra['node'][$bundle->type]['display']['language'] = array( + $extra['node'][$bundle->id()]['display']['language'] = array( 'label' => t('Language'), 'description' => $description, 'weight' => 0, @@ -1948,8 +1948,8 @@ function hook_entity_extra_field_info() { function hook_entity_extra_field_info_alter(&$info) { // Force node title to always be at the top of the list by default. foreach (NodeType::loadMultiple() as $bundle) { - if (isset($info['node'][$bundle->type]['form']['title'])) { - $info['node'][$bundle->type]['form']['title']['weight'] = -20; + if (isset($info['node'][$bundle->id()]['form']['title'])) { + $info['node'][$bundle->id()]['form']['title']['weight'] = -20; } } } diff --git a/core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php deleted file mode 100644 index f6f30fe9c..000000000 --- a/core/lib/Drupal/Core/EventSubscriber/ContentControllerSubscriber.php +++ /dev/null @@ -1,48 +0,0 @@ -getRequest(); - - if ($request->attributes->has('_form')) { - $request->attributes->set('_controller', 'controller.form:getContentResult'); - } - } - - /** - * Registers the methods in this class that should be listeners. - * - * @return array - * An array of event listener definitions. - */ - static function getSubscribedEvents() { - $events[KernelEvents::REQUEST][] = array('onRequestDeriveFormWrapper', 25); - - return $events; - } - -} diff --git a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php index 770b96f79..2ae21143b 100644 --- a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php @@ -147,7 +147,12 @@ class DefaultExceptionHtmlSubscriber extends HttpExceptionSubscriberBase { } $response = $this->httpKernel->handle($sub_request, HttpKernelInterface::SUB_REQUEST); - $response->setStatusCode($status_code); + // Only 2xx responses should have their status code overridden; any + // other status code should be passed on: redirects (3xx), error (5xx)… + // @see https://www.drupal.org/node/2603788#comment-10504916 + if ($response->isSuccessful()) { + $response->setStatusCode($status_code); + } // Persist any special HTTP headers that were set on the exception. if ($exception instanceof HttpExceptionInterface) { diff --git a/core/lib/Drupal/Core/EventSubscriber/HtmlResponsePlaceholderStrategySubscriber.php b/core/lib/Drupal/Core/EventSubscriber/HtmlResponsePlaceholderStrategySubscriber.php index 943b08bd1..c67f531cc 100644 --- a/core/lib/Drupal/Core/EventSubscriber/HtmlResponsePlaceholderStrategySubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/HtmlResponsePlaceholderStrategySubscriber.php @@ -48,10 +48,6 @@ class HtmlResponsePlaceholderStrategySubscriber implements EventSubscriberInterf * The event to process. */ public function onRespond(FilterResponseEvent $event) { - if (!$event->isMasterRequest()) { - return; - } - $response = $event->getResponse(); if (!$response instanceof HtmlResponse) { return; diff --git a/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php index 6fada86d8..be64602ad 100644 --- a/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/HtmlResponseSubscriber.php @@ -42,10 +42,6 @@ class HtmlResponseSubscriber implements EventSubscriberInterface { * The event to process. */ public function onRespond(FilterResponseEvent $event) { - if (!$event->isMasterRequest()) { - return; - } - $response = $event->getResponse(); if (!$response instanceof HtmlResponse) { return; diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php index 1988a143d..c3d868428 100644 --- a/core/lib/Drupal/Core/Extension/ThemeHandler.php +++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php @@ -483,4 +483,18 @@ class ThemeHandler implements ThemeHandlerInterface { throw new \InvalidArgumentException(sprintf('The theme %s does not exist.', $name)); } + /** + * {@inheritdoc} + */ + public function hasUi($name) { + $themes = $this->listInfo(); + if (isset($themes[$name])) { + if (!empty($themes[$name]->info['hidden'])) { + $theme_config = $this->configFactory->get('system.theme'); + return $name == $theme_config->get('default') || $name == $theme_config->get('admin'); + } + return TRUE; + } + return FALSE; + } } diff --git a/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php b/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php index c46f96a00..8b59ae3b8 100644 --- a/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php +++ b/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php @@ -208,4 +208,18 @@ interface ThemeHandlerInterface { */ public function getTheme($name); + /** + * Determines if a theme should be shown in the user interface. + * + * To be shown in the UI the theme has to be installed. If the theme is hidden + * it will not be shown unless it is the default or admin theme. + * + * @param string $name + * The name of the theme to check. + * + * @return bool + * TRUE if the theme should be shown in the UI, FALSE if not. + */ + public function hasUi($name); + } diff --git a/core/lib/Drupal/Core/Field/EntityReferenceFieldItemList.php b/core/lib/Drupal/Core/Field/EntityReferenceFieldItemList.php index 4217b2ea9..cd221d24b 100644 --- a/core/lib/Drupal/Core/Field/EntityReferenceFieldItemList.php +++ b/core/lib/Drupal/Core/Field/EntityReferenceFieldItemList.php @@ -15,6 +15,16 @@ use Drupal\Core\Form\FormStateInterface; */ class EntityReferenceFieldItemList extends FieldItemList implements EntityReferenceFieldItemListInterface { + /** + * {@inheritdoc} + */ + public function getConstraints() { + $constraints = parent::getConstraints(); + $constraint_manager = $this->getTypedDataManager()->getValidationConstraintManager(); + $constraints[] = $constraint_manager->create('ValidReference', []); + return $constraints; + } + /** * {@inheritdoc} */ diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php index 9e76afbd2..9ad1a9d29 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php @@ -40,9 +40,6 @@ use Drupal\Core\Validation\Plugin\Validation\Constraint\AllowedValuesConstraint; * default_widget = "entity_reference_autocomplete", * default_formatter = "entity_reference_label", * list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList", - * default_widget = "entity_reference_autocomplete", - * default_formatter = "entity_reference_label", - * constraints = {"ValidReference" = {}} * ) */ class EntityReferenceItem extends FieldItemBase implements OptionsProviderInterface, PreconfiguredFieldUiOptionsInterface { @@ -165,20 +162,6 @@ class EntityReferenceItem extends FieldItemBase implements OptionsProviderInterf unset($constraints[$key]); } } - list($current_handler) = explode(':', $this->getSetting('handler'), 2); - if ($current_handler === 'default') { - $handler_settings = $this->getSetting('handler_settings'); - if (isset($handler_settings['target_bundles'])) { - $constraint_manager = \Drupal::typedDataManager()->getValidationConstraintManager(); - $constraints[] = $constraint_manager->create('ComplexData', [ - 'entity' => [ - 'Bundle' => [ - 'bundle' => $handler_settings['target_bundles'], - ], - ], - ]); - } - } return $constraints; } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php index 1481d884e..9d62405a1 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UriItem.php @@ -7,6 +7,8 @@ namespace Drupal\Core\Field\Plugin\Field\FieldType; +use Drupal\Component\Utility\Unicode; +use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\TypedData\DataDefinition; @@ -77,4 +79,16 @@ class UriItem extends StringItem { return parent::isEmpty(); } + /** + * {@inheritdoc} + */ + public static function generateSampleValue(FieldDefinitionInterface $field_definition) { + $values = parent::generateSampleValue($field_definition); + $suffix_length = $field_definition->getSetting('max_length') - 7; + foreach ($values as $key => $value) { + $values[$key] = 'http://' . Unicode::substr($value, 0, $suffix_length); + } + return $values; + } + } diff --git a/core/lib/Drupal/Core/Menu/LocalTaskManager.php b/core/lib/Drupal/Core/Menu/LocalTaskManager.php index 512ccfea9..1791efebe 100644 --- a/core/lib/Drupal/Core/Menu/LocalTaskManager.php +++ b/core/lib/Drupal/Core/Menu/LocalTaskManager.php @@ -304,7 +304,9 @@ class LocalTaskManager extends DefaultPluginManager implements LocalTaskManagerI } // Pre-fetch all routes involved in the tree. This reduces the number // of SQL queries that would otherwise be triggered by the access manager. - $routes = $route_names ? $this->routeProvider->getRoutesByNames($route_names) : array(); + if ($route_names) { + $this->routeProvider->getRoutesByNames($route_names); + } foreach ($tree as $level => $instances) { /** @var $instances \Drupal\Core\Menu\LocalTaskInterface[] */ diff --git a/core/lib/Drupal/Core/Menu/MenuLinkManager.php b/core/lib/Drupal/Core/Menu/MenuLinkManager.php index 106407b2b..beb0d95f7 100644 --- a/core/lib/Drupal/Core/Menu/MenuLinkManager.php +++ b/core/lib/Drupal/Core/Menu/MenuLinkManager.php @@ -351,8 +351,11 @@ class MenuLinkManager implements MenuLinkManagerInterface { * {@inheritdoc} */ public function addDefinition($id, array $definition) { - if ($this->treeStorage->load($id) || $id === '') { - throw new PluginException("The ID $id already exists as a plugin definition or is not valid"); + if ($this->treeStorage->load($id)) { + throw new PluginException("The menu link ID $id already exists as a plugin definition"); + } + elseif ($id === '') { + throw new PluginException("The menu link ID cannot be empty"); } // Add defaults, so there is no requirement to specify everything. $this->processDefinition($definition, $id); diff --git a/core/lib/Drupal/Core/Menu/MenuLinkTree.php b/core/lib/Drupal/Core/Menu/MenuLinkTree.php index 5b3aee85f..3c71930f3 100644 --- a/core/lib/Drupal/Core/Menu/MenuLinkTree.php +++ b/core/lib/Drupal/Core/Menu/MenuLinkTree.php @@ -177,6 +177,7 @@ class MenuLinkTree implements MenuLinkTreeInterface { // Add the theme wrapper for outer markup. // Allow menu-specific theme overrides. $build['#theme'] = 'menu__' . strtr($menu_name, '-', '_'); + $build['#menu_name'] = $menu_name; $build['#items'] = $items; // Set cache tag. $build['#cache']['tags'][] = 'config:system.menu.' . $menu_name; diff --git a/core/lib/Drupal/Core/Path/AliasStorage.php b/core/lib/Drupal/Core/Path/AliasStorage.php index 899c39e08..8caae97e6 100644 --- a/core/lib/Drupal/Core/Path/AliasStorage.php +++ b/core/lib/Drupal/Core/Path/AliasStorage.php @@ -11,9 +11,14 @@ use Drupal\Core\Cache\Cache; use Drupal\Core\Database\Connection; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Database\Query\Condition; /** * Provides a class for CRUD operations on path aliases. + * + * All queries perform case-insensitive matching on the 'source' and 'alias' + * fields, so the aliases '/test-alias' and '/test-Alias' are considered to be + * the same, and will both refer to the same internal system path. */ class AliasStorage implements AliasStorageInterface { /** @@ -98,7 +103,13 @@ class AliasStorage implements AliasStorageInterface { public function load($conditions) { $select = $this->connection->select('url_alias'); foreach ($conditions as $field => $value) { - $select->condition($field, $value); + if ($field == 'source' || $field == 'alias') { + // Use LIKE for case-insensitive matching. + $select->condition($field, $this->connection->escapeLike($value), 'LIKE'); + } + else { + $select->condition($field, $value); + } } return $select ->fields('url_alias') @@ -115,7 +126,13 @@ class AliasStorage implements AliasStorageInterface { $path = $this->load($conditions); $query = $this->connection->delete('url_alias'); foreach ($conditions as $field => $value) { - $query->condition($field, $value); + if ($field == 'source' || $field == 'alias') { + // Use LIKE for case-insensitive matching. + $query->condition($field, $this->connection->escapeLike($value), 'LIKE'); + } + else { + $query->condition($field, $value); + } } $deleted = $query->execute(); // @todo Switch to using an event for this instead of a hook. @@ -128,90 +145,101 @@ class AliasStorage implements AliasStorageInterface { * {@inheritdoc} */ public function preloadPathAlias($preloaded, $langcode) { - $args = array( - ':system[]' => $preloaded, - ':langcode' => $langcode, - ':langcode_undetermined' => LanguageInterface::LANGCODE_NOT_SPECIFIED, - ); + $langcode_list = [$langcode, LanguageInterface::LANGCODE_NOT_SPECIFIED]; + $select = $this->connection->select('url_alias') + ->fields('url_alias', ['source', 'alias']); + + if (!empty($preloaded)) { + $conditions = new Condition('OR'); + foreach ($preloaded as $preloaded_item) { + $conditions->condition('source', $this->connection->escapeLike($preloaded_item), 'LIKE'); + } + $select->condition($conditions); + } + // Always get the language-specific alias before the language-neutral one. // For example 'de' is less than 'und' so the order needs to be ASC, while // 'xx-lolspeak' is more than 'und' so the order needs to be DESC. We also // order by pid ASC so that fetchAllKeyed() returns the most recently // created alias for each source. Subsequent queries using fetchField() must - // use pid DESC to have the same effect. For performance reasons, the query - // builder is not used here. + // use pid DESC to have the same effect. if ($langcode == LanguageInterface::LANGCODE_NOT_SPECIFIED) { - // Prevent PDO from complaining about a token the query doesn't use. - unset($args[':langcode']); - $result = $this->connection->query('SELECT source, alias FROM {url_alias} WHERE source IN ( :system[] ) AND langcode = :langcode_undetermined ORDER BY pid ASC', $args); + array_pop($langcode_list); } elseif ($langcode < LanguageInterface::LANGCODE_NOT_SPECIFIED) { - $result = $this->connection->query('SELECT source, alias FROM {url_alias} WHERE source IN ( :system[] ) AND langcode IN (:langcode, :langcode_undetermined) ORDER BY langcode ASC, pid ASC', $args); + $select->orderBy('langcode', 'ASC'); } else { - $result = $this->connection->query('SELECT source, alias FROM {url_alias} WHERE source IN ( :system[] ) AND langcode IN (:langcode, :langcode_undetermined) ORDER BY langcode DESC, pid ASC', $args); + $select->orderBy('langcode', 'DESC'); } - return $result->fetchAllKeyed(); + $select->orderBy('pid', 'ASC'); + $select->condition('langcode', $langcode_list, 'IN'); + return $select->execute()->fetchAllKeyed(); } /** * {@inheritdoc} */ public function lookupPathAlias($path, $langcode) { - $args = array( - ':source' => $path, - ':langcode' => $langcode, - ':langcode_undetermined' => LanguageInterface::LANGCODE_NOT_SPECIFIED, - ); - // See the queries above. + $source = $this->connection->escapeLike($path); + $langcode_list = [$langcode, LanguageInterface::LANGCODE_NOT_SPECIFIED]; + + // See the queries above. Use LIKE for case-insensitive matching. + $select = $this->connection->select('url_alias') + ->fields('url_alias', ['alias']) + ->condition('source', $source, 'LIKE'); if ($langcode == LanguageInterface::LANGCODE_NOT_SPECIFIED) { - unset($args[':langcode']); - $alias = $this->connection->query("SELECT alias FROM {url_alias} WHERE source = :source AND langcode = :langcode_undetermined ORDER BY pid DESC", $args)->fetchField(); + array_pop($langcode_list); } elseif ($langcode > LanguageInterface::LANGCODE_NOT_SPECIFIED) { - $alias = $this->connection->query("SELECT alias FROM {url_alias} WHERE source = :source AND langcode IN (:langcode, :langcode_undetermined) ORDER BY langcode DESC, pid DESC", $args)->fetchField(); + $select->orderBy('langcode', 'DESC'); } else { - $alias = $this->connection->query("SELECT alias FROM {url_alias} WHERE source = :source AND langcode IN (:langcode, :langcode_undetermined) ORDER BY langcode ASC, pid DESC", $args)->fetchField(); + $select->orderBy('langcode', 'ASC'); } - return $alias; + $select->orderBy('pid', 'DESC'); + $select->condition('langcode', $langcode_list, 'IN'); + return $select->execute()->fetchField(); } /** * {@inheritdoc} */ public function lookupPathSource($path, $langcode) { - $args = array( - ':alias' => $path, - ':langcode' => $langcode, - ':langcode_undetermined' => LanguageInterface::LANGCODE_NOT_SPECIFIED, - ); - // See the queries above. + $alias = $this->connection->escapeLike($path); + $langcode_list = [$langcode, LanguageInterface::LANGCODE_NOT_SPECIFIED]; + + // See the queries above. Use LIKE for case-insensitive matching. + $select = $this->connection->select('url_alias') + ->fields('url_alias', ['source']) + ->condition('alias', $alias, 'LIKE'); if ($langcode == LanguageInterface::LANGCODE_NOT_SPECIFIED) { - unset($args[':langcode']); - $result = $this->connection->query("SELECT source FROM {url_alias} WHERE alias = :alias AND langcode = :langcode_undetermined ORDER BY pid DESC", $args); + array_pop($langcode_list); } elseif ($langcode > LanguageInterface::LANGCODE_NOT_SPECIFIED) { - $result = $this->connection->query("SELECT source FROM {url_alias} WHERE alias = :alias AND langcode IN (:langcode, :langcode_undetermined) ORDER BY langcode DESC, pid DESC", $args); + $select->orderBy('langcode', 'DESC'); } else { - $result = $this->connection->query("SELECT source FROM {url_alias} WHERE alias = :alias AND langcode IN (:langcode, :langcode_undetermined) ORDER BY langcode ASC, pid DESC", $args); + $select->orderBy('langcode', 'ASC'); } - return $result->fetchField(); + $select->orderBy('pid', 'DESC'); + $select->condition('langcode', $langcode_list, 'IN'); + return $select->execute()->fetchField(); } /** * {@inheritdoc} */ public function aliasExists($alias, $langcode, $source = NULL) { + // Use LIKE and NOT LIKE for case-insensitive matching. $query = $this->connection->select('url_alias') - ->condition('alias', $alias) + ->condition('alias', $this->connection->escapeLike($alias), 'LIKE') ->condition('langcode', $langcode); if (!empty($source)) { - $query->condition('source', $source, '<>'); + $query->condition('source', $this->connection->escapeLike($source), 'NOT LIKE'); } $query->addExpression('1'); $query->range(0, 1); diff --git a/core/lib/Drupal/Core/Path/AliasStorageInterface.php b/core/lib/Drupal/Core/Path/AliasStorageInterface.php index 5ac77a3ef..3b9c4eecd 100644 --- a/core/lib/Drupal/Core/Path/AliasStorageInterface.php +++ b/core/lib/Drupal/Core/Path/AliasStorageInterface.php @@ -44,6 +44,9 @@ interface AliasStorageInterface { /** * Fetches a specific URL alias from the database. * + * The default implementation performs case-insensitive matching on the + * 'source' and 'alias' strings. + * * @param array $conditions * An array of query conditions. * @@ -60,6 +63,9 @@ interface AliasStorageInterface { /** * Deletes a URL alias. * + * The default implementation performs case-insensitive matching on the + * 'source' and 'alias' strings. + * * @param array $conditions * An array of criteria. */ @@ -82,6 +88,9 @@ interface AliasStorageInterface { /** * Returns an alias of Drupal system URL. * + * The default implementation performs case-insensitive matching on the + * 'source' and 'alias' strings. + * * @param string $path * The path to investigate for corresponding path aliases. * @param string $langcode @@ -96,6 +105,9 @@ interface AliasStorageInterface { /** * Returns Drupal system URL of an alias. * + * The default implementation performs case-insensitive matching on the + * 'source' and 'alias' strings. + * * @param string $path * The path to investigate for corresponding system URLs. * @param string $langcode @@ -110,6 +122,9 @@ interface AliasStorageInterface { /** * Checks if alias already exists. * + * The default implementation performs case-insensitive matching on the + * 'source' and 'alias' strings. + * * @param string $alias * Alias to check against. * @param string $langcode @@ -135,8 +150,9 @@ interface AliasStorageInterface { * * @param array $header * Table header. - * @param string[]|null $keys - * (optional) Search keys. + * @param string|null $keys + * (optional) Search keyword that may include one or more '*' as wildcard + * values. * * @return array * Array of items to be displayed on the current page. diff --git a/core/lib/Drupal/Core/PathProcessor/OutboundPathProcessorInterface.php b/core/lib/Drupal/Core/PathProcessor/OutboundPathProcessorInterface.php index 59f2d0c51..cad93c269 100644 --- a/core/lib/Drupal/Core/PathProcessor/OutboundPathProcessorInterface.php +++ b/core/lib/Drupal/Core/PathProcessor/OutboundPathProcessorInterface.php @@ -21,8 +21,27 @@ interface OutboundPathProcessorInterface { * @param string $path * The path to process, with a leading slash. * @param array $options - * An array of options such as would be passed to the generator's - * generateFromRoute() method. + * (optional) An associative array of additional options, with the following + * elements: + * - 'query': An array of query key/value-pairs (without any URL-encoding) + * to append to the URL. + * - 'fragment': A fragment identifier (named anchor) to append to the URL. + * Do not include the leading '#' character. + * - 'absolute': Defaults to FALSE. Whether to force the output to be an + * absolute link (beginning with http:). Useful for links that will be + * displayed outside the site, such as in an RSS feed. + * - 'language': An optional language object used to look up the alias + * for the URL. If $options['language'] is omitted, it defaults to the + * current language for the language type LanguageInterface::TYPE_URL. + * - 'https': Whether this URL should point to a secure location. If not + * defined, the current scheme is used, so the user stays on HTTP or HTTPS + * respectively. TRUE enforces HTTPS and FALSE enforces HTTP. + * - 'base_url': Only used internally by a path processor, for example, to + * modify the base URL when a language dependent URL requires so. + * - 'prefix': Only used internally, to modify the path when a language + * dependent URL requires so. + * - 'route': The route object for the given path. It will be set by + * \Drupal\Core\Routing\UrlGenerator::generateFromRoute(). * @param \Symfony\Component\HttpFoundation\Request $request * The HttpRequest object representing the current request. * @param \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata diff --git a/core/lib/Drupal/Core/Render/Element/RenderElement.php b/core/lib/Drupal/Core/Render/Element/RenderElement.php index 47c84024c..b6f95bcd6 100644 --- a/core/lib/Drupal/Core/Render/Element/RenderElement.php +++ b/core/lib/Drupal/Core/Render/Element/RenderElement.php @@ -269,6 +269,11 @@ abstract class RenderElement extends PluginBase implements ElementInterface { return $element; } + // Add a data attribute to disable automatic refocus after ajax call. + if (!empty($element['#ajax']['disable-refocus'])) { + $element['#attributes']['data-disable-refocus'] = "true"; + } + // Add a reasonable default event handler if none was specified. if (isset($element['#ajax']) && !isset($element['#ajax']['event'])) { switch ($element['#type']) { diff --git a/core/lib/Drupal/Core/Routing/Enhancer/FormRouteEnhancer.php b/core/lib/Drupal/Core/Routing/Enhancer/FormRouteEnhancer.php new file mode 100644 index 000000000..863accad9 --- /dev/null +++ b/core/lib/Drupal/Core/Routing/Enhancer/FormRouteEnhancer.php @@ -0,0 +1,33 @@ +hasDefault('_form') && !$route->hasDefault('_controller'); + } + + /** + * {@inheritdoc} + */ + public function enhance(array $defaults, Request $request) { + $defaults['_controller'] = 'controller.form:getContentResult'; + return $defaults; + } + +} diff --git a/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php b/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php index 3c1d282ec..a476006e5 100644 --- a/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php +++ b/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php @@ -44,8 +44,12 @@ class ParamConversionEnhancer implements RouteEnhancerInterface, EventSubscriber * {@inheritdoc} */ public function enhance(array $defaults, Request $request) { - $defaults['_raw_variables'] = $this->copyRawVariables($defaults); - return $this->paramConverterManager->convert($defaults); + // Just run the parameter conversion once per request. + if (!isset($defaults['_raw_variables'])) { + $defaults['_raw_variables'] = $this->copyRawVariables($defaults); + $defaults = $this->paramConverterManager->convert($defaults); + } + return $defaults; } /** diff --git a/core/lib/Drupal/Core/Routing/RouteProvider.php b/core/lib/Drupal/Core/Routing/RouteProvider.php index 937cff71f..ac8188790 100644 --- a/core/lib/Drupal/Core/Routing/RouteProvider.php +++ b/core/lib/Drupal/Core/Routing/RouteProvider.php @@ -246,7 +246,7 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv * @return array * An array of outlines that could match the specified path parts. */ - public function getCandidateOutlines(array $parts) { + protected function getCandidateOutlines(array $parts) { $number_parts = count($parts); $ancestors = array(); $length = $number_parts - 1; @@ -355,7 +355,7 @@ class RouteProvider implements PreloadableRouteProviderInterface, PagedRouteProv /** * Comparison function for usort on routes. */ - public function routeProviderRouteCompare(array $a, array $b) { + protected function routeProviderRouteCompare(array $a, array $b) { if ($a['fit'] == $b['fit']) { return strcmp($a['name'], $b['name']); } diff --git a/core/lib/Drupal/Core/Routing/UrlGenerator.php b/core/lib/Drupal/Core/Routing/UrlGenerator.php index f3d1275b2..62ece640d 100644 --- a/core/lib/Drupal/Core/Routing/UrlGenerator.php +++ b/core/lib/Drupal/Core/Routing/UrlGenerator.php @@ -309,6 +309,9 @@ class UrlGenerator implements UrlGeneratorInterface { $name = $this->getRouteDebugMessage($name); $this->processRoute($name, $route, $parameters, $generated_url); $path = $this->getInternalPathFromRoute($name, $route, $parameters, $query_params); + // Outbound path processors might need the route object for the path, e.g. + // to get the path pattern. + $options['route'] = $route; $path = $this->processPath($path, $options, $generated_url); if (!empty($options['prefix'])) { diff --git a/core/lib/Drupal/Core/Routing/UrlGeneratorInterface.php b/core/lib/Drupal/Core/Routing/UrlGeneratorInterface.php index 7c33fd4b6..eb77445c8 100644 --- a/core/lib/Drupal/Core/Routing/UrlGeneratorInterface.php +++ b/core/lib/Drupal/Core/Routing/UrlGeneratorInterface.php @@ -77,6 +77,10 @@ interface UrlGeneratorInterface extends VersatileGeneratorInterface { * @throws \Symfony\Component\Routing\Exception\InvalidParameterException * Thrown when a parameter value for a placeholder is not correct because it * does not match the requirement. + * + * @internal + * Should not be used in user code. + * Use \Drupal\Core\Url instead. */ public function generateFromRoute($name, $parameters = array(), $options = array(), $collect_bubbleable_metadata = FALSE); diff --git a/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php b/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php index db8019b18..514cad3e0 100644 --- a/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php +++ b/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php @@ -47,28 +47,41 @@ class ReverseProxyMiddleware implements HttpKernelInterface { */ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) { // Initialize proxy settings. - if ($this->settings->get('reverse_proxy', FALSE)) { - $ip_header = $this->settings->get('reverse_proxy_header', 'X_FORWARDED_FOR'); + static::setSettingsOnRequest($request, $this->settings); + return $this->httpKernel->handle($request, $type, $catch); + } + + /** + * Sets reverse proxy settings on Request object. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * A Request instance. + * @param \Drupal\Core\Site\Settings $settings + * The site settings. + */ + public static function setSettingsOnRequest(Request $request, Settings $settings) { + // Initialize proxy settings. + if ($settings->get('reverse_proxy', FALSE)) { + $ip_header = $settings->get('reverse_proxy_header', 'X_FORWARDED_FOR'); $request::setTrustedHeaderName($request::HEADER_CLIENT_IP, $ip_header); - $proto_header = $this->settings->get('reverse_proxy_proto_header', 'X_FORWARDED_PROTO'); + $proto_header = $settings->get('reverse_proxy_proto_header', 'X_FORWARDED_PROTO'); $request::setTrustedHeaderName($request::HEADER_CLIENT_PROTO, $proto_header); - $host_header = $this->settings->get('reverse_proxy_host_header', 'X_FORWARDED_HOST'); + $host_header = $settings->get('reverse_proxy_host_header', 'X_FORWARDED_HOST'); $request::setTrustedHeaderName($request::HEADER_CLIENT_HOST, $host_header); - $port_header = $this->settings->get('reverse_proxy_port_header', 'X_FORWARDED_PORT'); + $port_header = $settings->get('reverse_proxy_port_header', 'X_FORWARDED_PORT'); $request::setTrustedHeaderName($request::HEADER_CLIENT_PORT, $port_header); - $forwarded_header = $this->settings->get('reverse_proxy_forwarded_header', 'FORWARDED'); + $forwarded_header = $settings->get('reverse_proxy_forwarded_header', 'FORWARDED'); $request::setTrustedHeaderName($request::HEADER_FORWARDED, $forwarded_header); - $proxies = $this->settings->get('reverse_proxy_addresses', array()); + $proxies = $settings->get('reverse_proxy_addresses', array()); if (count($proxies) > 0) { $request::setTrustedProxies($proxies); } } - return $this->httpKernel->handle($request, $type, $catch); } } diff --git a/core/lib/Drupal/Core/StringTranslation/TranslationManager.php b/core/lib/Drupal/Core/StringTranslation/TranslationManager.php index e9962d6eb..872d57f63 100644 --- a/core/lib/Drupal/Core/StringTranslation/TranslationManager.php +++ b/core/lib/Drupal/Core/StringTranslation/TranslationManager.php @@ -134,6 +134,11 @@ class TranslationManager implements TranslationInterface, TranslatorInterface { * The translated string. */ protected function doTranslate($string, array $options = array()) { + // If a NULL langcode has been provided, unset it. + if (!isset($options['langcode']) && array_key_exists('langcode', $options)) { + unset($options['langcode']); + } + // Merge in options defaults. $options = $options + [ 'langcode' => $this->defaultLangcode, diff --git a/core/lib/Drupal/Core/Template/Attribute.php b/core/lib/Drupal/Core/Template/Attribute.php index 26a1793cd..8aaac3bb0 100644 --- a/core/lib/Drupal/Core/Template/Attribute.php +++ b/core/lib/Drupal/Core/Template/Attribute.php @@ -117,10 +117,11 @@ class Attribute implements \ArrayAccess, \IteratorAggregate, MarkupInterface { * An AttributeValueBase representation of the attribute's value. */ protected function createAttributeValue($name, $value) { - // If the value is already an AttributeValueBase object, return it - // straight away. + // If the value is already an AttributeValueBase object, + // return a new instance of the same class, but with the new name. if ($value instanceof AttributeValueBase) { - return $value; + $class = get_class($value); + return new $class($name, $value->value()); } // An array value or 'class' attribute name are forced to always be an // AttributeArray value for consistency. diff --git a/core/lib/Drupal/Core/Theme/MissingThemeDependencyException.php b/core/lib/Drupal/Core/Theme/MissingThemeDependencyException.php new file mode 100644 index 000000000..0708450f8 --- /dev/null +++ b/core/lib/Drupal/Core/Theme/MissingThemeDependencyException.php @@ -0,0 +1,47 @@ +theme = $theme; + } + + /** + * Gets the machine name of the missing theme. + * + * @return string + * The machine name of the theme that is missing. + */ + public function getMissingThemeName() { + return $this->theme; + } + +} diff --git a/core/lib/Drupal/Core/Theme/ThemeInitialization.php b/core/lib/Drupal/Core/Theme/ThemeInitialization.php index 95f27a9d0..d0c91662e 100644 --- a/core/lib/Drupal/Core/Theme/ThemeInitialization.php +++ b/core/lib/Drupal/Core/Theme/ThemeInitialization.php @@ -109,6 +109,16 @@ class ThemeInitialization implements ThemeInitializationInterface { $ancestor = $theme_name; while ($ancestor && isset($themes[$ancestor]->base_theme)) { $ancestor = $themes[$ancestor]->base_theme; + if (!$this->themeHandler->themeExists($ancestor)) { + if ($ancestor == 'stable') { + // Themes that depend on Stable will be fixed by system_update_8014(). + // There is no harm in not adding it as an ancestor since at worst + // some people might experience slight visual regressions on + // update.php. + continue; + } + throw new MissingThemeDependencyException(sprintf('Base theme %s has not been installed.', $ancestor), $ancestor); + } $base_themes[] = $themes[$ancestor]; } diff --git a/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php b/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php index f2b1547ed..a3b54df0b 100644 --- a/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php +++ b/core/lib/Drupal/Core/Theme/ThemeInitializationInterface.php @@ -34,6 +34,9 @@ interface ThemeInitializationInterface { * * @return \Drupal\Core\Theme\ActiveTheme * An active theme object instance for the given theme. + * + * @throws \Drupal\Core\Theme\MissingThemeDependencyException + * Thrown when base theme for installed theme is not installed. */ public function getActiveThemeByName($theme_name); @@ -54,8 +57,8 @@ interface ThemeInitializationInterface { * @param \Drupal\Core\Extension\Extension $theme * The theme extension object. * @param \Drupal\Core\Extension\Extension[] $base_themes - * An array of extension objects of base theme and its bases. It is ordered - * by 'oldest first', meaning the top level of the chain will be first. + * An array of extension objects of base theme and its bases. It is ordered + * by 'next parent first', meaning the top level of the chain will be first. * * @return \Drupal\Core\Theme\ActiveTheme * The active theme instance for the passed in $theme. diff --git a/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php b/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php index 10aa8c6fc..8029d7093 100644 --- a/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php +++ b/core/lib/Drupal/Core/Utility/LinkGeneratorInterface.php @@ -72,6 +72,9 @@ interface LinkGeneratorInterface { * @throws \Symfony\Component\Routing\Exception\InvalidParameterException * Thrown when a parameter value for a placeholder is not correct because it * does not match the requirement. + * + * @internal + * Should not be used in user code. Use \Drupal\Core\Link instead. */ public function generate($text, Url $url); @@ -84,6 +87,10 @@ interface LinkGeneratorInterface { * @return \Drupal\Core\GeneratedLink * A GeneratedLink object containing a link to the given route and * parameters and bubbleable metadata. + * + * @internal + * Should not be used in user code. + * Use \Drupal\Core\Link instead. */ public function generateFromLink(Link $link); diff --git a/core/misc/ajax.js b/core/misc/ajax.js index 2a6616dc7..b63bc0344 100644 --- a/core/misc/ajax.js +++ b/core/misc/ajax.js @@ -735,9 +735,36 @@ } $(this.element).prop('disabled', false); + // Save element's ancestors tree so if the element is removed from the dom + // we can try to refocus one of its parents. Using addBack reverse the + // result array, meaning that index 0 is the highest parent in the hierarchy + // in this situation it is usually a
element. + var elementParents = $(this.element).parents('[data-drupal-selector]').addBack().toArray(); + + // Track if any command is altering the focus so we can avoid changing the + // focus set by the Ajax command. + var focusChanged = false; for (var i in response) { if (response.hasOwnProperty(i) && response[i].command && this.commands[response[i].command]) { this.commands[response[i].command](this, response[i], status); + if (response[i].command === 'invoke' && response[i].method === 'focus') { + focusChanged = true; + } + } + } + + // If the focus hasn't be changed by the ajax commands, try to refocus the + // triggering element or one of its parents if that element does not exist + // anymore. + if (!focusChanged && this.element && !$(this.element).data('disable-refocus')) { + var target = false; + + for (var n = elementParents.length - 1; !target && n > 0; n--) { + target = document.querySelector('[data-drupal-selector="' + elementParents[n].getAttribute('data-drupal-selector') + '"]'); + } + + if (target) { + $(target).trigger('focus'); } } diff --git a/core/misc/drupalSettingsLoader.js b/core/misc/drupalSettingsLoader.js index da61b7edd..7ff292efb 100644 --- a/core/misc/drupalSettingsLoader.js +++ b/core/misc/drupalSettingsLoader.js @@ -7,7 +7,8 @@ 'use strict'; - var settingsElement = document.querySelector('script[type="application/json"][data-drupal-selector="drupal-settings-json"]'); + // Use direct child elements to harden against XSS exploits when CSP is on. + var settingsElement = document.querySelector('head > script[type="application/json"][data-drupal-selector="drupal-settings-json"], body > script[type="application/json"][data-drupal-selector="drupal-settings-json"]'); /** * Variable generated by Drupal with all the configuration created from PHP. diff --git a/core/misc/progress.js b/core/misc/progress.js index bf678f55b..26757518e 100644 --- a/core/misc/progress.js +++ b/core/misc/progress.js @@ -120,6 +120,7 @@ type: this.method, url: uri, data: '', + dataType: 'json', success: function (progress) { // Display errors. if (progress.status === 0) { diff --git a/core/misc/tabledrag.js b/core/misc/tabledrag.js index aa512acea..6a27d8fb2 100644 --- a/core/misc/tabledrag.js +++ b/core/misc/tabledrag.js @@ -236,14 +236,10 @@ // Add event bindings to the document. The self variable is passed along // as event handlers do not have direct access to the tableDrag object. - if (Modernizr.touchevents) { - $(document).on('touchmove', function (event) { return self.dragRow(event.originalEvent.touches[0], self); }); - $(document).on('touchend', function (event) { return self.dropRow(event.originalEvent.touches[0], self); }); - } - else { - $(document).on('mousemove', function (event) { return self.dragRow(event, self); }); - $(document).on('mouseup', function (event) { return self.dropRow(event, self); }); - } + $(document).on('touchmove', function (event) { return self.dragRow(event.originalEvent.touches[0], self); }); + $(document).on('touchend', function (event) { return self.dropRow(event.originalEvent.touches[0], self); }); + $(document).on('mousemove pointermove', function (event) { return self.dragRow(event, self); }); + $(document).on('mouseup pointerup', function (event) { return self.dropRow(event, self); }); // React to localStorage event showing or hiding weight columns. $(window).on('storage', $.proxy(function (e) { @@ -460,19 +456,13 @@ $item.find('td').eq(0).prepend(handle); } - if (Modernizr.touchevents) { - handle.on('touchstart', function (event) { - event.preventDefault(); + handle.on('mousedown touchstart pointerdown', function (event) { + event.preventDefault(); + if (event.originalEvent.type === 'touchstart') { event = event.originalEvent.touches[0]; - self.dragStart(event, self, item); - }); - } - else { - handle.on('mousedown', function (event) { - event.preventDefault(); - self.dragStart(event, self, item); - }); - } + } + self.dragStart(event, self, item); + }); // Prevent the anchor tag from jumping us to the top of the page. handle.on('click', function (e) { diff --git a/core/modules/aggregator/src/Tests/Migrate/MigrateAggregatorStubTest.php b/core/modules/aggregator/src/Tests/Migrate/MigrateAggregatorStubTest.php new file mode 100644 index 000000000..d620259a5 --- /dev/null +++ b/core/modules/aggregator/src/Tests/Migrate/MigrateAggregatorStubTest.php @@ -0,0 +1,63 @@ +installEntitySchema('aggregator_feed'); + $this->installEntitySchema('aggregator_item'); + } + + /** + * Tests creation of aggregator feed stubs. + */ + public function testFeedStub() { + $this->performStubTest('aggregator_feed'); + } + + /** + * Tests creation of aggregator feed items. + */ + public function testItemStub() { + try { + // We expect an exception, because there's no feed to reference. + $this->performStubTest('aggregator_item'); + $this->fail('Expected exception has not been thrown.'); + } + catch (MigrateException $e) { + $this->assertIdentical($e->getMessage(), + 'Stubbing failed, unable to generate value for field fid'); + } + + // The stub should pass when there's a feed to point to. + $this->createStub('aggregator_feed'); + $this->performStubTest('aggregator_item'); + } + +} diff --git a/core/modules/block/block.module b/core/modules/block/block.module index 29c6e16bf..0b6ca2631 100644 --- a/core/modules/block/block.module +++ b/core/modules/block/block.module @@ -89,7 +89,10 @@ function block_page_top(array &$page_top) { */ function block_themes_installed($theme_list) { foreach ($theme_list as $theme) { - block_theme_initialize($theme); + // Don't initialize themes that are not displayed in the UI. + if (\Drupal::service('theme_handler')->hasUi($theme)) { + block_theme_initialize($theme); + } } } diff --git a/core/modules/block/src/Controller/BlockController.php b/core/modules/block/src/Controller/BlockController.php index 2779a9b57..effa84266 100644 --- a/core/modules/block/src/Controller/BlockController.php +++ b/core/modules/block/src/Controller/BlockController.php @@ -11,6 +11,7 @@ use Drupal\Component\Utility\Html; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Extension\ThemeHandlerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Controller routines for admin block routes. @@ -53,6 +54,10 @@ class BlockController extends ControllerBase { * A #type 'page' render array containing the block region demo. */ public function demo($theme) { + if (!$this->themeHandler->hasUi($theme)) { + throw new NotFoundHttpException(); + } + $page = [ '#title' => Html::escape($this->themeHandler->getName($theme)), '#type' => 'page', diff --git a/core/modules/block/src/Controller/BlockListController.php b/core/modules/block/src/Controller/BlockListController.php index 72aa445c0..6185c9097 100644 --- a/core/modules/block/src/Controller/BlockListController.php +++ b/core/modules/block/src/Controller/BlockListController.php @@ -8,13 +8,42 @@ namespace Drupal\block\Controller; use Drupal\Core\Entity\Controller\EntityListController; +use Drupal\Core\Extension\ThemeHandlerInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Defines a controller to list blocks. */ class BlockListController extends EntityListController { + /** + * The theme handler. + * + * @var \Drupal\Core\Extension\ThemeHandlerInterface + */ + protected $themeHandler; + + /** + * Constructs the BlockListController. + * + * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler + * The theme handler. + */ + public function __construct(ThemeHandlerInterface $theme_handler) { + $this->themeHandler = $theme_handler; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('theme_handler') + ); + } + /** * Shows the block administration page. * @@ -28,6 +57,10 @@ class BlockListController extends EntityListController { */ public function listing($theme = NULL, Request $request = NULL) { $theme = $theme ?: $this->config('system.theme')->get('default'); + if (!$this->themeHandler->hasUi($theme)) { + throw new NotFoundHttpException(); + } + return $this->entityManager()->getListBuilder('block')->render($theme, $request); } diff --git a/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php b/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php index 4e337db7b..ed9d09544 100644 --- a/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php +++ b/core/modules/block/src/Plugin/Derivative/ThemeLocalTask.php @@ -50,7 +50,7 @@ class ThemeLocalTask extends DeriverBase implements ContainerDeriverInterface { $default_theme = $this->themeHandler->getDefault(); foreach ($this->themeHandler->listInfo() as $theme_name => $theme) { - if ($theme->status) { + if ($this->themeHandler->hasUi($theme_name)) { $this->derivatives[$theme_name] = $base_plugin_definition; $this->derivatives[$theme_name]['title'] = $theme->info['name']; $this->derivatives[$theme_name]['route_parameters'] = array('theme' => $theme_name); diff --git a/core/modules/block/src/Tests/BlockHiddenRegionTest.php b/core/modules/block/src/Tests/BlockHiddenRegionTest.php index a6af2ce5e..bb42dceea 100644 --- a/core/modules/block/src/Tests/BlockHiddenRegionTest.php +++ b/core/modules/block/src/Tests/BlockHiddenRegionTest.php @@ -56,7 +56,9 @@ class BlockHiddenRegionTest extends WebTestBase { // Install "block_test_theme" and set it as the default theme. $theme = 'block_test_theme'; - \Drupal::service('theme_handler')->install(array($theme)); + // We need to install a non-hidden theme so that there is more than one + // local task. + \Drupal::service('theme_handler')->install(array($theme, 'stark')); $this->config('system.theme') ->set('default', $theme) ->save(); diff --git a/core/modules/block/src/Tests/BlockTest.php b/core/modules/block/src/Tests/BlockTest.php index c98b042de..261c3ae6d 100644 --- a/core/modules/block/src/Tests/BlockTest.php +++ b/core/modules/block/src/Tests/BlockTest.php @@ -197,9 +197,9 @@ class BlockTest extends BlockTestBase { */ public function testBlockThemeSelector() { // Install all themes. - \Drupal::service('theme_handler')->install(array('bartik', 'seven')); + \Drupal::service('theme_handler')->install(['bartik', 'seven', 'stark']); $theme_settings = $this->config('system.theme'); - foreach (array('bartik', 'classy', 'seven') as $theme) { + foreach (['bartik', 'seven', 'stark'] as $theme) { $this->drupalGet('admin/structure/block/list/' . $theme); $this->assertTitle(t('Block layout') . ' | Drupal'); // Select the 'Powered by Drupal' block to be placed. diff --git a/core/modules/block/src/Tests/BlockUiTest.php b/core/modules/block/src/Tests/BlockUiTest.php index 25b7942a5..4d0f03a1e 100644 --- a/core/modules/block/src/Tests/BlockUiTest.php +++ b/core/modules/block/src/Tests/BlockUiTest.php @@ -90,6 +90,10 @@ class BlockUiTest extends WebTestBase { \Drupal::service('theme_handler')->install(array('test_theme')); $this->drupalGet('admin/structure/block/demo/test_theme'); $this->assertEscaped('Test theme'); + + \Drupal::service('theme_handler')->install(['stable']); + $this->drupalGet('admin/structure/block/demo/stable'); + $this->assertResponse(404, 'Hidden themes that are not the default theme are not supported by the block demo screen'); } /** @@ -136,6 +140,28 @@ class BlockUiTest extends WebTestBase { $this->drupalGet('admin/structure/block'); $element = $this->xpath('//tr[contains(@class, :class)]', [':class' => 'region-title-header']); $this->assertTrue(!empty($element)); + + // Ensure hidden themes do not appear in the UI. Enable another non base + // theme and place the local tasks block. + $this->assertTrue(\Drupal::service('theme_handler')->themeExists('classy'), 'The classy base theme is enabled'); + $this->drupalPlaceBlock('local_tasks_block', ['region' => 'header']); + \Drupal::service('theme_installer')->install(['stable', 'stark']); + $this->drupalGet('admin/structure/block'); + $theme_handler = \Drupal::service('theme_handler'); + $this->assertLink($theme_handler->getName('classy')); + $this->assertLink($theme_handler->getName('stark')); + $this->assertNoLink($theme_handler->getName('stable')); + + $this->drupalGet('admin/structure/block/list/stable'); + $this->assertResponse(404, 'Placing blocks through UI is not possible for a hidden base theme.'); + + \Drupal::configFactory()->getEditable('system.theme')->set('admin', 'stable')->save(); + \Drupal::service('router.builder')->rebuildIfNeeded(); + $this->drupalPlaceBlock('local_tasks_block', ['region' => 'header', 'theme' => 'stable']); + $this->drupalGet('admin/structure/block'); + $this->assertLink($theme_handler->getName('stable')); + $this->drupalGet('admin/structure/block/list/stable'); + $this->assertResponse(200, 'Placing blocks through UI is possible for a hidden base theme that is the admin theme.'); } /** diff --git a/core/modules/block/src/Tests/NewDefaultThemeBlocksTest.php b/core/modules/block/src/Tests/NewDefaultThemeBlocksTest.php index 68592c84f..6d14eedb6 100644 --- a/core/modules/block/src/Tests/NewDefaultThemeBlocksTest.php +++ b/core/modules/block/src/Tests/NewDefaultThemeBlocksTest.php @@ -65,6 +65,14 @@ class NewDefaultThemeBlocksTest extends WebTestBase { unset($new_blocks[str_replace($default_theme . '_', $new_theme . '_', $default_block_name)]); } $this->assertTrue(empty($new_blocks), 'The new theme has exactly the same blocks as the previous default theme.'); + + // Install a hidden base theme and ensure blocks are not copied. + $base_theme = 'test_basetheme'; + \Drupal::service('theme_handler')->install([$base_theme]); + $new_blocks = $this->container->get('entity.query')->get('block') + ->condition('theme', $base_theme) + ->execute(); + $this->assertTrue(empty($new_blocks), 'Installing a hidden base theme does not copy blocks from the default theme.'); } } diff --git a/core/modules/block/tests/src/Unit/Menu/BlockLocalTasksTest.php b/core/modules/block/tests/src/Unit/Menu/BlockLocalTasksTest.php index f70a57cf7..632091754 100644 --- a/core/modules/block/tests/src/Unit/Menu/BlockLocalTasksTest.php +++ b/core/modules/block/tests/src/Unit/Menu/BlockLocalTasksTest.php @@ -27,7 +27,11 @@ class BlockLocalTasksTest extends LocalTaskIntegrationTestBase { $themes = array(); $themes['test_a'] = (object) array( - 'status' => 0, + 'status' => 1, + 'info' => array( + 'name' => 'test_a', + 'hidden' => TRUE, + ), ); $themes['test_b'] = (object) array( 'status' => 1, @@ -45,6 +49,13 @@ class BlockLocalTasksTest extends LocalTaskIntegrationTestBase { $theme_handler->expects($this->any()) ->method('listInfo') ->will($this->returnValue($themes)); + $theme_handler->expects($this->any()) + ->method('hasUi') + ->willReturnMap([ + ['test_a', FALSE], + ['test_b', TRUE], + ['test_c', TRUE], + ]); $container = new ContainerBuilder(); $container->set('config.factory', $config_factory); diff --git a/core/modules/block_content/block_content.routing.yml b/core/modules/block_content/block_content.routing.yml index 8e4f649cc..75ea9b29d 100644 --- a/core/modules/block_content/block_content.routing.yml +++ b/core/modules/block_content/block_content.routing.yml @@ -44,6 +44,7 @@ entity.block_content.canonical: _admin_route: TRUE requirements: _entity_access: 'block_content.update' + block_content: \d+ entity.block_content.edit_form: path: '/block/{block_content}' @@ -53,6 +54,7 @@ entity.block_content.edit_form: _admin_route: TRUE requirements: _entity_access: 'block_content.update' + block_content: \d+ entity.block_content.delete_form: path: '/block/{block_content}/delete' @@ -63,6 +65,7 @@ entity.block_content.delete_form: _admin_route: TRUE requirements: _entity_access: 'block_content.delete' + block_content: \d+ block_content.type_add: path: '/admin/structure/block/block-content/types/add' diff --git a/core/modules/block_content/src/Tests/BlockContentTypeTest.php b/core/modules/block_content/src/Tests/BlockContentTypeTest.php index e669a72e3..d1405b9ee 100644 --- a/core/modules/block_content/src/Tests/BlockContentTypeTest.php +++ b/core/modules/block_content/src/Tests/BlockContentTypeTest.php @@ -185,17 +185,15 @@ class BlockContentTypeTest extends BlockContentTestBase { ->getStorage('block_content'); // Install all themes. - \Drupal::service('theme_handler')->install(array('bartik', 'seven')); - $themes = array('bartik', 'seven', 'classy'); + \Drupal::service('theme_handler')->install(['bartik', 'seven', 'stark']); $theme_settings = $this->config('system.theme'); - foreach ($themes as $default_theme) { + foreach (['bartik', 'seven', 'stark'] as $default_theme) { // Change the default theme. $theme_settings->set('default', $default_theme)->save(); \Drupal::service('router.builder')->rebuild(); // For each installed theme, go to its block page and test the redirects. - $themes = array('bartik', 'classy', 'seven'); - foreach ($themes as $theme) { + foreach (['bartik', 'seven', 'stark'] as $theme) { // Test that adding a block from the 'place blocks' form sends you to the // block configure form. $path = $theme == $default_theme ? 'admin/structure/block' : "admin/structure/block/list/$theme"; diff --git a/core/modules/block_content/src/Tests/Migrate/MigrateBlockContentStubTest.php b/core/modules/block_content/src/Tests/Migrate/MigrateBlockContentStubTest.php new file mode 100644 index 000000000..5b28c3705 --- /dev/null +++ b/core/modules/block_content/src/Tests/Migrate/MigrateBlockContentStubTest.php @@ -0,0 +1,63 @@ +installEntitySchema('block_content'); + } + + /** + * Tests creation of block content stubs with no block_content_type available. + */ + public function testStubFailure() { + $message = 'Expected MigrateException thrown when no bundles exist.'; + try { + $this->createStub('block_content'); + $this->fail($message); + } + catch (MigrateException $e) { + $this->pass($message); + $this->assertEqual('Stubbing failed, no bundles available for entity type: block_content', $e->getMessage()); + } + } + + /** + * Tests creation of block content stubs when there is a block_content_type. + */ + public function testStubSuccess() { + BlockContentType::create([ + 'id' => 'test_block_content_type', + 'label' => 'Test block content type', + ])->save(); + $this->performStubTest('block_content'); + } + +} diff --git a/core/modules/book/book.routing.yml b/core/modules/book/book.routing.yml index 9b8f32293..772a6cf39 100644 --- a/core/modules/book/book.routing.yml +++ b/core/modules/book/book.routing.yml @@ -29,6 +29,7 @@ book.export: requirements: _permission: 'access printer-friendly version' _entity_access: 'node.view' + node: \d+ entity.node.book_outline_form: path: '/node/{node}/outline' @@ -38,6 +39,7 @@ entity.node.book_outline_form: requirements: _permission: 'administer book outlines' _entity_access: 'node.view' + node: \d+ options: _node_operation_route: TRUE @@ -62,3 +64,4 @@ entity.node.book_remove_form: _permission: 'administer book outlines' _entity_access: 'node.view' _access_book_removable: 'TRUE' + node: \d+ diff --git a/core/modules/ckeditor/js/plugins/drupallink/plugin.js b/core/modules/ckeditor/js/plugins/drupallink/plugin.js index dfb7c875a..9f0abcd98 100644 --- a/core/modules/ckeditor/js/plugins/drupallink/plugin.js +++ b/core/modules/ckeditor/js/plugins/drupallink/plugin.js @@ -9,6 +9,27 @@ 'use strict'; + function parseAttributes(element) { + var parsedAttributes = {}; + + var domElement = element.$; + var attribute = null; + var attributeName; + for (var attrIndex = 0; attrIndex < domElement.attributes.length; attrIndex++) { + attribute = domElement.attributes.item(attrIndex); + attributeName = attribute.nodeName.toLowerCase(); + // Don't consider data-cke-saved- attributes; they're just there to work + // around browser quirks. + if (attributeName.substring(0, 15) === 'data-cke-saved-') { + continue; + } + // Store the value for this attribute, unless there's a data-cke-saved- + // alternative for it, which will contain the quirk-free, original value. + parsedAttributes[attributeName] = element.data('cke-saved-' + attributeName) || attribute.nodeValue; + } + return parsedAttributes; + } + CKEDITOR.plugins.add('drupallink', { init: function (editor) { // Add the commands for link and unlink. @@ -16,8 +37,7 @@ allowedContent: { a: { attributes: { - '!href': true, - 'target': true + '!href': true }, classes: {} } @@ -34,35 +54,16 @@ var drupalImageUtils = CKEDITOR.plugins.drupalimage; var focusedImageWidget = drupalImageUtils && drupalImageUtils.getFocusedWidget(editor); var linkElement = getSelectedLink(editor); - var linkDOMElement = null; // Set existing values based on selected element. var existingValues = {}; if (linkElement && linkElement.$) { - linkDOMElement = linkElement.$; - - // Populate an array with the link's current attributes. - var attribute = null; - var attributeName; - for (var attrIndex = 0; attrIndex < linkDOMElement.attributes.length; attrIndex++) { - attribute = linkDOMElement.attributes.item(attrIndex); - attributeName = attribute.nodeName.toLowerCase(); - // Don't consider data-cke-saved- attributes; they're just there - // to work around browser quirks. - if (attributeName.substring(0, 15) === 'data-cke-saved-') { - continue; - } - // Store the value for this attribute, unless there's a - // data-cke-saved- alternative for it, which will contain the - // quirk-free, original value. - existingValues[attributeName] = linkElement.data('cke-saved-' + attributeName) || attribute.nodeValue; - } + existingValues = parseAttributes(linkElement); } // Or, if an image widget is focused, we're editing a link wrapping // an image widget. else if (focusedImageWidget && focusedImageWidget.data.link) { - var url = focusedImageWidget.data.link.url; - existingValues.href = url.protocol + url.url; + existingValues = CKEDITOR.tools.clone(focusedImageWidget.data.link); } // Prepare a save callback to be used upon saving the dialog. @@ -70,14 +71,7 @@ // If an image widget is focused, we're not editing an independent // link, but we're wrapping an image widget in a link. if (focusedImageWidget) { - var urlMatch = returnValues.attributes.href.match(urlRegex); - focusedImageWidget.setData('link', { - type: 'url', - url: { - protocol: urlMatch[1], - url: urlMatch[2] - } - }); + focusedImageWidget.setData('link', CKEDITOR.tools.extend(returnValues.attributes, focusedImageWidget.data.link)); editor.fire('saveSnapshot'); return; } @@ -97,11 +91,6 @@ range.selectNodeContents(text); } - // Ignore a disabled target attribute. - if (returnValues.attributes.target === 0) { - delete returnValues.attributes.target; - } - // Create the new link by applying a style to the new text. var style = new CKEDITOR.style({element: 'a', attributes: returnValues.attributes}); style.type = CKEDITOR.STYLE_INLINE; @@ -150,8 +139,7 @@ allowedContent: { a: { attributes: { - '!href': true, - 'target': true + '!href': true } } }, @@ -280,8 +268,6 @@ return null; } - var urlRegex = /^((?:http|https):\/\/)?(.*)$/; - /** * The image2 plugin is currently tightly coupled to the link plugin: it * calls CKEDITOR.plugins.link.parseLinkAttributes(). @@ -296,28 +282,20 @@ */ CKEDITOR.plugins.link = CKEDITOR.plugins.link || { parseLinkAttributes: function (editor, element) { - var href = (element && (element.data('cke-saved-href') || element.getAttribute('href'))) || ''; - var urlMatch = href.match(urlRegex); - return { - type: 'url', - url: { - protocol: urlMatch[1], - url: urlMatch[2] - } - }; + return parseAttributes(element); }, getLinkAttributes: function (editor, data) { var set = {}; - - var protocol = (data.url && typeof data.url.protocol !== 'undefined') ? data.url.protocol : 'http://'; - var url = (data.url && CKEDITOR.tools.trim(data.url.url)) || ''; - set['data-cke-saved-href'] = (url.indexOf('/') === 0) ? url : protocol + url; - - // Browser need the "href" fro copy/paste link to work. (#6641) - if (set['data-cke-saved-href']) { - set.href = set['data-cke-saved-href']; + for (var attributeName in data) { + if (data.hasOwnProperty(attributeName)) { + set[attributeName] = data[attributeName]; + } } + // CKEditor tracks the *actual* saved href in a data-cke-saved-* attribute + // to work around browser quirks. We need to update it. + set['data-cke-saved-href'] = set.href; + // Remove all attributes which are not currently set. var removed = {}; for (var s in set) { diff --git a/core/modules/comment/comment.routing.yml b/core/modules/comment/comment.routing.yml index 967cb3f08..3d698b837 100644 --- a/core/modules/comment/comment.routing.yml +++ b/core/modules/comment/comment.routing.yml @@ -23,6 +23,7 @@ entity.comment.edit_form: _entity_form: 'comment.default' requirements: _entity_access: 'comment.update' + comment: \d+ comment.approve: path: '/comment/{comment}/approve' @@ -33,6 +34,7 @@ comment.approve: requirements: _entity_access: 'comment.approve' _csrf_token: 'TRUE' + comment: \d+ entity.comment.canonical: path: '/comment/{comment}' @@ -41,6 +43,7 @@ entity.comment.canonical: _controller: '\Drupal\comment\Controller\CommentController::commentPermalink' requirements: _entity_access: 'comment.view' + comment: \d+ entity.comment.delete_form: path: '/comment/{comment}/delete' @@ -49,6 +52,7 @@ entity.comment.delete_form: _entity_form: 'comment.delete' requirements: _entity_access: 'comment.delete' + comment: \d+ comment.reply: path: '/comment/reply/{entity_type}/{entity}/{field_name}/{pid}' @@ -77,6 +81,7 @@ comment.node_redirect: requirements: _entity_access: 'node.view' _module_dependencies: 'node' + node: \d+ entity.comment_type.collection: path: '/admin/structure/comment' diff --git a/core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php b/core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php index c8bc4a701..b053170fc 100644 --- a/core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php +++ b/core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php @@ -39,6 +39,34 @@ class CommentSelection extends DefaultSelection { return $query; } + /** + * {@inheritdoc} + */ + public function createNewEntity($entity_type_id, $bundle, $label, $uid) { + $comment = parent::createNewEntity($entity_type_id, $bundle, $label, $uid); + + // In order to create a referenceable comment, it needs to published. + /** @var \Drupal\comment\CommentInterface $comment */ + $comment->setPublished(TRUE); + + return $comment; + } + + /** + * {@inheritdoc} + */ + public function validateReferenceableNewEntities(array $entities) { + $entities = parent::validateReferenceableNewEntities($entities); + // Mirror the conditions checked in buildEntityQuery(). + if (!$this->currentUser->hasPermission('administer comments')) { + $entities = array_filter($entities, function ($comment) { + /** @var \Drupal\comment\CommentInterface $comment */ + return $comment->isPublished(); + }); + } + return $entities; + } + /** * {@inheritdoc} */ diff --git a/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php b/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php index 477cdcd0c..7ebbc8338 100644 --- a/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php +++ b/core/modules/comment/src/Plugin/migrate/destination/EntityComment.php @@ -10,6 +10,7 @@ namespace Drupal\comment\Plugin\migrate\destination; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Entity\Query\QueryFactory; +use Drupal\Core\Field\FieldTypePluginManagerInterface; use Drupal\Core\State\StateInterface; use Drupal\migrate\Entity\MigrationInterface; use Drupal\migrate\MigrateException; @@ -62,13 +63,15 @@ class EntityComment extends EntityContentBase { * The list of bundles this entity type has. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager service. + * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager + * The field type plugin manager service. * @param \Drupal\Core\State\StateInterface $state * The state storage object. * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query * The query object that can query the given entity type. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, StateInterface $state, QueryFactory $entity_query) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager); + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager, StateInterface $state, QueryFactory $entity_query) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager, $field_type_manager); $this->state = $state; $this->entityQuery = $entity_query; } @@ -86,6 +89,7 @@ class EntityComment extends EntityContentBase { $container->get('entity.manager')->getStorage($entity_type), array_keys($container->get('entity.manager')->getBundleInfo($entity_type)), $container->get('entity.manager'), + $container->get('plugin.manager.field.field_type'), $container->get('state'), $container->get('entity.query') ); @@ -110,32 +114,9 @@ class EntityComment extends EntityContentBase { */ protected function processStubRow(Row $row) { parent::processStubRow($row); - $stub_commented_entity_type = $row->getDestinationProperty('entity_type'); - - // While parent::getEntity() fills the bundle property for stub entities - // if it's still empty, here we must also make sure entity_id/entity_type - // are filled (so $comment->getCommentedEntity() always returns a value). - if (empty($this->stubCommentedEntityIds[$stub_commented_entity_type])) { - // Fill stub entity id. Any id will do, as long as it exists. - $entity_type = $this->entityManager->getDefinition($stub_commented_entity_type); - $id_key = $entity_type->getKey('id'); - $result = $this->entityQuery - ->get($stub_commented_entity_type) - ->range(0, 1) - ->execute(); - if ($result) { - $this->stubCommentedEntityIds[$stub_commented_entity_type] = array_pop($result); - $row->setSourceProperty($id_key, $this->stubCommentedEntityIds[$stub_commented_entity_type]); - } - else { - throw new MigrateException(t('Could not find parent entity to use for comment %id', ['%id' => implode(':', $row->getSourceIdValues())]), MigrationInterface::MESSAGE_ERROR); - } - } - - $row->setDestinationProperty('entity_id', $this->stubCommentedEntityIds[$stub_commented_entity_type]); - $row->setDestinationProperty('entity_type', $stub_commented_entity_type); - $row->setDestinationProperty('created', REQUEST_TIME); - $row->setDestinationProperty('changed', REQUEST_TIME); + // Neither uid nor name is required in itself, but it is required to set one + // of them. + $row->setDestinationProperty('name', 'anonymous_stub'); } } diff --git a/core/modules/comment/src/Tests/CommentValidationTest.php b/core/modules/comment/src/Tests/CommentValidationTest.php index 62acec0b1..5c30d893d 100644 --- a/core/modules/comment/src/Tests/CommentValidationTest.php +++ b/core/modules/comment/src/Tests/CommentValidationTest.php @@ -39,7 +39,7 @@ class CommentValidationTest extends EntityUnitTestBase { */ public function testValidation() { // Add a user. - $user = User::create(array('name' => 'test')); + $user = User::create(array('name' => 'test', 'status' => TRUE)); $user->save(); // Add comment type. diff --git a/core/modules/comment/src/Tests/Migrate/MigrateCommentStubTest.php b/core/modules/comment/src/Tests/Migrate/MigrateCommentStubTest.php new file mode 100644 index 000000000..22818f585 --- /dev/null +++ b/core/modules/comment/src/Tests/Migrate/MigrateCommentStubTest.php @@ -0,0 +1,78 @@ +installEntitySchema('comment'); + $this->installEntitySchema('node'); + // Make sure uid 0 is created (default uid for comments is 0). + $storage = \Drupal::entityManager()->getStorage('user'); + // Insert a row for the anonymous user. + $storage + ->create(array( + 'uid' => 0, + 'status' => 0, + 'name' => '', + )) + ->save(); + // Need at least one node type and comment type present. + NodeType::create([ + 'type' => 'testnodetype', + 'name' => 'Test node type', + ])->save(); + CommentType::create([ + 'id' => 'testcommenttype', + 'label' => 'Test comment type', + 'target_entity_type_id' => 'node', + ])->save(); + } + + /** + * Tests creation of comment stubs. + */ + public function testStub() { + try { + // We expect an exception, because there's no node to reference. + $this->performStubTest('comment'); + $this->fail('Expected exception has not been thrown.'); + } + catch (MigrateException $e) { + $this->assertIdentical($e->getMessage(), + 'Stubbing failed, unable to generate value for field entity_id'); + } + + // The stub should pass when there's a node to point to. + $this->createStub('node'); + $this->performStubTest('comment'); + } + +} diff --git a/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php b/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php index 4545e4626..7219d9548 100644 --- a/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php +++ b/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php @@ -22,13 +22,7 @@ class MigrateCommentTest extends MigrateDrupal6TestBase { /** * {@inheritdoc} */ - public static $modules = [ - 'comment', - // Directly testing that a stub comment's entity_id is populated upon - // importing is not straightforward, but RDF module serves as an implicit - // test - its hook_comment_storage_load() references a stubbed comment. - 'rdf', - ]; + public static $modules = ['comment']; /** * {@inheritdoc} diff --git a/core/modules/config/src/Tests/ConfigImportInstallProfileTest.php b/core/modules/config/src/Tests/ConfigImportInstallProfileTest.php index 19ef2eec0..e15d3acbf 100644 --- a/core/modules/config/src/Tests/ConfigImportInstallProfileTest.php +++ b/core/modules/config/src/Tests/ConfigImportInstallProfileTest.php @@ -67,6 +67,7 @@ class ConfigImportInstallProfileTest extends WebTestBase { $core['module']['testing_config_import'] = 0; unset($core['module']['syslog']); unset($core['theme']['stark']); + $core['theme']['stable'] = 0; $core['theme']['classy'] = 0; $sync->write('core.extension', $core); $sync->deleteAll('syslog.'); diff --git a/core/modules/config/src/Tests/ConfigInstallProfileOverrideTest.php b/core/modules/config/src/Tests/ConfigInstallProfileOverrideTest.php index b5409bec6..e10dfe0b1 100644 --- a/core/modules/config/src/Tests/ConfigInstallProfileOverrideTest.php +++ b/core/modules/config/src/Tests/ConfigInstallProfileOverrideTest.php @@ -92,12 +92,12 @@ class ConfigInstallProfileOverrideTest extends WebTestBase { } // Install the config_test module and ensure that the override from the - // install profile is not used. Optional configuration can not override + // install profile is used. Optional configuration can override // configuration in a modules config/install directory. $this->container->get('module_installer')->install(['config_test']); $this->rebuildContainer(); $config_test_storage = \Drupal::entityManager()->getStorage('config_test'); - $this->assertEqual($config_test_storage->load('dotted.default')->label(), 'Default', 'The config_test entity is not overridden by the profile optional configuration.'); + $this->assertEqual($config_test_storage->load('dotted.default')->label(), 'Default install profile override', 'The config_test entity is overridden by the profile optional configuration.'); // Test that override of optional configuration does work. $this->assertEqual($config_test_storage->load('override')->label(), 'Override', 'The optional config_test entity is overridden by the profile optional configuration.'); // Test that override of optional configuration which introduces an unmet diff --git a/core/modules/config/src/Tests/ConfigInstallProfileUnmetDependenciesTest.php b/core/modules/config/src/Tests/ConfigInstallProfileUnmetDependenciesTest.php index e7e8f6cab..59683af60 100644 --- a/core/modules/config/src/Tests/ConfigInstallProfileUnmetDependenciesTest.php +++ b/core/modules/config/src/Tests/ConfigInstallProfileUnmetDependenciesTest.php @@ -95,6 +95,7 @@ class ConfigInstallProfileUnmetDependenciesTest extends InstallerTestBase { else { $this->fail('Expected Drupal\Core\Config\UnmetDependenciesException exception thrown'); } + $this->assertErrorLogged('Configuration objects (system.action.user_block_user_action) provided by user have unmet dependencies in'); } } diff --git a/core/modules/contact/contact.routing.yml b/core/modules/contact/contact.routing.yml index d81bb9fc2..59779868d 100644 --- a/core/modules/contact/contact.routing.yml +++ b/core/modules/contact/contact.routing.yml @@ -54,3 +54,4 @@ entity.user.contact_form: _controller: '\Drupal\contact\Controller\ContactController::contactPersonalPage' requirements: _access_contact_personal_tab: 'TRUE' + user: \d+ diff --git a/core/modules/content_translation/content_translation.install b/core/modules/content_translation/content_translation.install index 0bfe4149e..d44b2d112 100644 --- a/core/modules/content_translation/content_translation.install +++ b/core/modules/content_translation/content_translation.install @@ -29,3 +29,19 @@ function content_translation_enable() { $message = t('Enable translation for content types, taxonomy vocabularies, accounts, or any other element you wish to translate.', $t_args); drupal_set_message($message, 'warning'); } + +/** + * @addtogroup updates-8.0.0-rc + * @{ + */ + +/** + * Rebuild the routes as the content translation routes have now new names. + */ +function content_translation_update_8001() { + \Drupal::service('router.builder')->rebuild(); +} + +/** + * @} End of "addtogroup updates-8.0.0-rc". + */ diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module index ff1b34ddf..b354e9549 100644 --- a/core/modules/content_translation/content_translation.module +++ b/core/modules/content_translation/content_translation.module @@ -53,7 +53,7 @@ function content_translation_help($route_name, RouteMatchInterface $route_match) */ function content_translation_module_implements_alter(&$implementations, $hook) { switch ($hook) { - // Move some of our hook implementations to the end of the list. + // Move our hook_entity_type_alter() implementation to the end of the list. case 'entity_type_alter': $group = $implementations['content_translation']; unset($implementations['content_translation']); @@ -140,7 +140,11 @@ function content_translation_entity_type_alter(array &$entity_types) { if ($entity_type->hasLinkTemplate('canonical')) { // Provide default route names for the translation paths. if (!$entity_type->hasLinkTemplate('drupal:content-translation-overview')) { - $entity_type->setLinkTemplate('drupal:content-translation-overview', $entity_type->getLinkTemplate('canonical') . '/translations'); + $translations_path = $entity_type->getLinkTemplate('canonical') . '/translations'; + $entity_type->setLinkTemplate('drupal:content-translation-overview', $translations_path); + $entity_type->setLinkTemplate('drupal:content-translation-add', $translations_path . '/add/{source}/{target}'); + $entity_type->setLinkTemplate('drupal:content-translation-edit', $translations_path . '/edit/{language}'); + $entity_type->setLinkTemplate('drupal:content-translation-delete', $translations_path . '/delete/{language}'); } // @todo Remove this as soon as menu access checks rely on the // controller. See https://www.drupal.org/node/2155787. diff --git a/core/modules/content_translation/src/ContentTranslationHandler.php b/core/modules/content_translation/src/ContentTranslationHandler.php index d7eb42ab3..1b8d77df9 100644 --- a/core/modules/content_translation/src/ContentTranslationHandler.php +++ b/core/modules/content_translation/src/ContentTranslationHandler.php @@ -652,7 +652,7 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E $source = $form_state->getValue(array('source_langcode', 'source')); $entity_type_id = $entity->getEntityTypeId(); - $form_state->setRedirect('content_translation.translation_add_' . $entity_type_id, array( + $form_state->setRedirect("entity.$entity_type_id.content_translation_add", array( $entity_type_id => $entity->id(), 'source' => $source, 'target' => $form_object->getFormLangcode($form_state), @@ -689,7 +689,7 @@ class ContentTranslationHandler implements ContentTranslationHandlerInterface, E $form_state->setRedirectUrl($entity->urlInfo('delete-form')); } else { - $form_state->setRedirect('content_translation.translation_delete_' . $entity_type_id, [ + $form_state->setRedirect("entity.$entity_type_id.content_translation_delete", [ $entity_type_id => $entity->id(), 'language' => $form_object->getFormLangcode($form_state), ]); diff --git a/core/modules/content_translation/src/Controller/ContentTranslationController.php b/core/modules/content_translation/src/Controller/ContentTranslationController.php index 9c6879ac9..8c19de141 100644 --- a/core/modules/content_translation/src/Controller/ContentTranslationController.php +++ b/core/modules/content_translation/src/Controller/ContentTranslationController.php @@ -127,7 +127,7 @@ class ContentTranslationController extends ControllerBase { $langcode = $language->getId(); $add_url = new Url( - 'content_translation.translation_add_' . $entity_type_id, + "entity.$entity_type_id.content_translation_add", array( 'source' => $original, 'target' => $language->getId(), @@ -138,7 +138,7 @@ class ContentTranslationController extends ControllerBase { ) ); $edit_url = new Url( - 'content_translation.translation_edit_' . $entity_type_id, + "entity.$entity_type_id.content_translation_edit", array( 'language' => $language->getId(), $entity_type_id => $entity->id(), @@ -148,7 +148,7 @@ class ContentTranslationController extends ControllerBase { ) ); $delete_url = new Url( - 'content_translation.translation_delete_' . $entity_type_id, + "entity.$entity_type_id.content_translation_delete", array( 'language' => $language->getId(), $entity_type_id => $entity->id(), diff --git a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php index a2b54a8a2..ebdf5626a 100644 --- a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php +++ b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php @@ -112,7 +112,7 @@ class ContentTranslationRouteSubscriber extends RouteSubscriberBase { '_admin_route' => $is_admin, ) ); - $collection->add("content_translation.translation_add_$entity_type_id", $route); + $collection->add("entity.$entity_type_id.content_translation_add", $route); $route = new Route( $path . '/edit/{language}', @@ -137,7 +137,7 @@ class ContentTranslationRouteSubscriber extends RouteSubscriberBase { '_admin_route' => $is_admin, ) ); - $collection->add("content_translation.translation_edit_$entity_type_id", $route); + $collection->add("entity.$entity_type_id.content_translation_edit", $route); $route = new Route( $path . '/delete/{language}', @@ -162,7 +162,7 @@ class ContentTranslationRouteSubscriber extends RouteSubscriberBase { '_admin_route' => $is_admin, ) ); - $collection->add("content_translation.translation_delete_$entity_type_id", $route); + $collection->add("entity.$entity_type_id.content_translation_delete", $route); } } diff --git a/core/modules/content_translation/src/Tests/ContentTranslationEnableTest.php b/core/modules/content_translation/src/Tests/ContentTranslationEnableTest.php index 9af869807..926a60e4a 100644 --- a/core/modules/content_translation/src/Tests/ContentTranslationEnableTest.php +++ b/core/modules/content_translation/src/Tests/ContentTranslationEnableTest.php @@ -19,7 +19,7 @@ class ContentTranslationEnableTest extends WebTestBase { /** * {@inheritdoc} */ - public static $modules = ['entity_test', 'menu_link_content']; + public static $modules = ['entity_test', 'menu_link_content', 'node']; /** * Tests that entity schemas are up-to-date after enabling translation. @@ -39,6 +39,9 @@ class ContentTranslationEnableTest extends WebTestBase { $requirement_value = $this->cssSelect("tr.system-status-report__entry th:contains('Entity/field definitions') + td"); $this->assertEqual(t('Up to date'), trim((string) $requirement_value[0])); + $this->drupalGet('admin/config/regional/content-language'); + // The node entity type should not be an option because it has no bundles. + $this->assertNoRaw('entity_types[node]'); // Enable content translation on entity types that have will have a // content_translation_uid. $edit = [ @@ -47,12 +50,23 @@ class ContentTranslationEnableTest extends WebTestBase { 'entity_types[entity_test_mul]' => TRUE, 'settings[entity_test_mul][entity_test_mul][translatable]' => TRUE, ]; - $this->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration')); + $this->drupalPostForm(NULL, $edit, t('Save configuration')); // No pending updates should be available. $this->drupalGet('admin/reports/status'); $requirement_value = $this->cssSelect("tr.system-status-report__entry th:contains('Entity/field definitions') + td"); $this->assertEqual(t('Up to date'), trim((string) $requirement_value[0])); + + // Create a node type and check the content translation settings are now + // available for nodes. + $edit = array( + 'name' => 'foo', + 'title_label' => 'title for foo', + 'type' => 'foo', + ); + $this->drupalPostForm('admin/structure/types/add', $edit, t('Save content type')); + $this->drupalGet('admin/config/regional/content-language'); + $this->assertRaw('entity_types[node]'); } } diff --git a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php index 33d936a46..1b79d1313 100644 --- a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php +++ b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php @@ -107,7 +107,8 @@ abstract class ContentTranslationUITestBase extends ContentTranslationTestBase { $language = ConfigurableLanguage::load($langcode); $values[$langcode] = $this->getNewEntityValues($langcode); - $add_url = Url::fromRoute('content_translation.translation_add_' . $entity->getEntityTypeId(), [ + $entity_type_id = $entity->getEntityTypeId(); + $add_url = Url::fromRoute("entity.$entity_type_id.content_translation_add", [ $entity->getEntityTypeId() => $entity->id(), 'source' => $default_langcode, 'target' => $langcode @@ -167,7 +168,8 @@ abstract class ContentTranslationUITestBase extends ContentTranslationTestBase { $language = ConfigurableLanguage::load($langcode); $source_langcode = 'it'; $edit = array('source_langcode[source]' => $source_langcode); - $add_url = Url::fromRoute('content_translation.translation_add_' . $entity->getEntityTypeId(), [ + $entity_type_id = $entity->getEntityTypeId(); + $add_url = Url::fromRoute("entity.$entity_type_id.content_translation_add", [ $entity->getEntityTypeId() => $entity->id(), 'source' => $default_langcode, 'target' => $langcode @@ -180,7 +182,8 @@ abstract class ContentTranslationUITestBase extends ContentTranslationTestBase { // Add another translation and mark the other ones as outdated. $values[$langcode] = $this->getNewEntityValues($langcode); $edit = $this->getEditValues($values, $langcode) + array('content_translation[retranslate]' => TRUE); - $add_url = Url::fromRoute('content_translation.translation_add_' . $entity->getEntityTypeId(), [ + $entity_type_id = $entity->getEntityTypeId(); + $add_url = Url::fromRoute("entity.$entity_type_id.content_translation_add", [ $entity->getEntityTypeId() => $entity->id(), 'source' => $source_langcode, 'target' => $langcode @@ -207,13 +210,15 @@ abstract class ContentTranslationUITestBase extends ContentTranslationTestBase { */ protected function doTestTranslationOverview() { $entity = entity_load($this->entityTypeId, $this->entityId, TRUE); - $this->drupalGet($entity->urlInfo('drupal:content-translation-overview')); + $translate_url = $entity->urlInfo('drupal:content-translation-overview'); + $this->drupalGet($translate_url); + $translate_url->setAbsolute(FALSE); foreach ($this->langcodes as $langcode) { if ($entity->hasTranslation($langcode)) { $language = new Language(array('id' => $langcode)); - $view_path = $entity->url('canonical', array('language' => $language)); - $elements = $this->xpath('//table//a[@href=:href]', array(':href' => $view_path)); + $view_url = $entity->url('canonical', ['language' => $language]); + $elements = $this->xpath('//table//a[@href=:href]', [':href' => $view_url]); $this->assertEqual((string) $elements[0], $entity->getTranslation($langcode)->label(), format_string('Label correctly shown for %language translation.', array('%language' => $langcode))); $edit_path = $entity->url('edit-form', array('language' => $language)); $elements = $this->xpath('//table//ul[@class="dropbutton"]/li/a[@href=:href]', array(':href' => $edit_path)); @@ -343,7 +348,7 @@ abstract class ContentTranslationUITestBase extends ContentTranslationTestBase { // Check that the translator cannot delete the original translation. $args = [$this->entityTypeId => $entity->id(), 'language' => 'en']; - $this->drupalGet(Url::fromRoute('content_translation.translation_delete_' . $this->entityTypeId, $args)); + $this->drupalGet(Url::fromRoute("entity.$this->entityTypeId.content_translation_delete", $args)); $this->assertResponse(403); } diff --git a/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php b/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php index 9d8a052e4..63c1963d0 100644 --- a/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php +++ b/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php @@ -73,7 +73,7 @@ class ContentTranslationWorkflowsTest extends ContentTranslationTestBase { // Create a translation. $this->drupalLogin($this->translator); - $add_translation_url = Url::fromRoute('content_translation.translation_add_' . $this->entityTypeId, [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $this->langcodes[2]]); + $add_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_add", [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $this->langcodes[2]]); $this->drupalPostForm($add_translation_url, array(), t('Save')); $this->rebuildContainer(); } @@ -175,7 +175,7 @@ class ContentTranslationWorkflowsTest extends ContentTranslationTestBase { $this->assertResponse($expected_status['overview'], SafeMarkup::format('The @user_label has the expected translation overview access.', $args)); // Check whether the user is allowed to create a translation. - $add_translation_url = Url::fromRoute('content_translation.translation_add_' . $this->entityTypeId, [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $langcode], $options); + $add_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_add", [$this->entityTypeId => $this->entity->id(), 'source' => $default_langcode, 'target' => $langcode], $options); if ($expected_status['add_translation'] == 200) { $this->clickLink('Add'); $this->assertUrl($add_translation_url->toString(), [], 'The translation overview points to the translation form when creating translations.'); @@ -193,7 +193,7 @@ class ContentTranslationWorkflowsTest extends ContentTranslationTestBase { // Check whether the user is allowed to edit a translation. $langcode = $this->langcodes[2]; $options['language'] = $languages[$langcode]; - $edit_translation_url = Url::fromRoute('content_translation.translation_edit_' . $this->entityTypeId, [$this->entityTypeId => $this->entity->id(), 'language' => $langcode], $options); + $edit_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_edit", [$this->entityTypeId => $this->entity->id(), 'language' => $langcode], $options); if ($expected_status['edit_translation'] == 200) { $this->drupalGet($translations_url); $editor = $expected_status['edit'] == 200; @@ -221,7 +221,7 @@ class ContentTranslationWorkflowsTest extends ContentTranslationTestBase { // Check whether the user is allowed to delete a translation. $langcode = $this->langcodes[2]; $options['language'] = $languages[$langcode]; - $delete_translation_url = Url::fromRoute('content_translation.translation_delete_' . $this->entityTypeId, [$this->entityTypeId => $this->entity->id(), 'language' => $langcode], $options); + $delete_translation_url = Url::fromRoute("entity.$this->entityTypeId.content_translation_delete", [$this->entityTypeId => $this->entity->id(), 'language' => $langcode], $options); if ($expected_status['delete_translation'] == 200) { $this->drupalGet($translations_url); $editor = $expected_status['delete'] == 200; diff --git a/core/modules/editor/editor.module b/core/modules/editor/editor.module index e83d49a97..a2c3219e8 100644 --- a/core/modules/editor/editor.module +++ b/core/modules/editor/editor.module @@ -464,7 +464,11 @@ function _editor_get_file_uuids_by_field(EntityInterface $entity) { $formatted_text_fields = _editor_get_formatted_text_fields($entity); foreach ($formatted_text_fields as $formatted_text_field) { - $text = $entity->get($formatted_text_field)->value; + $text = ''; + $field_items = $entity->get($formatted_text_field); + foreach ($field_items as $field_item) { + $text .= $field_item->value; + } $uuids[$formatted_text_field] = _editor_parse_file_uuids($text); } return $uuids; diff --git a/core/modules/editor/src/Annotation/Editor.php b/core/modules/editor/src/Annotation/Editor.php index 58d2450c1..e0b28059c 100644 --- a/core/modules/editor/src/Annotation/Editor.php +++ b/core/modules/editor/src/Annotation/Editor.php @@ -14,11 +14,43 @@ use Drupal\Component\Annotation\Plugin; * * Plugin Namespace: Plugin\Editor * + * Text editor plugin implementations need to define a plugin definition array + * through annotation. These definition arrays may be altered through + * hook_editor_info_alter(). The definition includes the following keys: + * + * - id: The unique, system-wide identifier of the text editor. Typically named + * the same as the editor library. + * - label: The human-readable name of the text editor, translated. + * - supports_content_filtering: Whether the editor supports "allowed content + * only" filtering. + * - supports_inline_editing: Whether the editor supports the inline editing + * provided by the Edit module. + * - is_xss_safe: Whether this text editor is not vulnerable to XSS attacks. + * - supported_element_types: On which form element #types this text editor is + * capable of working. + * + * A complete sample plugin definition should be defined as in this example: + * + * @code + * @Editor( + * id = "myeditor", + * label = @Translation("My Editor"), + * supports_content_filtering = FALSE, + * supports_inline_editing = FALSE, + * is_xss_safe = FALSE, + * supported_element_types = { + * "textarea", + * "textfield", + * } + * ) + * @endcode + * * For a working example, see \Drupal\ckeditor\Plugin\Editor\CKEditor * * @see \Drupal\editor\Plugin\EditorPluginInterface * @see \Drupal\editor\Plugin\EditorBase * @see \Drupal\editor\Plugin\EditorManager + * @see hook_editor_info_alter() * @see plugin_api * * @Annotation diff --git a/core/modules/editor/src/EditorController.php b/core/modules/editor/src/EditorController.php index fd605cd78..73d5dad0e 100644 --- a/core/modules/editor/src/EditorController.php +++ b/core/modules/editor/src/EditorController.php @@ -60,6 +60,9 @@ class EditorController extends ControllerBase { * @return \Symfony\Component\HttpFoundation\JsonResponse * A JSON response containing the XSS-filtered value. * + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * Thrown if no value to filter is specified. + * * @see editor_filter_xss() */ public function filterXss(Request $request, FilterFormatInterface $filter_format) { diff --git a/core/modules/editor/src/Plugin/EditorBase.php b/core/modules/editor/src/Plugin/EditorBase.php index cc39c18a4..514a32cd4 100644 --- a/core/modules/editor/src/Plugin/EditorBase.php +++ b/core/modules/editor/src/Plugin/EditorBase.php @@ -17,30 +17,8 @@ use Drupal\editor\Entity\Editor; * This class provides default implementations of the EditorPluginInterface so * that classes extending this one do not need to implement every method. * - * Plugins extending this class need to define a plugin definition array through - * annotation. These definition arrays may be altered through - * hook_editor_info_alter(). The definition includes the following keys: - * - * - id: The unique, system-wide identifier of the text editor. Typically named - * the same as the editor library. - * - label: The human-readable name of the text editor, translated. - * - supports_content_filtering: Whether the editor supports "allowed content - * only" filtering. - * - supports_inline_editing: Whether the editor supports the inline editing - * provided by the Edit module. - * - is_xss_safe: Whether this text editor is not vulnerable to XSS attacks. - * - * A complete sample plugin definition should be defined as in this example: - * - * @code - * @Editor( - * id = "myeditor", - * label = @Translation("My Editor"), - * supports_content_filtering = FALSE, - * supports_inline_editing = FALSE, - * is_xss_safe = FALSE - * ) - * @endcode + * Plugins extending this class need to specify an annotation containing the + * plugin definition so the plugin can be discovered. * * @see \Drupal\editor\Annotation\Editor * @see \Drupal\editor\Plugin\EditorPluginInterface diff --git a/core/modules/editor/src/Tests/EditorFileUsageTest.php b/core/modules/editor/src/Tests/EditorFileUsageTest.php index 7b5210e50..6e291d434 100644 --- a/core/modules/editor/src/Tests/EditorFileUsageTest.php +++ b/core/modules/editor/src/Tests/EditorFileUsageTest.php @@ -8,6 +8,8 @@ namespace Drupal\editor\Tests; use Drupal\system\Tests\Entity\EntityUnitTestBase; +use Drupal\field\Entity\FieldStorageConfig; +use Drupal\Core\Field\FieldStorageDefinitionInterface; /** * Tests tracking of file usage by the Text Editor module. @@ -39,6 +41,11 @@ class EditorFileUsageTest extends EntityUnitTestBase { )); $filtered_html_format->save(); + // Set cardinality for body field. + FieldStorageConfig::loadByName('node', 'body') + ->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) + ->save(); + // Set up text editor. $editor = entity_create('editor', array( 'format' => 'filtered_html', @@ -56,33 +63,56 @@ class EditorFileUsageTest extends EntityUnitTestBase { * Tests the configurable text editor manager. */ public function testEditorEntityHooks() { - $image = entity_create('file'); - $image->setFileUri('core/misc/druplicon.png'); - $image->setFilename(drupal_basename($image->getFileUri())); - $image->save(); - $file_usage = $this->container->get('file.usage'); - $this->assertIdentical(array(), $file_usage->listUsage($image), 'The image has zero usages.'); + $image_paths = array( + 0 => 'core/misc/druplicon.png', + 1 => 'core/misc/tree.png', + 2 => 'core/misc/help.png', + ); + + $image_entities = array(); + foreach ($image_paths as $key => $image_path) { + $image = entity_create('file'); + $image->setFileUri($image_path); + $image->setFilename(drupal_basename($image->getFileUri())); + $image->save(); + + $file_usage = $this->container->get('file.usage'); + $this->assertIdentical(array(), $file_usage->listUsage($image), 'The image ' . $image_paths[$key] . ' has zero usages.'); + + $image_entities[] = $image; + } + + $body = array(); + foreach ($image_entities as $key => $image_entity) { + // Don't be rude, say hello. + $body_value = '

Hello, world!

'; + // Test handling of a valid image entry. + $body_value .= ''; + // Test handling of an invalid data-entity-uuid attribute. + $body_value .= ''; + // Test handling of an invalid data-entity-type attribute. + $body_value .= ''; + // Test handling of a non-existing UUID. + $body_value .= ''; + + $body[] = array( + 'value' => $body_value, + 'format' => 'filtered_html', + ); + } - $body_value = '

Hello, world!

'; - // Test handling of an invalid data-entity-uuid attribute. - $body_value .= ''; - // Test handling of an invalid data-entity-type attribute. - $body_value .= ''; - // Test handling of a non-existing UUID. - $body_value .= ''; // Test editor_entity_insert(): increment. $this->createUser(); $node = entity_create('node', array( 'type' => 'page', 'title' => 'test', - 'body' => array( - 'value' => $body_value, - 'format' => 'filtered_html', - ), + 'body' => $body, 'uid' => 1, )); $node->save(); - $this->assertIdentical(array('editor' => array('node' => array(1 => '1'))), $file_usage->listUsage($image), 'The image has 1 usage.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array('editor' => array('node' => array(1 => '1'))), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has 1 usage.'); + } // Test editor_entity_update(): increment, twice, by creating new revisions. $node->setNewRevision(TRUE); @@ -90,45 +120,68 @@ class EditorFileUsageTest extends EntityUnitTestBase { $second_revision_id = $node->getRevisionId(); $node->setNewRevision(TRUE); $node->save(); - $this->assertIdentical(array('editor' => array('node' => array(1 => '3'))), $file_usage->listUsage($image), 'The image has 3 usages.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array('editor' => array('node' => array(1 => '3'))), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has 3 usages.'); + } // Test hook_entity_update(): decrement, by modifying the last revision: // remove the data-entity-type attribute from the body field. - $body = $node->get('body')->first()->get('value'); - $original_value = $body->getValue(); - $new_value = str_replace('data-entity-type', 'data-entity-type-modified', $original_value); - $body->setValue($new_value); + $original_values = array(); + for ($i = 0; $i < count($image_entities); $i++) { + $original_value = $node->body[$i]->value; + $new_value = str_replace('data-entity-type', 'data-entity-type-modified', $original_value); + $node->body[$i]->value = $new_value; + $original_values[$i] = $original_value; + } $node->save(); - $this->assertIdentical(array('editor' => array('node' => array(1 => '2'))), $file_usage->listUsage($image), 'The image has 2 usages.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array('editor' => array('node' => array(1 => '2'))), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has 2 usages.'); + } // Test editor_entity_update(): increment again by creating a new revision: // read the data- attributes to the body field. $node->setNewRevision(TRUE); - $node->get('body')->first()->get('value')->setValue($original_value); + foreach ($original_values as $key => $original_value) { + $node->body[$key]->value = $original_value; + } $node->save(); - $this->assertIdentical(array('editor' => array('node' => array(1 => '3'))), $file_usage->listUsage($image), 'The image has 3 usages.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array('editor' => array('node' => array(1 => '3'))), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has 3 usages.'); + } // Test hook_entity_update(): decrement, by modifying the last revision: // remove the data-entity-uuid attribute from the body field. - $body = $node->get('body')->first()->get('value'); - $new_value = str_replace('data-entity-uuid', 'data-entity-uuid-modified', $original_value); - $body->setValue($new_value); + foreach ($original_values as $key => $original_value) { + $original_value = $node->body[$key]->value; + $new_value = str_replace('data-entity-type', 'data-entity-type-modified', $original_value); + $node->body[$key]->value = $new_value; + } $node->save(); - $this->assertIdentical(array('editor' => array('node' => array(1 => '2'))), $file_usage->listUsage($image), 'The image has 2 usages.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array('editor' => array('node' => array(1 => '2'))), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has 2 usages.'); + } // Test hook_entity_update(): increment, by modifying the last revision: // read the data- attributes to the body field. - $node->get('body')->first()->get('value')->setValue($original_value); + foreach ($original_values as $key => $original_value) { + $node->body[$key]->value = $original_value; + } $node->save(); - $this->assertIdentical(array('editor' => array('node' => array(1 => '3'))), $file_usage->listUsage($image), 'The image has 3 usages.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array('editor' => array('node' => array(1 => '3'))), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has 3 usages.'); + } // Test editor_entity_revision_delete(): decrement, by deleting a revision. entity_revision_delete('node', $second_revision_id); - $this->assertIdentical(array('editor' => array('node' => array(1 => '2'))), $file_usage->listUsage($image), 'The image has 2 usages.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array('editor' => array('node' => array(1 => '2'))), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has 2 usages.'); + } // Test editor_entity_delete(). $node->delete(); - $this->assertIdentical(array(), $file_usage->listUsage($image), 'The image has zero usages again.'); + foreach ($image_entities as $key => $image_entity) { + $this->assertIdentical(array(), $file_usage->listUsage($image_entity), 'The image ' . $image_paths[$key] . ' has zero usages again.'); + } } } diff --git a/core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php b/core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php index bddfc271b..923590319 100644 --- a/core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php +++ b/core/modules/field/src/Plugin/migrate/source/d6/FieldInstance.php @@ -40,7 +40,7 @@ class FieldInstance extends DrupalSqlBase { public function fields() { return array( 'field_name' => $this->t('The machine name of field.'), - 'type_name' => $this->t('Content type where is used this field.'), + 'type_name' => $this->t('Content type where this field is in use.'), 'weight' => $this->t('Weight.'), 'label' => $this->t('A name to show.'), 'widget_type' => $this->t('Widget type.'), diff --git a/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php index f8a934855..f629ce8cc 100644 --- a/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php +++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php @@ -7,6 +7,8 @@ namespace Drupal\field\Tests\EntityReference; +use Drupal\comment\Entity\Comment; +use Drupal\Component\Render\FormattableMarkup; use Drupal\Component\Utility\Unicode; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FieldItemInterface; @@ -17,8 +19,11 @@ use Drupal\entity_test\Entity\EntityTestStringId; use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\field\Tests\FieldUnitTestBase; +use Drupal\file\Entity\File; +use Drupal\node\Entity\Node; use Drupal\taxonomy\Entity\Term; use Drupal\taxonomy\Entity\Vocabulary; +use Drupal\user\Entity\User; /** @@ -35,7 +40,7 @@ class EntityReferenceItemTest extends FieldUnitTestBase { * * @var array */ - public static $modules = ['taxonomy', 'text', 'filter', 'views', 'field']; + public static $modules = ['node', 'comment', 'file', 'taxonomy', 'text', 'filter', 'views', 'field']; /** * The taxonomy vocabulary to test with. @@ -66,6 +71,11 @@ class EntityReferenceItemTest extends FieldUnitTestBase { $this->installEntitySchema('entity_test_string_id'); $this->installEntitySchema('taxonomy_term'); + $this->installEntitySchema('node'); + $this->installEntitySchema('comment'); + $this->installEntitySchema('file'); + + $this->installSchema('comment', ['comment_entity_statistics']); $this->vocabulary = entity_create('taxonomy_vocabulary', array( 'name' => $this->randomMachineName(), @@ -90,6 +100,10 @@ class EntityReferenceItemTest extends FieldUnitTestBase { $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_taxonomy_term', 'Test content entity reference', 'taxonomy_term'); $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_entity_test_string_id', 'Test content entity reference with string ID', 'entity_test_string_id'); $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_taxonomy_vocabulary', 'Test config entity reference', 'taxonomy_vocabulary'); + $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_node', 'Test node entity reference', 'node'); + $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_user', 'Test user entity reference', 'user'); + $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_comment', 'Test comment entity reference', 'comment'); + $this->createEntityReferenceField('entity_test', 'entity_test', 'field_test_file', 'Test file entity reference', 'file'); } /** @@ -333,9 +347,9 @@ class EntityReferenceItemTest extends FieldUnitTestBase { } /** - * Tests validation constraint. + * Tests ValidReferenceConstraint with newly created and unsaved entities. */ - public function testValidation() { + public function testAutocreateValidation() { // The term entity is unsaved here. $term = Term::create(array( 'name' => $this->randomMachineName(), @@ -367,6 +381,100 @@ class EntityReferenceItemTest extends FieldUnitTestBase { $entity->save(); $errors = $entity->validate(); $this->assertEqual(0, count($errors)); + + // Test with an unpublished and unsaved node. + $title = $this->randomString(); + $node = Node::create([ + 'title' => $title, + 'type' => 'node', + 'status' => NODE_NOT_PUBLISHED, + ]); + + $entity = EntityTest::create([ + 'field_test_node' => [ + 'entity' => $node, + ], + ]); + + $errors = $entity->validate(); + $this->assertEqual(1, count($errors)); + $this->assertEqual($errors[0]->getMessage(), new FormattableMarkup('This entity (%type: %label) cannot be referenced.', ['%type' => 'node', '%label' => $title])); + $this->assertEqual($errors[0]->getPropertyPath(), 'field_test_node.0.entity'); + + // Publish the node and try again. + $node->setPublished(TRUE); + $errors = $entity->validate(); + $this->assertEqual(0, count($errors)); + + // Test with an unpublished and unsaved comment. + $title = $this->randomString(); + $comment = Comment::create([ + 'subject' => $title, + 'comment_type' => 'comment', + 'status' => 0, + ]); + + $entity = EntityTest::create([ + 'field_test_comment' => [ + 'entity' => $comment, + ], + ]); + + $errors = $entity->validate(); + $this->assertEqual(1, count($errors)); + $this->assertEqual($errors[0]->getMessage(), new FormattableMarkup('This entity (%type: %label) cannot be referenced.', ['%type' => 'comment', '%label' => $title])); + $this->assertEqual($errors[0]->getPropertyPath(), 'field_test_comment.0.entity'); + + // Publish the comment and try again. + $comment->setPublished(TRUE); + $errors = $entity->validate(); + $this->assertEqual(0, count($errors)); + + // Test with an inactive and unsaved user. + $name = $this->randomString(); + $user = User::create([ + 'name' => $name, + 'status' => 0, + ]); + + $entity = EntityTest::create([ + 'field_test_user' => [ + 'entity' => $user, + ], + ]); + + $errors = $entity->validate(); + $this->assertEqual(1, count($errors)); + $this->assertEqual($errors[0]->getMessage(), new FormattableMarkup('This entity (%type: %label) cannot be referenced.', ['%type' => 'user', '%label' => $name])); + $this->assertEqual($errors[0]->getPropertyPath(), 'field_test_user.0.entity'); + + // Activate the user and try again. + $user->activate(); + $errors = $entity->validate(); + $this->assertEqual(0, count($errors)); + + // Test with a temporary and unsaved file. + $filename = $this->randomMachineName() . '.txt'; + $file = File::create([ + 'filename' => $filename, + 'status' => 0, + ]); + + $entity = EntityTest::create([ + 'field_test_file' => [ + 'entity' => $file, + ], + ]); + + $errors = $entity->validate(); + $this->assertEqual(1, count($errors)); + $this->assertEqual($errors[0]->getMessage(), new FormattableMarkup('This entity (%type: %label) cannot be referenced.', ['%type' => 'file', '%label' => $filename])); + $this->assertEqual($errors[0]->getPropertyPath(), 'field_test_file.0.entity'); + + // Set the file as permanent and try again. + $file->setPermanent(); + $errors = $entity->validate(); + $this->assertEqual(0, count($errors)); } } diff --git a/core/modules/field/src/Tests/Uri/UriItemTest.php b/core/modules/field/src/Tests/Uri/UriItemTest.php index 46ffe0ad5..9dc50a2c6 100644 --- a/core/modules/field/src/Tests/Uri/UriItemTest.php +++ b/core/modules/field/src/Tests/Uri/UriItemTest.php @@ -68,6 +68,11 @@ class UriItemTest extends FieldUnitTestBase { 'type' => 'uri', ]) ->save(); + + // Test the generateSampleValue() method. + $entity = entity_create('entity_test'); + $entity->$field_name->generateSampleItems(); + $this->entityValidateAndSave($entity); } } diff --git a/core/modules/file/config/schema/file.destination.schema.yml b/core/modules/file/config/schema/file.destination.schema.yml index 5d494f701..c6b197ffe 100644 --- a/core/modules/file/config/schema/file.destination.schema.yml +++ b/core/modules/file/config/schema/file.destination.schema.yml @@ -5,3 +5,6 @@ migrate.destination.entity:file: source_path_property: type: string label: 'Source path' + urlencode: + type: boolean + label: 'Whether to urlencode incoming file paths' diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc index 6c065758a..bbfc2b23e 100644 --- a/core/modules/file/file.field.inc +++ b/core/modules/file/file.field.inc @@ -9,27 +9,6 @@ use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Field\FieldFilteredMarkup; use Drupal\Core\Render\Element; -/** - * Returns HTML for an individual file upload widget. - * - * Default template: file-widget.html.twig. - * - * @param array $variables - * An associative array containing: - * - element: A render element representing the file. - */ -function template_preprocess_file_widget(&$variables) { - $element = $variables['element']; - if (!empty($element['fids']['#value'])) { - // Add the file size after the file name. - $file = reset($element['#files']); - $element['file_' . $file->id()]['filename']['#suffix'] = ' (' . format_size($file->getSize()) . ') '; - } - $variables['element'] = $element; - // The "js-form-managed-file" class is required for proper Ajax functionality. - $variables['attributes'] = array('class' => array('file-widget', 'js-form-managed-file', 'form-managed-file', 'clearfix')); -} - /** * Prepares variables for multi file form widget templates. * diff --git a/core/modules/file/file.js b/core/modules/file/file.js index 30cf2450e..8ed377eec 100644 --- a/core/modules/file/file.js +++ b/core/modules/file/file.js @@ -110,10 +110,10 @@ */ Drupal.behaviors.filePreviewLinks = { attach: function (context) { - $(context).find('div.js-form-managed-file .file a, .file-widget .file a').on('click', Drupal.file.openInNewWindow); + $(context).find('div.js-form-managed-file .file a').on('click', Drupal.file.openInNewWindow); }, detach: function (context) { - $(context).find('div.js-form-managed-file .file a, .file-widget .file a').off('click', Drupal.file.openInNewWindow); + $(context).find('div.js-form-managed-file .file a').off('click', Drupal.file.openInNewWindow); } }; diff --git a/core/modules/file/file.module b/core/modules/file/file.module index d48b23209..26c35ac53 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -555,10 +555,6 @@ function file_theme() { ), // From file.field.inc. - 'file_widget' => array( - 'render element' => 'element', - 'file' => 'file.field.inc', - ), 'file_widget_multiple' => array( 'render element' => 'element', 'file' => 'file.field.inc', diff --git a/core/modules/file/migration_templates/d6_file.yml b/core/modules/file/migration_templates/d6_file.yml index 07a9cc2d3..a4693cf11 100644 --- a/core/modules/file/migration_templates/d6_file.yml +++ b/core/modules/file/migration_templates/d6_file.yml @@ -23,3 +23,4 @@ process: uid: uid destination: plugin: entity:file + urlencode: true diff --git a/core/modules/file/migration_templates/d7_file.yml b/core/modules/file/migration_templates/d7_file.yml index ea8f647f1..b10cca614 100644 --- a/core/modules/file/migration_templates/d7_file.yml +++ b/core/modules/file/migration_templates/d7_file.yml @@ -23,3 +23,4 @@ process: destination: plugin: entity:file source_path_property: filepath + urlencode: true diff --git a/core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php b/core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php index e789154d2..01fb8cd8a 100644 --- a/core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php +++ b/core/modules/file/src/Plugin/EntityReferenceSelection/FileSelection.php @@ -27,8 +27,41 @@ class FileSelection extends DefaultSelection { */ protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') { $query = parent::buildEntityQuery($match, $match_operator); - $query->condition('status', FILE_STATUS_PERMANENT); + // Allow referencing : + // - files with status "permanent" + // - or files uploaded by the current user (since newly uploaded files only + // become "permanent" after the containing entity gets validated and + // saved.) + $query->condition($query->orConditionGroup() + ->condition('status', FILE_STATUS_PERMANENT) + ->condition('uid', $this->currentUser->id())); return $query; } + /** + * {@inheritdoc} + */ + public function createNewEntity($entity_type_id, $bundle, $label, $uid) { + $file = parent::createNewEntity($entity_type_id, $bundle, $label, $uid); + + // In order to create a referenceable file, it needs to have a "permanent" + // status. + /** @var \Drupal\file\FileInterface $file */ + $file->setPermanent(); + + return $file; + } + + /** + * {@inheritdoc} + */ + public function validateReferenceableNewEntities(array $entities) { + $entities = parent::validateReferenceableNewEntities($entities); + $entities = array_filter($entities, function ($file) { + /** @var \Drupal\file\FileInterface $file */ + return $file->isPermanent() || $file->getOwnerId() === $this->currentUser->id(); + }); + return $entities; + } + } diff --git a/core/modules/file/src/Plugin/Field/FieldType/FileItem.php b/core/modules/file/src/Plugin/Field/FieldType/FileItem.php index 1633147b2..ba50903ae 100644 --- a/core/modules/file/src/Plugin/Field/FieldType/FileItem.php +++ b/core/modules/file/src/Plugin/Field/FieldType/FileItem.php @@ -28,7 +28,7 @@ use Drupal\Core\TypedData\DataDefinition; * default_widget = "file_generic", * default_formatter = "file_default", * list_class = "\Drupal\file\Plugin\Field\FieldType\FileFieldItemList", - * constraints = {"ValidReference" = {}, "ReferenceAccess" = {}} + * constraints = {"ReferenceAccess" = {}, "FileValidation" = {}} * ) */ class FileItem extends EntityReferenceItem { diff --git a/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php b/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php index bd511c8cf..3570c3506 100644 --- a/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php +++ b/core/modules/file/src/Plugin/Field/FieldWidget/FileWidget.php @@ -18,8 +18,9 @@ use Drupal\Core\Plugin\ContainerFactoryPluginInterface; use Drupal\Core\Render\Element; use Drupal\Core\Render\ElementInfoManagerInterface; use Drupal\file\Element\ManagedFile; -use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\file\Entity\File; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\Validator\ConstraintViolationListInterface; /** * Plugin implementation of the 'file_generic' widget. @@ -369,11 +370,6 @@ class FileWidget extends WidgetBase implements ContainerFactoryPluginInterface { $item = $element['#value']; $item['fids'] = $element['fids']['#value']; - // Prevent the file widget from overriding the image widget. - if (!isset($element['#theme'])) { - $element['#theme'] = 'file_widget'; - } - // Add the display field if enabled. if ($element['#display_field']) { $element['display'] = array( @@ -575,4 +571,15 @@ class FileWidget extends WidgetBase implements ContainerFactoryPluginInterface { static::setWidgetState($parents, $field_name, $form_state, $field_state); } + /** + * {@inheritdoc} + */ + public function flagErrors(FieldItemListInterface $items, ConstraintViolationListInterface $violations, array $form, FormStateInterface $form_state) { + // Never flag validation errors for the remove button. + $clicked_button = end($form_state->getTriggeringElement()['#parents']); + if ($clicked_button !== 'remove_button') { + parent::flagErrors($items, $violations, $form, $form_state); + } + } + } diff --git a/core/modules/file/src/Plugin/Validation/Constraint/FileValidationConstraint.php b/core/modules/file/src/Plugin/Validation/Constraint/FileValidationConstraint.php new file mode 100644 index 000000000..3b14feea0 --- /dev/null +++ b/core/modules/file/src/Plugin/Validation/Constraint/FileValidationConstraint.php @@ -0,0 +1,22 @@ +get('entity')->getTarget()->getValue(); + // Get the validators. + $validators = $value->getUploadValidators(); + // Checks that a file meets the criteria specified by the validators. + if ($errors = file_validate($file, $validators)) { + foreach ($errors as $error) { + $this->context->addViolation($error); + } + } + } + +} diff --git a/core/modules/file/src/Plugin/migrate/destination/EntityFile.php b/core/modules/file/src/Plugin/migrate/destination/EntityFile.php index c5e898948..38c3f8716 100644 --- a/core/modules/file/src/Plugin/migrate/destination/EntityFile.php +++ b/core/modules/file/src/Plugin/migrate/destination/EntityFile.php @@ -7,8 +7,11 @@ namespace Drupal\file\Plugin\migrate\destination; +use Drupal\Component\Utility\Unicode; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\Core\Field\FieldTypePluginManagerInterface; +use Drupal\Core\Field\Plugin\Field\FieldType\UriItem; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\StreamWrapper\LocalStream; use Drupal\Core\StreamWrapper\StreamWrapperManagerInterface; @@ -41,7 +44,7 @@ class EntityFile extends EntityContentBase { /** * {@inheritdoc} */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, StreamWrapperManagerInterface $stream_wrappers, FileSystemInterface $file_system) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager, StreamWrapperManagerInterface $stream_wrappers, FileSystemInterface $file_system) { $configuration += array( 'source_base_path' => '', 'source_path_property' => 'filepath', @@ -49,7 +52,7 @@ class EntityFile extends EntityContentBase { 'move' => FALSE, 'urlencode' => FALSE, ); - parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager); + parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager, $field_type_manager); $this->streamWrapperManager = $stream_wrappers; $this->fileSystem = $file_system; @@ -68,6 +71,7 @@ class EntityFile extends EntityContentBase { $container->get('entity.manager')->getStorage($entity_type), array_keys($container->get('entity.manager')->getBundleInfo($entity_type)), $container->get('entity.manager'), + $container->get('plugin.manager.field.field_type'), $container->get('stream_wrapper_manager'), $container->get('file_system') ); @@ -77,6 +81,12 @@ class EntityFile extends EntityContentBase { * {@inheritdoc} */ protected function getEntity(Row $row, array $old_destination_id_values) { + // For stub rows, there is no real file to deal with, let the stubbing + // process take its default path. + if ($row->isStub()) { + return parent::getEntity($row, $old_destination_id_values); + } + $destination = $row->getDestinationProperty($this->configuration['destination_path_property']); $entity = $this->storage->loadByProperties(['uri' => $destination]); if ($entity) { @@ -91,6 +101,12 @@ class EntityFile extends EntityContentBase { * {@inheritdoc} */ public function import(Row $row, array $old_destination_id_values = array()) { + // For stub rows, there is no real file to deal with, let the stubbing + // process create the stub entity. + if ($row->isStub()) { + return parent::import($row, $old_destination_id_values); + } + $file = $row->getSourceProperty($this->configuration['source_path_property']); $destination = $row->getDestinationProperty($this->configuration['destination_path_property']); $source = $this->configuration['source_base_path'] . $file; @@ -256,4 +272,30 @@ class EntityFile extends EntityContentBase { return $filename; } + /** + * {@inheritdoc} + */ + protected function processStubRow(Row $row) { + // We stub the uri value ourselves so we can create a real stub file for it. + if (!$row->getDestinationProperty('uri')) { + $field_definitions = $this->entityManager + ->getFieldDefinitions($this->storage->getEntityTypeId(), + $this->getKey('bundle')); + $value = UriItem::generateSampleValue($field_definitions['uri']); + if (empty($value)) { + throw new MigrateException('Stubbing failed, unable to generate value for field uri'); + } + // generateSampleValue() wraps the value in an array. + $value = reset($value); + // Make it into a proper public file uri, stripping off the existing + // scheme if present. + $value = 'public://' . preg_replace('|^[a-z]+://|i', '', $value); + $value = Unicode::substr($value, 0, $field_definitions['uri']->getSetting('max_length')); + // Create a real file, so File::preSave() can do filesize() on it. + touch($value); + $row->setDestinationProperty('uri', $value); + } + parent::processStubRow($row); + } + } diff --git a/core/modules/file/src/Plugin/migrate/process/d6/FileUri.php b/core/modules/file/src/Plugin/migrate/process/d6/FileUri.php index b464ee004..912371c25 100644 --- a/core/modules/file/src/Plugin/migrate/process/d6/FileUri.php +++ b/core/modules/file/src/Plugin/migrate/process/d6/FileUri.php @@ -24,6 +24,11 @@ class FileUri extends ProcessPluginBase { * {@inheritdoc} */ public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) { + // If we're stubbing a file entity, return a uri of NULL so it will get + // stubbed by the general process. + if ($row->isStub()) { + return NULL; + } list($filepath, $file_directory_path, $temp_directory_path, $is_public) = $value; // Specific handling using $temp_directory_path for temporary files. diff --git a/core/modules/file/src/Tests/FileFieldValidateTest.php b/core/modules/file/src/Tests/FileFieldValidateTest.php index 291c43297..12fe92552 100644 --- a/core/modules/file/src/Tests/FileFieldValidateTest.php +++ b/core/modules/file/src/Tests/FileFieldValidateTest.php @@ -159,4 +159,35 @@ class FileFieldValidateTest extends FileFieldTestBase { $this->assertFileEntryExists($node_file, 'File entry exists after uploading a file with extension checking.'); } + /** + * Checks that a file can always be removed if it does not pass validation. + */ + public function testFileRemoval() { + $node_storage = $this->container->get('entity.manager')->getStorage('node'); + $type_name = 'article'; + $field_name = 'file_test'; + $this->createFileField($field_name, 'node', $type_name); + + $test_file = $this->getTestFile('image'); + + // Disable extension checking. + $this->updateFileField($field_name, $type_name, array('file_extensions' => '')); + + // Check that the file can be uploaded with no extension checking. + $nid = $this->uploadNodeFile($test_file, $field_name, $type_name); + $node_storage->resetCache(array($nid)); + $node = $node_storage->load($nid); + $node_file = File::load($node->{$field_name}->target_id); + $this->assertFileExists($node_file, 'File exists after uploading a file with no extension checking.'); + $this->assertFileEntryExists($node_file, 'File entry exists after uploading a file with no extension checking.'); + + // Enable extension checking for text files. + $this->updateFileField($field_name, $type_name, array('file_extensions' => 'txt')); + + // Check that the file can still be removed. + $this->removeNodeFile($nid); + $this->assertNoText('Only files with the following extensions are allowed: txt.'); + $this->assertText('Article ' . $node->getTitle() . ' has been updated.'); + } + } diff --git a/core/modules/file/src/Tests/Migrate/MigrateFileStubTest.php b/core/modules/file/src/Tests/Migrate/MigrateFileStubTest.php new file mode 100644 index 000000000..ae7446c87 --- /dev/null +++ b/core/modules/file/src/Tests/Migrate/MigrateFileStubTest.php @@ -0,0 +1,42 @@ +installEntitySchema('file'); + } + + /** + * Tests creation of file stubs. + */ + public function testStub() { + $this->performStubTest('file'); + } + +} diff --git a/core/modules/file/templates/file-widget.html.twig b/core/modules/file/templates/file-widget.html.twig deleted file mode 100644 index 892ed3d83..000000000 --- a/core/modules/file/templates/file-widget.html.twig +++ /dev/null @@ -1,17 +0,0 @@ -{# -/** - * @file - * Default theme implementation to display a file widget. - * - * Available variables: - * - element: Form element for the managed file. - * - attributes: Remaining HTML attributes for the containing element. - * - * @see template_preprocess_file_widget() - * - * @ingroup themeable - */ -#} - - {{ element }} - diff --git a/core/modules/file/tests/src/Kernel/FileItemValidationTest.php b/core/modules/file/tests/src/Kernel/FileItemValidationTest.php new file mode 100644 index 000000000..fbfcbd18e --- /dev/null +++ b/core/modules/file/tests/src/Kernel/FileItemValidationTest.php @@ -0,0 +1,119 @@ +installEntitySchema('user'); + $this->installEntitySchema('file'); + $this->installSchema('file', 'file_usage'); + $this->installSchema('system', 'sequences'); + + $this->user = User::create([ + 'name' => 'username', + 'status' => 1, + ]); + $this->user->save(); + } + + /** + * @covers \Drupal\file\Plugin\Validation\Constraint\FileValidationConstraint + * @covers \Drupal\file\Plugin\Validation\Constraint\FileValidationConstraintValidator + * @dataProvider getFileTypes + */ + public function testFileValidationConstraint($file_type) { + $field_storage = FieldStorageConfig::create([ + 'field_name' => 'field_test_file', + 'entity_type' => 'entity_test', + 'type' => $file_type, + ]); + $field_storage->save(); + + $field = FieldConfig::create([ + 'field_name' => 'field_test_file', + 'entity_type' => 'entity_test', + 'bundle' => 'entity_test', + 'settings' => [ + 'max_filesize' => '2k', + 'file_extensions' => 'jpg|png', + ], + ]); + $field->save(); + + vfsStream::setup('drupal_root'); + vfsStream::create([ + 'sites' => [ + 'default' => [ + 'files' => [ + 'test.txt' => str_repeat('a', 3000), + ] + ] + ] + ]); + + // Test for max filesize. + $file = File::create([ + 'uri' => 'vfs://drupal_root/sites/default/files/test.txt', + ]); + $file->setPermanent(); + $file->save(); + + $entity_test = EntityTest::create([ + 'uid' => $this->user->id(), + 'field_test_file' => [ + 'target_id' => $file->id(), + ] + ]); + $result = $entity_test->validate(); + $this->assertCount(2, $result); + + $this->assertEquals('field_test_file.0', $result->get(0)->getPropertyPath()); + $this->assertEquals('The file is 2.93 KB exceeding the maximum file size of 2 KB.', (string) $result->get(0)->getMessage()); + $this->assertEquals('field_test_file.0', $result->get(1)->getPropertyPath()); + $this->assertEquals('Only files with the following extensions are allowed: jpg|png.', (string) $result->get(1)->getMessage()); + } + + /** + * Provides a list of file types to test. + */ + public function getFileTypes() { + return [['file'], ['image']]; + } + +} diff --git a/core/modules/history/history.routing.yml b/core/modules/history/history.routing.yml index f4db92a27..ff01a7c33 100644 --- a/core/modules/history/history.routing.yml +++ b/core/modules/history/history.routing.yml @@ -11,3 +11,4 @@ history.read_node: _controller: '\Drupal\history\Controller\HistoryController::readNode' requirements: _entity_access: 'node.view' + node: \d+ diff --git a/core/modules/history/src/Plugin/views/filter/HistoryUserTimestamp.php b/core/modules/history/src/Plugin/views/filter/HistoryUserTimestamp.php index 221692732..9abfe5639 100644 --- a/core/modules/history/src/Plugin/views/filter/HistoryUserTimestamp.php +++ b/core/modules/history/src/Plugin/views/filter/HistoryUserTimestamp.php @@ -81,8 +81,7 @@ class HistoryUserTimestamp extends FilterPluginBase { $clause = ''; $clause2 = ''; - if (\Drupal::moduleHandler()->moduleExists('comment')) { - $ces = $this->query->ensureTable('comment_entity_statistics', $this->relationship); + if ($ces = $this->query->ensureTable('comment_entity_statistics', $this->relationship)) { $clause = ("OR $ces.last_comment_timestamp > (***CURRENT_TIME*** - $limit)"); $clause2 = "OR $field < $ces.last_comment_timestamp"; } diff --git a/core/modules/history/src/Tests/Views/HistoryTimestampTest.php b/core/modules/history/src/Tests/Views/HistoryTimestampTest.php index 44f67f958..a76a5e804 100644 --- a/core/modules/history/src/Tests/Views/HistoryTimestampTest.php +++ b/core/modules/history/src/Tests/Views/HistoryTimestampTest.php @@ -80,5 +80,14 @@ class HistoryTimestampTest extends ViewTestBase { $this->executeView($view); $this->assertEqual(count($view->result), 1); $this->assertIdenticalResultset($view, array(array('nid' => $nodes[0]->id())), $column_map); + + // Install Comment module and make sure that content types without comment + // field will not break the view. + // See \Drupal\history\Plugin\views\filter\HistoryUserTimestamp::query() + \Drupal::service('module_installer')->install(['comment']); + $view = Views::getView('test_history'); + $view->setDisplay('page_2'); + $this->executeView($view); + } } diff --git a/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php b/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php index 442929fe7..9ec3b6794 100644 --- a/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php +++ b/core/modules/image/src/Plugin/Field/FieldType/ImageItem.php @@ -43,7 +43,7 @@ use Drupal\file\Plugin\Field\FieldType\FileItem; * }, * }, * list_class = "\Drupal\file\Plugin\Field\FieldType\FileFieldItemList", - * constraints = {"ValidReference" = {}, "ReferenceAccess" = {}} + * constraints = {"ReferenceAccess" = {}, "FileValidation" = {}} * ) */ class ImageItem extends FileItem { @@ -346,10 +346,10 @@ class ImageItem extends FileItem { if ($path = $random->image(drupal_realpath($destination), $min_resolution, $max_resolution)) { $image = File::create(); $image->setFileUri($path); - // $image->setOwner($account); + $image->setOwnerId(\Drupal::currentUser()->id()); $image->setMimeType('image/' . pathinfo($path, PATHINFO_EXTENSION)); $image->setFileName(drupal_basename($path)); - $destination_dir = $settings['uri_scheme'] . '://' . $settings['file_directory']; + $destination_dir = static::doGetUploadLocation($settings); file_prepare_directory($destination_dir, FILE_CREATE_DIRECTORY); $destination = $destination_dir . '/' . basename($path); $file = file_move($image, $destination, FILE_CREATE_DIRECTORY); diff --git a/core/modules/language/language.install b/core/modules/language/language.install new file mode 100644 index 000000000..dcec16ae6 --- /dev/null +++ b/core/modules/language/language.install @@ -0,0 +1,13 @@ +invalidateContainer(); +} diff --git a/core/modules/language/language.services.yml b/core/modules/language/language.services.yml index fc9bba1cf..19d0f21a9 100644 --- a/core/modules/language/language.services.yml +++ b/core/modules/language/language.services.yml @@ -9,7 +9,7 @@ services: - [initLanguageManager] language.config_subscriber: class: Drupal\language\EventSubscriber\ConfigSubscriber - arguments: ['@language_manager', '@language.default', '@config.factory'] + arguments: ['@language_manager', '@language.default', '@config.factory', '@language_negotiator'] tags: - { name: event_subscriber } language.config_factory_override: diff --git a/core/modules/language/src/EventSubscriber/ConfigSubscriber.php b/core/modules/language/src/EventSubscriber/ConfigSubscriber.php index e1875ce7d..f1c758234 100644 --- a/core/modules/language/src/EventSubscriber/ConfigSubscriber.php +++ b/core/modules/language/src/EventSubscriber/ConfigSubscriber.php @@ -14,6 +14,8 @@ use Drupal\Core\Language\LanguageManagerInterface; use Drupal\Core\Config\ConfigCrudEvent; use Drupal\Core\Config\ConfigEvents; use Drupal\language\ConfigurableLanguageManager; +use Drupal\language\HttpKernel\PathProcessorLanguage; +use Drupal\language\LanguageNegotiatorInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** @@ -42,6 +44,20 @@ class ConfigSubscriber implements EventSubscriberInterface { */ protected $configFactory; + /** + * The language negotiator. + * + * @var \Drupal\language\LanguageNegotiatorInterface + */ + protected $languageNegotiator; + + /** + * The language path processor. + * + * @var \Drupal\language\HttpKernel\PathProcessorLanguage + */ + protected $pathProcessorLanguage; + /** * Constructs a new class object. * @@ -51,11 +67,14 @@ class ConfigSubscriber implements EventSubscriberInterface { * The default language. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The configuration factory. + * @param \Drupal\language\LanguageNegotiatorInterface $language_negotiator + * The language negotiator. */ - public function __construct(LanguageManagerInterface $language_manager, LanguageDefault $language_default, ConfigFactoryInterface $config_factory) { + public function __construct(LanguageManagerInterface $language_manager, LanguageDefault $language_default, ConfigFactoryInterface $config_factory, LanguageNegotiatorInterface $language_negotiator) { $this->languageManager = $language_manager; $this->languageDefault = $language_default; $this->configFactory = $config_factory; + $this->languageNegotiator = $language_negotiator; } /** @@ -102,6 +121,25 @@ class ConfigSubscriber implements EventSubscriberInterface { // Trigger a container rebuild on the next request by invalidating it. ConfigurableLanguageManager::rebuildServices(); } + elseif ($saved_config->getName() == 'language.types' && $event->isChanged('negotiation')) { + // If the negotiation configuration changed the language negotiator and + // the language path processor have to be reset so that they regenerate + // the method instances and also sort them accordingly to the new config. + $this->languageNegotiator->reset(); + if (isset($this->pathProcessorLanguage)) { + $this->pathProcessorLanguage->reset(); + } + } + } + + /** + * Injects the language path processors on multilingual site configuration. + * + * @param \Drupal\language\HttpKernel\PathProcessorLanguage $path_processor_language + * The language path processor. + */ + public function setPathProcessorLanguage(PathProcessorLanguage $path_processor_language) { + $this->pathProcessorLanguage = $path_processor_language; } /** diff --git a/core/modules/language/src/Form/ContentLanguageSettingsForm.php b/core/modules/language/src/Form/ContentLanguageSettingsForm.php index ebbf0fd95..4b7d4a50a 100644 --- a/core/modules/language/src/Form/ContentLanguageSettingsForm.php +++ b/core/modules/language/src/Form/ContentLanguageSettingsForm.php @@ -63,7 +63,7 @@ class ContentLanguageSettingsForm extends FormBase { $bundles = $this->entityManager->getAllBundleInfo(); $language_configuration = array(); foreach ($entity_types as $entity_type_id => $entity_type) { - if (!$entity_type instanceof ContentEntityTypeInterface || !$entity_type->hasKey('langcode')) { + if (!$entity_type instanceof ContentEntityTypeInterface || !$entity_type->hasKey('langcode') || !isset($bundles[$entity_type_id])) { continue; } $labels[$entity_type_id] = $entity_type->getLabel() ?: $entity_type_id; diff --git a/core/modules/language/src/HttpKernel/PathProcessorLanguage.php b/core/modules/language/src/HttpKernel/PathProcessorLanguage.php index caddfc0a0..aa5870915 100644 --- a/core/modules/language/src/HttpKernel/PathProcessorLanguage.php +++ b/core/modules/language/src/HttpKernel/PathProcessorLanguage.php @@ -13,6 +13,7 @@ use Drupal\Core\PathProcessor\InboundPathProcessorInterface; use Drupal\Core\PathProcessor\OutboundPathProcessorInterface; use Drupal\Core\Render\BubbleableMetadata; use Drupal\language\ConfigurableLanguageManagerInterface; +use Drupal\language\EventSubscriber\ConfigSubscriber; use Drupal\language\LanguageNegotiatorInterface; use Symfony\Component\HttpFoundation\Request; use Drupal\Core\Session\AccountInterface; @@ -57,6 +58,14 @@ class PathProcessorLanguage implements InboundPathProcessorInterface, OutboundPa */ protected $multilingual; + /** + * The language configuration event subscriber. + * + * @var \Drupal\language\EventSubscriber\ConfigSubscriber + */ + protected $configSubscriber; + + /** * Constructs a PathProcessorLanguage object. * @@ -68,12 +77,15 @@ class PathProcessorLanguage implements InboundPathProcessorInterface, OutboundPa * The language negotiator. * @param \Drupal\Core\Session\AccountInterface $current_user * The current active user. + * @param \Drupal\language\EventSubscriber\ConfigSubscriber $config_subscriber + * The language configuration event subscriber. */ - public function __construct(ConfigFactoryInterface $config, ConfigurableLanguageManagerInterface $language_manager, LanguageNegotiatorInterface $negotiator, AccountInterface $current_user) { + public function __construct(ConfigFactoryInterface $config, ConfigurableLanguageManagerInterface $language_manager, LanguageNegotiatorInterface $negotiator, AccountInterface $current_user, ConfigSubscriber $config_subscriber) { $this->config = $config; $this->languageManager = $language_manager; $this->negotiator = $negotiator; $this->negotiator->setCurrentUser($current_user); + $this->configSubscriber = $config_subscriber; } /** @@ -152,4 +164,22 @@ class PathProcessorLanguage implements InboundPathProcessorInterface, OutboundPa }); } + /** + * Initializes the injected event subscriber with the language path processor. + * + * The language path processor service is registered only on multilingual + * site configuration, thus we inject it in the event subscriber only when + * it is initialized. + */ + public function initConfigSubscriber() { + $this->configSubscriber->setPathProcessorLanguage($this); + } + + /** + * Resets the collected processors instances. + */ + public function reset() { + $this->processors = array(); + } + } diff --git a/core/modules/language/src/LanguageServiceProvider.php b/core/modules/language/src/LanguageServiceProvider.php index 2f1840c09..c3f1cd12d 100644 --- a/core/modules/language/src/LanguageServiceProvider.php +++ b/core/modules/language/src/LanguageServiceProvider.php @@ -39,7 +39,9 @@ class LanguageServiceProvider extends ServiceProviderBase { ->addArgument(new Reference('config.factory')) ->addArgument(new Reference('language_manager')) ->addArgument(new Reference('language_negotiator')) - ->addArgument(new Reference('current_user')); + ->addArgument(new Reference('current_user')) + ->addArgument(new Reference('language.config_subscriber')) + ->addMethodCall('initConfigSubscriber'); } } diff --git a/core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationContentEntity.php b/core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationContentEntity.php new file mode 100644 index 000000000..4ce022dea --- /dev/null +++ b/core/modules/language/src/Plugin/LanguageNegotiation/LanguageNegotiationContentEntity.php @@ -0,0 +1,294 @@ +entityManager = $entity_manager; + $this->paths = new \SplObjectStorage(); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static($container->get('entity.manager')); + } + + /** + * {@inheritdoc} + */ + public function getLangcode(Request $request = NULL) { + $langcode = $request->get(static::QUERY_PARAMETER); + + $language_enabled = array_key_exists($langcode, $this->languageManager->getLanguages()); + return $language_enabled ? $langcode : NULL; + } + + /** + * {@inheritdoc} + */ + public function processOutbound($path, &$options = [], Request $request = NULL, BubbleableMetadata $bubbleable_metadata = NULL) { + // If appropriate, process outbound to add a query parameter to the url and + // remove the language option, so that url negotiator does not rewrite the + // url. + + // First, check if processing conditions are met. + if (!($request && !empty($options['route']) && $this->hasLowerLanguageNegotiationWeight() && $this->meetsContentEntityRoutesCondition($options['route'], $request))) { + return $path; + } + + if (isset($options['language']) || $langcode = $this->getLangcode($request)) { + // If the language option is set, unset it, so that the url language + // negotiator does not rewrite the url. + if (isset($options['language'])) { + $langcode = $options['language']->getId(); + unset($options['language']); + } + + if (isset($options['query']) && is_string($options['query'])) { + $query = []; + parse_str($options['query'], $query); + $options['query'] = $query; + } + else { + $options['query'] = []; + } + + if (!isset($options['query'][static::QUERY_PARAMETER])) { + $query_addon = [static::QUERY_PARAMETER => $langcode]; + $options['query'] += $query_addon; + // @todo Remove this once https://www.drupal.org/node/2507005 lands. + $path .= (strpos($path, '?') !== FALSE ? '&' : '?') . UrlHelper::buildQuery($query_addon); + } + + if ($bubbleable_metadata) { + // Cached URLs that have been processed by this outbound path + // processor must be: + $bubbleable_metadata + // - varied by the content language query parameter. + ->addCacheContexts(['url.query_args:' . static::QUERY_PARAMETER]); + } + } + + return $path; + } + + /** + * {@inheritdoc} + */ + public function getLanguageSwitchLinks(Request $request, $type, Url $url) { + $links = []; + $query = []; + parse_str($request->getQueryString(), $query); + + foreach ($this->languageManager->getNativeLanguages() as $language) { + $langcode = $language->getId(); + $query[static::QUERY_PARAMETER] = $langcode; + $links[$langcode] = [ + 'url' => $url, + 'title' => $language->getName(), + 'attributes' => ['class' => ['language-link']], + 'query' => $query, + ]; + } + + return $links; + } + + /** + * Determines if content entity language negotiator has higher priority. + * + * The content entity language negotiator having higher priority than the url + * language negotiator, is a criteria in + * \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationContentEntity::processOutbound(). + * + * @return bool + * TRUE if the the content entity language negotiator has higher priority + * than the url language negotiator, FALSE otherwise. + */ + protected function hasLowerLanguageNegotiationWeight() { + if (!isset($this->hasLowerLanguageNegotiationWeightResult)) { + // Only run if the LanguageNegotiationContentEntity outbound function is + // being executed before the outbound function of LanguageNegotiationUrl. + $content_method_weights = $this->config->get('language.types')->get('negotiation.language_content.enabled') ?: []; + + // Check if the content language is configured to be dependent on the + // url negotiator directly or indirectly over the interface negotiator. + if (isset($content_method_weights[LanguageNegotiationUrl::METHOD_ID]) && ($content_method_weights[static::METHOD_ID] > $content_method_weights[LanguageNegotiationUrl::METHOD_ID])) { + $this->hasLowerLanguageNegotiationWeightResult = FALSE; + } + else { + $check_interface_method = FALSE; + if (isset($content_method_weights[LanguageNegotiationUI::METHOD_ID])) { + $interface_method_weights = $this->config->get('language.types')->get('negotiation.language_interface.enabled') ?: []; + $check_interface_method = isset($interface_method_weights[LanguageNegotiationUrl::METHOD_ID]); + } + if ($check_interface_method) { + $max_weight = $content_method_weights[LanguageNegotiationUI::METHOD_ID]; + $max_weight = isset($content_method_weights[LanguageNegotiationUrl::METHOD_ID]) ? max($max_weight, $content_method_weights[LanguageNegotiationUrl::METHOD_ID]) : $max_weight; + } + else { + $max_weight = isset($content_method_weights[LanguageNegotiationUrl::METHOD_ID]) ? $content_method_weights[LanguageNegotiationUrl::METHOD_ID] : PHP_INT_MAX; + } + + $this->hasLowerLanguageNegotiationWeightResult = $content_method_weights[static::METHOD_ID] < $max_weight; + } + } + + return $this->hasLowerLanguageNegotiationWeightResult; + } + + /** + * Determines if content entity route condition is met. + * + * Requirements: currently being on an content entity route and processing + * outbound url pointing to the same content entity. + * + * @param \Symfony\Component\Routing\Route $outbound_route + * The route object for the current outbound url being processed. + * @param \Symfony\Component\HttpFoundation\Request $request + * The HttpRequest object representing the current request. + * + * @return bool + * TRUE if the content entity route condition is met, FALSE otherwise. + */ + protected function meetsContentEntityRoutesCondition(Route $outbound_route, Request $request) { + $outbound_path_pattern = $outbound_route->getPath(); + $storage = isset($this->paths[$request]) ? $this->paths[$request] : []; + if (!isset($storage[$outbound_path_pattern])) { + $storage[$outbound_path_pattern] = FALSE; + + // Check if the outbound route points to the current entity. + if ($content_entity_type_id_for_current_route = $this->getContentEntityTypeIdForCurrentRequest($request)) { + if (!empty($this->getContentEntityPaths()[$outbound_path_pattern]) && $content_entity_type_id_for_current_route == $this->getContentEntityPaths()[$outbound_path_pattern]) { + $storage[$outbound_path_pattern] = TRUE; + } + } + + $this->paths[$request] = $storage; + } + + return $storage[$outbound_path_pattern]; + } + + /** + * Returns the content entity type ID from the current request for the route. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * The HttpRequest object representing the current request. + * + * @return string + * The entity type ID for the route from the request. + */ + protected function getContentEntityTypeIdForCurrentRequest(Request $request) { + $content_entity_type_id_for_current_route = ''; + + if ($current_route = $request->attributes->get(RouteObjectInterface::ROUTE_OBJECT)) { + $current_route_path = $current_route->getPath(); + $content_entity_type_id_for_current_route = isset($this->getContentEntityPaths()[$current_route_path]) ? $this->getContentEntityPaths()[$current_route_path] : ''; + } + + return $content_entity_type_id_for_current_route; + } + + /** + * Returns the paths for the link templates of all content entities. + * + * @return array + * An array of all content entity type IDs, keyed by the corresponding link + * template paths. + */ + protected function getContentEntityPaths() { + if (!isset($this->contentEntityPaths)) { + $this->contentEntityPaths = []; + $entity_types = $this->entityManager->getDefinitions(); + foreach ($entity_types as $entity_type_id => $entity_type) { + if ($entity_type->isSubclassOf(ContentEntityInterface::class)) { + $entity_paths = array_fill_keys($entity_type->getLinkTemplates(), $entity_type_id); + $this->contentEntityPaths = array_merge($this->contentEntityPaths, $entity_paths); + } + } + } + + return $this->contentEntityPaths; + } + +} diff --git a/core/modules/language/src/Tests/EntityUrlLanguageTest.php b/core/modules/language/src/Tests/EntityUrlLanguageTest.php index 915f7f605..f172b38f4 100644 --- a/core/modules/language/src/Tests/EntityUrlLanguageTest.php +++ b/core/modules/language/src/Tests/EntityUrlLanguageTest.php @@ -7,22 +7,34 @@ namespace Drupal\language\Tests; +use Drupal\Core\Language\LanguageInterface; use Drupal\entity_test\Entity\EntityTest; use Drupal\language\Entity\ConfigurableLanguage; -use Drupal\simpletest\KernelTestBase; +use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationContentEntity; +use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl; +use Symfony\Cmf\Component\Routing\RouteObjectInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Route; /** * Tests the language of entity URLs. * @group language */ -class EntityUrlLanguageTest extends KernelTestBase { +class EntityUrlLanguageTest extends LanguageTestBase { /** * Modules to enable. * * @var array */ - public static $modules = ['language', 'entity_test', 'user', 'system']; + public static $modules = ['entity_test', 'user']; + + /** + * The entity being used for testing. + * + * @var \Drupal\Core\Entity\ContentEntityInterface + */ + protected $entity; protected function setUp() { parent::setUp(); @@ -37,33 +49,93 @@ class EntityUrlLanguageTest extends KernelTestBase { ConfigurableLanguage::create(['id' => 'es'])->save(); ConfigurableLanguage::create(['id' => 'fr'])->save(); - $this->config('language.types')->setData([ - 'configurable' => ['language_interface'], - 'negotiation' => ['language_interface' => ['enabled' => ['language-url' => 0]]], - ])->save(); - $this->config('language.negotiation')->setData([ - 'url' => [ - 'source' => 'path_prefix', - 'prefixes' => ['en' => 'en', 'es' => 'es', 'fr' => 'fr'] - ], - ])->save(); + $config = $this->config('language.negotiation'); + $config->set('url.prefixes', ['en' => 'en', 'es' => 'es', 'fr' => 'fr']) + ->save(); $this->kernel->rebuildContainer(); - $this->container = $this->kernel->getContainer(); - \Drupal::setContainer($this->container); + + $this->createTranslatableEntity(); } /** * Ensures that entity URLs in a language have the right language prefix. */ public function testEntityUrlLanguage() { - $entity = EntityTest::create(); - $entity->addTranslation('es', ['name' => 'name spanish']); - $entity->addTranslation('fr', ['name' => 'name french']); - $entity->save(); + $this->assertTrue(strpos($this->entity->urlInfo()->toString(), '/en/entity_test/' . $this->entity->id()) !== FALSE); + $this->assertTrue(strpos($this->entity->getTranslation('es')->urlInfo()->toString(), '/es/entity_test/' . $this->entity->id()) !== FALSE); + $this->assertTrue(strpos($this->entity->getTranslation('fr')->urlInfo()->toString(), '/fr/entity_test/' . $this->entity->id()) !== FALSE); + } - $this->assertTrue(strpos($entity->urlInfo()->toString(), '/en/entity_test/' . $entity->id()) !== FALSE); - $this->assertTrue(strpos($entity->getTranslation('es')->urlInfo()->toString(), '/es/entity_test/' . $entity->id()) !== FALSE); - $this->assertTrue(strpos($entity->getTranslation('fr')->urlInfo()->toString(), '/fr/entity_test/' . $entity->id()) !== FALSE); + /** + * Ensures correct entity URLs with the method language-content-entity enabled. + * + * Test case with the method language-content-entity enabled and configured + * with higher and also with lower priority than the method language-url. + */ + public function testEntityUrlLanguageWithLanguageContentEnabled() { + // Define the method language-content-entity with a higher priority than + // language-url. + $config = $this->config('language.types'); + $config->set('configurable', [LanguageInterface::TYPE_INTERFACE, LanguageInterface::TYPE_CONTENT]); + $config->set('negotiation.language_content.enabled', [ + LanguageNegotiationContentEntity::METHOD_ID => 0, + LanguageNegotiationUrl::METHOD_ID => 1 + ]); + $config->save(); + + // Without being on an content entity route the default entity URL tests + // should still pass. + $this->testEntityUrlLanguage(); + + // Now switching to an entity route, so that the URL links are generated + // while being on an entity route. + $this->setCurrentRequestForRoute('/entity_test/{entity_test}', 'entity.entity_test.canonical'); + + // The method language-content-entity should run before language-url and + // append query parameter for the content language and prevent language-url + // from overwriting the url. + $this->assertTrue(strpos($this->entity->urlInfo('canonical')->toString(), '/en/entity_test/' . $this->entity->id() . '?' . LanguageNegotiationContentEntity::QUERY_PARAMETER . '=en') !== FALSE); + $this->assertTrue(strpos($this->entity->getTranslation('es')->urlInfo('canonical')->toString(), '/en/entity_test/' . $this->entity->id() . '?' . LanguageNegotiationContentEntity::QUERY_PARAMETER . '=es') !== FALSE); + $this->assertTrue(strpos($this->entity->getTranslation('fr')->urlInfo('canonical')->toString(), '/en/entity_test/' . $this->entity->id() . '?' . LanguageNegotiationContentEntity::QUERY_PARAMETER . '=fr') !== FALSE); + + // Define the method language-url with a higher priority than + // language-content-entity. This configuration should match the default one, + // where the language-content-entity is turned off. + $config->set('negotiation.language_content.enabled', [ + LanguageNegotiationUrl::METHOD_ID => 0, + LanguageNegotiationContentEntity::METHOD_ID => 1 + ]); + $config->save(); + + // The default entity URL tests should pass again with the current + // configuration. + $this->testEntityUrlLanguage(); + } + + /** + * Creates a translated entity. + */ + protected function createTranslatableEntity() { + $this->entity = EntityTest::create(); + $this->entity->addTranslation('es', ['name' => 'name spanish']); + $this->entity->addTranslation('fr', ['name' => 'name french']); + $this->entity->save(); + } + + /** + * Sets the current request to a specific path with the corresponding route. + * + * @param string $path + * The path for which the current request should be created. + * @param string $route_name + * The route name for which the route object for the request should be + * created. + */ + protected function setCurrentRequestForRoute($path, $route_name) { + $request = Request::create($path); + $request->attributes->set(RouteObjectInterface::ROUTE_NAME, $route_name); + $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route($path)); + $this->container->get('request_stack')->push($request); } } diff --git a/core/modules/language/src/Tests/LanguageNegotiationContentEntityTest.php b/core/modules/language/src/Tests/LanguageNegotiationContentEntityTest.php new file mode 100644 index 000000000..5373096fc --- /dev/null +++ b/core/modules/language/src/Tests/LanguageNegotiationContentEntityTest.php @@ -0,0 +1,182 @@ + 'es'])->save(); + ConfigurableLanguage::create(['id' => 'fr'])->save(); + + // In order to reflect the changes for a multilingual site in the container + // we have to rebuild it. + $this->rebuildContainer(); + + $this->createTranslatableEntity(); + + $user = $this->drupalCreateUser(array('view test entity')); + $this->drupalLogin($user); + } + + /** + * Tests default with content language remaining same as interface language. + */ + public function testDefaultConfiguration() { + $translation = $this->entity; + $this->drupalGet($translation->urlInfo()); + $last = $this->container->get('state')->get('language_test.language_negotiation_last'); + $last_content_language = $last[LanguageInterface::TYPE_CONTENT]; + $last_interface_language = $last[LanguageInterface::TYPE_INTERFACE]; + $this->assertTrue(($last_interface_language == $last_content_language) && ($last_content_language == $translation->language()->getId()), new FormattableMarkup('Interface language %interface_language and Content language %content_language are the same as the translation language %translation_language of the entity.', ['%interface_language' => $last_interface_language, '%content_language' => $last_content_language, '%translation_language' => $translation->language()->getId()])); + + $translation = $this->entity->getTranslation('es'); + $this->drupalGet($translation->urlInfo()); + $last = $this->container->get('state')->get('language_test.language_negotiation_last'); + $last_content_language = $last[LanguageInterface::TYPE_CONTENT]; + $last_interface_language = $last[LanguageInterface::TYPE_INTERFACE]; + $this->assertTrue(($last_interface_language == $last_content_language) && ($last_content_language == $translation->language()->getId()), new FormattableMarkup('Interface language %interface_language and Content language %content_language are the same as the translation language %translation_language of the entity.', ['%interface_language' => $last_interface_language, '%content_language' => $last_content_language, '%translation_language' => $translation->language()->getId()])); + + $translation = $this->entity->getTranslation('fr'); + $this->drupalGet($translation->urlInfo()); + $last = $this->container->get('state')->get('language_test.language_negotiation_last'); + $last_content_language = $last[LanguageInterface::TYPE_CONTENT]; + $last_interface_language = $last[LanguageInterface::TYPE_INTERFACE]; + $this->assertTrue(($last_interface_language == $last_content_language) && ($last_content_language == $translation->language()->getId()), new FormattableMarkup('Interface language %interface_language and Content language %content_language are the same as the translation language %translation_language of the entity.', ['%interface_language' => $last_interface_language, '%content_language' => $last_content_language, '%translation_language' => $translation->language()->getId()])); + } + + /** + * Tests enabling the language negotiator language_content_entity. + */ + public function testEnabledLanguageContentNegotiator() { + // Define the method language-url with a higher priority than + // language-content-entity. This configuration should match the default one, + // where the language-content-entity is turned off. + $config = $this->config('language.types'); + $config->set('configurable', [LanguageInterface::TYPE_INTERFACE, LanguageInterface::TYPE_CONTENT]); + $config->set('negotiation.language_content.enabled', [ + LanguageNegotiationUrl::METHOD_ID => 0, + LanguageNegotiationContentEntity::METHOD_ID => 1 + ]); + $config->save(); + + // In order to reflect the changes for a multilingual site in the container + // we have to rebuild it. + $this->rebuildContainer(); + + // The tests for the default configuration should still pass. + $this->testDefaultConfiguration(); + + // Define the method language-content-entity with a higher priority than + // language-url. + $config->set('negotiation.language_content.enabled', [ + LanguageNegotiationContentEntity::METHOD_ID => 0, + LanguageNegotiationUrl::METHOD_ID => 1 + ]); + $config->save(); + + // In order to reflect the changes for a multilingual site in the container + // we have to rebuild it. + $this->rebuildContainer(); + + // The method language-content-entity should run before language-url and + // append query parameter for the content language and prevent language-url + // from overwriting the URL. + $default_site_langcode = $this->config('system.site')->get('default_langcode'); + + // Now switching to an entity route, so that the URL links are generated + // while being on an entity route. + $this->setCurrentRequestForRoute('/entity_test/{entity_test}', 'entity.entity_test.canonical'); + + $translation = $this->entity; + $this->drupalGet($translation->urlInfo()); + $last = $this->container->get('state')->get('language_test.language_negotiation_last'); + $last_content_language = $last[LanguageInterface::TYPE_CONTENT]; + $last_interface_language = $last[LanguageInterface::TYPE_INTERFACE]; + $this->assertTrue(($last_interface_language == $default_site_langcode) && ($last_interface_language == $last_content_language) && ($last_content_language == $translation->language()->getId()), 'Interface language and Content language are the same as the default translation language of the entity.'); + $this->assertTrue($last_interface_language == $default_site_langcode, 'Interface language did not change from the default site language.'); + $this->assertTrue($last_content_language == $translation->language()->getId(), 'Content language matches the current entity translation language.'); + + $translation = $this->entity->getTranslation('es'); + $this->drupalGet($translation->urlInfo()); + $last = $this->container->get('state')->get('language_test.language_negotiation_last'); + $last_content_language = $last[LanguageInterface::TYPE_CONTENT]; + $last_interface_language = $last[LanguageInterface::TYPE_INTERFACE]; + $this->assertTrue($last_interface_language == $default_site_langcode, 'Interface language did not change from the default site language.'); + $this->assertTrue($last_content_language == $translation->language()->getId(), 'Content language matches the current entity translation language.'); + + $translation = $this->entity->getTranslation('fr'); + $this->drupalGet($translation->urlInfo()); + $last = $this->container->get('state')->get('language_test.language_negotiation_last'); + $last_content_language = $last[LanguageInterface::TYPE_CONTENT]; + $last_interface_language = $last[LanguageInterface::TYPE_INTERFACE]; + $this->assertTrue($last_interface_language == $default_site_langcode, 'Interface language did not change from the default site language.'); + $this->assertTrue($last_content_language == $translation->language()->getId(), 'Content language matches the current entity translation language.'); + } + + /** + * Creates a translated entity. + */ + protected function createTranslatableEntity() { + $this->entity = EntityTest::create(); + $this->entity->addTranslation('es', ['name' => 'name spanish']); + $this->entity->addTranslation('fr', ['name' => 'name french']); + $this->entity->save(); + } + + /** + * Sets the current request to a specific path with the corresponding route. + * + * @param string $path + * The path for which the current request should be created. + * @param string $route_name + * The route name for which the route object for the request should be + * created. + */ + protected function setCurrentRequestForRoute($path, $route_name) { + $request = Request::create($path); + $request->attributes->set(RouteObjectInterface::ROUTE_NAME, $route_name); + $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route($path)); + $this->container->get('request_stack')->push($request); + } + +} diff --git a/core/modules/language/src/Tests/LanguageSelectorTranslatableTest.php b/core/modules/language/src/Tests/LanguageSelectorTranslatableTest.php index 15290fdd2..7f9a72ecd 100644 --- a/core/modules/language/src/Tests/LanguageSelectorTranslatableTest.php +++ b/core/modules/language/src/Tests/LanguageSelectorTranslatableTest.php @@ -84,7 +84,7 @@ class LanguageSelectorTranslatableTest extends WebTestBase { $this->drupalGet($path); // Get en language from selector. - $elements = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => 'edit-settings-node-node-settings-language-langcode', ':option' => 'en')); + $elements = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => 'edit-settings-user-user-settings-language-langcode', ':option' => 'en')); // Check that the language text is translated. $this->assertEqual((string) $elements[0], $name_translation, 'Checking the option string English is translated to Spanish.'); diff --git a/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php b/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php index 4645d68bc..16ba13e46 100644 --- a/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php +++ b/core/modules/language/src/Tests/LanguageUILanguageNegotiationTest.php @@ -221,8 +221,13 @@ class LanguageUILanguageNegotiationTest extends WebTestBase { // Unknown language prefix should return 404. $definitions = \Drupal::languageManager()->getNegotiator()->getNegotiationMethods(); + // Enable only methods, which are either not limited to a specific language + // type or are supporting the interface language type. + $language_interface_method_definitions = array_filter($definitions, function ($method_definition) { + return !isset($method_definition['types']) || (isset($method_definition['types']) && in_array(LanguageInterface::TYPE_INTERFACE, $method_definition['types'])); + }); $this->config('language.types') - ->set('negotiation.' . LanguageInterface::TYPE_INTERFACE . '.enabled', array_flip(array_keys($definitions))) + ->set('negotiation.' . LanguageInterface::TYPE_INTERFACE . '.enabled', array_flip(array_keys($language_interface_method_definitions))) ->save(); $this->drupalGet("$langcode_unknown/admin/config", array(), $http_header_browser_fallback); $this->assertResponse(404, "Unknown language path prefix should return 404"); diff --git a/core/modules/language/templates/language-negotiation-configure-form.html.twig b/core/modules/language/templates/language-negotiation-configure-form.html.twig index 12528acd4..60717314b 100644 --- a/core/modules/language/templates/language-negotiation-configure-form.html.twig +++ b/core/modules/language/templates/language-negotiation-configure-form.html.twig @@ -1,24 +1,25 @@ {# /** -* @file -* Default theme implementation for a language negotiation configuration form. -* -* Available variables: -* - language_types: A list of language negotiation types. Each language type -* contains the following: -* - type: The machine name for the negotiation type. -* - title: The language negotiation type name. -* - description: A description for how the language negotiation type operates. -* - configurable: A radio element to toggle the table. -* - table: A draggable table for the language detection methods of this type. -* - children: Remaining form items for the group. -* - attributes: A list of HTML attributes for the wrapper element. -* - children: Remaining form items for all groups. -* -* @see template_preprocess_language_negotiation_configure_form() -* -* @ingroup themeable -*/ + * @file + * Default theme implementation for a language negotiation configuration form. + * + * Available variables: + * - language_types: A list of language negotiation types. Each language type + * contains the following: + * - type: The machine name for the negotiation type. + * - title: The language negotiation type name. + * - description: A description for how the language negotiation type + * operates. + * - configurable: A radio element to toggle the table. + * - table: A draggable table for the language detection methods of this type. + * - children: Remaining form items for the group. + * - attributes: A list of HTML attributes for the wrapper element. + * - children: Remaining form items for all groups. + * + * @see template_preprocess_language_negotiation_configure_form() + * + * @ingroup themeable + */ #} {% for language_type in language_types %} {% diff --git a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php index 5c21ace87..722a0c1de 100644 --- a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php +++ b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php @@ -121,25 +121,30 @@ class LinkItem extends FieldItemBase implements LinkItemInterface { * {@inheritdoc} */ public static function generateSampleValue(FieldDefinitionInterface $field_definition) { - // Set of possible top-level domains. - $tlds = array('com', 'net', 'gov', 'org', 'edu', 'biz', 'info'); - // Set random length for the domain name. - $domain_length = mt_rand(7, 15); $random = new Random(); + if ($field_definition->getItemDefinition()->getSetting('link_type') & LinkItemInterface::LINK_EXTERNAL) { + // Set of possible top-level domains. + $tlds = array('com', 'net', 'gov', 'org', 'edu', 'biz', 'info'); + // Set random length for the domain name. + $domain_length = mt_rand(7, 15); - switch ($field_definition->getSetting('title')) { - case DRUPAL_DISABLED: - $values['title'] = ''; - break; - case DRUPAL_REQUIRED: - $values['title'] = $random->sentences(4); - break; - case DRUPAL_OPTIONAL: - // In case of optional title, randomize its generation. - $values['title'] = mt_rand(0,1) ? $random->sentences(4) : ''; - break; + switch ($field_definition->getSetting('title')) { + case DRUPAL_DISABLED: + $values['title'] = ''; + break; + case DRUPAL_REQUIRED: + $values['title'] = $random->sentences(4); + break; + case DRUPAL_OPTIONAL: + // In case of optional title, randomize its generation. + $values['title'] = mt_rand(0, 1) ? $random->sentences(4) : ''; + break; + } + $values['uri'] = 'http://www.' . $random->word($domain_length) . '.' . $tlds[mt_rand(0, (sizeof($tlds) - 1))]; + } + else { + $values['uri'] = 'base:' . $random->name(mt_rand(1, 64)); } - $values['uri'] = 'http://www.' . $random->word($domain_length) . '.' . $tlds[mt_rand(0, (sizeof($tlds)-1))]; return $values; } diff --git a/core/modules/link/src/Plugin/Validation/Constraint/LinkNotExistingInternalConstraintValidator.php b/core/modules/link/src/Plugin/Validation/Constraint/LinkNotExistingInternalConstraintValidator.php index dad78ab69..98b29e0bd 100644 --- a/core/modules/link/src/Plugin/Validation/Constraint/LinkNotExistingInternalConstraintValidator.php +++ b/core/modules/link/src/Plugin/Validation/Constraint/LinkNotExistingInternalConstraintValidator.php @@ -7,6 +7,8 @@ namespace Drupal\link\Plugin\Validation\Constraint; +use Symfony\Component\Routing\Exception\InvalidParameterException; +use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; use Symfony\Component\Routing\Exception\RouteNotFoundException; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidatorInterface; @@ -50,9 +52,17 @@ class LinkNotExistingInternalConstraintValidator implements ConstraintValidatorI try { $url->toString(); } + // The following exceptions are all possible during URL generation, and + // should be considered as disallowed URLs. catch (RouteNotFoundException $e) { $allowed = FALSE; } + catch (InvalidParameterException $e) { + $allowed = FALSE; + } + catch (MissingMandatoryParametersException $e) { + $allowed = FALSE; + } if (!$allowed) { $this->context->addViolation($constraint->message, array('@uri' => $value->uri)); } diff --git a/core/modules/link/src/Tests/LinkFieldTest.php b/core/modules/link/src/Tests/LinkFieldTest.php index 494936a09..eada49430 100644 --- a/core/modules/link/src/Tests/LinkFieldTest.php +++ b/core/modules/link/src/Tests/LinkFieldTest.php @@ -129,8 +129,6 @@ class LinkFieldTest extends WebTestBase { 'entity:user/1' => '- Restricted access - (1)', // URI for an entity that doesn't exist, but with a valid ID. 'entity:user/999999' => 'entity:user/999999', - // URI for an entity that doesn't exist, with an invalid ID. - 'entity:user/invalid-parameter' => 'entity:user/invalid-parameter', ); // Define some invalid URLs. @@ -146,6 +144,8 @@ class LinkFieldTest extends WebTestBase { $invalid_internal_entries = array( 'no-leading-slash' => $validation_error_2, 'entity:non_existing_entity_type/yar' => $validation_error_1, + // URI for an entity that doesn't exist, with an invalid ID. + 'entity:user/invalid-parameter' => $validation_error_1, ); // Test external and internal URLs for 'link_type' = LinkItemInterface::LINK_GENERIC. diff --git a/core/modules/link/src/Tests/LinkItemTest.php b/core/modules/link/src/Tests/LinkItemTest.php index 382a464f1..1115983f9 100644 --- a/core/modules/link/src/Tests/LinkItemTest.php +++ b/core/modules/link/src/Tests/LinkItemTest.php @@ -10,7 +10,10 @@ namespace Drupal\link\Tests; use Drupal\Component\Utility\UrlHelper; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FieldItemInterface; +use Drupal\field\Entity\FieldConfig; +use Drupal\field\Entity\FieldStorageConfig; use Drupal\field\Tests\FieldUnitTestBase; +use Drupal\link\LinkItemInterface; /** * Tests the new entity API for the link field type. @@ -29,17 +32,40 @@ class LinkItemTest extends FieldUnitTestBase { protected function setUp() { parent::setUp(); - // Create a link field for validation. - entity_create('field_storage_config', array( + // Create a generic, external, and internal link fields for validation. + FieldStorageConfig::create([ 'field_name' => 'field_test', 'entity_type' => 'entity_test', 'type' => 'link', - ))->save(); - entity_create('field_config', array( + ])->save(); + FieldConfig::create([ 'entity_type' => 'entity_test', 'field_name' => 'field_test', 'bundle' => 'entity_test', - ))->save(); + 'settings' => ['link_type' => LinkItemInterface::LINK_GENERIC], + ])->save(); + FieldStorageConfig::create([ + 'field_name' => 'field_test_external', + 'entity_type' => 'entity_test', + 'type' => 'link', + ])->save(); + FieldConfig::create([ + 'entity_type' => 'entity_test', + 'field_name' => 'field_test_external', + 'bundle' => 'entity_test', + 'settings' => ['link_type' => LinkItemInterface::LINK_EXTERNAL], + ])->save(); + FieldStorageConfig::create([ + 'field_name' => 'field_test_internal', + 'entity_type' => 'entity_test', + 'type' => 'link', + ])->save(); + FieldConfig::create([ + 'entity_type' => 'entity_test', + 'field_name' => 'field_test_internal', + 'bundle' => 'entity_test', + 'settings' => ['link_type' => LinkItemInterface::LINK_INTERNAL], + ])->save(); } /** @@ -130,9 +156,12 @@ class LinkItemTest extends FieldUnitTestBase { $entity->field_test[0] = NULL; $this->assertNull($entity->field_test[0]->getValue()); - // Test the generateSampleValue() method. + // Test the generateSampleValue() method for generic, external, and internal + // link types. $entity = entity_create('entity_test'); $entity->field_test->generateSampleItems(); + $entity->field_test_external->generateSampleItems(); + $entity->field_test_internal->generateSampleItems(); $this->entityValidateAndSave($entity); } diff --git a/core/modules/locale/src/Tests/LocaleConfigTranslationImportTest.php b/core/modules/locale/src/Tests/LocaleConfigTranslationImportTest.php index b0450e55b..dbe831099 100644 --- a/core/modules/locale/src/Tests/LocaleConfigTranslationImportTest.php +++ b/core/modules/locale/src/Tests/LocaleConfigTranslationImportTest.php @@ -78,6 +78,10 @@ class LocaleConfigTranslationImportTest extends WebTestBase { $this->container->get('module_installer')->install(['block', 'config_translation']); $this->resetAll(); + // The testing profile overrides locale.settings to disable translation + // import. Test that this override is in place. + $this->assertFalse($this->config('locale.settings')->get('translation.import_enabled'), 'Translations imports are disabled by default in the Testing profile.'); + $admin_user = $this->drupalCreateUser(array('administer modules', 'administer site configuration', 'administer languages', 'access administration pages', 'administer permissions', 'translate configuration')); $this->drupalLogin($admin_user); diff --git a/core/modules/locale/src/Tests/LocalePluralFormatTest.php b/core/modules/locale/src/Tests/LocalePluralFormatTest.php index ba5cf84a2..a8dfa453e 100644 --- a/core/modules/locale/src/Tests/LocalePluralFormatTest.php +++ b/core/modules/locale/src/Tests/LocalePluralFormatTest.php @@ -144,6 +144,66 @@ class LocalePluralFormatTest extends WebTestBase { } } + /** + * Tests plural editing of DateFormatter strings + */ + public function testPluralEditDateFormatter() { + + // Import some .po files with formulas to set up the environment. + // These will also add the languages to the system. + $this->importPoFile($this->getPoFileWithSimplePlural(), array( + 'langcode' => 'fr', + )); + + // Set French as the site default language. + $this->config('system.site')->set('default_langcode', 'fr')->save(); + + // Visit User Info page before updating translation strings. + $this->drupalGet('user'); + + // Member for time should be translated. + $this->assertText("seconde", "'Member for' text is translated."); + + $path = 'admin/config/regional/translate/'; + $search = array( + 'langcode' => 'fr', + // Limit to only translated strings to ensure that database ordering does + // not break the test. + 'translation' => 'translated', + ); + $this->drupalPostForm($path, $search, t('Filter')); + // Plural values for the langcode fr. + $this->assertText('@count seconde'); + $this->assertText('@count secondes'); + + // Inject a plural source string to the database. We need to use a specific + // langcode here because the language will be English by default and will + // not save our source string for performance optimization if we do not ask + // specifically for a language. + \Drupal::translation()->formatPlural(1, '1 second', '@count seconds', array(), array('langcode' => 'fr'))->render(); + $lid = db_query("SELECT lid FROM {locales_source} WHERE source = :source AND context = ''", array(':source' => "1 second" . LOCALE_PLURAL_DELIMITER . "@count seconds"))->fetchField(); + // Look up editing page for this plural string and check fields. + $search = array( + 'string' => '1 second', + 'langcode' => 'fr', + ); + $this->drupalPostForm('admin/config/regional/translate', $search, t('Filter')); + + // Save complete translations for the string in langcode fr. + $edit = array( + "strings[$lid][translations][0]" => '1 seconde updated', + "strings[$lid][translations][1]" => '@count secondes updated', + ); + $this->drupalPostForm($path, $edit, t('Save translations')); + + // User interface input for translating seconds should not be duplicated + $this->assertUniqueText('@count seconds', 'Interface translation input for @count seconds only appears once.'); + + // Member for time should be translated. + $this->drupalGet('user'); + $this->assertText("seconde", "'Member for' text is translated."); + } + /** * Tests plural editing and export functionality. */ @@ -308,6 +368,11 @@ msgid_plural "@count hours" msgstr[0] "@count heure" msgstr[1] "@count heures" +msgid "1 second" +msgid_plural "@count seconds" +msgstr[0] "@count seconde" +msgstr[1] "@count secondes" + msgid "Monday" msgstr "lundi" EOF; diff --git a/core/modules/menu_link_content/src/Tests/Migrate/MigrateMenuLinkContentStubTest.php b/core/modules/menu_link_content/src/Tests/Migrate/MigrateMenuLinkContentStubTest.php new file mode 100644 index 000000000..47e94d134 --- /dev/null +++ b/core/modules/menu_link_content/src/Tests/Migrate/MigrateMenuLinkContentStubTest.php @@ -0,0 +1,42 @@ +installEntitySchema('menu_link_content'); + } + + /** + * Tests creation of menu link content stubs. + */ + public function testStub() { + $this->performStubTest('menu_link_content'); + } + +} diff --git a/core/modules/migrate/src/MigrateExecutable.php b/core/modules/migrate/src/MigrateExecutable.php index 2749313d3..a3706239e 100644 --- a/core/modules/migrate/src/MigrateExecutable.php +++ b/core/modules/migrate/src/MigrateExecutable.php @@ -401,8 +401,8 @@ class MigrateExecutable implements MigrateExecutableInterface { $multiple = $multiple || $plugin->multiple(); } } - // No plugins means do not set. - if ($plugins) { + // No plugins or no value means do not set. + if ($plugins && !is_null($value)) { $row->setDestinationProperty($destination, $value); } // Reset the value. diff --git a/core/modules/migrate/src/Plugin/MigrateSourceInterface.php b/core/modules/migrate/src/Plugin/MigrateSourceInterface.php index efcf89861..3620e6777 100644 --- a/core/modules/migrate/src/Plugin/MigrateSourceInterface.php +++ b/core/modules/migrate/src/Plugin/MigrateSourceInterface.php @@ -44,10 +44,14 @@ interface MigrateSourceInterface extends \Countable, \Iterator, PluginInspection public function __toString(); /** - * Get the source ids. + * Defines the source fields uniquely identifying a source row. None of these + * fields should contain a NULL value - if necessary, use prepareRow() or + * hook_migrate_prepare_row() to rewrite NULL values to appropriate empty + * values (such as '' or 0). * * @return array - * The source ids. + * Array keyed by source field name, with values being a schema array + * describing the field (such as ['type' => 'string]). */ public function getIds(); diff --git a/core/modules/migrate/src/Plugin/migrate/destination/Entity.php b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php index 64123d6d4..f7a6a1e93 100644 --- a/core/modules/migrate/src/Plugin/migrate/destination/Entity.php +++ b/core/modules/migrate/src/Plugin/migrate/destination/Entity.php @@ -136,19 +136,6 @@ abstract class Entity extends DestinationBase implements ContainerFactoryPluginI return $row->getDestinationProperty($this->getKey('id')); } - /** - * Process the stub values. - * - * @param \Drupal\migrate\Row $row - * The row of data. - */ - protected function processStubRow(Row $row) { - $bundle_key = $this->getKey('bundle'); - if ($bundle_key && empty($row->getDestinationProperty($bundle_key))) { - $row->setDestinationProperty($bundle_key, reset($this->bundles)); - } - } - /** * Returns a specific entity key. * diff --git a/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php index ae3030a11..e2320cd75 100644 --- a/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php +++ b/core/modules/migrate/src/Plugin/migrate/destination/EntityContentBase.php @@ -7,12 +7,17 @@ namespace Drupal\migrate\Plugin\migrate\destination; +use Drupal\Component\Utility\Random; +use Drupal\Component\Utility\Unicode; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\Core\Field\FieldTypePluginManagerInterface; use Drupal\Core\TypedData\TypedDataInterface; +use Drupal\link\LinkItemInterface; use Drupal\migrate\Entity\MigrationInterface; +use Drupal\migrate\MigrateException; use Drupal\migrate\Plugin\MigrateIdMapInterface; use Drupal\migrate\Row; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -29,6 +34,13 @@ class EntityContentBase extends Entity { */ protected $entityManager; + /** + * Field type plugin manager. + * + * @var \Drupal\Core\Field\FieldTypePluginManagerInterface + */ + protected $fieldTypeManager; + /** * Constructs a content entity. * @@ -46,10 +58,13 @@ class EntityContentBase extends Entity { * The list of bundles this entity type has. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager service. + * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager + * The field type plugin manager service. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles); $this->entityManager = $entity_manager; + $this->fieldTypeManager = $field_type_manager; } /** @@ -64,7 +79,8 @@ class EntityContentBase extends Entity { $migration, $container->get('entity.manager')->getStorage($entity_type), array_keys($container->get('entity.manager')->getBundleInfo($entity_type)), - $container->get('entity.manager') + $container->get('entity.manager'), + $container->get('plugin.manager.field.field_type') ); } @@ -74,6 +90,9 @@ class EntityContentBase extends Entity { public function import(Row $row, array $old_destination_id_values = array()) { $this->rollbackAction = MigrateIdMapInterface::ROLLBACK_DELETE; $entity = $this->getEntity($row, $old_destination_id_values); + if (!$entity) { + throw new MigrateException('Unable to get entity'); + } return $this->save($entity, $old_destination_id_values); } @@ -132,4 +151,47 @@ class EntityContentBase extends Entity { $this->setRollbackAction($row->getIdMap()); } + /** + * Do as much population of the stub row as we can. + * + * @param \Drupal\migrate\Row $row + * The row of data. + */ + protected function processStubRow(Row $row) { + $bundle_key = $this->getKey('bundle'); + if ($bundle_key && empty($row->getDestinationProperty($bundle_key))) { + if (empty($this->bundles)) { + throw new MigrateException('Stubbing failed, no bundles available for entity type: ' . $this->storage->getEntityTypeId()); + } + $row->setDestinationProperty($bundle_key, reset($this->bundles)); + } + + // Populate any required fields not already populated. + $fields = $this->entityManager + ->getFieldDefinitions($this->storage->getEntityTypeId(), $bundle_key); + foreach ($fields as $field_name => $field_definition) { + if ($field_definition->isRequired() && is_null($row->getDestinationProperty($field_name))) { + // Use the configured default value for this specific field, if any. + if ($default_value = $field_definition->getDefaultValueLiteral()) { + $values[] = $default_value; + } + else { + // Otherwise, ask the field type to generate a sample value. + $field_type = $field_definition->getType(); + /** @var \Drupal\Core\Field\FieldItemInterface $field_type_class */ + $field_type_class = $this->fieldTypeManager + ->getPluginClass($field_definition->getType()); + $values = $field_type_class::generateSampleValue($field_definition); + if (is_null($values)) { + // Handle failure to generate a sample value. + throw new MigrateException('Stubbing failed, unable to generate value for field ' . $field_name); + break; + } + } + + $row->setDestinationProperty($field_name, $values); + } + } + } + } diff --git a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php index 1e47d1ae4..7f9746406 100644 --- a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php +++ b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php @@ -287,6 +287,7 @@ class Sql extends PluginBase implements MigrateIdMapInterface, ContainerFactoryP foreach ($this->migration->getSourcePlugin()->getIds() as $id_definition) { $mapkey = 'sourceid' . $count++; $source_id_schema[$mapkey] = $this->getFieldSchema($id_definition); + $source_id_schema[$mapkey]['not null'] = TRUE; // With InnoDB, utf8mb4-based primary keys can't be over 191 characters. // Use ASCII-based primary keys instead. diff --git a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php index a7e3e89b9..a222eee32 100644 --- a/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php +++ b/core/modules/migrate/src/Plugin/migrate/source/SourcePluginBase.php @@ -136,6 +136,7 @@ abstract class SourcePluginBase extends PluginBase implements MigrateSourceInter $this->skipCount = !empty($configuration['skip_count']); $this->cacheKey = !empty($configuration['cache_key']) ? !empty($configuration['cache_key']) : NULL; $this->trackChanges = !empty($configuration['track_changes']) ? $configuration['track_changes'] : FALSE; + $this->idMap = $this->migration->getIdMap(); // Pull out the current highwater mark if we have a highwater property. if ($this->highWaterProperty = $this->migration->get('highWaterProperty')) { @@ -256,7 +257,6 @@ abstract class SourcePluginBase extends PluginBase implements MigrateSourceInter * source records. */ public function rewind() { - $this->idMap = $this->migration->getIdMap(); $this->getIterator()->rewind(); $this->next(); } diff --git a/core/modules/migrate/src/Row.php b/core/modules/migrate/src/Row.php index e055c1d4c..4e788afec 100644 --- a/core/modules/migrate/src/Row.php +++ b/core/modules/migrate/src/Row.php @@ -73,7 +73,7 @@ class Row { * * @see getRawDestination() */ - protected $rawDestination; + protected $rawDestination = []; /** * TRUE when this row is a stub. @@ -222,6 +222,17 @@ class Row { NestedArray::setValue($this->destination, explode(static::PROPERTY_SEPARATOR, $property), $value, TRUE); } + /** + * Removes destination property. + * + * @param string $property + * The name of the destination property. + */ + public function removeDestinationProperty($property) { + unset($this->rawDestination[$property]); + NestedArray::unsetValue($this->destination, explode(static::PROPERTY_SEPARATOR, $property)); + } + /** * Returns the whole destination array. * diff --git a/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php b/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php index 051e9174e..502c9e7aa 100644 --- a/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php +++ b/core/modules/migrate/tests/src/Unit/MigrateSourceTest.php @@ -9,8 +9,12 @@ namespace Drupal\Tests\migrate\Unit; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\DependencyInjection\ContainerBuilder; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\migrate\MigrateExecutable; +use Drupal\migrate\MigrateSkipRowException; +use Drupal\migrate\Plugin\migrate\source\SourcePluginBase; use Drupal\migrate\Plugin\MigrateIdMapInterface; +use Drupal\migrate\Row; /** * @coversDefaultClass \Drupal\migrate\Plugin\migrate\source\SourcePluginBase @@ -128,6 +132,7 @@ class MigrateSourceTest extends MigrateTestCase { } /** + * @covers ::__construct * @expectedException \Drupal\migrate\MigrateException */ public function testHighwaterTrackChangesIncompatible() { @@ -138,6 +143,8 @@ class MigrateSourceTest extends MigrateTestCase { /** * Test that the source count is correct. + * + * @covers ::count */ public function testCount() { // Mock the cache to validate set() receives appropriate arguments. @@ -221,6 +228,144 @@ class MigrateSourceTest extends MigrateTestCase { $this->assertTrue(is_a($source->current(), 'Drupal\migrate\Row'), 'Incoming row timestamp is greater than current highwater mark so we have a row.'); } + /** + * Test basic row preparation. + * + * @covers ::prepareRow + */ + public function testPrepareRow() { + $this->migrationConfiguration['id'] = 'test_migration'; + + // Get a new migration with an id. + $migration = $this->getMigration(); + $source = new StubSourcePlugin([], '', [], $migration); + $row = new Row([], []); + + $module_handler = $this->prophesize(ModuleHandlerInterface::class); + $module_handler->invokeAll('migrate_prepare_row', [$row, $source, $migration]) + ->willReturn([TRUE, TRUE]) + ->shouldBeCalled(); + $module_handler->invokeAll('migrate_' . $migration->id() . '_prepare_row', [$row, $source, $migration]) + ->willReturn([TRUE, TRUE]) + ->shouldBeCalled(); + $source->setModuleHandler($module_handler->reveal()); + + // Ensure we don't log this to the mapping table. + $this->idMap->expects($this->never()) + ->method('saveIdMapping'); + + $this->assertTrue($source->prepareRow($row)); + + // Track_changes... + $source = new StubSourcePlugin(['track_changes' => TRUE], '', [], $migration); + $row2 = $this->prophesize(Row::class); + $row2->rehash() + ->shouldBeCalled(); + $module_handler->invokeAll('migrate_prepare_row', [$row2, $source, $migration]) + ->willReturn([TRUE, TRUE]) + ->shouldBeCalled(); + $module_handler->invokeAll('migrate_' . $migration->id() . '_prepare_row', [$row2, $source, $migration]) + ->willReturn([TRUE, TRUE]) + ->shouldBeCalled(); + $source->setModuleHandler($module_handler->reveal()); + $this->assertTrue($source->prepareRow($row2->reveal())); + } + + /** + * Test that global prepare hooks can skip rows. + * + * @covers ::prepareRow + */ + public function testPrepareRowGlobalPrepareSkip() { + $this->migrationConfiguration['id'] = 'test_migration'; + + $migration = $this->getMigration(); + $source = new StubSourcePlugin([], '', [], $migration); + $row = new Row([], []); + + $module_handler = $this->prophesize(ModuleHandlerInterface::class); + // Return a failure from a prepare row hook. + $module_handler->invokeAll('migrate_prepare_row', [$row, $source, $migration]) + ->willReturn([TRUE, FALSE, TRUE]) + ->shouldBeCalled(); + $module_handler->invokeAll('migrate_' . $migration->id() . '_prepare_row', [$row, $source, $migration]) + ->willReturn([TRUE, TRUE]) + ->shouldBeCalled(); + $source->setModuleHandler($module_handler->reveal()); + + $this->idMap->expects($this->once()) + ->method('saveIdMapping') + ->with($row, [], MigrateIdMapInterface::STATUS_IGNORED); + + $this->assertFalse($source->prepareRow($row)); + } + + /** + * Test that migrate specific prepare hooks can skip rows. + * + * @covers ::prepareRow + */ + public function testPrepareRowMigratePrepareSkip() { + $this->migrationConfiguration['id'] = 'test_migration'; + + $migration = $this->getMigration(); + $source = new StubSourcePlugin([], '', [], $migration); + $row = new Row([], []); + + $module_handler = $this->prophesize(ModuleHandlerInterface::class); + // Return a failure from a prepare row hook. + $module_handler->invokeAll('migrate_prepare_row', [$row, $source, $migration]) + ->willReturn([TRUE, TRUE]) + ->shouldBeCalled(); + $module_handler->invokeAll('migrate_' . $migration->id() . '_prepare_row', [$row, $source, $migration]) + ->willReturn([TRUE, FALSE, TRUE]) + ->shouldBeCalled(); + $source->setModuleHandler($module_handler->reveal()); + + $this->idMap->expects($this->once()) + ->method('saveIdMapping') + ->with($row, [], MigrateIdMapInterface::STATUS_IGNORED); + + $this->assertFalse($source->prepareRow($row)); + } + + /** + * Test that a skip exception during prepare hooks correctly skips. + * + * @covers ::prepareRow + */ + public function testPrepareRowPrepareException() { + $this->migrationConfiguration['id'] = 'test_migration'; + + $migration = $this->getMigration(); + $source = new StubSourcePlugin([], '', [], $migration); + $row = new Row([], []); + + $module_handler = $this->prophesize(ModuleHandlerInterface::class); + // Return a failure from a prepare row hook. + $module_handler->invokeAll('migrate_prepare_row', [$row, $source, $migration]) + ->willReturn([TRUE, TRUE]) + ->shouldBeCalled(); + $module_handler->invokeAll('migrate_' . $migration->id() . '_prepare_row', [$row, $source, $migration]) + ->willThrow(new MigrateSkipRowException()) + ->shouldBeCalled(); + $source->setModuleHandler($module_handler->reveal()); + + // This will only be called on the first prepare because the second + // explicitly avoids it. + $this->idMap->expects($this->once()) + ->method('saveIdMapping') + ->with($row, [], MigrateIdMapInterface::STATUS_IGNORED); + $this->assertFalse($source->prepareRow($row)); + + // Throw an exception the second time that avoids mapping. + $e = new MigrateSkipRowException('', FALSE); + $module_handler->invokeAll('migrate_' . $migration->id() . '_prepare_row', [$row, $source, $migration]) + ->willThrow($e) + ->shouldBeCalled(); + $this->assertFalse($source->prepareRow($row)); + } + /** * Get a mock executable for the test. * @@ -239,3 +384,46 @@ class MigrateSourceTest extends MigrateTestCase { } } + +/** + * Stubbed source plugin for testing base class implementations. + */ +class StubSourcePlugin extends SourcePluginBase { + + /** + * Helper for setting internal module handler implementation. + * + * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler + */ + function setModuleHandler(ModuleHandlerInterface $module_handler) { + $this->moduleHandler = $module_handler; + } + + /** + * {@inheritdoc} + */ + public function fields() { + return []; + } + + /** + * {@inheritdoc} + */ + public function __toString() { + return ''; + } + + /** + * {@inheritdoc} + */ + public function getIds() { + return []; + } + + /** + * {@inheritdoc} + */ + protected function initializeIterator() { + return []; + } +} diff --git a/core/modules/migrate/tests/src/Unit/MigrateTestCase.php b/core/modules/migrate/tests/src/Unit/MigrateTestCase.php index 768e0fcc7..e3a253a59 100644 --- a/core/modules/migrate/tests/src/Unit/MigrateTestCase.php +++ b/core/modules/migrate/tests/src/Unit/MigrateTestCase.php @@ -19,6 +19,11 @@ abstract class MigrateTestCase extends UnitTestCase { protected $migrationConfiguration = []; + /** + * @var \Drupal\migrate\Plugin\MigrateIdMapInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $idMap; + /** * Local store for mocking setStatus()/getStatus(). * diff --git a/core/modules/migrate/tests/src/Unit/Plugin/migrate/destination/EntityContentBaseTest.php b/core/modules/migrate/tests/src/Unit/Plugin/migrate/destination/EntityContentBaseTest.php new file mode 100644 index 000000000..220cbe84e --- /dev/null +++ b/core/modules/migrate/tests/src/Unit/Plugin/migrate/destination/EntityContentBaseTest.php @@ -0,0 +1,118 @@ +migration = $this->prophesize(MigrationInterface::class); + $this->storage = $this->prophesize(EntityStorageInterface::class); + $this->entityManager = $this->prophesize(EntityManagerInterface::class); + } + + /** + * Test basic entity save. + * + * @covers ::import + */ + public function testImport() { + $bundles = []; + $destination = new EntityTestDestination([], '', [], + $this->migration->reveal(), + $this->storage->reveal(), + $bundles, + $this->entityManager->reveal(), + $this->prophesize(FieldTypePluginManagerInterface::class)->reveal()); + $entity = $this->prophesize(ContentEntityInterface::class); + // Assert that save is called. + $entity->save() + ->shouldBeCalledTimes(1); + // Set an id for the entity + $entity->id() + ->willReturn(5); + $destination->setEntity($entity->reveal()); + // Ensure the id is saved entity id is returned from import. + $this->assertEquals([5], $destination->import(new Row([], []))); + // Assert that import set the rollback action. + $this->assertEquals(MigrateIdMapInterface::ROLLBACK_DELETE, $destination->rollbackAction()); + } + + /** + * Test row skipping when we can't get an entity to save. + * + * @covers ::import + * @expectedException \Drupal\migrate\MigrateException + * @expectedExceptionMessage Unable to get entity + */ + public function testImportEntityLoadFailure() { + $bundles = []; + $destination = new EntityTestDestination([], '', [], + $this->migration->reveal(), + $this->storage->reveal(), + $bundles, + $this->entityManager->reveal(), + $this->prophesize(FieldTypePluginManagerInterface::class)->reveal()); + $destination->setEntity(FALSE); + $destination->import(new Row([], [])); + } + +} + +/** + * Stub class for testing EntityContentBase methods. + * + * We want to test things without testing the base class implementations. + */ +class EntityTestDestination extends EntityContentBase { + + private $entity = NULL; + + public function setEntity($entity) { + $this->entity = $entity; + } + + protected function getEntity(Row $row, array $old_destination_id_values) { + return $this->entity; + } +} diff --git a/core/modules/migrate/tests/src/Unit/destination/EntityRevisionTest.php b/core/modules/migrate/tests/src/Unit/destination/EntityRevisionTest.php index d5f71a072..2db5d9e8e 100644 --- a/core/modules/migrate/tests/src/Unit/destination/EntityRevisionTest.php +++ b/core/modules/migrate/tests/src/Unit/destination/EntityRevisionTest.php @@ -36,6 +36,11 @@ class EntityRevisionTest extends UnitTestCase { */ protected $entityManager; + /** + * @var \Drupal\Core\Field\FieldTypePluginManagerInterface + */ + protected $fieldTypeManager; + public function setUp() { parent::setUp(); @@ -43,6 +48,7 @@ class EntityRevisionTest extends UnitTestCase { $this->migration = $this->prophesize('\Drupal\migrate\Entity\MigrationInterface'); $this->storage = $this->prophesize('\Drupal\Core\Entity\EntityStorageInterface'); $this->entityManager = $this->prophesize('\Drupal\Core\Entity\EntityManagerInterface'); + $this->fieldTypeManager = $this->prophesize('\Drupal\Core\Field\FieldTypePluginManagerInterface'); } /** @@ -183,7 +189,9 @@ class EntityRevisionTest extends UnitTestCase { $this->migration->reveal(), $this->storage->reveal(), [], - $this->entityManager->reveal()); + $this->entityManager->reveal(), + $this->fieldTypeManager->reveal() + ); } } diff --git a/core/modules/migrate_drupal/src/Tests/StubTestTrait.php b/core/modules/migrate_drupal/src/Tests/StubTestTrait.php new file mode 100644 index 000000000..1e028bfff --- /dev/null +++ b/core/modules/migrate_drupal/src/Tests/StubTestTrait.php @@ -0,0 +1,80 @@ +createStub($entity_type_id); + $this->assertTrue($entity_id, 'Stub successfully created'); + if ($entity_id) { + $violations = $this->validateStub($entity_type_id, $entity_id); + if (!$this->assertIdentical(count($violations), 0, 'Stub is a valid entity')) { + foreach ($violations as $violation) { + $this->fail((string) $violation->getMessage()); + } + } + } + } + + /** + * Create a stub of the given entity type. + * + * @param string $entity_type_id + * The entity type we are stubbing. + * + * @return int + * ID of the created entity. + */ + protected function createStub($entity_type_id) { + // Create a dummy migration to pass to the destination plugin. + $config = [ + 'id' => 'dummy', + 'migration_tags' => ['Stub test'], + 'source' => ['plugin' => 'empty'], + 'process' => [], + 'destination' => ['plugin' => 'entity:' . $entity_type_id], + ]; + $migration = Migration::create($config); + $destination_plugin = $migration->getDestinationPlugin(TRUE); + $stub_row = new Row([], [], TRUE); + $destination_ids = $destination_plugin->import($stub_row); + return reset($destination_ids); + } + + /** + * Perform validation on a stub entity. + * + * @param string $entity_type_id + * The entity type we are stubbing. + * @param string $entity_id + * ID of the stubbed entity to validate. + * + * @return \Drupal\Core\Entity\EntityConstraintViolationListInterface + * List of constraint violations identified. + */ + protected function validateStub($entity_type_id, $entity_id) { + $controller = \Drupal::entityManager()->getStorage($entity_type_id); + /** @var \Drupal\Core\Entity\ContentEntityInterface $stub_entity */ + $stub_entity = $controller->load($entity_id); + return $stub_entity->validate(); + } + +} diff --git a/core/modules/migrate_drupal/tests/fixtures/drupal7.php b/core/modules/migrate_drupal/tests/fixtures/drupal7.php index c1480c186..78651e4be 100644 --- a/core/modules/migrate_drupal/tests/fixtures/drupal7.php +++ b/core/modules/migrate_drupal/tests/fixtures/drupal7.php @@ -41539,10 +41539,30 @@ $connection->insert('variable') 'name' => 'tracker_batch_size', 'value' => 'i:999;', )) +->values(array( + 'name' => 'update_check_frequency', + 'value' => 'i:1;', +)) +->values(array( + 'name' => 'update_fetch_url', + 'value' => 's:23:"http://127.0.0.1/update";', +)) ->values(array( 'name' => 'update_last_check', 'value' => 'i:1444944973;', )) +->values(array( + 'name' => 'update_max_fetch_attempts', + 'value' => 'i:3;', +)) +->values(array( + 'name' => 'update_notification_threshold', + 'value' => 's:3:"all";', +)) +->values(array( + 'name' => 'update_notify_emails', + 'value' => 'a:1:{i:0;s:19:"webmaster@127.0.0.1";}', +)) ->values(array( 'name' => 'user_admin_role', 'value' => 's:1:"3";', diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 896c4f888..a54fc0a2c 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -1064,6 +1064,14 @@ function node_query_node_access_alter(AlterableInterface $query) { // Update the query for the given storage method. \Drupal::service('node.grant_storage')->alterQuery($query, $tables, $op, $account, $base_table); + + // Bubble the 'user.node_grants:$op' cache context to the current render + // context. + $renderer = \Drupal::service('renderer'); + if ($renderer->hasRenderContext()) { + $build = ['#cache' => ['contexts' => ['user.node_grants:' . $op]]]; + $renderer->render($build); + } } /** diff --git a/core/modules/node/node.routing.yml b/core/modules/node/node.routing.yml index 187e8521a..7c942a2c1 100644 --- a/core/modules/node/node.routing.yml +++ b/core/modules/node/node.routing.yml @@ -47,6 +47,7 @@ entity.node.version_history: _controller: '\Drupal\node\Controller\NodeController::revisionOverview' requirements: _access_node_revision: 'view' + node: \d+ options: _node_operation_route: TRUE @@ -57,6 +58,7 @@ entity.node.revision: _title_callback: '\Drupal\node\Controller\NodeController::revisionPageTitle' requirements: _access_node_revision: 'view' + node: \d+ node.revision_revert_confirm: path: '/node/{node}/revisions/{node_revision}/revert' @@ -65,6 +67,7 @@ node.revision_revert_confirm: _title: 'Revert to earlier revision' requirements: _access_node_revision: 'update' + node: \d+ options: _node_operation_route: TRUE @@ -75,6 +78,7 @@ node.revision_revert_translation_confirm: _title: 'Revert to earlier revision of a translation' requirements: _access_node_revision: 'update' + node: \d+ options: _node_operation_route: TRUE @@ -85,6 +89,7 @@ node.revision_delete_confirm: _title: 'Delete earlier revision' requirements: _access_node_revision: 'delete' + node: \d+ options: _node_operation_route: TRUE diff --git a/core/modules/node/src/Controller/NodeController.php b/core/modules/node/src/Controller/NodeController.php index a43bb53a8..3c534f2ea 100644 --- a/core/modules/node/src/Controller/NodeController.php +++ b/core/modules/node/src/Controller/NodeController.php @@ -187,7 +187,7 @@ class NodeController extends ControllerBase implements ContainerInjectionInterfa if ($revision->hasTranslation($langcode) && $revision->getTranslation($langcode)->isRevisionTranslationAffected()) { $username = [ '#theme' => 'username', - '#account' => $revision->uid->entity, + '#account' => $revision->getRevisionAuthor(), ]; // Use revision link to link to revisions that are not active. diff --git a/core/modules/node/src/Entity/NodeRouteProvider.php b/core/modules/node/src/Entity/NodeRouteProvider.php index fa1c02d7f..7bfc9820d 100644 --- a/core/modules/node/src/Entity/NodeRouteProvider.php +++ b/core/modules/node/src/Entity/NodeRouteProvider.php @@ -27,6 +27,7 @@ class NodeRouteProvider implements EntityRouteProviderInterface { '_controller' => '\Drupal\node\Controller\NodeViewController::view', '_title_callback' => '\Drupal\node\Controller\NodeViewController::title', ]) + ->setRequirement('node', '\d+') ->setRequirement('_entity_access', 'node.view'); $route_collection->add('entity.node.canonical', $route); @@ -35,6 +36,7 @@ class NodeRouteProvider implements EntityRouteProviderInterface { '_entity_form' => 'node.delete', '_title' => 'Delete', ]) + ->setRequirement('node', '\d+') ->setRequirement('_entity_access', 'node.delete') ->setOption('_node_operation_route', TRUE); $route_collection->add('entity.node.delete_form', $route); @@ -42,6 +44,7 @@ class NodeRouteProvider implements EntityRouteProviderInterface { $route = (new Route('/node/{node}/edit')) ->setDefault('_entity_form', 'node.edit') ->setRequirement('_entity_access', 'node.update') + ->setRequirement('node', '\d+') ->setOption('_node_operation_route', TRUE); $route_collection->add('entity.node.edit_form', $route); diff --git a/core/modules/node/src/Plugin/EntityReferenceSelection/NodeSelection.php b/core/modules/node/src/Plugin/EntityReferenceSelection/NodeSelection.php index 276c795b6..a42fa60ec 100644 --- a/core/modules/node/src/Plugin/EntityReferenceSelection/NodeSelection.php +++ b/core/modules/node/src/Plugin/EntityReferenceSelection/NodeSelection.php @@ -48,4 +48,32 @@ class NodeSelection extends DefaultSelection { return $query; } + /** + * {@inheritdoc} + */ + public function createNewEntity($entity_type_id, $bundle, $label, $uid) { + $node = parent::createNewEntity($entity_type_id, $bundle, $label, $uid); + + // In order to create a referenceable node, it needs to published. + /** @var \Drupal\node\NodeInterface $node */ + $node->setPublished(TRUE); + + return $node; + } + + /** + * {@inheritdoc} + */ + public function validateReferenceableNewEntities(array $entities) { + $entities = parent::validateReferenceableNewEntities($entities); + // Mirror the conditions checked in buildEntityQuery(). + if (!$this->currentUser->hasPermission('bypass node access') && !count($this->moduleHandler->getImplementations('node_grants'))) { + $entities = array_filter($entities, function ($node) { + /** @var \Drupal\node\NodeInterface $node */ + return $node->isPublished(); + }); + } + return $entities; + } + } diff --git a/core/modules/node/src/Plugin/views/wizard/Node.php b/core/modules/node/src/Plugin/views/wizard/Node.php index f7a43ecf8..5f560c568 100644 --- a/core/modules/node/src/Plugin/views/wizard/Node.php +++ b/core/modules/node/src/Plugin/views/wizard/Node.php @@ -199,7 +199,9 @@ class Node extends WizardPluginBase { protected function buildFilters(&$form, FormStateInterface $form_state) { parent::buildFilters($form, $form_state); - $selected_bundle = static::getSelected($form_state, array('show', 'type'), 'all', $form['displays']['show']['type']); + if (isset($form['displays']['show']['type'])) { + $selected_bundle = static::getSelected($form_state, array('show', 'type'), 'all', $form['displays']['show']['type']); + } // Add the "tagged with" filter to the view. diff --git a/core/modules/node/src/Tests/Migrate/MigrateNodeStubTest.php b/core/modules/node/src/Tests/Migrate/MigrateNodeStubTest.php new file mode 100644 index 000000000..22d140bf3 --- /dev/null +++ b/core/modules/node/src/Tests/Migrate/MigrateNodeStubTest.php @@ -0,0 +1,48 @@ +installEntitySchema('node'); + // Need at least one node type present. + NodeType::create([ + 'type' => 'testnodetype', + 'name' => 'Test node type', + ])->save(); + } + + /** + * Tests creation of node stubs. + */ + public function testStub() { + $this->performStubTest('node'); + } + +} diff --git a/core/modules/node/src/Tests/NodeAccessAutoBubblingTest.php b/core/modules/node/src/Tests/NodeAccessAutoBubblingTest.php new file mode 100644 index 000000000..908567239 --- /dev/null +++ b/core/modules/node/src/Tests/NodeAccessAutoBubblingTest.php @@ -0,0 +1,72 @@ +drupalCreateNode(); + $this->drupalCreateNode(); + $this->drupalCreateNode(); + $this->drupalCreateNode(); + } + + /** + * Tests that the node grants cache context is auto-added, only when needed. + * + * @see node_query_node_access_alter() + */ + public function testNodeAccessCacheabilitySafeguard() { + $this->dumpHeaders = TRUE; + + // The node grants cache context should be added automatically. + $this->drupalGet(new Url('node_access_test_auto_bubbling')); + $this->assertCacheContext('user.node_grants:view'); + + // The root user has the 'bypass node access' permission, which means the + // node grants cache context is not necessary. + $this->drupalLogin($this->rootUser); + $this->drupalGet(new Url('node_access_test_auto_bubbling')); + $this->assertNoCacheContext('user.node_grants:view'); + $this->drupalLogout(); + + // Uninstall the module with the only hook_node_grants() implementation. + $this->container->get('module_installer')->uninstall(['node_access_test']); + $this->rebuildContainer(); + + // Because there are no node grants defined, there also is no need for the + // node grants cache context to be bubbled. + $this->drupalGet(new Url('node_access_test_auto_bubbling')); + $this->assertNoCacheContext('user.node_grants:view'); + } + +} diff --git a/core/modules/node/src/Tests/NodeRevisionsTest.php b/core/modules/node/src/Tests/NodeRevisionsTest.php index 2e3114576..45fa06d58 100644 --- a/core/modules/node/src/Tests/NodeRevisionsTest.php +++ b/core/modules/node/src/Tests/NodeRevisionsTest.php @@ -21,7 +21,19 @@ use Drupal\node\NodeInterface; * @group node */ class NodeRevisionsTest extends NodeTestBase { + + /** + * An array of node revisions. + * + * @var \Drupal\node\NodeInterface[] + */ protected $nodes; + + /** + * Revision log messages. + * + * @var array + */ protected $revisionLogs; /** @@ -93,6 +105,16 @@ class NodeRevisionsTest extends NodeTestBase { ); $node->untranslatable_string_field->value = $this->randomString(); $node->setNewRevision(); + + // Edit the 2nd revision with a different user. + if ($i == 1) { + $editor = $this->drupalCreateUser(); + $node->setRevisionAuthorId($editor->id()); + } + else { + $node->setRevisionAuthorId($web_user->id()); + } + $node->save(); $node = Node::load($node->id()); // Make sure we get revision information. @@ -123,6 +145,11 @@ class NodeRevisionsTest extends NodeTestBase { foreach ($logs as $revision_log) { $this->assertText($revision_log, 'Revision log message found.'); } + // Original author, and editor names should appear on revisions overview. + $web_user = $nodes[0]->revision_uid->entity; + $this->assertText(t('by @name', ['@name' => $web_user->getAccountName()])); + $editor = $nodes[2]->revision_uid->entity; + $this->assertText(t('by @name', ['@name' => $editor->getAccountName()])); // Confirm that this is the default revision. $this->assertTrue($node->isDefaultRevision(), 'Third node revision is the default one.'); diff --git a/core/modules/node/src/Tests/NodeTranslationUITest.php b/core/modules/node/src/Tests/NodeTranslationUITest.php index b42eb76b4..0bb81c071 100644 --- a/core/modules/node/src/Tests/NodeTranslationUITest.php +++ b/core/modules/node/src/Tests/NodeTranslationUITest.php @@ -94,7 +94,8 @@ class NodeTranslationUITest extends ContentTranslationUITestBase { $language = ConfigurableLanguage::load($langcode); $values[$langcode] = array('title' => array(array('value' => $this->randomMachineName()))); - $add_url = Url::fromRoute('content_translation.translation_add_' . $entity->getEntityTypeId(), [ + $entity_type_id = $entity->getEntityTypeId(); + $add_url = Url::fromRoute("entity.$entity_type_id.content_translation_add", [ $entity->getEntityTypeId() => $entity->id(), 'source' => $default_langcode, 'target' => $langcode diff --git a/core/modules/node/src/Tests/NodeTypeTest.php b/core/modules/node/src/Tests/NodeTypeTest.php index a8fa54d98..07117f709 100644 --- a/core/modules/node/src/Tests/NodeTypeTest.php +++ b/core/modules/node/src/Tests/NodeTypeTest.php @@ -218,6 +218,9 @@ class NodeTypeTest extends NodeTestBase { * Tests for when there are no content types defined. */ public function testNodeTypeNoContentType() { + /** @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface $bundle_info */ + $bundle_info = \Drupal::service('entity_type.bundle.info'); + $this->assertEqual(2, count($bundle_info->getBundleInfo('node')), 'The bundle information service has 2 bundles for the Node entity type.'); $web_user = $this->drupalCreateUser(['administer content types']); $this->drupalLogin($web_user); @@ -231,6 +234,9 @@ class NodeTypeTest extends NodeTestBase { $this->assertRaw(t('No content types available. Add content type.', [ ':link' => Url::fromRoute('node.type_add')->toString() ]), 'Empty text when there are no content types in the system is correct.'); + + $bundle_info->clearCachedBundles(); + $this->assertEqual(0, count($bundle_info->getBundleInfo('node')), 'The bundle information service has 0 bundles for the Node entity type.'); } } diff --git a/core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.info.yml b/core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.info.yml new file mode 100644 index 000000000..49a990d75 --- /dev/null +++ b/core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.info.yml @@ -0,0 +1,6 @@ +name: 'Node module access automatic cacheability bubbling tests' +type: module +description: 'Support module for node permission testing. Provides a route which does a node access query without explicitly specifying the corresponding cache context.' +package: Testing +version: VERSION +core: 8.x diff --git a/core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.routing.yml b/core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.routing.yml new file mode 100644 index 000000000..34fd420b3 --- /dev/null +++ b/core/modules/node/tests/node_access_test_auto_bubbling/node_access_test_auto_bubbling.routing.yml @@ -0,0 +1,6 @@ +node_access_test_auto_bubbling: + path: '/node_access_test_auto_bubbling' + defaults: + _controller: '\Drupal\node_access_test_auto_bubbling\Controller\NodeAccessTestAutoBubblingController::latest' + requirements: + _access: 'TRUE' diff --git a/core/modules/node/tests/node_access_test_auto_bubbling/src/Controller/NodeAccessTestAutoBubblingController.php b/core/modules/node/tests/node_access_test_auto_bubbling/src/Controller/NodeAccessTestAutoBubblingController.php new file mode 100644 index 000000000..1fcaa4b03 --- /dev/null +++ b/core/modules/node/tests/node_access_test_auto_bubbling/src/Controller/NodeAccessTestAutoBubblingController.php @@ -0,0 +1,61 @@ +entityQuery = $entity_query; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('entity.query') + ); + } + + /** + * Lists the three latest published node IDs. + * + * @return array + * A render array. + */ + public function latest() { + $nids = $this->entityQuery->get('node') + ->condition('status', NODE_PUBLISHED) + ->sort('created', 'DESC') + ->range(0, 3) + ->execute(); + return ['#markup' => $this->t('The three latest nodes are: @nids.', ['@nids' => implode(', ', $nids)])]; + } + +} diff --git a/core/modules/path/src/Form/PathFormBase.php b/core/modules/path/src/Form/PathFormBase.php index 8c8484167..95d261ac7 100644 --- a/core/modules/path/src/Form/PathFormBase.php +++ b/core/modules/path/src/Form/PathFormBase.php @@ -180,8 +180,22 @@ abstract class PathFormBase extends FormBase { $langcode = $form_state->getValue('langcode', LanguageInterface::LANGCODE_NOT_SPECIFIED); if ($this->aliasStorage->aliasExists($alias, $langcode, $this->path['source'])) { - $form_state->setErrorByName('alias', t('The alias %alias is already in use in this language.', array('%alias' => $alias))); + $stored_alias = $this->aliasStorage->load(['alias' => $alias, 'langcode' => $langcode]); + if ($stored_alias['alias'] !== $alias) { + // The alias already exists with different capitalization as the default + // implementation of AliasStorageInterface::aliasExists is + // case-insensitive. + $form_state->setErrorByName('alias', t('The alias %alias could not be added because it is already in use in this language with different capitalization: %stored_alias.', [ + '%alias' => $alias, + '%stored_alias' => $stored_alias['alias'], + ])); + } + else { + $form_state->setErrorByName('alias', t('The alias %alias is already in use in this language.', ['%alias' => $alias])); + } } + + if (!$this->pathValidator->isValid(trim($source, '/'))) { $form_state->setErrorByName('source', t("The path '@link_path' is either invalid or you do not have access to it.", array('@link_path' => $source))); } diff --git a/core/modules/path/src/Tests/PathAliasTest.php b/core/modules/path/src/Tests/PathAliasTest.php index 651c11f9e..7e85cda03 100644 --- a/core/modules/path/src/Tests/PathAliasTest.php +++ b/core/modules/path/src/Tests/PathAliasTest.php @@ -7,7 +7,9 @@ namespace Drupal\path\Tests; +use Drupal\Component\Utility\Unicode; use Drupal\Core\Cache\Cache; +use Drupal\Core\Database\Database; /** * Add, edit, delete, and change alias and verify its consistency in the @@ -75,25 +77,45 @@ class PathAliasTest extends PathTestBase { // Create alias. $edit = array(); $edit['source'] = '/node/' . $node1->id(); - $edit['alias'] = '/' . $this->randomMachineName(8); + $edit['alias'] = '/' . $this->getRandomGenerator()->word(8); $this->drupalPostForm('admin/config/search/path/add', $edit, t('Save')); // Confirm that the alias works. $this->drupalGet($edit['alias']); $this->assertText($node1->label(), 'Alias works.'); $this->assertResponse(200); + // Confirm that the alias works in a case-insensitive way. + $this->assertTrue(ctype_lower(ltrim($edit['alias'], '/'))); + $this->drupalGet($edit['alias']); + $this->assertText($node1->label(), 'Alias works lower case.'); + $this->assertResponse(200); + $this->drupalGet(Unicode::strtoupper($edit['alias'])); + $this->assertText($node1->label(), 'Alias works upper case.'); + $this->assertResponse(200); // Change alias to one containing "exotic" characters. $pid = $this->getPID($edit['alias']); $previous = $edit['alias']; - $edit['alias'] = "/- ._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters. - "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string. - "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets. + $edit['alias'] = '/alias' . // Lower-case letters. + // "Special" ASCII characters. + "- ._~!$'\"()*@[]?&+%#,;=:" . + // Characters that look like a percent-escaped string. + "%23%25%26%2B%2F%3F" . + // Characters from various non-ASCII alphabets. + "中國書۞"; + $connection = Database::getConnection(); + if ($connection->databaseType() != 'sqlite') { + // When using LIKE for case-insensitivity, the SQLite driver is + // currently unable to find the upper-case versions of non-ASCII + // characters. + // @todo fix this in https://www.drupal.org/node/2607432 + $edit['alias'] .= "ïвβéø"; + } $this->drupalPostForm('admin/config/search/path/edit/' . $pid, $edit, t('Save')); // Confirm that the alias works. - $this->drupalGet($edit['alias']); + $this->drupalGet(Unicode::strtoupper($edit['alias'])); $this->assertText($node1->label(), 'Changed alias works.'); $this->assertResponse(200); @@ -114,6 +136,14 @@ class PathAliasTest extends PathTestBase { // Confirm no duplicate was created. $this->assertRaw(t('The alias %alias is already in use in this language.', array('%alias' => $edit['alias'])), 'Attempt to move alias was rejected.'); + $edit_upper = $edit; + $edit_upper['alias'] = Unicode::strtoupper($edit['alias']); + $this->drupalPostForm('admin/config/search/path/add', $edit_upper, t('Save')); + $this->assertRaw(t('The alias %alias could not be added because it is already in use in this language with different capitalization: %stored_alias.', [ + '%alias' => $edit_upper['alias'], + '%stored_alias' => $edit['alias'], + ]), 'Attempt to move upper-case alias was rejected.'); + // Delete alias. $this->drupalPostForm('admin/config/search/path/edit/' . $pid, array(), t('Delete')); $this->drupalPostForm(NULL, array(), t('Confirm')); @@ -217,15 +247,27 @@ class PathAliasTest extends PathTestBase { $elements = $this->xpath("//link[contains(@rel, 'shortlink') and contains(@href, 'node/" . $node1->id() . "')]"); $this->assertTrue(!empty($elements), 'Page contains shortlink URL.'); - // Change alias to one containing "exotic" characters. $previous = $edit['path[0][alias]']; - $edit['path[0][alias]'] = "/- ._~!$'\"()*@[]?&+%#,;=:" . // "Special" ASCII characters. - "%23%25%26%2B%2F%3F" . // Characters that look like a percent-escaped string. - "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets. + // Change alias to one containing "exotic" characters. + $edit['path[0][alias]'] = '/alias' . // Lower-case letters. + // "Special" ASCII characters. + "- ._~!$'\"()*@[]?&+%#,;=:" . + // Characters that look like a percent-escaped string. + "%23%25%26%2B%2F%3F" . + // Characters from various non-ASCII alphabets. + "中國書۞"; + $connection = Database::getConnection(); + if ($connection->databaseType() != 'sqlite') { + // When using LIKE for case-insensitivity, the SQLite driver is + // currently unable to find the upper-case versions of non-ASCII + // characters. + // @todo fix this in https://www.drupal.org/node/2607432 + $edit['path[0][alias]'] .= "ïвβéø"; + } $this->drupalPostForm('node/' . $node1->id() . '/edit', $edit, t('Save')); // Confirm that the alias works. - $this->drupalGet($edit['path[0][alias]']); + $this->drupalGet(Unicode::strtoupper($edit['path[0][alias]'])); $this->assertText($node1->label(), 'Changed alias works.'); $this->assertResponse(200); diff --git a/core/modules/rest/src/Plugin/views/display/RestExport.php b/core/modules/rest/src/Plugin/views/display/RestExport.php index 427becfac..68bd407cd 100644 --- a/core/modules/rest/src/Plugin/views/display/RestExport.php +++ b/core/modules/rest/src/Plugin/views/display/RestExport.php @@ -151,7 +151,7 @@ class RestExport extends PathPluginBase implements ResponseDisplayPluginInterfac * {@inheritdoc} */ public function usesExposed() { - return FALSE; + return TRUE; } /** diff --git a/core/modules/rest/src/Tests/Views/StyleSerializerTest.php b/core/modules/rest/src/Tests/Views/StyleSerializerTest.php index 5f378ee2f..e3b8d263c 100644 --- a/core/modules/rest/src/Tests/Views/StyleSerializerTest.php +++ b/core/modules/rest/src/Tests/Views/StyleSerializerTest.php @@ -50,7 +50,7 @@ class StyleSerializerTest extends PluginTestBase { * * @var array */ - public static $testViews = array('test_serializer_display_field', 'test_serializer_display_entity', 'test_serializer_node_display_field'); + public static $testViews = array('test_serializer_display_field', 'test_serializer_display_entity', 'test_serializer_node_display_field', 'test_serializer_node_exposed_filter'); /** * A user with administrative privileges to look at test entity and configure views. @@ -609,4 +609,64 @@ class StyleSerializerTest extends PluginTestBase { } $this->assertEqual($serializer->serialize($expected, 'json'), (string) $renderer->renderRoot($build)); } + + /** + * Tests the exposed filter works. + * + * There is an exposed filter on the title field which takes a title query + * parameter. This is set to filter nodes by those whose title starts with + * the value provided. + */ + public function testRestViewExposedFilter() { + $this->drupalCreateContentType(array('type' => 'page')); + $node0 = $this->drupalCreateNode(array('title' => 'Node 1')); + $node1 = $this->drupalCreateNode(array('title' => 'Node 11')); + $node2 = $this->drupalCreateNode(array('title' => 'Node 111')); + + // Test that no filter brings back all three nodes. + $result = $this->drupalGetJSON('test/serialize/node-exposed-filter'); + + $expected = array( + 0 => array( + 'nid' => $node0->id(), + 'body' => $node0->body->processed, + ), + 1 => array( + 'nid' => $node1->id(), + 'body' => $node1->body->processed, + ), + 2 => array( + 'nid' => $node2->id(), + 'body' => $node2->body->processed, + ), + ); + + $this->assertEqual($result, $expected, 'Querying a view with no exposed filter returns all nodes.'); + + // Test that title starts with 'Node 11' query finds 2 of the 3 nodes. + $result = $this->drupalGetJSON('test/serialize/node-exposed-filter', ['query' => ['title' => 'Node 11']]); + + $expected = array( + 0 => array( + 'nid' => $node1->id(), + 'body' => $node1->body->processed, + ), + 1 => array( + 'nid' => $node2->id(), + 'body' => $node2->body->processed, + ), + ); + + $cache_contexts = [ + 'languages:language_content', + 'languages:language_interface', + 'theme', + 'request_format', + 'user.node_grants:view', + 'url', + ]; + + $this->assertEqual($result, $expected, 'Querying a view with a starts with exposed filter on the title returns nodes whose title starts with value provided.'); + $this->assertCacheContexts($cache_contexts); + } } diff --git a/core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_exposed_filter.yml b/core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_exposed_filter.yml new file mode 100644 index 000000000..b5af1e96b --- /dev/null +++ b/core/modules/rest/tests/modules/rest_test_views/test_views/views.view.test_serializer_node_exposed_filter.yml @@ -0,0 +1,172 @@ +langcode: en +status: true +dependencies: + config: + - field.storage.node.body + module: + - field + - node + - rest + - rest_test_views + - user +id: test_serializer_node_exposed_filter +label: 'Test serializer display for exposed filters' +module: rest_test_views +description: '' +tag: '' +base_table: node_field_data +base_field: nid +core: 8.x +display: + default: + display_plugin: default + id: default + display_title: Master + position: null + display_options: + access: + type: perm + options: + perm: 'access content' + cache: + type: tag + query: + type: views_query + exposed_form: + type: basic + style: + type: serializer + row: + type: data_field + fields: + nid: + id: nid + table: node + field: nid + plugin_id: field + entity_type: node + entity_field: nid + body: + id: body + table: node__body + field: body + relationship: none + group_type: group + admin_label: '' + label: Body + exclude: false + alter: + alter_text: false + text: '' + make_link: false + path: '' + absolute: false + external: false + replace_spaces: false + path_case: none + trim_whitespace: false + alt: '' + rel: '' + link_class: '' + prefix: '' + suffix: '' + target: '' + nl2br: false + max_length: 0 + word_boundary: true + ellipsis: true + more_link: false + more_link_text: '' + more_link_path: '' + strip_tags: false + trim: false + preserve_tags: '' + html: false + element_type: '' + element_class: '' + element_label_type: '' + element_label_class: '' + element_label_colon: true + element_wrapper_type: '' + element_wrapper_class: '' + element_default_classes: true + empty: '' + hide_empty: false + empty_zero: false + hide_alter_empty: true + click_sort_column: value + type: text_default + settings: { } + group_column: value + group_columns: { } + group_rows: true + delta_limit: 0 + delta_offset: 0 + delta_reversed: false + delta_first_last: false + multi_type: separator + separator: ', ' + field_api_classes: false + plugin_id: field + entity_type: node + entity_field: body + filters: + title: + id: title + table: node_field_data + field: title + relationship: none + group_type: group + admin_label: '' + operator: starts + value: '' + group: 1 + exposed: true + expose: + operator_id: title_op + label: Title + description: '' + use_operator: false + operator: title_op + identifier: title + required: false + remember: false + multiple: false + remember_roles: + authenticated: authenticated + anonymous: '0' + administrator: '0' + is_grouped: false + group_info: + label: '' + description: '' + identifier: '' + optional: true + widget: select + multiple: false + remember: false + default_group: All + default_group_multiple: { } + group_items: { } + entity_type: node + entity_field: title + plugin_id: string + title: 'Test serialize' + arguments: { } + rest_export_1: + display_plugin: rest_export + id: rest_export_1 + display_title: serializer + position: null + display_options: + defaults: + access: false + style: false + row: false + path: test/serialize/node-exposed-filter + access: + type: none + style: + type: serializer + row: + type: data_field diff --git a/core/modules/search/migration_templates/d7_search_settings.yml b/core/modules/search/migration_templates/d7_search_settings.yml index ec272141a..57db8b945 100644 --- a/core/modules/search/migration_templates/d7_search_settings.yml +++ b/core/modules/search/migration_templates/d7_search_settings.yml @@ -12,6 +12,7 @@ source: - search_cron_limit - search_tag_weights - search_and_or_limit + - search_default_module process: 'index/minimum_word_size': minimum_word_size 'index/overlap_cjk': overlap_cjk @@ -19,6 +20,13 @@ process: 'index/tag_weights': search_tag_weights and_or_limit: search_and_or_limit logging: 'constants/status' + default_page: + plugin: static_map + source: + - search_default_module + map: + node: node_search + user: user_search destination: plugin: config config_name: search.settings diff --git a/core/modules/search/src/Tests/Migrate/d7/MigrateSearchSettingsTest.php b/core/modules/search/src/Tests/Migrate/d7/MigrateSearchSettingsTest.php index 5adff4108..ac0e4c0ea 100644 --- a/core/modules/search/src/Tests/Migrate/d7/MigrateSearchSettingsTest.php +++ b/core/modules/search/src/Tests/Migrate/d7/MigrateSearchSettingsTest.php @@ -31,6 +31,7 @@ class MigrateSearchSettingsTest extends MigrateDrupal7TestBase { */ public function testSearchSettings() { $config = $this->config('search.settings'); + $this->assertIdentical('node_search', $config->get('default_page')); $this->assertIdentical(4, $config->get('index.minimum_word_size')); $this->assertTrue($config->get('index.overlap_cjk')); $this->assertIdentical(100, $config->get('index.cron_limit')); diff --git a/core/modules/serialization/src/Tests/NormalizerTestBase.php b/core/modules/serialization/src/Tests/NormalizerTestBase.php index c38c55433..50e3c870c 100644 --- a/core/modules/serialization/src/Tests/NormalizerTestBase.php +++ b/core/modules/serialization/src/Tests/NormalizerTestBase.php @@ -7,7 +7,9 @@ namespace Drupal\serialization\Tests; -use Drupal\simpletest\KernelTestBase; +use Drupal\KernelTests\KernelTestBase; +use Drupal\field\Entity\FieldConfig; +use Drupal\field\Entity\FieldStorageConfig; abstract class NormalizerTestBase extends KernelTestBase { @@ -29,14 +31,14 @@ abstract class NormalizerTestBase extends KernelTestBase { \Drupal::moduleHandler()->invoke('rest', 'install'); // Auto-create a field for testing. - entity_create('field_storage_config', array( + FieldstorageConfig::create(array( 'entity_type' => 'entity_test_mulrev', 'field_name' => 'field_test_text', 'type' => 'text', 'cardinality' => 1, 'translatable' => FALSE, ))->save(); - entity_create('field_config', array( + FieldConfig::create(array( 'entity_type' => 'entity_test_mulrev', 'field_name' => 'field_test_text', 'bundle' => 'entity_test_mulrev', diff --git a/core/modules/shortcut/shortcut.routing.yml b/core/modules/shortcut/shortcut.routing.yml index d6c0e1ad2..113335756 100644 --- a/core/modules/shortcut/shortcut.routing.yml +++ b/core/modules/shortcut/shortcut.routing.yml @@ -61,6 +61,7 @@ entity.shortcut.canonical: _title: 'Edit' requirements: _entity_access: 'shortcut.update' + shortcut: \d+ entity.shortcut.edit_form: path: '/admin/config/user-interface/shortcut/link/{shortcut}' @@ -69,6 +70,7 @@ entity.shortcut.edit_form: _title: 'Edit' requirements: _entity_access: 'shortcut.update' + shortcut: \d+ entity.shortcut.link_delete_inline: path: '/admin/config/user-interface/shortcut/link/{shortcut}/delete-inline' @@ -77,6 +79,7 @@ entity.shortcut.link_delete_inline: requirements: _entity_access: 'shortcut.delete' _csrf_token: 'TRUE' + shortcut: \d+ entity.shortcut.delete_form: path: '/admin/config/user-interface/shortcut/link/{shortcut}/delete' @@ -85,6 +88,7 @@ entity.shortcut.delete_form: _title: 'Delete' requirements: _entity_access: 'shortcut.delete' + shortcut: \d+ shortcut.set_switch: path: '/user/{user}/shortcuts' @@ -95,3 +99,4 @@ shortcut.set_switch: _custom_access: 'Drupal\shortcut\Form\SwitchShortcutSet::checkAccess' options: _admin_route: TRUE + user: \d+ diff --git a/core/modules/shortcut/src/Tests/Migrate/MigrateShortcutStubTest.php b/core/modules/shortcut/src/Tests/Migrate/MigrateShortcutStubTest.php new file mode 100644 index 000000000..ba9a0002e --- /dev/null +++ b/core/modules/shortcut/src/Tests/Migrate/MigrateShortcutStubTest.php @@ -0,0 +1,44 @@ +installEntitySchema('shortcut'); + // Make sure the 'default' shortcut_set is installed. + $this->installConfig(['shortcut']); + } + + /** + * Tests creation of shortcut stubs. + */ + public function testStub() { + $this->performStubTest('shortcut'); + } + +} diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module index b99435222..74d348e92 100644 --- a/core/modules/simpletest/simpletest.module +++ b/core/modules/simpletest/simpletest.module @@ -170,17 +170,20 @@ function simpletest_run_tests($test_list) { * @param $unescaped_test_classnames * An array of test class names, including full namespaces, to be passed as * a regular expression to PHPUnit's --filter option. + * @param int $status + * (optional) The exit status code of the PHPUnit process will be assigned to + * this variable. * * @return array * The parsed results of PHPUnit's JUnit XML output, in the format of * {simpletest}'s schema. */ -function simpletest_run_phpunit_tests($test_id, array $unescaped_test_classnames) { +function simpletest_run_phpunit_tests($test_id, array $unescaped_test_classnames, &$status = NULL) { $phpunit_file = simpletest_phpunit_xml_filepath($test_id); - $ret = simpletest_phpunit_run_command($unescaped_test_classnames, $phpunit_file); - // A return value of 0 = passed test, 1 = failed test, > 1 indicates segfault + simpletest_phpunit_run_command($unescaped_test_classnames, $phpunit_file, $status); + // A $status of 0 = passed test, 1 = failed test, > 1 indicates segfault // timeout, or other type of failure. - if ($ret > 1) { + if ($status > 1) { // Something broke during the execution of phpunit. // Return an error record of all failed classes. $rows[] = [ @@ -251,11 +254,14 @@ function simpletest_phpunit_configuration_filepath() { * a regular expression to PHPUnit's --filter option. * @param string $phpunit_file * A filepath to use for PHPUnit's --log-junit option. + * @param int $status + * (optional) The exit status code of the PHPUnit process will be assigned to + * this variable. * * @return string * The results as returned by exec(). */ -function simpletest_phpunit_run_command(array $unescaped_test_classnames, $phpunit_file) { +function simpletest_phpunit_run_command(array $unescaped_test_classnames, $phpunit_file, &$status = NULL) { // Setup an environment variable containing the database connection so that // functional tests can connect to the database. putenv('SIMPLETEST_DB=' . Database::getConnectionInfoAsUrl()); @@ -292,7 +298,8 @@ function simpletest_phpunit_run_command(array $unescaped_test_classnames, $phpun // exec in a subshell so that the environment is isolated when running tests // via the simpletest UI. - exec(join($command, " "), $output, $ret); + $ret = exec(join($command, " "), $output, $status); + chdir($old_cwd); putenv('SIMPLETEST_DB='); return $ret; diff --git a/core/modules/simpletest/src/TestBase.php b/core/modules/simpletest/src/TestBase.php index b255dea49..60ad26095 100644 --- a/core/modules/simpletest/src/TestBase.php +++ b/core/modules/simpletest/src/TestBase.php @@ -821,7 +821,7 @@ abstract class TestBase { * @return bool * TRUE if the assertion succeeded, FALSE otherwise. * - * @see TestBase::prepareEnvironment() + * @see \Drupal\simpletest\TestBase::prepareEnvironment() * @see \Drupal\Core\DrupalKernel::bootConfiguration() */ protected function assertNoErrorsLogged() { @@ -830,6 +830,42 @@ abstract class TestBase { return $this->assertFalse(file_exists(DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'), 'PHP error.log is empty.'); } + /** + * Asserts that a specific error has been logged to the PHP error log. + * + * @param string $error_message + * The expected error message. + * + * @return bool + * TRUE if the assertion succeeded, FALSE otherwise. + * + * @see \Drupal\simpletest\TestBase::prepareEnvironment() + * @see \Drupal\Core\DrupalKernel::bootConfiguration() + */ + protected function assertErrorLogged($error_message) { + $error_log_filename = DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'; + if (!file_exists($error_log_filename)) { + $this->error('No error logged yet.'); + } + + $content = file_get_contents($error_log_filename); + $rows = explode(PHP_EOL, $content); + + // We iterate over the rows in order to be able to remove the logged error + // afterwards. + $found = FALSE; + foreach ($rows as $row_index => $row) { + if (strpos($content, $error_message) !== FALSE) { + $found = TRUE; + unset($rows[$row_index]); + } + } + + file_put_contents($error_log_filename, implode("\n", $rows)); + + return $this->assertTrue($found, sprintf('The %s error message was logged.', $error_message)); + } + /** * Fire an assertion that is always positive. * diff --git a/core/modules/system/src/Controller/ThemeController.php b/core/modules/system/src/Controller/ThemeController.php index 5f56052b3..d54cd9141 100644 --- a/core/modules/system/src/Controller/ThemeController.php +++ b/core/modules/system/src/Controller/ThemeController.php @@ -29,27 +29,17 @@ class ThemeController extends ControllerBase { */ protected $themeHandler; - /** - * The route builder service. - * - * @var \Drupal\Core\Routing\RouteBuilderInterface - */ - protected $routeBuilder; - /** * Constructs a new ThemeController. * * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler * The theme handler. - * @param \Drupal\Core\Routing\RouteBuilderInterface $route_builder - * The route builder. * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The config factory. */ - public function __construct(ThemeHandlerInterface $theme_handler, RouteBuilderInterface $route_builder, ConfigFactoryInterface $config_factory) { + public function __construct(ThemeHandlerInterface $theme_handler,ConfigFactoryInterface $config_factory) { $this->themeHandler = $theme_handler; $this->configFactory = $config_factory; - $this->routeBuilder = $route_builder; } /** @@ -58,7 +48,6 @@ class ThemeController extends ControllerBase { public static function create(ContainerInterface $container) { return new static( $container->get('theme_handler'), - $container->get('router.builder'), $container->get('config.factory') ); } @@ -183,8 +172,6 @@ class ThemeController extends ControllerBase { // Set the default theme. $config->set('default', $theme)->save(); - $this->routeBuilder->setRebuildNeeded(); - // The status message depends on whether an admin theme is currently in // use: a value of 0 means the admin theme is set to be the default // theme. diff --git a/core/modules/system/src/Form/ThemeSettingsForm.php b/core/modules/system/src/Form/ThemeSettingsForm.php index 395c74359..7f02517d0 100644 --- a/core/modules/system/src/Form/ThemeSettingsForm.php +++ b/core/modules/system/src/Form/ThemeSettingsForm.php @@ -108,13 +108,11 @@ class ThemeSettingsForm extends ConfigFormBase { $themes = $this->themeHandler->listInfo(); - // Deny access if the theme is not installed or not found. - if (!empty($theme) && (empty($themes[$theme]) || !$themes[$theme]->status)) { - throw new NotFoundHttpException(); - } - // Default settings are defined in theme_get_setting() in includes/theme.inc if ($theme) { + if (!$this->themeHandler->hasUi($theme)) { + throw new NotFoundHttpException(); + } $var = 'theme_' . $theme . '_settings'; $config_key = $theme . '.settings'; $themes = $this->themeHandler->listInfo(); diff --git a/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php b/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php index 9c9de198e..7193ea5c4 100644 --- a/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php +++ b/core/modules/system/src/Plugin/Derivative/ThemeLocalTask.php @@ -48,7 +48,7 @@ class ThemeLocalTask extends DeriverBase implements ContainerDeriverInterface { */ public function getDerivativeDefinitions($base_plugin_definition) { foreach ($this->themeHandler->listInfo() as $theme_name => $theme) { - if ($theme->status) { + if ($this->themeHandler->hasUi($theme_name)) { $this->derivatives[$theme_name] = $base_plugin_definition; $this->derivatives[$theme_name]['title'] = $theme->info['name']; $this->derivatives[$theme_name]['route_parameters'] = array('theme' => $theme_name); diff --git a/core/modules/system/src/SystemConfigSubscriber.php b/core/modules/system/src/SystemConfigSubscriber.php index 204d68538..76ae5731e 100644 --- a/core/modules/system/src/SystemConfigSubscriber.php +++ b/core/modules/system/src/SystemConfigSubscriber.php @@ -7,8 +7,10 @@ namespace Drupal\system; +use Drupal\Core\Config\ConfigCrudEvent; use Drupal\Core\Config\ConfigEvents; use Drupal\Core\Config\ConfigImporterEvent; +use Drupal\Core\Routing\RouteBuilderInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -18,6 +20,35 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; class SystemConfigSubscriber implements EventSubscriberInterface { use StringTranslationTrait; + /** + * The router builder. + * + * @var \Drupal\Core\Routing\RouteBuilderInterface + */ + protected $routerBuilder; + + /** + * Constructs the SystemConfigSubscriber. + * + * @param \Drupal\Core\Routing\RouteBuilderInterface $route_builder + * The router builder service. + */ + public function __construct(RouteBuilderInterface $router_builder) { + $this->routerBuilder = $router_builder; + } + + /** + * Rebuilds the router when the default or admin theme is changed. + * + * @param \Drupal\Core\Config\ConfigCrudEvent $event + */ + public function onConfigSave(ConfigCrudEvent $event) { + $saved_config = $event->getConfig(); + if ($saved_config->getName() == 'system.theme' && ($event->isChanged('admin') || $event->isChanged('default'))) { + $this->routerBuilder->setRebuildNeeded(); + } + } + /** * Checks that the configuration synchronization is valid. * @@ -55,6 +86,7 @@ class SystemConfigSubscriber implements EventSubscriberInterface { * {@inheritdoc} */ public static function getSubscribedEvents() { + $events[ConfigEvents::SAVE][] = array('onConfigSave', 0); // The empty check has a high priority so that is can stop propagation if // there is no configuration to import. $events[ConfigEvents::IMPORT_VALIDATE][] = array('onConfigImporterValidateNotEmpty', 512); diff --git a/core/modules/system/src/Tests/Entity/Element/EntityAutocompleteElementFormTest.php b/core/modules/system/src/Tests/Entity/Element/EntityAutocompleteElementFormTest.php index 0fdd9af97..3e0386ce4 100644 --- a/core/modules/system/src/Tests/Entity/Element/EntityAutocompleteElementFormTest.php +++ b/core/modules/system/src/Tests/Entity/Element/EntityAutocompleteElementFormTest.php @@ -137,6 +137,7 @@ class EntityAutocompleteElementFormTest extends EntityUnitTestBase implements Fo $form['single_autocreate_no_validate'] = array( '#type' => 'entity_autocomplete', '#target_type' => 'entity_test', + '#validate_reference' => FALSE, '#autocreate' => array( 'bundle' => 'entity_test', ), diff --git a/core/modules/system/src/Tests/Entity/EntityFieldTest.php b/core/modules/system/src/Tests/Entity/EntityFieldTest.php index 6fae79b31..5c9161e3c 100644 --- a/core/modules/system/src/Tests/Entity/EntityFieldTest.php +++ b/core/modules/system/src/Tests/Entity/EntityFieldTest.php @@ -691,8 +691,8 @@ class EntityFieldTest extends EntityUnitTestBase { ->setSetting('target_type', 'node') ->setSetting('handler_settings', ['target_bundles' => ['article' => 'article']]); $reference_field = \Drupal::TypedDataManager()->create($definition); - $reference = $reference_field->appendItem(array('entity' => $node)); - $violations = $reference->validate(); + $reference_field->appendItem(array('entity' => $node)); + $violations = $reference_field->validate(); $this->assertEqual($violations->count(), 1); $node = entity_create('node', array( @@ -701,8 +701,8 @@ class EntityFieldTest extends EntityUnitTestBase { 'title' => $this->randomString(), )); $node->save(); - $reference->setValue($node); - $violations = $reference->validate(); + $reference_field->entity = $node; + $violations = $reference_field->validate(); $this->assertEqual($violations->count(), 0); } diff --git a/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php b/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php index 8e64386a5..aa49b84de 100644 --- a/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php +++ b/core/modules/system/src/Tests/Entity/EntityReferenceFieldTest.php @@ -113,7 +113,7 @@ class EntityReferenceFieldTest extends EntityUnitTestBase { $entity->{$this->fieldName}->target_id = $referenced_entity->id(); $violations = $entity->{$this->fieldName}->validate(); $this->assertEqual($violations->count(), 1, 'Validation throws a violation.'); - $this->assertEqual($violations[0]->getMessage(), t('The entity must be of bundle %bundle.', array('%bundle' => $this->bundle))); + $this->assertEqual($violations[0]->getMessage(), t('This entity (%type: %id) cannot be referenced.', array('%type' => $this->referencedEntityType, '%id' => $referenced_entity->id()))); } /** diff --git a/core/modules/system/src/Tests/File/HtaccessUnitTest.php b/core/modules/system/src/Tests/File/HtaccessUnitTest.php index c8599b3af..9f5273c25 100644 --- a/core/modules/system/src/Tests/File/HtaccessUnitTest.php +++ b/core/modules/system/src/Tests/File/HtaccessUnitTest.php @@ -40,8 +40,7 @@ class HtaccessUnitTest extends KernelTestBase { $this->assertTrue(strpos($content, "SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006") !== FALSE); $this->assertFalse(strpos($content, "Require all denied") !== FALSE); $this->assertFalse(strpos($content, "Deny from all") !== FALSE); - $this->assertTrue(strpos($content, "Options None") !== FALSE); - $this->assertTrue(strpos($content, "Options +FollowSymLinks") !== FALSE); + $this->assertTrue(strpos($content, "Options -Indexes -ExecCGI -Includes -MultiViews") !== FALSE); $this->assertTrue(strpos($content, "SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003") !== FALSE); $this->assertFilePermissions($public . '/.htaccess', 0444); @@ -54,8 +53,7 @@ class HtaccessUnitTest extends KernelTestBase { $this->assertTrue(strpos($content, "SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006") !== FALSE); $this->assertTrue(strpos($content, "Require all denied") !== FALSE); $this->assertTrue(strpos($content, "Deny from all") !== FALSE); - $this->assertTrue(strpos($content, "Options None") !== FALSE); - $this->assertTrue(strpos($content, "Options +FollowSymLinks") !== FALSE); + $this->assertTrue(strpos($content, "Options -Indexes -ExecCGI -Includes -MultiViews") !== FALSE); $this->assertTrue(strpos($content, "SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003") !== FALSE); $this->assertFilePermissions($private . '/.htaccess', 0444); @@ -68,8 +66,7 @@ class HtaccessUnitTest extends KernelTestBase { $this->assertTrue(strpos($content,"SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006") !== FALSE); $this->assertTrue(strpos($content, "Require all denied") !== FALSE); $this->assertTrue(strpos($content,"Deny from all") !== FALSE); - $this->assertTrue(strpos($content,"Options None") !== FALSE); - $this->assertTrue(strpos($content,"Options +FollowSymLinks") !== FALSE); + $this->assertTrue(strpos($content,"Options -Indexes -ExecCGI -Includes -MultiViews") !== FALSE); $this->assertTrue(strpos($content, "SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003") !== FALSE); $this->assertFilePermissions($stream . '/.htaccess', 0444); diff --git a/core/modules/system/src/Tests/Installer/StandardInstallerTest.php b/core/modules/system/src/Tests/Installer/StandardInstallerTest.php index 184e07b65..dfe920b9c 100644 --- a/core/modules/system/src/Tests/Installer/StandardInstallerTest.php +++ b/core/modules/system/src/Tests/Installer/StandardInstallerTest.php @@ -40,6 +40,19 @@ class StandardInstallerTest extends ConfigAfterInstallerTestBase { parent::setUpSite(); } + /** + * {@inheritdoc} + */ + protected function curlExec($curl_options, $redirect = FALSE) { + // Ensure that we see the classy progress CSS on the batch page. + // Batch processing happens as part of HTTP redirects, so we can access the + // HTML of the batch page. + if (strpos($curl_options[CURLOPT_URL], '&id=1&op=do_nojs') !== FALSE) { + $this->assertRaw('themes/classy/css/components/progress.css'); + } + return parent::curlExec($curl_options, $redirect); + } + /** * Ensures that the exported standard configuration is up to date. */ diff --git a/core/modules/system/src/Tests/Menu/MenuRouterTest.php b/core/modules/system/src/Tests/Menu/MenuRouterTest.php index 42332e06c..7ea4e0f5c 100644 --- a/core/modules/system/src/Tests/Menu/MenuRouterTest.php +++ b/core/modules/system/src/Tests/Menu/MenuRouterTest.php @@ -204,6 +204,7 @@ class MenuRouterTest extends WebTestBase { "éøïвβ中國書۞"; // Characters from various non-ASCII alphabets. $this->drupalGet($path); $this->assertRaw('This is the menuTestCallback content.'); + $this->assertNoText(t('The website encountered an unexpected error. Please try again later.')); } /** diff --git a/core/modules/system/src/Tests/Routing/RouteProviderTest.php b/core/modules/system/src/Tests/Routing/RouteProviderTest.php index c1d24ff33..cbe8b0981 100644 --- a/core/modules/system/src/Tests/Routing/RouteProviderTest.php +++ b/core/modules/system/src/Tests/Routing/RouteProviderTest.php @@ -115,7 +115,7 @@ class RouteProviderTest extends KernelTestBase { public function testCandidateOutlines() { $connection = Database::getConnection(); - $provider = new RouteProvider($connection, $this->state, $this->currentPath, $this->cache, $this->pathProcessor, $this->cacheTagsInvalidator, 'test_routes'); + $provider = new TestRouteProvider($connection, $this->state, $this->currentPath, $this->cache, $this->pathProcessor, $this->cacheTagsInvalidator, 'test_routes'); $parts = array('node', '5', 'edit'); @@ -532,7 +532,7 @@ class RouteProviderTest extends KernelTestBase { */ public function testGetRoutesByPatternWithLongPatterns() { $connection = Database::getConnection(); - $provider = new RouteProvider($connection, $this->state, $this->currentPath, $this->cache, $this->pathProcessor, $this->cacheTagsInvalidator, 'test_routes'); + $provider = new TestRouteProvider($connection, $this->state, $this->currentPath, $this->cache, $this->pathProcessor, $this->cacheTagsInvalidator, 'test_routes'); $this->fixtures->createTables($connection); // This pattern has only 3 parts, so we will get candidates, but no routes, @@ -613,3 +613,11 @@ class RouteProviderTest extends KernelTestBase { } } + +class TestRouteProvider extends RouteProvider { + + public function getCandidateOutlines(array $parts) { + return parent::getCandidateOutlines($parts); + } + +} diff --git a/core/modules/system/src/Tests/System/DefaultMobileMetaTagsTest.php b/core/modules/system/src/Tests/System/DefaultMobileMetaTagsTest.php index 31d404d40..ae2d3f4ff 100644 --- a/core/modules/system/src/Tests/System/DefaultMobileMetaTagsTest.php +++ b/core/modules/system/src/Tests/System/DefaultMobileMetaTagsTest.php @@ -44,11 +44,6 @@ class DefaultMobileMetaTagsTest extends WebTestBase { * Verifies that the default mobile meta tags can be removed. */ public function testRemovingDefaultMetaTags() { - // @todo remove once PHP7 on Drupal CI has the fix. - if (version_compare(phpversion(), '7.0.0-dev') >= 0) { - // @see https://bugs.php.net/bug.php?id=70808 - return; - } \Drupal::service('module_installer')->install(array('system_module_test')); $this->drupalGet(''); foreach ($this->defaultMetaTags as $name => $metatag) { diff --git a/core/modules/system/src/Tests/System/ErrorHandlerTest.php b/core/modules/system/src/Tests/System/ErrorHandlerTest.php index 2cea2b766..07f2aacfb 100644 --- a/core/modules/system/src/Tests/System/ErrorHandlerTest.php +++ b/core/modules/system/src/Tests/System/ErrorHandlerTest.php @@ -100,6 +100,7 @@ class ErrorHandlerTest extends WebTestBase { $this->assertErrorMessage($error_warning); $this->assertErrorMessage($error_user_notice); $this->assertNoRaw('
', 'Did not find pre element with backtrace class.');
+    $this->assertErrorLogged($fatal_error['@message']);
 
     // Set error reporting to not collect notices.
     $config->set('error_level', ERROR_REPORTING_DISPLAY_SOME)->save();
diff --git a/core/modules/system/src/Tests/System/ThemeTest.php b/core/modules/system/src/Tests/System/ThemeTest.php
index 8b2836b75..278353db5 100644
--- a/core/modules/system/src/Tests/System/ThemeTest.php
+++ b/core/modules/system/src/Tests/System/ThemeTest.php
@@ -52,6 +52,9 @@ class ThemeTest extends WebTestBase {
     $this->assertResponse(404, 'The theme settings form URL for a uninstalled theme could not be found.');
     $this->drupalGet('admin/appearance/settings/' . $this->randomMachineName());
     $this->assertResponse(404, 'The theme settings form URL for a non-existent theme could not be found.');
+    $this->assertTrue(\Drupal::service('theme_installer')->install(['stable']));
+    $this->drupalGet('admin/appearance/settings/stable');
+    $this->assertResponse(404, 'The theme settings form URL for a hidden theme is unavailable.');
 
     // Specify a filesystem path to be used for the logo.
     $file = current($this->drupalGetTestFiles('image'));
@@ -190,6 +193,23 @@ class ThemeTest extends WebTestBase {
     // The logo field should only be present on the global theme settings form.
     $this->assertNoFieldByName('logo_path');
     $this->drupalPostForm(NULL, [], t('Save configuration'));
+
+    // Ensure only valid themes are listed in the local tasks.
+    $this->drupalPlaceBlock('local_tasks_block', ['region' => 'header']);
+    $this->drupalGet('admin/appearance/settings');
+    $theme_handler = \Drupal::service('theme_handler');
+    $this->assertLink($theme_handler->getName('classy'));
+    $this->assertLink($theme_handler->getName('bartik'));
+    $this->assertNoLink($theme_handler->getName('stable'));
+
+    // If a hidden theme is an admin theme it should be viewable.
+    \Drupal::configFactory()->getEditable('system.theme')->set('admin', 'stable')->save();
+    \Drupal::service('router.builder')->rebuildIfNeeded();
+    $this->drupalPlaceBlock('local_tasks_block', ['region' => 'header', 'theme' => 'stable']);
+    $this->drupalGet('admin/appearance/settings');
+    $this->assertLink($theme_handler->getName('stable'));
+    $this->drupalGet('admin/appearance/settings/stable');
+    $this->assertResponse(200, 'The theme settings form URL for a hidden theme that is the admin theme is available.');
   }
 
   /**
@@ -255,8 +275,14 @@ class ThemeTest extends WebTestBase {
    * Test switching the default theme.
    */
   function testSwitchDefaultTheme() {
+    /** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */
+    $theme_handler = \Drupal::service('theme_handler');
+    // First, install Stark and set it as the default theme programmatically.
+    $theme_handler->install(array('stark'));
+    $theme_handler->setDefault('stark');
+
     // Install Bartik and set it as the default theme.
-    \Drupal::service('theme_handler')->install(array('bartik'));
+    $theme_handler->install(array('bartik'));
     $this->drupalGet('admin/appearance');
     $this->clickLink(t('Set as default'));
     $this->assertEqual($this->config('system.theme')->get('default'), 'bartik');
@@ -266,10 +292,10 @@ class ThemeTest extends WebTestBase {
     $this->assertText('Bartik(' . t('active tab') . ')', 'Default local task on blocks admin page is the default theme.');
     // Switch back to Stark and test again to test that the menu cache is cleared.
     $this->drupalGet('admin/appearance');
-    // Classy is the first 'Set as default' link.
-    $this->clickLink(t('Set as default'), 0);
+    // Stark is the first 'Set as default' link.
+    $this->clickLink(t('Set as default'));
     $this->drupalGet('admin/structure/block');
-    $this->assertText('Classy(' . t('active tab') . ')', 'Default local task on blocks admin page has changed.');
+    $this->assertText('Stark(' . t('active tab') . ')', 'Default local task on blocks admin page has changed.');
   }
 
   /**
@@ -328,8 +354,8 @@ class ThemeTest extends WebTestBase {
     // base theme of bartik.
     $this->assertNoRaw('Uninstall Classy theme', 'A link to uninstall the Classy theme does not appear on the theme settings page.');
 
-    // Change the default theme to stark, stark is third in the list.
-    $this->clickLink(t('Set as default'), 2);
+    // Change the default theme to stark, stark is second in the list.
+    $this->clickLink(t('Set as default'), 1);
 
     // Check that bartik can be uninstalled now.
     $this->assertRaw('Uninstall Bartik theme', 'A link to uninstall the Bartik theme does appear on the theme settings page.');
@@ -344,9 +370,9 @@ class ThemeTest extends WebTestBase {
     // Seven is the second in the list.
     $this->clickLink(t('Uninstall'));
     $this->assertRaw('The Seven theme has been uninstalled');
-    // Now uninstall classy.
-    $this->clickLink(t('Uninstall'));
-    $this->assertRaw('The Classy theme has been uninstalled');
+
+    // Check that the classy theme still can't be uninstalled as it is hidden.
+    $this->assertNoRaw('Uninstall Classy theme', 'A link to uninstall the Classy theme does not appear on the theme settings page.');
   }
 
   /**
diff --git a/core/modules/system/src/Tests/System/UncaughtExceptionTest.php b/core/modules/system/src/Tests/System/UncaughtExceptionTest.php
index 8c87ebf46..3a67ae873 100644
--- a/core/modules/system/src/Tests/System/UncaughtExceptionTest.php
+++ b/core/modules/system/src/Tests/System/UncaughtExceptionTest.php
@@ -87,6 +87,7 @@ class UncaughtExceptionTest extends WebTestBase {
     $this->assertResponse(500);
     $this->assertText('The website encountered an unexpected error. Please try again later.');
     $this->assertText($this->expectedExceptionMessage);
+    $this->assertErrorLogged($this->expectedExceptionMessage);
   }
 
   /**
@@ -122,6 +123,7 @@ class UncaughtExceptionTest extends WebTestBase {
 
     $this->assertRaw('The website encountered an unexpected error.');
     $this->assertRaw($this->expectedExceptionMessage);
+    $this->assertErrorLogged($this->expectedExceptionMessage);
   }
 
   /**
@@ -178,6 +180,7 @@ class UncaughtExceptionTest extends WebTestBase {
     $this->assertResponse(500);
 
     $this->assertRaw($this->expectedExceptionMessage);
+    $this->assertErrorLogged($this->expectedExceptionMessage);
   }
 
   /**
@@ -199,6 +202,7 @@ class UncaughtExceptionTest extends WebTestBase {
 
     $this->assertRaw('The website encountered an unexpected error');
     $this->assertRaw($this->expectedExceptionMessage);
+    $this->assertErrorLogged($this->expectedExceptionMessage);
   }
 
   /**
@@ -233,6 +237,7 @@ class UncaughtExceptionTest extends WebTestBase {
     $this->drupalGet('');
     $this->assertResponse(500);
     $this->assertRaw('PDOException');
+    $this->assertErrorLogged($this->expectedExceptionMessage);
   }
 
   /**
@@ -252,7 +257,8 @@ class UncaughtExceptionTest extends WebTestBase {
 
     // Find fatal error logged to the simpletest error.log
     $errors = file(\Drupal::root() . '/' . $this->siteDirectory . '/error.log');
-    $this->assertIdentical(count($errors), 1, 'Exactly one line logged to the PHP error log');
+    $this->assertIdentical(count($errors), 2, 'The error + the error that the logging service is broken has been written to the error log.');
+    $this->assertTrue(strpos($errors[0], 'Failed to log error') !== FALSE, 'The error handling logs when an error could not be logged to the logger.');
 
     $expected_path = \Drupal::root() . '/core/modules/system/tests/modules/error_service_test/src/MonkeysInTheControlRoom.php';
     $expected_line = 63;
diff --git a/core/modules/system/src/Tests/Theme/StableLibraryOverrideTest.php b/core/modules/system/src/Tests/Theme/StableLibraryOverrideTest.php
new file mode 100644
index 000000000..526be51c1
--- /dev/null
+++ b/core/modules/system/src/Tests/Theme/StableLibraryOverrideTest.php
@@ -0,0 +1,185 @@
+themeManager = $this->container->get('theme.manager');
+    $this->themeInitialization = $this->container->get('theme.initialization');
+    $this->libraryDiscovery = $this->container->get('library.discovery');
+
+    $this->container->get('theme_installer')->install(['stable']);
+
+    // Enable all core modules.
+    $all_modules = system_rebuild_module_data();
+    $all_modules = array_filter($all_modules, function ($module) {
+      // Filter contrib, hidden, already enabled modules and modules in the
+      // Testing package.
+      if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing') {
+        return FALSE;
+      }
+      return TRUE;
+    });
+    $this->allModules = array_keys($all_modules);
+    sort($this->allModules);
+    $this->enableModules($this->allModules);
+  }
+
+  /**
+   * Ensures that Stable overrides all relevant core library assets.
+   */
+  public function testStableLibraryOverrides() {
+    // First get the clean library definitions with no active theme.
+    $libraries_before = $this->getAllLibraries();
+    $libraries_before = $this->removeVendorAssets($libraries_before);
+
+    $this->themeManager->setActiveTheme($this->themeInitialization->getActiveThemeByName('stable'));
+    $this->libraryDiscovery->clearCachedDefinitions();
+
+    // Now get the library definitions with Stable as the active theme.
+    $libraries_after = $this->getAllLibraries();
+    $libraries_after = $this->removeVendorAssets($libraries_after);
+
+    $root = \Drupal::root();
+    foreach ($libraries_before as $extension => $libraries) {
+      foreach ($libraries as $library_name => $library) {
+        // Allow skipping libraries.
+        if (in_array("$extension/$library_name", $this->librariesToSkip)) {
+          continue;
+        }
+        $library_after = $libraries_after[$extension][$library_name];
+
+        // Check that all the CSS assets are overridden.
+        foreach ($library['css'] as $index => $asset) {
+          $clean_path = $asset['data'];
+          $stable_path = $library_after['css'][$index]['data'];
+          // Make core/misc assets look like they are coming from a "core"
+          // module.
+          $replacements = [
+            'core/misc/' => "core/modules/core/css/",
+          ];
+          $expected_path = strtr($clean_path, $replacements);
+
+          // Adjust the module asset paths to correspond with the Stable folder
+          // structure.
+          $expected_path = str_replace("core/modules/$extension/css/", "core/themes/stable/css/$extension/", $expected_path);
+          $assert_path = str_replace("core/modules/$extension/", '', $clean_path);
+
+          $this->assertEqual($expected_path, $stable_path, "$assert_path from the $extension/$library_name library is overridden in Stable.");
+        }
+      }
+    }
+  }
+
+  /**
+   * Removes all vendor libraries and assets from the library definitions.
+   *
+   * @param array[] $all_libraries
+   *   An associative array of libraries keyed by extension, then by library
+   *   name, and so on.
+   *
+   * @return array[]
+   *   The reduced array of libraries.
+   */
+  protected function removeVendorAssets($all_libraries) {
+    foreach ($all_libraries as $extension => $libraries) {
+      foreach ($libraries as $library_name => $library) {
+        if (isset($library['remote'])) {
+          unset($all_libraries[$extension][$library_name]);
+        }
+        foreach (['css', 'js'] as $asset_type) {
+          foreach ($library[$asset_type] as $index => $asset) {
+            if (strpos($asset['data'], 'core/assets/vendor') !== FALSE) {
+              unset($all_libraries[$extension][$library_name][$asset_type][$index]);
+              // Re-key the array of assets. This is needed because
+              // libraries-override doesn't always preserve the order.
+              if (!empty($all_libraries[$extension][$library_name][$asset_type])) {
+                $all_libraries[$extension][$library_name][$asset_type] = array_values($all_libraries[$extension][$library_name][$asset_type]);
+              }
+            }
+          }
+        }
+      }
+    }
+    return $all_libraries;
+  }
+
+  /**
+   * Gets all libraries for core and all installed modules.
+   *
+   * @return array[]
+   *   An associative array of libraries keyed by extension, then by library
+   *   name, and so on.
+   */
+  protected function getAllLibraries() {
+    $modules = \Drupal::moduleHandler()->getModuleList();
+    $module_list = array_keys($modules);
+    sort($module_list);
+    $this->assertEqual($this->allModules, $module_list, 'All core modules are installed.');
+
+    $libraries['core'] = $this->libraryDiscovery->getLibrariesByExtension('core');
+
+    $root = \Drupal::root();
+    foreach ($modules as $module_name => $module) {
+      $library_file = $module->getPath() . '/' . $module_name . '.libraries.yml';
+      if (is_file($root . '/' . $library_file)) {
+        $libraries[$module_name] = $this->libraryDiscovery->getLibrariesByExtension($module_name);
+      }
+    }
+    return $libraries;
+  }
+
+}
diff --git a/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseFilledTest.php b/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseFilledTest.php
index 956849c0e..fa1499970 100644
--- a/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseFilledTest.php
+++ b/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseFilledTest.php
@@ -30,8 +30,7 @@ class UpdatePathRC1TestBaseFilledTest extends UpdatePathRC1TestBaseTest {
    * Tests that the content and configuration were properly updated.
    */
   public function testUpdatedSite() {
-    // @todo there are no updates to run.
-    //$this->runUpdates();
+    $this->runUpdates();
 
     $spanish = \Drupal::languageManager()->getLanguage('es');
 
diff --git a/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseTest.php b/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseTest.php
index 47e70b17e..54c2d1e93 100644
--- a/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseTest.php
+++ b/core/modules/system/src/Tests/Update/UpdatePathRC1TestBaseTest.php
@@ -34,6 +34,8 @@ class UpdatePathRC1TestBaseTest extends UpdatePathTestBase {
    * Tests that the database was properly loaded.
    */
   public function testDatabaseLoaded() {
+    $extensions = \Drupal::service('config.storage')->read('core.extension');
+    $this->assertFalse(isset($extensions['theme']['stable']), 'Stable is not installed before updating.');
     $hook_updates = [
       'user' => '8000',
       'node' => '8003',
@@ -57,11 +59,14 @@ class UpdatePathRC1TestBaseTest extends UpdatePathTestBase {
       $this->assertEqual($existing_updates[$expected_update], 1, new FormattableMarkup("@expected_update exists in 'existing_updates' key and only appears once.", ['@expected_update' => $expected_update]));
     }
 
-    // @todo there are no updates to run.
-    // $this->runUpdates();
+    $this->runUpdates();
     $this->assertEqual(\Drupal::config('system.site')->get('name'), 'Site-Install');
     $this->drupalGet('');
     $this->assertText('Site-Install');
+    $extensions = \Drupal::service('config.storage')->read('core.extension');
+    $this->assertTrue(isset($extensions['theme']['stable']), 'Stable is installed after updating.');
+    $blocks = \Drupal::entityManager()->getStorage('block')->loadByProperties(['theme' => 'stable']);
+    $this->assertTrue(empty($blocks), 'No blocks have been placed for Stable.');
   }
 
 }
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 69044a1ed..c9e81754e 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -1464,6 +1464,7 @@ function system_update_8005() {
         break;
 
       case 'classy':
+      case 'stable':
         // Don't place any blocks or trigger custom themes installed warning.
         break;
 
@@ -1541,6 +1542,7 @@ function system_update_8006() {
 
       case 'seven':
       case 'classy':
+      case 'stable':
         // Don't place any blocks or trigger custom themes installed warning.
         break;
       default:
@@ -1805,23 +1807,6 @@ function system_update_8011() {
   _system_update_create_block($name, $theme_name, $values);
 }
 
-/**
- * Install the Stable base theme if needed.
- */
-function system_update_8012() {
-  $theme_handler = \Drupal::service('theme_handler');
-  // Ensure we have fresh info.
-  $theme_handler->rebuildThemeData();
-  foreach ($theme_handler->listInfo() as $theme) {
-    // We first check that a base theme is set because if it's set to false then
-    // it's unset in \Drupal\Core\Extension\ThemeHandler::rebuildThemeData().
-    if (isset($theme->info['base theme']) && $theme->info['base theme'] == 'stable') {
-      $theme_handler->install(['stable']);
-      return;
-    }
-  }
-}
-
 /**
  * Enable automated cron module and move the config into it.
  */
@@ -1847,3 +1832,31 @@ function system_update_8013() {
 /**
  * @} End of "addtogroup updates-8.0.0-beta".
  */
+
+/**
+ * @addtogroup updates-8.0.0-rc
+ * @{
+ */
+
+/**
+ * Install the Stable base theme if needed.
+ */
+function system_update_8014() {
+  $theme_handler = \Drupal::service('theme_handler');
+  if ($theme_handler->themeExists('stable')) {
+    return;
+  }
+  $theme_handler->refreshInfo();
+  foreach ($theme_handler->listInfo() as $theme) {
+    // We first check that a base theme is set because if it's set to false then
+    // it's unset in \Drupal\Core\Extension\ThemeHandler::rebuildThemeData().
+    if (isset($theme->info['base theme']) && $theme->info['base theme'] == 'stable') {
+      $theme_handler->install(['stable']);
+      return;
+    }
+  }
+}
+
+/**
+ * @} End of "addtogroup updates-8.0.0-rc".
+ */
diff --git a/core/modules/system/system.services.yml b/core/modules/system/system.services.yml
index 0f816d6fe..c70889d3f 100644
--- a/core/modules/system/system.services.yml
+++ b/core/modules/system/system.services.yml
@@ -35,6 +35,7 @@ services:
       - { name: theme_negotiator, priority: 100 }
   system.config_subscriber:
     class: Drupal\system\SystemConfigSubscriber
+    arguments: ['@router.builder']
     tags:
       - { name: event_subscriber }
   system.config_cache_tag:
diff --git a/core/modules/system/templates/block--local-actions-block.html.twig b/core/modules/system/templates/block--local-actions-block.html.twig
index 65d57be1f..3e660c514 100644
--- a/core/modules/system/templates/block--local-actions-block.html.twig
+++ b/core/modules/system/templates/block--local-actions-block.html.twig
@@ -1,4 +1,4 @@
-{% extends "@block/block.html.twig" %}
+{% extends "block.html.twig" %}
 {#
 /**
  * @file
diff --git a/core/modules/system/tests/fixtures/update/drupal-8-rc1.bare.standard.php.gz b/core/modules/system/tests/fixtures/update/drupal-8-rc1.bare.standard.php.gz
new file mode 100644
index 0000000000000000000000000000000000000000..db046bea9472fdb0591a592aca17ef2cac4fae95
GIT binary patch
literal 119576
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	_%nuX{)E|jloxRLMCQe$ZEla&o
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 QumyF`N%~96 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 V$>GU?a4B+|y8scv2+SJg6aWFMZQK9= literal 0 HcmV?d00001 diff --git a/core/modules/system/tests/fixtures/update/drupal-8-rc1.filled.standard.php.gz b/core/modules/system/tests/fixtures/update/drupal-8-rc1.filled.standard.php.gz new file mode 100644 index 0000000000000000000000000000000000000000..615b88a7d45e4c5fbc65105b1f26ae98e637792f GIT binary patch literal 623241 zcmV(rK<>XEiwFp(Ksi5>~)b}stApCZL}cd>ksK%wR;sj0(36swyQd0CX$w&_!mKyCo3N@SvQC=hbkq5tOv zjw9>{{k^ZD`zCslyS}y7-nkP)4HVgJpN?p;0A%iQ&Epqe&L*?p^#1~oQ;E7UCi>*lwEoQFTI&0Wq=Wac~k~t zlbIr_OdJdrK{YYKlcJtQX>i=#3F1Lm<#}3mY3`sL7Rju_AidxGrY`M+?;hucdG|z@ z;r{siH^2G2VV-4XSS5KD{2{PEoSu$N_1OJ#f4lu;_@Eq4%rv^c9X=Qqh8FfF8l>j_ zRx}z=3@Yh?VDUvAN z>eyehyb7{9P5IY1ufP4u{Zb}B=sQ_nO#OH2tW3t4iI?8lmVdVD`i3=JMa6Iu6&F!C zOp@CyB{kW&n#jxj-Q%tHd})-8hk0y1<(x}XR!NoKYQDS9w0m%{G*w-spJbw){pE8k z%&0Kskqcds8=D zRcwSZ5%IWo%F4XI>md%3@zP|;G#dXJV87GOCeaNLcpF5%X2uo#GF3GGG@DzQYMRFh zk?l_p_WYl%SwS~fEP_k3Sj#4wC+jRBG{J+b3}uN2T`=FdxB!vAxVVbadL3vm3s_lD zlEvn|x%Ctqh-~YFqs5)(i~dR9ecW!}z^2Wtqp{2L;GthNi_+K4r)CN8tw!5O*Yt;# z)1NNNzoZucv&dq)(uV$rJy{#Do80td?zCq{H@T)qMENs}?TrEuO!K z&E82oI_QUk{r*w7KN#(X(a!#Ucz7I{ozcJ??#eLr0~D1LA6aA&7|WU__*{r%(pqyFJZ>j?R` z9q%M>o_qDM`JE^3xgZQIP>>vrt(8HN1w;Bc&WY;0;$c)^_HPQ~eDm$|=gp1Dp`8rl zqj-0B?}QH8j82aC`_W+>@9Z4YEttcD_+)SYuzzUwqtV_`v~LDO+G~GrclYG*Wbb6} zz`J)I@1C5+{=vaX*uS>~3*KSj0Sg;MorZN~K2$!xP~3zPavNEFP-pS&#K>POD)Uv2 zqB>QSUlAu#Q+;e9iS)3=hUs^fd2mLkvbeZGZTNL!+Rb`PVXl&ruKRDjj!&=8?Cstf zE~@BndKL{rT~tv)TJ+!ga=ZmadTJkAa6DL1H~mxim73?~Y5P07`+kYSw>E+e=helf3vVZS1dV=&6z^VRAH`eL@av=NjK+ zB>wd~x|v2NEi1?^%o89vRskQu0CGKXT&AiUM!NRg-ESXb*`!Xsrx&}!eA*kN`M4*Vb4a6xl?)nUtPo@MS|`#- z*sFT=7qbUvL0Khf8Wd(~rUO&3V``KXW!0<_Gnn8k7}QBxb%V2t-C6ATqKChTf=OXU zf4Fzkn(5&%&rFzvr0#~(MOYa_OU|?2y$9#?WHieQ6MP+&RgnyX$5A$<C<$u5=tU2R|7LLzRlES)E>;&6CMAr^%siMbXo(8~>YT)r;MtoO&-sPN=jXKi zpe{|ky7YBMi6Z}=K)CmV$?iS)N0VV{Jq4dU**NqlNRx^{Ef^$K zKo~ZXz2w1svYzQ>X#q?ot8q6>ach;kk#sb&Lf=W zWS54YJ$N|6b)3<$W=T1rUultyWc;4qXNMl3-CZ`&Lu)5MF$DG4k$F#~4cCWv*mIj> zKDq_^-!er}qt4#R;ql(CHIF$y^Q#g01|qflfkf)OqH7Oc)x~8}mX=5nUCx3hgg5_a ziri7I6z${|NhGe{b*b@NnQk<1dpczx+d# zzj!nH_W6vajnayyZ9&!Vf4j4H@_8BP81xXs-_4Kp9)Qk%(W6sp|M%J}n&o9h08@S9 z%Q=r|l?0capnpJQ8M)g}-;m-9q@vddiaXr#lK_o0Z9`QMMgTI>7;N)84fc0;X74`_ z#O8Dw?DY@uagZ0prb2yY$NP$3KP7ITCh_OQ*^6 zh$Y+2_IUrqKEEhuQTE`MAO8anbN~nX-_L&e@jr<#()kkO6X9uGll()%2v}oA*T(_{ z2|Nuu0ICy>vPCUj}&j3>nB0M6c9ltQ4B>YxuRu60a1y-Lnvozy)7(FS2b9J|f3Nv`s)?jHzW=Xsqf#!ez4w4}u*L%lS* zr-DSnxgi9mJxqCRWz{wxJEX%WWsXjk-Xmf`?l`I=_5f5j_>s zW(kBDcL+3S^@ow$qB&qPJ4)`=0IwLymVgxOfHAbk%aIIX9gk#5p$Lv2HL2m11> zs2WZHHc9rGdv?&GP)f5_;9x|OOZT$q&3f+-cH_RWa*|MSkKsK6_j*N&+amay6vSEZ zYLZv^U1>OY;Kdm4U(E3S5*4>}d-s?raGR+ADk@%J;Lkld$x-py5)p4*%Ok>17Q8wH zAyCc&a6gimrbGsktgcwCBNzx-@44ZMqb0QY<;VZ?IB$L9qe2@Kt{M2}pXRWhBsWe^ zq>Z5Q%huQL?zO4)na~hMCgLj)Wy)yr+0sK;WR#UZ|3tqpuLZ}EWLJ3#f=+wjp}@-Y zZ_z^;V@wu{wmD!{H6!rCq`(`{2>N1pNo-8NYp;R1Ct(YmB6vWKs^h*o?k=77TgK5+ zAN-QA{-*OH@tPPd26yIw`6MA!8`cF8;|h#$me0Yfi7ghu{v=H?xmsOHYfMq1oyOhZ zD~sWv(DXwN+CItGlT1sh>6oi}U>L9F!1gb%{_yy_@Z_uAH&6cY$wR{0XgDNcD}(uB zLB~0aU~aMS6B7id5aqD`l&E4#iaZMkdBMhxv}TB74wBBW+ynvISw`nIOzQ#LaO7O* z8Ci6aUB70UsxlMeVx~LJub9+NV1mVYI`ape%ePsAu$1$P=xW)J{GWeng1E6T@QFH0 z5VT^A6Ii5vO=RgRiR7HkVCm+=pfpBkHPQU(48|k5Ft&=6x8svc(Uef!tO1!_-oYZz#!v2}6knqX~qQWlY4Ge(- zSPrjhQkv+hU|WN!j)W?<;1MvAm|cqfkp$PmC|v6gK_b*|9?`~@0P11TmRf%P$&$m? zV>oZ{9Xat)@}4E!K|SsSaOax2QKN zF$@iDQ}#fBl2@tCnOP(j?Z*fe~>Ov=eZjx%P zC0f2>Su-{RMOiPGM4$7;&6j_Ij5xoA+y?XRfcO*^*HU#qYh(Ya*!Hy%Jy3P8vofXa zub1B%k&MMIyZ$BBng_se8&s~lN^4nuAxCG53mN=xpmi@1&*zc24j?^{D#+L%=IiBq zf>!|oghD&3nLq!eo&dt?7z}{fb7u*?&p-nh;27&vAA%uWu4XNTC5aVSPlJ?JvtCv(MbD;PVCOn^N|(OE zREFSlb|VuUc(ia;i<}_NoGw8s*1P>Ih zS_COo_Copr_P=W>2mDsUd`uFSY$h6#Lb8}bCSgxvhaEO7rGe2{zRl;uT!9#_DKbbM z^`KmoFx%x=UlfeYob>dZ<410B8y4&CeWY3-JJ{pX3XAk+|1*v6-{U}lQCI$o?Ip~ z6DJXqb$seQGMOPZNymK=C&Nktd+GmaGBS?yG!F$&^r7G>{r@>VbR#$F-mD=&tnl~< zix-V@(D9sTymQfV*cj2Etz$kLaLs!6*XTjF4MhH-I3>|G*5$F>kfW--tnFs}*rqD7Podx6C zu=(A|mNGgog&l-~ON3@j)|N~?;{x_L*m@dzasy8<6eN^(TB(Ze%wyu;kq~C@Umv7H z++-*ZstDFD)fbhC(BTli)diiwhZ@qG5iTGV{?&MU%NDcNT7~bP+U>&P$R^G!vuclK zlv*O#&>bvt2^9piC=8VXu>Rdzr8r8>f+3NVC}HN4S^fY*%xqC)ffZ78 zTi^B`iSPLgYEPJCVV;S%nqi1Oz@RlK%sfnE{%;-S&B~KB`{nP94!NGT&Kzz<01UCF!`^~G6k;n^ zyo{LvHxOfaoRq{MO5VYA!FY!s>6h;b9oak&frX@Q8j-e=jFcNd!w(+P1)l{7Ljop? z&m|_YmL;P$;tVY(OR^E62(v+woFS8q*ek<)iGcoQlWfqk+Sp6``6ujw2OCBZ-%Z9K zA<;aM#W&j8EE(b5AYV4Q(I*j zq6G{vaXuw!?yXQvy;3r>@8GcHH zb0K=+h(;$}%FFc zIomosyRZl2w%JO-wgy%_X;5KpqzrCQl$M1RW(h#5JfB`Ct9-C5LgW5*rI5zL@Gt`& z6jP`|5&bu-n#&cGZ{b}CPBMGd;fA}C($QYzd zc*|ruOJTn*YXmZywT=f&MQZSr1XaN!f)b~amNRx9)-ze8d7lt7g_fMK*eDySn}|sO z=cJy3S-+o|OmJK%I^niqZIj5GT_E-dzkHkvXobGUPgH7d7|oNc=Ep%M@B^s`Y~Bd@ zK$aY$bH#fJ7nBcTixtpRJB=I!n0ToxCb5UD$K~gML+BTk+B@fvwPtA~)`6*LUzU}@ z^tS=lAC_y3fq^f*FM=`2^=!~Uu&8CSOua_>IL(8~dJQOd=AcV~V9BvQ=;Z zfuLnXaZ)`F=2DRryozW#urdhynvVh&t|DdlE%Oo&LgK&cXr(zVfewMM=RsYfWqUIyH`1C<{yE>@`uBiRN){ zgk6hRY+_)Ez~3=5hkU?>9;|x;DO944FL_N6*{~hhcQBOoqiV1^Z3{&0HlhsN5FuUu zv~ei%;J4x4P`z}O?1coXm%-=T!MQ1P=^|EkIAVwcbi@ZzI&Yx0yg;z7MdlQsZM@D9 zJw@ASf$=_8R|Bh?I)ZIZ0-L7;2ob zyTUx6$-^>N4~L@3am*7DZU}t#Qd5w(Q8KECy@xq5w!E=~ZgekV-YBKTi`}mjP;Mk- z4jjv3E4LwHXGw`9wK$=ZTvAe%K-{R5u-HOJ?kk2w(7?E$Lm}u(EHI+PG8lqWiK30D zic;tTNJ5<7WJd+|sdG=LE^(@4G%{j^TV_0tX@rgz^2=CHB{JR!xB>bGs}_Td2STDQ zF}=F2t@0_2cX8jc@(cCGV>R3G+p^V=!7BJV&tsTMVbdVRFj9L}$^Ogbs4IpKxc-R8 zDIb-g*c(9~ zYZx`-l#ftZNuUR5gYA>JN+ifAH<}k5Km@s!Nto05aouHbpXG#ORVrKhvgPK&FhAQC zeS}Ga_7Ayy5i zEe_vCtH|OAQdnm)%Z}TU_6OR;Uex8dG}dXr#lclbUN<5cBdy+v=gp>Bb~jc($zd5G z7Hv^>I`vb*7Seio4mhJh!GK}Y@s}AjXCX@+ z3>aC7>F(J;#LX|F>Y@ogzp$g;ihXFT>&Nq`w0Y|D8v|Ha3A9OyB2q7hcUu7)LGfbx zD!tSF`6qX|A>X>fL}*Q8%C@^Vp#PLnz2pFe)kxXaXM4Fc!L>tncy~7prhB<|pl&2~PD@^So$D(2H;y03z0It4SeN^D&7htP^pd5b1X6oQn;d_5kjM zsjT@f7$B_!cLV|5`FA1^?XG9>2KyYd=~($E_>x8wLN&z+!v{uUkqub6h3cdXZ(nW&B1i zPB1Xb3xEqOMrT`7D<>+Jv%Go(f&*?M0<7_NM|A3}O&WregldPx5Zzr2Q_&0@ntBH|AOWNbUv`QTu_356m$f^frd+M6Lh1o}P+% zn?%GjHvLF(1P)njl5<-!)UBfVZ0v?c0!ngF+p@%(iv(-uB6dke{XpC+NZMyg*O0dx z5#9x9%_2Bq#Z- zbfTRxmjrKJB7_oBVmLR^h#CF!ZHfKkkvJTc%WgPj^>vMOjK?H0C*xYc zV8mp>YPUoV+^DHVoS%}#2^L3i_*t-?LcE-)wj?xR#%3)3B6C^P*k8(a(z;BB z2vOWBS>gfZFU3|al|O7?hE3#c2Zgf`2lV=UyS=8n=Ho~2^DLh(!mE534eFG{gRtMq zQMV7kF%Ys}gFTaerh1Ywmz96kXQlIl^ivg$%hTUygL3xyrsaJ=#R!b*mC!)d1zRVg zyv)l}f=(n{w=?34cvPP9x&nS^MuR<=!awZyLeZ*FzML)+#6` zurhE=poCblT&CYb;t|U*M`k85uY<)6XM}VIYV%J!o-Co|y~`$;XeDeBVls*N_Rx5x zv^0Ao?2}5$zzeV)Bx8>GBK_0}8EzFeKV!HUrc%s`PS*|=uuKp`coPfUkoc@f#;=~e z^5jhxp4DnTTqyg8Y(U)48NH97z;5Z;vx^<)!R8lns{7LMG>=*6kOY*4WtAJM6|_>x z?9p7vG79f>RBDk^k}0^L7|KNGX+2K{q(H+Ip}+ez#}Kv1BM^hPkBLo{ji2^GIx1wk z+F83Yt(aqzA`V4*a0ixH2YE9$Y8{A;I3l1;5UW5+uf09bJISIREDIu@EN>K65;#X= zXMr9pkTA#kC5a&^tTxzBv({%4(S)Q`Xp z3K$|ajUGuBsh!^@aOG^Z6-e*7h3IER01OBGK>-<&e+3lF)+iE`wpF%{vBSajMq?S+ z*~GCPO;`jg9EgA*(edY>Mg>WgY&f}}WW%(M#orj4_h|C9-6nUAgG95Ly_Yu<$SgGm zIU;$Bz(Q&>a_kmT$tB`b1ABnio{=t)8mP|FXXh3JN>$WS%uMR^xVStCOqR(c*waRp zwvN)xC(<@_0KkgMG6N9%Q?3Ohg;4}>WvI}q)9nFCvUW_5jsbnqx;vb|(%+>?3Zv6J zc*3`$);3lSz5Zuv0YcF4a6;Sa$fVB6V>S6`VPhotTDwk>krIObvq(M^%oaBe>wj~N zt=LhhI|k-*Xv4;? zrk#f1!}5@BxrF2h6!Y3|IO8ijM=az=E|ig>+R-U4Lo?6PJmP%4sTWq<5fefpDxX6e z=%bm(lpTMwI|3n)96kKS>SE=?db0^g4XWtIu|%b~%Nuaotn}>Lcr^cz*T4Zra`;ax zjqi-&n6uw$Bk&DzfGw}`^j3T~pA88zp&Y(^#eeY)-aqcXcLhJNEn7!K%Z6nBE%=2` z`Jm_+VP=)A^V=+f)MS%FvwX#Wu$*=sB7ZNkCB5)3FgU%t2bKBVy;J(Dg~adfb>w$X z8kNTycLPiTGfw?vh|zLvo-_p8R|O&+a7hvtf20}-YyV9}67ZSXEJY;^{MdD~L#>f% zb;Ir#dKgi{^5fU9o`<{Lo&Vu}EzDo)q~KrwMGR{w7bno%vr{|PXuarM_&$_ zqW}+)NB)gy*y`^N0{HmMRY-Rq_Pg&_pS0J62amgZL=K~LHX(XQDjPlduexlK5R+*= z4QYLYBqd4H4efR|V|xWZk@Cz${*C@NWQ$d6(=%J_BGg^$h=f?)DoF{+f!r9l9*vUs z{#75h*T@10TWs(f7&j3x*Gv_-+v)}nOD+0=I1+Y<%Wsh+x-EpdNpU!#ZIO!W3ng`t5NFjE ziRRrO(saW~Z$$duaGY#QNn+4POXiVE{zeIVGn}H8s|BEh&r=;ZfkdP}kD0U7_>?Al z{Ph`3f}oG$N41KAj--jI=E}&_<|5!6`4mz!Qo@7{VcRlWdfC7t>VBcejKg ziB4*r06-SE!)XN^^{IXz&Tg*~#9+4!M$LsZ$TX?PcuLj(Kl@>Fa{n!pfUkN3ur^;y4>Y#$zOBSJt+`5~d|+oC5=3XjlJaaj5Y@*>5Y~F>I4PEN z3EK9bj3~|sc~rNS(*v#P2sxtdxcQ{C=?%C~#xXsV8w>1Ygv!1C{?Wlfe+L?it$aYJ zmt=@m6pu7J6Rl$G-?12!vcTs^9q-V1&EwpZE_=cPAA{5sNUN`5?U8ea$h~uXhXu_g zCf4vr4xSR2bWy2bZ}OVNay3!WXHULr4*WGig=$nQkk7ax8c^AaFZr!J`u5G!_O)BB z9dIkwSlDMwF_J=B?27_92YHdA?s&RI*xkuF`TV|H(6*>8N|W$3$h}79TSd?5^Vayr znQtsM)TK);bork28v;K(dtzy(P!Wb!Di`(LrW36TnO_T1hyC3X2B~L+jGP*wCL{48 zida(STGti#vDwVN-!x!cTVei#jLA1x$@f3dO8$`Z?4Lh;@yaVK9R^R?eDT$Lf`$a% zvvPxNJmS|=+W&H`eCI(5*%T6*W~@7QzVK{bu?r;fjhJd6fbShTS3_<&cg$5rkdkYt zrOTV+xBM(|KLJ;GK3z#YQ(}w6=&4boF@^@hD0$N`E}QsX7eV3%jvd!okTk%@RKN?r#9)gAZ+%kaNLFz0WsjenGna3*ocpv%HcT zS-;&q4Zg~*5@Lj`#hzs`G}HV#_fN?~S3D$dRyW9d7LFa3c80JYnr3{`%v$4rP?H0m zC`_bzfK7MV++D!FOHYJ_p@n57-PCfR@!E}D(|=$)6qd(E=I24)Icf1d`vxF)HBxroHXZ67|p)NKPZ4^irl=8zlP_EWL3yFt^ggaEuZ6x z->bceHRsJZ~*}lm!x0Hf7!or)S%bqC>U!+ zk^fyEJJEjj+PD139pNi$-ap4GTj4tEXW%d>Hvx7W#z{FNwKU|4fgrO8c?fro!~RKd zABr2@(01@}N}OyM^}aFli+{+AOPkPT$6cD!es=#}d-7YQJrIhm>aTI|FC{K& zY7AR8?i(b;zJ6@K*#0=%M30{3xGecE0d$llKd|lA4S!8=)=T&NnmhlbC*=kGU^~!B zcMiPfIb6e}E+r5iY_!XL4z7~;;x&nj#Dv7oaqAO>jRDqytePOJegir2Vh#=^lF^o_ zWGck8nFU{oTirl?mh2kH>SY-g*=5!Sc>{5S%~HKZkaXK~@(|Jl2ni|)%ch<-co;O> zI0^>V_ z_lVtJWk{hw5{Ty4Yl$A+_O^d+#vb>8D+dhfG3qh*MkZo!uB#-f>4jL<=S?uIcb)B{ z-ZTyk;oao9nN`v!aJO00Q=1;-D+`SR#KX722?6g$GhbR-NxmlB$m2<^hkL4+hnV)a z2zww*u=9{W;8M?TFdd4X-ap#gJ%*mX40C1EaByvC%?8f7d$@DFvq$4K$It^Y$b=kJW5Han( zFu|)l9!6!gNeqEpmg*=hlg;FL8~jM4aIY`^vNw}iIQDPN@3*!FNL05mmwuEJuy2eo z;6R59%q%Inym{q}vRniQfytGn0Jcq`aj!|zIaebR^2OfWfVCWHmE8&f7ejGNK>5jC1E3=fnvuFNWABHo9>gJ|ksZyo1p(o3ed{fhNeEBTFtp%tpas zZOg9GADp;sg9SlrQ%>0@LO}AwNMopwZ4euThIwfNnoA@(&|35k)c~i_4{Y|(bMQB! zCjE9o0#`Ody!mJB+`)6q9qf(a1l?fRljLei!a+GS5@;ihpy*Z)H#d|#IM_Sf+uelX z9~)C{APL7GUyFHd=v%hevQ^d!3H#NA!M(Ac5wcb!8mHFU-%!-MYco41dv^(-MFlY! zyvI_bFqVoPwmjqV!bo$JEI_;TtuqM@Iu;a#YQJz*P8qw+VvI=596Z3-OkPQ{f8sm5v{uQ&~=TrL6F z6eMJSnp!Ayf>V_ZJ`2MEQK?Iq1O30z2Y}<_oN4BeZ842$X79LVRa%$z200||Jw4oc z7QH-wdKTqhs_gOys9UDE;0L(FU%-<|7CMc%!yPNrd=7g&UAi$`=zp#)LbmZr?M4LNS5rsbHizKp#9b*#x|Cl` zL44tX&861aEGMKGq{fTpvC_TXI}FK5DFv~x|B?h*2=1IW1X=g-SLbiUc`j*Wm4B<- zr%kpGcQ5{8Py{{t;-C8c)19Me`p9XY16CKkQof zPfqstZhdI_^bLo`Ppw?*@dsY(CtV@V_@9ud^UwBn(J;Jj+GjMEEe3)ulyW1Q8kasM z^R4lqa%+d)r5$d(v;IDg1WNJb4#%;3#Mbd!9)~=A({bRb{fNTI*Dp)P0Xwo!cMD{^34>$8C?qK7IX>$Wtqq z_JNf6)2>h$tXK#iBUTV-CT#Ky^)W{HL4vRBuTNZxR`Ud1my9WBcHpzm-Q5jnwtKqM zpLtiNBst+^{eeN+iNtVgN;~2Bm%-_))&RS+hL+oLNVlH^r`xUPj%Rm=jlKPo8OyE|-r+7;p|&nu>=;!A)RL26BINmaW9q7w;Ts1+#>qE9h@mMTdE z7cw5h#qo&;7RPI$;)|Y$&et0E4t9@@_U>-n6Xo^>P5$HqHTf3_B2*BBdm4OA@Jm8w zG7MhPp$rr5L;3qaQ;nuEoSpt4_D2Gw}sD<9yi?1(W!`M06-M{D`?w#x$G=T{x$Jy@X z+ri-XbmyNB|8O)M?Z>#u}8(CRRLj=ppyIMngutPGw}1*m0O+?G0s_& zhwb29_O9|Wo7uJ`nape|L?|LGs;;V|p9eZjiXo1MXfTc}45DDmrrmI8U!H1}uq`cU zF15p;(bKAvxJF?OFmypfE)ydqmJw4&nz=Q*unpPO-;A4XoCyCO*Ar_dMrEy#^NPjl z?DF_DfZyw;qh*3L>SJc zYaYA2SN2kT=9GS%JBoj{VTdK%LfRKfgshactm@Gy;D}rr4~8YUWHhopa#g09ceIc- z4-U%)iMwNz9LrIGrN}kMPV5#K1BB6Zn$B*%Gs%`^MqazME;l{r#tG_gvDkiQ(<{4v zMV)um8IBVrDA{deYv|yYXIim)#9aoz<_;Hu6ik*$-W+V-dzCudNQB^N3XQM6!OwpUS?}#N}Gs#BoWJlIb}L zsh8$M=d#4eT?E~71y<=GYi#;2laIg_EibjdPU*UsPP;7-IpZU7#(Jb^8Fik)ERWmX z(wg4dN5m~*%Noj&UK}Umse7_?g@E|E_Kdg%-c#9>%MRY%^P2&}rp1X-u0$ADyO%1f zuGAp{u^C<>Qr1&MAr__i%z74V%BT2^QButoj`E5Z8${JhGnVLwg>w}((a)S~8%l2o zg_Fz!|2mUdiCkO%^fsSoHi?R91E>m(7Ha%-M2@en(C{EZ`V?{8(so61<+x02jd^wY z;EOcj(cV=n-c5MMX-{3^$dh^ierVp4G@4`~crQvD_ zvqd8raT*+udLz7wYt}+DCex{0s%=K~EJ7C%Bs9U_6b=?4{_TL4nXpWLK*u30ICJF> z9bk`>$^v)kFQA7LQ9AI;kN;bdqD=){+hq0v+T^mFOMEjCWjO&wjU)gcqNI58K;AS$ zpAcCpBugG4wK-YD`FvHc?@H8kBDxaaKAGt zj8M4@daXoqdLu0T7v{vZ1bo4!o0eaooMm>Mz~HN`-e4g`16jMW6(+e1uj9S>nX$gJiF3~ou~N@n{k#d1X{Qq0+OA{U|F3PF>Uz5`uF(_GuN!zM(u zT8AjnC=gm6+ai;Rmype5bdrqZ2D#gdK(NHa${s7NcArRAVI+NfWc5wz)l!4?2#Jjo zGrS~8iRd;9M-D9c0QDxDQU>=u-Y6%l%^{dul^n^LwtFg=v^3oCM6*h4<8hoWCfC}$ zTscmJjCc2*ef97ObkdxwlUjz;T2pfwHgcqpz8i2B%LzE)O+jApUON_g!`hN2bV@8Q z5KU?eE9aHu%seEzutcZC`2+ftlv63bZmS_U*eQWISiH4TI@EQI<%J61G5#YNxo0{} zGpSOSK~NWUtz;Cj1TI3MlpA;XW&F~X)VD1RX_@!kDG2P?e1BWwI;yri%>c~_>HNM( zbykUkuhhERv=wRlCIz=kW7ji47i2T6g+Dov(bgFB;AsmfU)9oONYmHW?A$%?CDDrr z3{_S_OaJZN-!b=z;+WfZ_Nu(6%%F>r!Gw_LtCOB{>odj}RUyE4ZT)yxE9FCHb_28~ zm4w=gQ?DL=^MnPMyqMZBk@uAZc!VDPf;N?=+Dhy$t5LceMpI-+i{Pjv_uakKRdIU- z@RNd*+)|*ch`~sOeZ<|znYwD#O^`xms$l!MYy4n|M8ZuI%UmOSr1vz6M#x(Z&WFyDrU08^w1|=wP-Ea_5;%a^1Hf}o zms=X202jE=j`=1nGq!v#LkyA0+#ayU35o04ReP=sK?5P<;J#l|geL_O@{}%|&k%i1 zrA`B02gBF;L)&i2V>%|`C(@zwLty0=pb}LcM+YdR(gg&Wm#cJIlC?QPOLY#fZyfq2 zA(ROTVrUc3(VP-nHL98QC^=oyBOj><-=@m)t&09iC^@NfXoXbLt`n7+>1hALojHAm zFI-)Hrpr};$m^o6YV0+~mZ885oCY|P=B(YT1FWjlyMWPXB2mgVfy zxr&e{+iPJOdlKAqOp90NQlg9&HsqK>m4~??92-(JsBW#et@ruvo(;~G3D`2oMQxkv z!2&qOiV?_OZrQ)&O^AIkNoc(?rh2+)Ep98$DnQt(wAmEoCg#qqut=w6buWhc%10pv zg{GF0NZ#5Uz0;b}8Y)b|B@S8*DrxEVF%hE@n}XQHD@uW65tDG_ijeKIG7V<#c{sRW zn+J4A&7{)1er#)A>E!ph-dG|uo7sjoXp`T!??SSbAd8{nTy@;A}LE28O43hiOueZNZ^#MtGU zf!iy1tV!pQzY_^tqaCoKrybWKkfh>Hj6_w7ARKJE3nk*Oy`nE|LjD4n*AOy`JC+`B z0sd&{6?AUMpI=Fa?o22PA+XDItGRvZ1a0(azw}B$l*dym?mtSZM>VJjn<0s~v5jC` z1s=9vaaYHjgG7sn`xZ-&N6|=OTCdBn^-$mu1)W4F_RIY(8N_UA(`lFQa+$?o34Q4h*vNTf(I z78)WMDl+p;W7#a+W#&SN)O}t`v=V0%MxCL&>!d<8~Dhqo+ z#gP3k%ug(M(bf{u1YL3^SlwR*q9>a zpc*yK=R6?EbY$F!DtezxRVq|}GKwRzo~z7AGM|=)ur?gTlfw!$3+5(GMFea*6Ipc# zhSljH8Q0iq#IP*jA#2_$U0pO6Q_W3CgEQzf08c=$zqYNaHO?CjnpudOv{7VyC|9)y zO2mC=qa#*Iv{9^wYh|Od>F#CAXn{F%6-fc`#4pj-Sf#hA9-yUE0?XDMXq}b>8CMbw z>iLSBZ3{O}M7U@aFO|8YH6gPcZlppmFoVsD(*3(6cz_Kw3R(6GEmVdWT%cW~y%2|j zND7e=?Q_z(<7x6gfQ5z2Zip?)QuKKKkRdZ7=%lEucAFjOBZ5n8=?xyB|~SGLOi^RRkuwwR;y*Gx?j zglATvTJ6)-lt5vI)+17!nngG^dBJtcK7J%Gq0n@YMM-MIcxMSq;HCW|+&>Ka`+Gb4 zM~KXAf_aBe4#WLFewVsH+=skYBGg#x?|-|qck(%ra~Z^oW540Co-|{;;UKOp3gb`) z-%Gjn2d!B#!{!k5{lndZjrAoyLd^CJQR@Aj5ADu`AqTKUoVr$g!1dn;Pt2emGimuV z|0#g@>e(ywotIo9%>9N+kHOSpw}}7ZASZ zKgCipo6Hc`F$F5xLY+t9G#Z9^8NLtOv;UeJT>mwLxw({PQD+=LJYCqf9dbD+N%>yG z*pcjZ&^_#E2~n<)BaZ&2d(M^bqqjYV{>+EX^*1;c4|1XqZJq<;HeuAvhx|?m_~Y;R zq426ze%))sE;Go;%f%3vz+)W^l1sl}c%g|dbT!&@z4xG5j?GDjxBZtN|Budl^~;a{ zu2Q#&NJLTab|>IV>0Hp=Xb)#w>r`J5dF9ntkDqe~n%nn(+dn?pKiO2x^RI^=H<6V7 z2a=RGP_E7quzwo7GNf6&$wT}bJguQACVXsfz4o_Z@Y=-B=zw3-j~m;+iOz;$n=+@i z8y?!yLg(av#h}SU-<}Fg_BiwZrI=huaBD5euN(Ossv@vox>>EU*CCB+7;#fkggA}z zJRU^ZrE97tKXLpSkMrP>^7C8hJM%Iw}mkrL#dVxbH3DN!y8GBf3GElC0JOz!+V8 ziogF$omZcue|IFJ>^PUNT={AausE-x#bZ#wMJISe%aJo?L)q)-hdl4nKh;E!cj0Xd zW@|2=Hj&QO$j`}j!9!Mkn$@T~+ZWcA-Ix@$upl%_^AnNiONf|O z9kjCzYeKbY@`I)g(1|CgR~>mp*zKcCKoGUz0%OD-AvMXfJYz|uY6@_B{be55LPq5* zmmcqFUil_>38*d1IFj-uRxQ?84O>%x1yDDm)Lsud4=g#*dFGP^+`TxwP!11p428@s zytIMasP>Hp$W26oe+B;ea}JUyPRj~28ftM~5RwD+FukcHgdrCrzN&8Op@joXs~1KR z5Mmu~rI?moX)>6QaX>>G-Z>+sKdZ{dij0tG2_s8u(PmczuUFf8J#ek=>1+FdwithTjc+;ea zgMk5j?h7+{Nsqkv?v;GlmZl(u%dT3=yl6sZxc6o7$C^NZXxu)4 zmor1{g{CA2`^ip5qO>uEELgH zGC0^Yf}R(#BfB2%K16}H&Spa4wLTD!TqFXRFeBuO#*hQhJi+!m<|2Yq<4C@AbSPn6 zCw@DLY#}_0=4`(48XC|5DkK@>!j(xwzcdwRnmCbSoH0F@yUQ~~dBO2Vhmi=;<#69B z874Cbfz}#ri6yr(%}Q}uUeR`|1~L63V9oW;B&2_967tqYDA{`x?_;x96jBtbXm6PK z%OvB7+^AtU#=F+9nL~^3P#dP^q!AA*j?Y1{{eqnYN@9rG*ML(LcImJr&dy`LnP|u{ zJHFSWWAmBB!zD_M;!)x{%Emrl^@_yQNh*c?^O=Csh-%{!2(vTge%RO;V!&0TB+$PyoRmAQq zMwq~GIVcgO*eEU{0^hnm%CXNJ9H_1}d50IPQV5o7mnZ=W0hpyM&~;*GlBdz%wlJ`5 zyj{9@h(yAxxbwsym2^aP?y7w04g((EpGRzF7qJFO-us8@zMj zyevA9hRMp3KMEH}MZ`fwk{#HJFl){2fac|rm#y}=QNGfsq-E`qk)0I{mpE%PTR9Pv zb7Kp)0zx%T#^Pouj87UfHRY;ob61i)=2F9qYU*meD=D*6dX!YZ5o5rc2AeyYrXOpD z)p}Z0xXPQHsJ?8x>qu^+)aVE*&nGxZh#VJ4YjBZo-U-@u!tg_zb(a&|S4R zOTwne@Dh_bmU_}lswqi8N!FyM-Sr>~9)^z58m8Ic($WeE*~CoE5#lh8D9FBmKfne` zG)r*NNcQnHm3JEldSgH8Aq6STNj7S3Rd?xIfb4|Av+|{=vti20knOqy)Ti^|oT@eJ zh@)~c$k{(jEOuh@49+#H8@11b70a#;43W1O5-Qd1ls}%H> zE`wHBX{x#~&Ttq}G^0gmYyul%V`9q-tLj0kiAs$oZ3#Q9?35Gd^YzL~plEf}lNN3XwFZ?pIYRKvF@s74`jBG>ElM9txKGdQcrHHI&b(3H|5m1ri^ z9(A^Bz&dnbsCYCr#C~q2#fcbrg{c{b*-u$Om+pj2%$J$&u+@yp)+F}KOqT7AiAc=R z#i5mQCfnsG7Gq<#B#LMCAQ6WZargvn!80;pe_3O*WZKPjW?~{}*AOfhK*F&4=zq(QJF}~6Tt~h%d`rg3Qn~gw0mx;E?HqnmRs;#6z z5b`2gNWt?v`Cag#3Fa9@1uWPi&+^1iAu(W0kD|hfxeZt9D2K*w(g?}Q(A!nZeA0c~ zC0rux&}4qAa6xiCQ{uL_gCZSer+s<>(>DA?4yo4_f#g9)x|JE*Zk)xUYc+R|O@@nKoqFW_lw+sKE*6yo9)WE^59dSp|R$)$}-6BnD3KGaB9GbzI`aOG$8p(!It{uiG zt-#_E_hOg##hKU)Q^_=uHZ4xB<-*2N42&4kXauT}m66&uVTGavd|RSp@i?zEkwh%M z+_}L>RjLH}JsG>vN=@ds^b{!|c!A@;o2q2(1w-_1QY>h+MrX1vLXIuqOjoJ*--2*y zYxxWrqpke@+z~sfVqh-dXXckqOGX%Npk+BiaF8<+^c8C;eke*0>y35q!nh^ zEC@hp@%Lr>85?K$OfC}<-Nh|c7%fBs!_;{co!cPCPHSTLH83v@!*Z~>L~Sx@Z@U$= zpESb z5GppdECdqV>gHmO*IMBIx}3XR@0r=Uiw?(v!15e zBU3XF65WwIuz@5Akrv@qfM~)W)M$lO)Me8W#)jO`irB!9Btkgcfft;g$E|JYXO{VYZ%7zxD^EshL=8N4+mSM2ZnYAgQ!R?T0PM7-|GEl2BvVWm=G_y zbgj-UG`oF>#M|G}$SOjdty#Nm6m72-Ic68^5^0`ay=EfKeS1@Z;EYp641RC$q(oij`D{@60%Ea zjosu6s*6KQa3E7a2WRVq+!)G;Z~+*aP{o|KmSWxy6R)_IXtlOk3C!Z^oc9Y2St_UY zV#%IvnW&l|1>3A`NfWl(4~ruZ-@P~i>sidLp9=UAMrBBfPl(zmO&o_;e5Pqh?^>pd zcUig(P8x-`4ysZY$+%h}rQbMG*^N&uaDAfg=w}zF=fqxv?}D_Rz`;Y%O6zgoNr5QIH8U_qqTq^JrkXf5cHdLuX=G zPyoWuxavsoW>In%b9fpdD#2&~h!S$ajv-K8rr8h{BqiKc5EUztHNSJl3knzIYNBnM zL%^fE>tiA}cJJChLT1vY0O}8iubWV3??cObgOUCzhk>s+C7R5wx@aklNgZ}Hx+pZ8;my*^t%jaTl z(<`{!T3{{4ztZb7cZqB(7bNT$U%N#&v{z<6XHCVGBEtB%d!EPE3TtBjVv+Induy@5 z?!DpMWS*1U=EyoHmFl3a#kC3`EA;W)kc<7_mSNPt)^Bo6a5wK0$R+A_0iwFXAnY~5 zL*M5Etx1dG0&2;g+neIk1Nb_CwWekK>gO&=n&vZk_1n^XscD(?eV%H;;U}a_r@0oS z`-%&`2iL++aNjd($a7pdfdq5WL)0VaN&{|t<&E8q;zf05@LovxjK$ldxA+y;nd7ul zt}Dn6_&8CE30;`{UHYRxY@|nGYSuNB1rKG&$2KlB@ZW)TptJh0b%-gfyt}svoEW8S z-30bg!sC3-bv*euH`Te}_zMPujQ~an-EFN;ft#W2KC7R6e$v;4joYszj%8b47rEIE z-u1?MMan2q=w|#LgMom_TdkwwJK#xz@L)z;S2w?riv5F_+{7FLsYO&c-OLJMaYSA5 zXbo}jl7pp8FR3ikgglHz^VI74G(R@LNq!H? z^GS(J#;<``a=8v|-n`9m6tK2TVYJasvuf&$*p=1t;o53QB(lz6SR5!Ea2MaCl)?@R zE(LPQekHk@q*@_J{16*7YEErf0y9h8P(3lRVRFqfB6Z$LF&2}t9t`ImiUC$OO&sL3 z&1SYmRhJ}B2p>v0OD7vN2JPBXNF|Cbz$v9sgochadCnX!g`7azd<%_V83O58#cc(g z=tj_qxL+EJ2rZi6Kf?w_>6~UNuN?oV&Mp_WmJLs&<^9|9k(QqqJ|MPcIyWA@Vv%`0 zY!{Ynt90*^eC3LDwKTIkL$*&n`RY3i`0Dk`C+nwZ(8i-*bwj_N!{|+dIilbiP?B%0 z-=cvaph{&GImj~Bqanc-L=8TMAohW8O6G~>2*O4K!x zN({L)sKH?JA&#spv?k;ES{+8!mk3beX)@X#ID|DVF={aIs1ImT5hZQ6egwbg288A?ir~H@CD~6{lz!$RsDc`P`~ZQU0YSLGR+`0u{SqfA8dAx8Fb6 z*=y=koIR;tKRh3mE+~dG%H{MJvgohX9cdMJyW`e*X(3;Ocnun`7DlHWk z5*6G+EGri1BU*f`xSU_gn7}d)QK4t)0-_8T@IU=01XVW7{Cz&SU|G$s72y)F{7Sfl zk~fmfhoYU4h=ihOs1gR-&mqhXY!HjsoXw&K3s9|$+r|ih3bZJhlo?|9lVqmFh2YLA zGb!-VghF)!PP+U)U$EhvG<6%sV9PpL`9bP$W$bx32$F+gw?^C(1i%e@=gwXdTmP6A zF^+3QwraLMBL^dXedWT1!jW$7fY1*Xi=US*MsK@Y|u6M3;ONbOmlDT&9j*O zDU9$6ew*ddhR^6@*BRe83ji?7TNBqSm;iQxdAmW_n6%EM!O~C)G-asJA^O{rnY_mV zyy4WKW`2*ZWEz!W7LwjOyet_Z-;kR3m41{!Jb|aJGI;#eOLj$%B{HOnQfYg`WXC=A z?p_Nb&uGw&w(5|MJ6Y^LN<9!8HDZJNrEwS=juD_VH&QueVQejgE2fIwZr8#(XlGnR zb57MqbrxF|lEXmDXu&j1g5+!wU-SutJ<)mBS@DfIYFfe!Vj_DQVc<-k90tQN#V!+0 zt!ZY<^=~AOi1;hxT=Kdz8?PW?%STY?jwN7D4LELbg1II`eJzPV@cK{|Ty+ahPix78 zR>jZc8ay?R7M};U@E05Rq`%)vLol_^PZ0>@FQVh(IPuq zEk~lROri094Oct1AvqnJYhrUn8@I-BhtHa`PmEVH(%(D>FG<+TSPBo?qzQ@r6?;*d zYg+_@SGf*O8DOYoy2#yvEM*k%6wk0*ZsJM@kCy6!IdQYaub4!sv*ISXp8pUMyJW`j zi150yJao1fN_=;<7SCo9;?b%khF-wZTe$1JBwq#kiw?mFk@^+?6PCj$H5c6S_hR>W z$Ns1-IZV-hhszXJ%P(0fe%m@}w>S+ejGLx+(S@NPHp(Jw@Dddl)ez3&PNY2mt^91xr63@h4qQWj|Z${truJ^Dd0syF*gy zh`3i#V5F#m=P?!$>KZYqzkj^HDIVbC%LF%xMF$@!7QHnCF6(n@9g~uf5qy`Fw$G0^ zArekQF=-imD>3sDO#D!y?q8+#ILX$=-{^77&0vnA!=%vnY%|lcCoZZ`NMCs6CRKTH z#xsU&aSw+)V<FUZyKT85EG}%*&k^EO zMa`R)p3bd`AA03=m84uI_--k(i~~>vU3H>Bi&hIlaQBI%-NR18x-~KAYWXnv9yqdE zcIz_n+T;3Xoui%WnH-gi)>3c2OJ0;3qOCzxbmdeMKJfX(*h*OKtDEOy*dMaNexsp% zGkHGT-`P3Xprw9Va&!}=KKwvReGX4n@Tx8@ld^;!OR}jJU{Tb1RKWR2AD$6J4+_Gi zw;Cb-IIRa8X!A@4Y?SsA^Mv}fi~j8I5zCSpiP_o`+XJ03oal_9#-xWsH{-9S%`r}# z1SPeM`J_26KRQirbU)SlTIX@wYPCxT`>RUT_QU?(-r?cl-q8V<-wh_Kq&CSzcBlH!}I8m-A*)7iEl;$NnC%%7^tBWD6jA*9D6-`Y9K? zUVeS>#iak>&ZzrEkKVfL7XQnIO0MKXLS!*SFpxpQXd;ewra9rxaoFEoPgg7w3fzB9 zD()(qQuyqy0+kouedS>ka*Pn6suJ~(d--TV{g|6`eYrNRm>8qB>h)(0OmUSBJ z?d;6ne@@!E#INt}9^m7ED{O@N%#QaJzkUiobP|7#ia}#2JAHm+l;#nQ!7KUPVJ}wz z%{UO{jJp$MHt}oSv3$&HaYvlj)y%7zxB;r82S5K5{``|T-Qh{h#F|gce4+TkfdIso z#*OK0y0E6ZXLUA)AsI3#)>vx_+{%`)bQPx}T3&Zj_nc1@U&vAr9UysKDXr%$m=T)N zf@r>~AVRZP({Cin5@hUK84aoZy)>b%4)VMT-|z11^tj*vBGW5K%ti2&o{#fs86pUT zi(LiJ?Hj?L>5U*I?Kq#wnz&d!tpHY;RN6x|%O-gXVQQpPOHJiz6l)JT*qAulK|7`J z6++~%i1FGCuJw|q$-498GNGN5kdJ-gQ|}uZaB}e+CJWjS|BD6oZu>sT=k#{Q5hVOC zi>?CVg0|PYk`x;!f1&r?-!>|DS8!?=(-dvxe7!ERmN^OA&a75eT@<840{i||CcY0W3Dr+1w`_=2N--c??+x_l_* zeUfPt&nsC?z+>Xj9B36MY7o||Ee&diqF|J%xZjVqT;=QiOKobk?vY5Z+k$Y<1%)Jk zE@sCV=`?i3HX_)WgvCT^im4a<)Lu50OU&jy7tgV)CX}22*zM|p;2F1VN0nV$VJ^xf z@x8!As zd1d8-2=SVldB{}N=H6QSF8qz4KiK&-%K~Aw+=CX_tuLD;q7;GSRIcfe93lO&Rf)}< zj%^vJgK5oC-Y~JBkuC?)u(F7orTspN>+T-)B4hv)ID*87Qd}UGz zm=inC#f1?xWnClmdP3KpWXvJKuE`A|paYw^d?N*_dsAe8W-&bLFZj{Wj>+4pOB;{b*ejDl=0Zf5=GzXnjGpUCb5^;6@{qa+bqPSuxRS$G z6M@gExL(&ytsKT;5{pjSS<|cOk#nJCHxfW6UDy_mk?2P{m-0F4{~5!PGCsuqS7(Dxz*povB(IL#h;BvC~ipzmxY@>4hf+D+?;C zJXH>)d7iyXvp^r9F#X-*z27}N$+Lv$dsLNb@qxF5$PB4lC2cGpsr^gsWWOzGLFJ_T z{nN|no9BP5y78<=)Y!CM|^%Wl&$J1m1}EKhu@9ZtPz7@z!Ugc6^5cuh!& zHdfJSBqihq3${m&2nPpd0%tFmIFGnS8ocMNp0_;;a|P)}z2P zp}9)$tN|xX;~MCK4nW6B80sig!3jGEKL)M>9fS~Z(u04@gnM@odwaHY0NwZ7hiBo# z*Jlqq0sc$+4ee8NP_>TM!&hg#yEoC`1mds$r6~Ybp5sU0<^7xJqo6Nu0Q+ zFog@TYHZ;`j##Vj_-*X`!q%K?W5leDJ_%@K1JfCML2NGo$vy#db0O#hqqWDSLwr-4 z>pDWxXf^mGb>D3C1N+-i(`8D;bW++z6M!zR-fj!(L=`jfP7AsrWCQ{o_ESE z))YeUV&Ozw=jPTN(?KV4)>M%LO-n|`Ly@JvtItRuX*l;w;E^1ITJ zQ1lsT7@m6(6i$1q zPuHVEVjO|{Qfzq3mXPLOf!=gxg2YM2ml+1%JUs_5c}sLJpA&=wJ_SpjCt3YI_!-VH<(0Sh1Adhm}!cM7nMdq~9+mOvKPDz)YSzB3Q zzWj_4gexN3k}+IIi;ocp6rx&F<_gU>X6A4Iw3bJD5Cm~(psv2&RT{w-{@wG3Ped7Q%K@-MxT~`|1?6CHe)W;iaLdTl3^z0bg@#+;+{1^tLbrf zI+qFViwJ(`D99}9P2k(g6;@U{tOtpaqOi8vmitB^LeOTt*tHg8w061#s)7^}dKRVh zvTi3-K0SZR`ad1I#OCGB810+3@aWs*X<~J^R3h^QSVf6qDgk>vXqT-=i#q>ES!I;t zfYBP&!ZbmXXB48*)V@o`>@q}j25I7+29_n_dx421E6sC$W)fp z%XA@Su(jN@%63z_ys5>RXzk?I?1+FEFADdFjy6?&T2{#7C}$VUQAx1$+2ZD2sn>fg zZI0koK8yy)8()O|yCxCR-X-KW6gR4F6X2^3s;u5;*Jq+g|VW zEd1{AH$ObiULE&7EE)-cEeZHwXww3{%GEw|Zl?G9bkhmZH@$(~WvigI`UQ~SV z8pPf`JU%|$fY`qRv~R-NM)v|TNZ$027mirM9_{pQ=7mD)_5;N89T!vE6pnC=sXi`%tXA1MN&{Jd!)0{u0` z4gC=d_*xO?To4DW>D|2s(;jNIC09!olKPa*EBt*kDwjawa-5`_NI;nChlAP7sSauY!~`BgPpgNJ3Aqk>D~inF@f%FwP`jN{87 zB*06hEyAWW+6V*so&|>R2{OYGqYXRA@4njo-SN)vPEN`&L(v2GZ1_Em9yX)@w<|M= z@W|(+Yf1q!)Zhh5tcH=SalmNDTpHtCyD1NY*YX`(lUlrbo)N`UbG10cLDM)-6LpsxN0(d) zLz{t>-iRBA!^HS39g;m3U)uAWm`L)2@wQ9HhrR^k31{uX!a0(V0`;+oOA~NLGbaATYJ+99UzdG`5w3rieXwh3SLwWo$`?3Y>a_iTc z+jKq@OEKw^->89S+i%!rhd zHy^v@d;OEWy_4f(v{+-Glmx_bjEeG$?UbhZ(kA@5~NfPj&sj#OYBv923K<4N>)JRX)ElBrn!O=SO2R=Jq}JfBpiei|Lf zBj?BiMeY9g1&5|!gr?sRGALz-Ut z>%{9ZqpHxl_HpVC??v?>)C=Y=0_6ZkP}safph6Oc+Z4WHTFS1K2zok(wI~fLXV6=- z!x?laNP2}aYv$h4L~|xqWlZzhU>&GUK@~H>nry*TER#i?*9hUo=~XeJ)SE+ALSVye z;xC_Ox(Sde)6vDU22a%-4V4`9$}(D;KlCyJn%ZdwA>Fc;o@bJiT^S?K+$aoMBiu+n z8Yj;eOsZ4jfL1f@RAk~r)G|^Xs%9EYikF7xL?mHgDd6WuUQX7Jf1Kv&{8x4P5a>$# zi&~;p2SGdpl~-6NSz?UmpG`7js!c0nWtm5lDax2fcAm*S+nbK2V}Crx%Z=QO97ho6V3+YRX zEG=~QSWYK*p;{U-T`-JE#DO-t=aigUFdg&%eHM_=+A9RR=6o%m@CCcwL)4JIE|+L@ z09>PgwNzZ%<4R(rPzL3Qg2rGTF{fUTyavv>L^Cvf9&$+G>WEAHhLBrI7;bCQA4viL z%6lc1owuONd{YDla1n`fdCoBLNBEpUazb0^SZty9lH=x2ix24NWK_&_x635kR5(qR zw%l1_NlAt_Ewj{W(I=t7r5PL+*2n=92&*q^Q{1^^@uuN}^WsQqOj0#@6&eZrNjU;< zm?o|vMoyte=3&+o%5=vJOHJ3@22-FomAJ`_kX?C;fLCMi{Na$vjYzm-RuPabThUu{ zR4XL-G`EkZeFqOLSCxHBwCoAZp)Km6;62Q2>+Axm$YHk9mi67)uqHBr2r}d#h=<}j zvDxoTLdh(kg}w~uk-5{ZfU@zL`-6Dv{`=`C^NWCsb7yG-EWIKUac*D9E)uv}+V;y6 z6uLH~>uBZlFQ5S}>`^DG6P*KE*k~N zmI$jE_A4m68=7?Hv$!c04>xu@oyHf<@Q{6>8Y`aJ-Pp3vn8|;GKW%O7m_JQP6U3Dk zdD+@^e+(7ZDtN1HyzxqHb(0LGE@k!`#|+QQ$ow~CNUk18tG3q^h=unEvogWC9(Ei; zWpljBGY{NT88tc7r$R;6Z>r$r#~TGHTBj*s#j&NYgA*sw^Tuvyrw*-a+3h^sIe3V? zqG?@>&8r3WU4X>uG$=1tA(r$?bJ9B63Z3Gn7aeDfNCqmA_q%SC?g;dVphH}@7qo)_ox3BdtuY!>o*$S~l(z(H@0ekBvF4#5wt zyfw5r?T{4u7uTFEeU!9Ck&v|S6YAtsqFxD@`Gyq8WEYaRj(SlXL1tTC*@Vt+WsGFS zuaU!yww$y@(rPvODnSUmv}sqagYs7E4G(H4teKe9aS{)hTSqx&3YJzY`DO&)9quf| z!WunyjU#d+)h*mcI{rjBwWEBBYusiGGOOL^tDBn&C*|CQ>D@ZEP=TFsR_6)r zv-cT6q+N#C`2;J07@OJ3uN1jD^r1pyTKA+l*xcR3NzribI>j__dZ?=gLgtr|x|wR* zjW7~%mC~FZs@h5t)4GgpY?Qvrdz@?E@ zhdo9cJ)(wi*I7wd&wTS_Jdz?qI%90%icJB3y3DmBdY7$aVJ zc*MKZ;0lGaxjrrfRT7cS8`I0>~%tlJ*1B3(=jM6ykN@RqGmazq{ zW^$uZ;?!s$d}1ql4=k_0uI~Wc+IhHr(AmUgYNw%BRqc;vNIDyK(=(6OvY%X2o0p<_ zpcDumfCnS1Nu?+^Nhis;KN3*#X&AAm>CuK|=S9?YcVu1-c)Xq^kXI6)F!BP-arVSAp@EDLSD}gRK z;l+CZhSf8vwwB_&bv(q=_ShKdGc&h2JjDJNcc4)RFeaEu4V z9_>Z+HS3Lc*OxemGj|sP|W)TWJY72SMpU0XWM=*lwXLzPbhw$1B@yoa>nYH6=yPF4{&H*DmJTx3a5u;A# z>>&u@w4SIZjYkRfS!<qfs$XO-#)+#dzc!q-i5^)V zpi5-P;`>(-g!#@w7d}7$m~yI-f=nYH3F>%y)3OrMYn>byzSD`!a+w&Y0{ski$D`St z1{G_?3z9s*xI{OY+#1UyrFl56bsC~Wv2-ZzmqsRI6qUxCtwDCtJPbc*iiCK3<|4#y z35O^zh0Vi~;@Is?8|bjw5IhiMU&q9&5MgLZnN{S;yPz=!n(w?ZYYzPb<*14!QJSk| zsKjj6AjE!D!&-oI)L+YVH(qd6t(9eLoRC@C65hv?y;?ddSz|ief##Mlf4IuZB4>jDJFRRWTYN=L+vT$**leRR`?PGN zXUo(+(eyZe+i^Qe^wQp%uD7u)w}nAi6y~{o%Y$*?*bu$8@Ih3Cq+&Y3vQ1IjF8Qfe z9U=>+4^nj3tIkHMr#=V9H0em?8j7rx+46+67Zsq5adfjgQ>oPE71_uKkPzQRnV2hT zO4!WS!U{f9$z%f8JN*2(;xy1Bg z?ka)u(t|T$-K}o7X)X?NJl4Ant zqma+c3aV9;E0##JSoWGecVU+282jd4gwtT1B|gcWL2Zw@*3Ltw`nY4u zTxr~^;trz_&t-*qKnkk=N`C2rd(*0+e=%kzf@=;WmOx*4H>#p{*Z{dOBO~+AvS%~j zMnR5paD~Q!3w=5X4U8h!q46?PzAfo_<@#>z z7IptYMc#0#9Nlh;#v?`S*r0NBt0e+&n$As7+VPE^MM)L-KB_4}b>v(s+_Rfo_3(io z$txmI-9@MeL}=RV7G*pvKGxOD$iff*>wk1np2Oc=GQ%2;RcY54!QBj7i}*jQx6qT2LKSbc*mPAH1vSdvhgR~W0n&K2`F8_njA>QOSy{bjiX7T-lW0*|@ILX|46{1QYoJp_s?pTu9=f9_^gyQ;@22|HF z-!#YRW!msK9fyaGUY9n;poa29lhn;kj?NI(fZ!_L{ce5vR%+-?NyH@4T_hgrv`>jU zF&ib>a0%o3tzmNIt@lC3v`q~JlWPG`MdFt?b`}!nl)xG(5#}#Ro-)Z|KHFY$=2#cz z(m?v=*hf+tvpeUu>1#95KNywtq@gH9Pu->ouFEQbOVZp$UVWO4PCaR&p^a{FEjAWB z53zGrSS12Q3)!HwN$i8Ho>SHE1cZR$*3#`CXAQaz*WBBMa^AVvBR*wo$V@^z$)S8@u~l3UcLmy9}-I$x^#UZW+GH7bD2 zO?Q=KBPhKalHY{TK@R_cOV%)R?fGPqD9|e;;|lY=TrF0SI7NcKY3zB%Y)t~?MyILy zK9=ig0ktHE^5jiBl`Ke1evKr1nN>nk z&Kc>T>J7UNzUE3NNz{=bk|xvT`i`&%qPN9m)<_?;X9x##;b+5DU}@Q zpzTVtUR+&ib)8J89XiC)GIbz;bKg~GhE-8(_dSUXV|HCj))T7egSks~YcLE+qRND& zRSs~;nyg4{pz)O36oaCaT{zM=swchCOM-P?59!RrrN{1=Q zw~3?t@<2hFG#@=ldkGL6n(=RRW2k79HjOlNx!cGbuHMoutq^z`b!7Hexk6nAYMH<@ z6z15jRVHS0tfy5npetg3f9Iii<0wk}yBxd5sOZi49^RwFH4;7*tSwsnUYM=tLh{qx zm=+`v7AL&b(7zE^m^(;V-zviTz(uIl>(2Oyoc3!wS|0B1@BCJiYU0h#=EHq+!y}+b zWe%W?Ll|ODx51l z@L8=v7&+!lnS1u>6V&!j1&va{lw%gxM2N1W&0-UOm#YtLsfW06-8EL58$;LJ#aiXI zpD({Ys+284bF=%d@}Nq>^A=XGO9YlW6ii41CU#m`gCx+JLL=+eour106b78SUn~Hg z4Zs0SMsbk6L*8Z;i1xJT9(-O{PnLP;OkiG>h4f2{&g_mCi;#T?}&-Og+qNF*ui{> ze_q6txGSDkXaAtHlCJfOVNcuwy0O){C+Nm2oH8hA0jXAWJW7*XQ^Bhg>5k^s9w+7H zbP|Rzc`73H_9j}^anP~{mg&hGV)KUBz9E)3=+LV;X!&-$jju!2ynr-Me0kQ<)88EJ z6#f0`Q|}Fmick8|8Xav)caHMvGZng zbYkxq8D0UGgjM!HXVnrm ziC5ZK<6^aNsaw$p08c=$zvU@sT6_{f&C=`i2@07bNlmY%$U`1<$)S=KE1^Z}1ea6T-U|*$;KE|EDmX%T5|w-4sGE)?=D^xB=+tFo{%)&ddGtE_zat~Z&Sq=- zz@I`t4dcK3sdx4yNZZ^!Xu!^Gfy&57L(CZxS+p_I#4nBoct(vuykj=dh-_85T*8nc zP{0_uLUd3N+HW+81)Jdb^pp;QY~=kW zEn|=yv#-uZbag5&5UoOScif1?ou{9++YkyxhITb55I)sCODJ*B>{Vpp>>Y_^ngJP+ z?*hcSmb##*&8VBL@48g9`R~s;JvXE2V31WqOG$+GOapkAWuLK=?YMk!n2>)^DqE~_ zE3Uh4N@g5n;%8Mw^FWx32ym{_emitE@?7nln}i6f4YT?dW`{XuI4l5z4^dC-E! z*~TG0pk9|uA4X?4lrcriIlE^C5-ko;m~+_-Y-eycUN0Y7*TFjL!^PQdnHW!v*+ zAVGi5xd?h)&gO)b!!u`aF`!a0-vgs>p@GNz*TSyjijwnTA9@b6V zOlr_ejEQRku%3 z#;#cltode=#;Yi?|4cjyu{bfO?IkIla*SZnuEK*#k z`ETuNRU;yon*ZcBbVq}-#ixMxnM)JOlqmuS@^U$wc_c$EkY0e8nJ zZnSzzhl1Q-u|7F zmPPH_4RmL|YuEvz0*(4PmQ!!(7(wpE_nyrcs z$2NzXYP!uvbhTZUO$hgol7v9V#k2ZGB_xl0lc=Om&CT`&CB}C4GbQJ{Jh@`#rfJ;# zm`Meykq_H1V$#N*Go)>vTJ3G!ez@Q1EcIP{0fYWFuf^6qy%tCPE6GMbG_p#&C#c8! zpy?Pd3mTdva({tY{?~u`zX;S6ZQbO*NNn4Fzjc0gKG*CgtwuE@ISahJY1 zefso);OJ?0<_rztXD+l+n)CO*``oiRx{;bo=w*$3LKY zt6vNbqd%WKefH)s3Lw|aY(+;#K#&LRLtTfT{tvN1Dq*_ z!=g57#${$^J9TvEsS)r0UZvwK9vHbAr}e-7%l~ccJA4@jg47QhtKXW2Ki4lbgV4^)bGin4DzWFgtiR1MK!G>8kjeblj=yqD_`&d}d%*j%d zif>IU!?o)QykWKtAFW}vkx1QV!T^I;hg2^I5umKR|;Psvx>VA)GqId@6z$3 zxgGXh+x%@=w0y}?9DUhbB z8a3{)7_QGLj=6Upx2Izg|M+KTC7btU%>)l^&9% zM;+KqY>3{Sp0bpX@C4>|d}Z|R-Y^?a_zCJ05kMSIl5DV46@$Myty!I4r@0^UWl8%R zEOutBW!o%&Y~HHL93|YHd}TbgFXSKj!npaubyT(>Y31i2Yo$?wwxp{!goXDyolo1H zj!RCFtNl$Zvp1 z45$$qREvuXp>!-hxw*FyNCuV|V$+DLqSN*fn3TL-qY$>VYp{QV8}`d>wZMf0VX#iE zhJy-v-|Ca`;Nj-xsx+8i^@zCb1l_&o3HlsX{2#^SsX&F9Mn9BO%?vu~UmXnw0`NeZ zURQ*L08*Ihv@aPMt2p+|OUx?wTlhikD+wT~zo(5U8Q{H46#@?3V4x1Z*uFIGaZAzU z-;aa$-7ll2;n8IQ*hrze7Y5m%<;mC_567=gQ9n(XMjg00q&}FDAqxw2w@2$fqXhZc7sd$a#e+85}OBywCXRrc?u%mgjJ8|Ga{R%!0c($etA~<@0)2wcS zXgo>l(UzA@nxEnxjJ)k00jw}_T>vxIY0hZgowoly@ z^HXIkauj^2CddRsI^q3%DFqzD#@1tM>V@V*Nj-4VFD4{Npjab*$3x@kLFgSou6IFsJTmFs#e*&M+UE!~cD_V^1puUVQBWXwA69GoDH zzuZced49gSkVHOnl_cvJW-BN52J=kk{M>%1W}00Jj;AfF&BbngoTO@){W*Vs`Nx+h zp<%YY+c3;_wsxFh_7-`?5VKHp0^;DtzYX_eHSLa(rfT#lXj5;|LmaDz(FdsiAb#I! z!=p;geyxSm;l)&6!u1RP@FkZo{G560sU(WU$+VvpEEU2JQPa%U0@W5Wm}a8!&#x~w z%Q?6Ex!LaL*zV`L-OtT-KgX^;cia73xBGcvliKc0ZRj zJLj66$LG4;&)s%E*X`aKPqsq~C>*KS&e)p{{HcuP+}_$f*pDGO&iD26SN2EbY#5^n zvvb2V0zD0CrnR>gDTMxgPUWMgIxuk|q?4>N*TeE!u(b;77U+I&j=+7vO%OV$)eCfJ zE=)5VFjWDS<;dac>5N$b7Oez+0tj2ehneeps@VUvODjkGo@wgT`RrY{!9Y91`;rEZ z>}=NSGx%n{qhDZ+^#Zh?f)9u_GA4ow{VBxVxRMir?J}yS$u4FD3 ziyVWHzoWDaI(?{OrI1un}0!$*CjgaTqQ$F=xxet12C1El*26Yu#_7ji+&O-WoX(2p3qt+k?pxaD8VnGBe*J{CkNFBc!gE7c=7s@LLZet27hal5UgGEs| z4Cc<49^V+CK83I{G1bLZ=@UGT?tok!;I`F4A+AEHzxGn;LZqeTougUB&xVOsqbLHf z2!~_<>#Xpl4G419duyG!7Z7I51tKdO<~qs6dntYO-7Inp@}gc4G}k3JMJ+M8q?JIw&KJ0%KE2EFm~=Xd02-R(MBQv=SV$9IWktiU6xZl#jQc zx^oJ63c5)YJ{m5v+GcPB`&-1s!Usssy4{Xg2`rbqIq(-KE*DbOghRwNWOt^#Qfhq! z!8e(acbQ=2=D+AAoq@6v4N74d+gR{*Q+Yc?t0x&{7s?@;kchHy;2gF)%4HJZICy#Z zFf8oV2#Ux4~n!6{~w+e>3`x`PtvAXO4WqgLYKCVNr~fueD$)l8{@R z00a)UJW^jzWCkkiNDw#p@0$~}EKn7IoP2kIU$|S~qOefVG$9w0{Wb(uq`9dnEtLvI zQ*mHb6H3u)=EC?VbtSu^$qWUlF8rKw=g2`+J}ih&6*aklq_GQgFzBs23>XosTbo!W zT_=_zd2Ea+BV+g_08G{$;s?TrPa^lsw3@0MfXI;o48WeGYS1(Wy>j5$;+!L7p7k(L zgqNgUCKQ7lHHhK4WQ(xuQa7X_%iSqq{-Ee=e>x(qZb(MKS)A!0=TwUrCy(WGMpToDEq_V;0yxMj9EbBm zTzKs`s}!xbrx?}>KiiaJcPW(~cS-YB`zbQ%`%_C(5VXaMogPjyl}Q7Ok}hK4Up8!@ z4Dz|8y5w1=6-0dr1_6=@y4GmJ!+higg@cbMo>$>fDQIty$t%U;&LBeABCXTEx zEL8jZQp<`U=}hwBum|)M;zw>jptR2-x==?CzGMbC$}UpPT$2NcFjOg7b@7F*&hIQs zg+jLTM2`;i?+eEXbd8+tv&c&H6K{3GJN-SeA6hOfc090a7k_J!sQVNfRRE z2Ny+so#C!MEx>0dw+V+v_UZ6RzC$-zJ~!!HSyUM-GI3T*$cveXOJ7Uk2UY9C3tGD> zbC#(h-#}C6O&FBJmFc z54Ms+h+E9oBU*CM(ebZ$sl%wHNv{- z5EP6E^3LLGbId&8V=|1c9@-~L*%;Juv7kvWps~cQP#BCGOIBUoY&sHY59RvM6f>Cu zl3)?41qI0zuoG62Q4Zt=&Igq?aiV5JP8=4obhzl;-MB9&B_Yk^RBQ>8Q7pjqV)OeyypO7XcIED({be!Mt_pu6$f-L-$6dHVN8X`wqzxynnt z98D{!n+=w<0#>ZF?hRdpQRGl8no9>-fZvE1u;{)s-?>cFiFFZ-EsL6DYArRp=}uwC zczu8iAe^ZT8bCM&fla|Ex(EDJU`8KX4GyQ{Wrs0jcm7rizVn`*Iqs^B<-7yI!|!l@ zub~3D0H31NRbe2oiz}0np;q{3Tq{8SY4|t&Y%F0s--WiQ&o(}{Q8)w zm1dgVlzTIdJ2&Ws6>*jCNm@X{7Q`HOcdsbbTjg=N0|?VKMt_p?TvV;ifs2G_fliPe z@M!If*ud;m(BKNDmR6>6QRCOcI956sEJ)cW4q@L(`S&(DNZaq9bpH*ck-)WaSLpCK_c#nT-Y{x|aECbyPk}a=-&%6Ab^kyTO34TFJ!aSv6dx0K4-Gd;Ka)ysOB1GZ|!%tM}&X7A2y! zYFb{kcbU9))f=nE#$A|9%$~~X%T9i2Wu+EO---H?{b#XhvN{04wPOstU2fR?7Nw%r z%xd+!@D#U@TD)C9q#}&!+4pS(Mxc?oD)b6aZMI9|K}Os*9w*QmL};BP_>{_=*hf7c zZuL-cz;vQbr}sKbU`V`}u3B>k*Qc)ulpXQZXrxkd9iOC1#tdZibTpB4uTZVxI{Ryt zz6D9vOzaM5v1V4=8fa=|O>YD?x`1YTzIPAIWG6YeD5a6Cnya5fro0j=%Nk$XOO}DX zz=7c9;gqNGoPv3?lm}R3Z(qDs;QES5`<7LkOcnG8nft<-DkC{-`G^NY;Ymqj3kKMa zr*q1lKPJ?7)!&HR_?f7R92O3Ksg)h7!1j=p&*wBcy=?-8&P`yjeF9aPK{DyeqC(+< zp)aQnp3CN;syFlF04!p?-ysUUK%aedM!4BZ#Sk*gIeMFZnj89Ch|~2 z>RW;f$%X1$ym96^TvTH1^tn=u!(2dcDGJkbcSR5FaqtXuvo)Sh@Vo z_i=J?eNoMmG(+ixn=fnJsFcik#yGDe4<2{3Gcpc&G2^C?q`*iEs%dS(lZR2Y z@v+>?cj%J|4iSnwg9QSFXWE_$U7tn(;bcm9mrT_YWFcc=ZqTu)^y+#Q0`RA*Eo&N4 z%X}J0xKFgNLEz9kePw?rMwGZ(afdac5ZpJbTwk0mPLw*P?YYl>;+$LdUbz&O9LqnY z!tnt!LdiGuz@ftdG%+|ZYlg^pg;C9!7|Xd17Ay!O%=IgeVi->#?>MjR=Y=6&Aj zZ$!e?ZJYPLH@bar|6jXx6sQR*giSI}ihDOp1M%_b9P@X?+_dP{C5WLtC7i3x(IiHj zyHKE~Fr&=bG7^ij8N9dQ81;2GXXG%_v@tV`p1NI-GGv6W0lqcam!y9hhgn``UwP_wsgO3VMRTouhQt#ipMj34lqd!ch) zZD$Xh?v6c*;hfJ|ut8_E2dpjCyq4dKmP2hZTNWBnLt)WzwK`y~u_1eZO*#7wg)Dkn zcx@oSpd;a0MY3!DBylp4xzv^;1d?zpb^($Jg01iFSG)C=96l~CYa{|1SjniYCR?RB zatC-@G&FQcmy(8lFb`fL#FZdDevsPGbDCF(!r0erEI%=ux+j2;3oicnwk@W|elwKYs;$FMwJV zaQ2$`FYQf81>q0O^|}%`wgUo-H9E6&ZWd2$ z9Qfn$a7{cjnHU z75U8T?BoCwWgSqIJM85J=#nq9g$2#SDSx&;DTem)J$tp`_ z*!*9mLQEIfjBzv~?1I2`D6zD|;@E1Gd~H44Y+`Y&L-eF|^50D!IhuwOnreduzJ(=Y z5Fy=fZ*8^rR5q1^J67=9P$FYgu9}za`4U#i<%369McQsGh4+T54QU_ah+JdLDj#ZP z!cc6-K0QNCuS~ENe%En zYGaL|G(QIjjiRK&Vd+x%5+q;)rz3EeDF3@p&#sp;(PgE3t8y10MX%H-nE5m}NX&WHFa;O=cc20h522VaKz>bu|i?ULcU5m z+|8h3>uVLN*LsS=51UdfG;Sf|o%Zx%TGj;8x3f0f7W-d)6|08mP^^_7dF50jl2oXk zIuFLK9Idjuqv-_oWoD!O`1S{W^7i!)x}Y-M@QWxKgn8;JOW?`mO9gZ_G9L_Wki?UA zs+lY3(pGSIMKR)`S?(9Cgu$zM=!7ElG_58!+Ze}$WRpML58Zprp48#eFAHN{qFpd2 z?9?zC=7V4i{-{8bkaoBLOCIf@rJSwVc<_2Aqd87Mzv7IYM4JOC$rXyu^^xTgAZ}L}HNys=sF2YYl z4)r^$bU9!}{NF7UH=Ma-lARYSdd+WJ?b-E7dSc-Q(lGmKG;4nMwV*O{gSL^sm$$_~ z)n?(RygJ4lT}mLzN6dsKZbb6*rTe2yP;1+r)-|FrJPUdwFfE)Kg|W4C43kX!WVn}q z6UYArNpR1ihyV4_cLIcG!HpDs{Ln0Ro&wtFyWjj5)a+dR*Eq&^HNVPS$`uWyd)&)f zxvi)r=K@f2&iOb8NZUCRm?j14dd`^|c^)*Re=*m0dcOI|)_W@wmqkL^+&)-b+w)5J zPpUYekeimH;_ONPF9JMgHTCaBN#ESu+>SN@yUsN;!)1-6S)OmkVBmlXaTslGZFMG} z9w>6xKg|r~xC}>MVvhD+ULIc@y?*)`bM){4Q{?|_t}JuWH$UBo{5O+NbB}CxwssmV zEc<(b9gnkZT)_4y8ZOk%6Sh>2muUt$bRMul%v>R zDU(NyI$@i|f|Mp+3X2!O6DYlBa(6HgAQ0+V5QgWM%>QsL*jfQeKv=lF-CYCS&Eu*3 z@YLPcuA^tJHd?>ib9dqLt4fI-B0G(9w^Q@CGbSZTS&dO;heB+YNJ+(J!0I zS2Fo8S8BMewZYzWoi*D3p8mhl}ij1lmStm-o+$g3S&=`4|v->@qvE4{fR@cml9- z(y(ipPg;i)?qJ|xG^N5|gl|jrEAySHe9uH_X6h*UND(DO5!sv|kOAXxQ5`ggi7_}+ z1fE;48O4uhE%B{(@ctO@ui}IZ!d*DfY_(>4X}d7_TSjn8v+2gE(NS~T>~_1ex1{BZ z`nol&$0J>9o!b9U)%>ZuF(x#sA{X{s8dyE4|ktj{fDad&!DOW3$wqo z{p{1r*}B5}AFA5tsA|EyZ~o~oe=a_}dGdLx+JXzpTubza6F2(B@l&S z@)e$+(!EGcViuIbH5HYcbfptf7U_9Wbm*q8!J4eJ3-`R_JH5>E=_k4=jW(muE^khw zzeL|iP2aE>r)E=J3uF*=leGUpkP2?+Gg9!ANej^P2c+E(z^Tbsb_97ZxHw|#y2 zoInqL`}&8alcHl)^{pjmo>{d)+5&UnJ;$fbMc<@(1Kmk8@0|0o)7o$CA{Pf>mudOn zK9iyET4y5Os#bc_Oiaf0{4BJsHru}MeAov5AroR>w$6-*?tRmIU>AHW^5UYE^;^lb zeVOLdIvZ8%PK5=Pv(^RZSF@{BdGVNJPw(WkD%*_0w9SKS4*LtVy>eQ9nI`%C#LQ$? z;LEj7(3AV`MJ!}YYmDC+VM`=K?~=Ls2zY+$kC#Q;w{Xw7S-*iLV_os()q^#%lCO7Z z;OSA;oxd#b=ibQ7z~{(=X&3Fpu+eVcU`xiW4Xiclz^q=q`$x09*AG-BqiC6VZTl~` zdd=p4vQ@+y=mZpKR{OFydN?xmY*5R9kLB>j9>eOt#yqXxsh`cx>P2x8cn_lH=i{sJ zv$-RJj)p+rQo3CE(T0oc-&`uC#FG|6kgRyUF3OQPlo+ae+zdX#iO`c|e-wj?I%jFG z)xP#IL-`o0URp~Qs8OE>bTDbW5eEn&coG*xX8MUM^%1-rt%3rAG$Y|XEyI+EdTG-K zu9Xu)fuz_Gmgw3Sx~QkVxhkmeVO6J2Z?LMxnJZ{Zd(&E@ zo=J!*qXAG#kye4@G%7XNUx|&85H-%6lN6e~;dQL5babKRGQ!qZi5%zyTBKqo1O8Us zEY+-H(%nT+Zg%|ky%6_)lWiaDZA70A_RjZq9&oQfV?Z*t3wv8&DcPt>W@ul@NVl=D zx+#5m$j5BV*K4{=8iiU;B}tIK*`4F$Swr-vw-5X;mWA3)4fqS2}z_E zmz+5Hyy1vUQEuzVCAU^uuN5)`r{g~2rG3;Xo+MOnYG;#XW1 z^loU?v^2vBusn|_0#ecOmH3lKmW*tj{5d4!{`}P=No|NG$~k{a?kU_JD`*COwJgfp z5=$T6GqLo|=~*d7qQcC>QXH((QA4)gvl7!LmL3ay^C~JHvw_SIKFwN2um+k+{@==W zff{VSN=DlLZ`ay9X5P%jlsmLDm=r0XjZDw6@68u$ylR6NY0MxL{maCtR+KD3OCVMp zON@U0N*HHwh&uetq$bL{gc$uuPb@{65xUa65Osv;)yjO!X(+1AV^E5QwRjd8e~pI5 zf&z|6TG_Xk?RsYZe?-zP$8%|o%zP0dgcUtCJ{IXQYcS0c#Q)M@UEZQ(> zwtd6dv;A;)=iw@XqxTTYkl&X*#uhPa<4g`M~h$qWJOw7dg5^;I#Nn)7?NomJH| zjW^qMQpDHIhCYknL!IO?z{+E=K-W~sf)sD$gn4&t)YS<} z3t8Yei0k2W+|7Y+JvNGJmdB&?qGk{Q9VR*fG7bWqB?lZW0EckU3wxZg+f#El^;A=7 zV3vYiy0+!ff&xR-Rlny`Yes5HWCQgyRU6p!8kE%L5=i@sC7x9la>LVb(RKzpKtx<0 zfB?LeYr?$iQjep43aIXqHT#OuqywY<-~dlYGX=yj_X-}nNUEWfNayUO5vp9%Nu*-f zLQekczxnwpHRqyG~eY?jSN%Pbbi-f@?92W=&O~>{gF@iauxtNDuETT?Df!UqJe@*Vpssj>J@p^XGHm~tsg)@ ziOlp^jL4+dD?ol|!ET@d^Rv8=ObnwAXKF2)=Cr0SVhRVb56qXdk;~lGO7Dy52p|yj zm}r6V7=~;D>}tG%;%UieOV8PdiYVrexcXw3L3ZdX9HILuTA z(FBsu2pXx8{=9a?g zLF3iG2NP+n)V^S(U@oD0VPDg#o0|O-6Qt7XA5V-576AwSD(g=nErN-h2;{t)n67dj z?mTlIRkiOI@9J-VmI`>uarOd8&qZ&f#AbP4=_zL6^RJ4W)EGladzzU6Adg(g)d1OP zK{N-D=J1<;|aQ!ox zQMbPQlZ6qxPO{ohDB3@jaI#PWh&8AN9C4%ZPDw=Lk;&u7h@YTmAW%8Oas3!FDAc7@ zE0Sh&i^~heFNTL;CKM{YsZcjUp9B0Tx@-1?klE1@C3>9&NLCzPq#GUjuA>u*ZD4np zxn-hazH&W7eH|dkC}xIu5cy;Wl#o)Z}@5_ z{G~1q`OJTY6GkA}p#zy)ec7K;t<=JNHJ0I|wzLUJB~C_Cike?was#&*7RofU;9}I? zxsvO0d2elQA8g%$%llRh?lyIF^PcJ`FfZOBV}*bzqMRN^3UBdLd=SwoVc?!KSutdU zynzf8IutWugu9vT#p=_D2`eY=1~NHYYQRN%_x1aiFIQT;9~8;L<~MFcx55J0DvdtW zz{c<(DG_~JuG&QG*kUprC8e{V-SBy(5Gyz{w}~qjsUowT%&|2SxH(@eBVapHqhsD` zI&Sub%z=hDfiNQojTK=x&4Y62&_XAiHoeS>mF1j=wAT)D%d0m{@5-cpIuRnd^lZ=Rk$uug%bn^~S4 z^{Xp4AWJ83A>3-keTP;!_Z#$wC~_Z|>^)`XNN~K`VO7S~3gzs;IV$`y=Wx326PT zD${g68BL8DWOnUK{vN&M?^2D*BDjN~2<`&-f);r5S_?cy-E`2e{v6vE93H3X0wEis zx9E&f)6-#3IUmZ1wW>800o0NvmXwKGu(;0WB-SCexh>)S+fW$aym>q4N=FYlWHnce zGDt17$ek-Ms}?(E!N?%m@=`woVb$M}j7(798k@v2ROx0Rwp67!Z-Ohqq;c5&MTxf;_+Z#cbd_YYzSMywZ7+t?CmdrX{$ zHa;+$sFt{#xpAOk&*bvU-EsFFI`QbKdG@&5WQo>j5>*0(hg=ss! zHfp-I9ox3Ss@)ITUQeA1-F@b&8`7O82nZiwY+ZY-*ud#UVO@HYH2MxGfOeAS#gs5z zgl<3qhJ8p32!%?-4Qrkoa#NUN?q$%D@U$ek-oX7-aTr-A0&NLVW`9_bR5OL2>%$Pa zGbx=~Gy&CXZ^6Cnb(D2OS2E3S7_D z-&T0PAVni#aumk^MOLq+@jOU)%jeFR|2_+tDXtY!K(4gq%QMEP##|gT^RM`uT;}%M z0?#|J7V{(-yDm1c&l>0o!2}DiycuTMXS&zSeqF|0jAX8RbRjHuQY2VSOW7(E2qEKP z$T=+o-Y3}I>|{T!6=vRD)Pd@Nk72mmoe8ZULjC*Semd%WYti$PF&$z)Cg&E1e#J!h zuJxQb4lF_$(6^KJi5#KWkj{H6$O~r4>B8%$-RWRp0YE1O7#oFo0E=CeeZj>X3t1-b zvNWkOg~3eK3B94%qoulI;Fn}&TK)UPTrl5O8o{@SS*9HstvI^U2`w6+eT3NMZzOSLv1RaR;Xm?i;?$dWb{eme1eQ+6q7SM|bndKc{5?D^jKPbkbT(X4`tS*@|wQ z9fjYtdasj$blf!pq(g#_Cy`s#mL@Rp=~yl1Bvkf@{iD!ulKA&}4(L4Sk?PT;jJaul zS||jzU^eS5PjDAYoK79W|cz)bebw)jljWigp+bHie|iyrrb&{0}d&K%!< zp|mKtS?5^rVy=F@sX+H#ZB5ff;3dRWeg;z@o?V_%b5FPlI8q|WV&c-m7^=8VHKIjT zRTkSGP%=-(Dky8%7Ivo0SKR=KlarBMNL{AD-5;kAAVI#-Ik(8C5IF|HEEK#&{=wTT z1c@pkYOCD2L_aiNrZ7#A+`NTeInnnErhJ0mNx|v`}I~Il7 zbF*Vlo?m@yP%LcWZ$m8X@Z1SQ2kBt>TAH;{O&s=bEWLZ86WWYhdJTT7~USL%bpkN_rXf!f2_(Ku*N7DbF}G*a+p zZ1e?mIOyA^XLT`1(@Rbee`{~;Z|`>6U2_fQ=7NavDUCX#$uiLcv5y!cTg6C%fTE7S zOHAYiNzw6lbsl(4;lh%uHz%s)Om3@+Y_+1hYhR&$qLadaID@Eb>vD*8e#>`JN&%_b~2PExZ-bLShF!S-2QQY(| z$Vot++3D#6YebkQTT!Uw>R14RTV5z}pwIK>7=C@-L}%|@Mzm}z_z9K?$54VTaPw16 z+&`!ePcbL%0y$N@lg3Lz!=#QYv!EVP_i zufScgq5W#8bjJq3b>UvG+o$!QB$KV#!FRX(L-2kBxN=> zY03FG0)CGE)cUxb3*`g?F$V5>U;Rjg!AvWwbT>tUL3@Our>PAkjSGBNAp4WMobQ^4B`E`Eo#(Vybn$5-hFpYPAeOBOvYFM;M77erU zig38;PD@?&l&+T6ut-kYD6*PTRfSo`LhOSGo> zHwEHEj*Bln5K|Oq-?O*LOq20HDi5(K=bkeGk4OLIUhT-f1m}~UAc(F6;wD8Ly9)A z3m;gDjkudsM#+9O06WeI=5!o)OY`2LIoUtOo2^f_2Gy_1&6i6HO-XvN8J|T}_s=(X zZ{BA)c#3->{6KAV4}j%0S-V+BP!SYw*6aSV>2yB3Gt1zM;2IobBB#+x7}^7jU6 zsA3~m+HZZh6)o|g%y~1cGh#edo=oqEn0KPsq7b-W5)fEkkZ-tQ)Ub6S=4SHbd=T3s z=n54h*&TxKU(*uWaC=-`km#5hz-2m9q-GMp`g*OKor;sJ9g;Vu8fDZK*%GONWFH9@=Z*Zy9-z(VtrN!*-8h6@XKJsV!>FP1hWh*4?bvSCfQ#C)_dwO7v{rc7JrW9{A>FZ zr6)J~6m?cAlV!+#~A?Tq)t+?@NH_d?QvAh3VFzp}bdYxuB zyIrk+IK1vjNp43%z?kdh(czF)nO+M!=gVhTRcgtcbxE#bi+{!;vA?&wx!sBDl9fkh zISMWR$Aj>|&V52&8d14VB;f##081LZgb&A@%_!xgF=u`rAx94gf2L{ul?RSwwThF1 zjso4E3;WI*7PokX)^_vA)LX0aF-oEaz|E|_KN^h|JeW(|Ot$;*b-<6&IJov&(UN2k z4&=HtR*BS4H9SG{*f>kAEuY|K%jKlN4w;{FXDzW3ZMF`KKWJ;|_|6$K8i1VN3A&Bt z2yBu+3mJ2%p~i-DL2fvkxYrK`#XIP+h_Y* z?Y)cM{%&`xznxxmlkL5Son-rf#ExhcKK~+5RRnqGZA63YiUk9D4Rd45xh_{E5XNOC z8Xf^Le8r+gQkvJqe^N^mhn%v~i>6K1ltwmtD>@@$50{ZdKB0AQ2_l6z zR$3uRcXw-VWu?^@N@Be&Uw8YS`MM`K%k#8;ieP96Pa;(!GYcwcH6aUS<1ceWaG%8^xlqYe z)!VJP89@!xva)`~0>)&WYuDRuw$6Dow1B}El=2_!ZHJH*yZigzoV#`XLjJe)c|8N9 zg8=FPdor%3<1xUkeua6p)N?55W#o=tVdhY$hh}8cK9AuE2}OBT2y;Rv1ur`Es!<$| z)NSN#KQ{_Y7wUvLsed3eM-*%Bt5k1hA@tpd)$rFu`eMk;*bjAv>Z=##%qIPU=c3;5 z9PK$!n4}ypOLBK>sXEgw&Fux?Vkt5=>iWr<3n0ZbEA@&YwE%`AM<7OLnZF-LFH;G_ z(NoS89do&i2rj~-8jU|DV#)+Wq6<8*bE?adt?cBxi2==B+Xw= zd)d_77B9@G>04E0?f;05EW9H8V9+(FftkDiHDXO4SKS`um_VBCh%IxdX)dE3>Pu|> zio77!7ck`|hROZ$i`*phr`?T*-K}R`y!xn%=T5q#C9%4@ObgTrs1oL=tS_dcIGJRQ zBlwXgRR`XIdOMIEFq~UK3n)2c+F=F65~E)Ow8ZFW*im%rNHrSQ)<}UX>VUd-VNSCI zb?{5HRnw)=6hVAL!H-;m;qSIKjdW+d%KX6Q&jE(-2%~92wV}yUuFPjzu|e0Ac0@t+ z`i#Fal1wN_ar0|Y=(zeCBZ6gMTLK8**R}atsmP+X=q*5F)N^}IcTX8`TwFepN{rQX zIF}6&M9_g#s_3S^!Jt;!h7}Zebd)H_jqb3eNp>PANQP(ShfzC5ZQUuR58)vg=~#V7rPfJtV>{bfjg91a z)`Q~B_|Ns|r;mXqwEys+p$R=~FdqcyMu^4Y^-&Y(NR=T0s@ZyU+vydx5u#v5-H)eg zz24=p-`d`?=kCH`|HY2L+YbKSFTr;G#Fmg7rREtxF;KpmUD#mbso)v;M5a6QTN~SK zbEj=9)#DWJFk|%Zh(*G6O73{{|C^9n?^sgnH@!Jh>7V}*q}D$s<>h4&y}7IsWBdPe zv09(Lc=PToK0Q17Dc&~LPH60G?rv>`d;DPc;pcE!`6)~bo{H$o?3V&v0tR{%2l*#$4R+Sa@X8bdLf%5NTZ znTCMEZUFfjuPQvg`rsVPmZM7e^)IUbiM&SYH4LS zA(tTLGmCIxEK2m2vbmudMC!OSa?qcD6F|}s=8|!174R!56@Z1(yKG=;Xr*n>*H`hD zSte2qkZrk>r;~s<4|r;Snr8X}W<;snGysgfH`SIZ6Z*`|=2TuM8WSEOP?gPBk&e*? zmyI)Q1D?D~yNahQTA3s>D4bWXP|6WZH!LOsjM((z|M% zMkldu`AiT%II?c)Gj6nKkVm-UcA%n))n(@RX}%gO-q&#$8F!$-*~9`SqK*>dlhm7`Ld|)6p5IC z;#sAlr`dZv0oc^s)a44bDX;(@-yVr^aa}k_4#G@Tg*{sG;o z$dzSR4=2%v5@F)Jw71*Mt9B|=q{qmui&lk?FFzmBsM)42&U2;lJgkTd&f!Y6 z7|jcex>+p%T}`o7C^L|u%1OPX2z~pJy{+5s-d=adYf0b&=}Kmc1AyQm*B&z_`iT&f zEWJea1}Ia95h}cPs#EB@q6-xI(sj*vrGOJbJs`UtXU&R(yn4f)pq@SbM_dRfoEB}+B_}g4Q_6YY@VN~-L2_<2_JCGCdmfy`;*Ci0+NVsA zRirNDx`XXE{B?S=uL=Z}wH!E_bjz)wHqn*cRE=Hv6 z0Nz|N3XXr&_<%)|0MZr!c!^Du1G_xrl3Zq^tuiT=oh?gG5?UubD{PbC0uP_usW~67 ziz@(blpE1ynogp6nggZGvYAtIsYHmyJZB}oIUYd0orTxQbbGH*w??(XdwI;s*5gA`clnApm$7*sqa6uj!FVkyt485L>H5B>^ zNw(&pKblK-;XTpYqHomIrGzH9omIr9_Ib|WM84BTc{DRXjWoo#{TN4#DY3xbLjN2f zT0BC(;vD^=DL7`o;{K%tu#4SWzI3+2KR8R_Hox7w@Q`BxU+{P6UT<{$DF!0jh~{@t^(e(|I(11I42Zl^)gvA?rOdazQsR%JXie6%jF zF7Cop_!eWRhLH9TxYlJqZtkiJcfCXunSfYo|AQ3{|L`RjIQ*QL@Tqv!;$+%K9qgm; z_`@8tbzLSG=2U5ovTilYx!Cg(fbDdS9e-|i{5f{~d0m`i$Deb@pX-i4&+>EG@#hEU z*zxCFlyff1xmlERS(Njqe>{)Rb;qB(9e=JnzBQg~2iz2mp@*37DDy<1<{(WoiK!=Yo z%_YI)n}GdftJR@?1#JZ-hHz6qJrKwv^Sx_u>j`Nsa)Y|&7QYnLwwAi?;9aMwpb{GS z(yvS_YegxyhAWM+ccmZG2kWEF@~dKmT612b(rADl{5W{y2V2?P$dx1_@(Af9Qol6L zv{$OTvX;)A)T75Cuwl^b@#$$34tRNo&6GcR_G)D#SoN7s#Hrt7K@Q%e*EQVr`yYXW!cOyO3c)g-?^ zo`3V76a`)@3eT=_p_FsoSQ@sk?LDum~-lJ^xIeO-$If6tzx#{rSI!bk=qMIUg*(_V0LzK zSt;ZnvcaOo#t$Fno~D|FFxqE;x+iz#JSf z6ldeK(%SHY=-UU)&3nfyDM+h|eO6O=M?nhX#uw#sVmaH2`-e|Jl;q+BpY~;SX#LE~ zyLAV}YaX@ootgG~IKamUL5s zm$7AFuG+n-YKLmmdR=who7cL&;EeL*j^UC@+Xrp7G+VEC?-|ZjUCuH6MXH#6si~9| z-#U1>ySceuzuqayx5KP9=0kKuL{6i89D@=pugo>}B+1SHeR1L3-PzgS>8#h)x5X&y z%|!YR*|iKMZUKIoWY?FeM;IzEwSo>p(M{`X@S_;5y(p~*xBAkvzk9ItaA$YDA*oSP zY2_zP4e^50&n&7IA$Ztjg`-=i%XeIcgU;T;{+fLj<;sh%O~3%g8l73R6M>-*qpy-O zgjy3oR+!i8=r8asHw|kgGKs+s61#loyK69K$>7&eT-xZdP1;4yt#c$+mqm4WjC`m` z-L&4z{zY}jenor;WjZgVn}pUt6HMZB=iNQzS30If|CjEUx@zttqtY+x=dn?#zI4x? z+lKEmWfIG9)d63&XN|`1SPirP@Zg}+Syf8;Z|3m7Ewr+K&(O;8Fqr@z;0$zyhml&_ z79`62_$up_1%&N8rV^10<6`~I=p+ZDo5RYx^arMh6uGsoL z(y4v+L#Anenqx9tZ#-aei@pi|pegnb!jZDlRfH=uj#4qdocWv{~k`4;Hyrv{J^5xad6+FyVEmei$4r)7o&tDg#i+FT0}=$ ze!11@M9(2je>O^Gv8v?mF2wYo-d}B==Er}0{_Opo2r|PP2}Kndf-%iPf@bIuYv4P; zE-CG~c1FGY?~XU$^vn%A4;wuHX;?>a&?qC2Uu|5Fvis89BgS-1FQWjM_rNk=1C}yl zwvNl;FsiJ%Dr(1)aI1!D@1Itu)rrgACTY-YGW$DG;-h1;oLS$(1~(WEUELTRn@qL+ z`KyKRnQ@KNB!7$?5Bv}&$y$O!a<3^Ck>s<}0ukL8eJT*=%2-V&%{QqQPmr4=xnyR| znct&8r>sMm=6wZj;ah0|fJYYC7J{$pn(FvbxqD>E1mpF77XZshDGRt@*Xh?~>Y19f zL|F4#uph3t74Y1sIV2pratbaK@n4X07yovrWv)J%r8{IN+#wAq3k5JJTWQ~PNbNk_ zTU8PK8JqUDqv_#2kEQ_pmD=tE*$Wea=5Jzt>)&yVR0-GWmaw9A<#D7l|c(;gp;wmX{osmW! zk*GycxHtL7JiTrktuzI}jqA^!gW&}ef*2&S{!pz`IntIBbF!Ng4E(=#ci7}TnK$aU zOA4+r6QOt@fD{i(qtAd?!%qWJvWFJFp=ZvcBpZ;~_FFE9v)N{ zO&FeRf*@}f^sxd41wf;rysIHavI#T;*YfEJxgn=UQt&-8hyXzOH&>IQX0?ZiGnHH9 zY2qdfslJgad!-2O32QviL5)wlh`Sk~hN&x`@kqw+$Ha{qnvr5ujVfj!U)>b?XpgeL z{?$x$0P6Nq{vsK(W(5WQ^3e@nmZI`t6>;4%eU$l}lYXN2GJ0%U9F(HOGo>PwJ=t1| zoxY=xdCbe;1kwBvW-q=JS-f-8j>7G;Hl6F<3j}t5Fpoqyo?eCf^3KhM8)<#-B(FH< zh4hrg@%B#R(!0@5d7GOuwq8oQuXy_7biB=Bx%Pz_df%j zwRg~Yc%$jKTK%|1^V;crmgdzss9s|-qvy{*M5ksGRnZ$>BluY=gin2N;jK9V&4s*5 zqgoI*TEZh}3%&Nm#dTca1^kyy$3AYs0%O{CA%VJOjDTyV{^7V8vO_Cjy zSwG&kxv^#f&$m0B^XiwWIlw){#qoz{qraSNzd_UZo@t!wno*j!I+IV|s=8)>rM~qc zmC|r2#O{HsCQdxOQ zz#Np-I#e6eTNWervq4tlg#&X*%%rvoywX}6fWSda1>EHlI%I)X^z&CAFq?#Kw56in zGhjx_(rofuYh_fx*d}UMS4~R&pn!Y0BCO;%`K!>323T%Fr;Q}FGBW#;Ihp|uLm{xQ zra!2Lb@PS6{xB-KC{ug(2F}u9VkG)$nSM;0bHWkaxHTaA0NI%iQkFdDsXAd07-kuC zbEM${vfO&rL@-K!4O*2$D273dc~xt=hEOtuE=y&GOgCu`U^@$)YTAKi5~Qftc7oXSSia=K!l*#z9P2y}^41O(xk?A=mM)Iv!#=oOY z&s`6j&Ff*)Uk_(XQGr(}y2160dvf)RDCMHCglbVK;1%~e0al-Q^~=Hvk2&>5{gxAV zwd~S-C@e-ogT!jY$TGwDMAKzbYD-GNsneH$j^tJsc|!mN&)fzLhys$1v$V9eg_J7! z!ZF$v01!eKpkKVS(d<>0L{~{kVso<}VaBmHbZ*rIEE8}BIeX1puN;<)FND=yI+2;& z2+jmIGc>V5SV8!SiFvNSVuAwqsTk67S)hOE9LZcTbzfIOpS;wXeR6ME5qL_ol}8qi zl2YM8E^ZbkKaQi^IR&DrB4Q^wK};|-Vr$k_s4#3aX|=Sdd2u9Ra$P1o9Y~|8A48-3 z{tR!a{$SewgCF4^6vF2Z|Jl5Iz?0=SfB4iK;!a}AJ=6yRIc%LBlpL}b%`yJW8eM=Rq92ORDb^)&c7q@oF&oA z>807I$EsC2LNuz_HjvV@p{GWaNc2ZHO;MdD0)E~_<{IMA(i$tM%^|T7!OKb2PzurG zs)&i*(l2^bfV608*RcaaltC@)KDrUQV$ zyH^4`pK734qMC0uw!T1)L8ukmA~T~$S3{b-kH0`l zLFcsi>0ugQU+y0L8>bZX_v5}DnPLx$df(rV+y`OYtkbMT-rk;1B=}$_R+YkG*S4FoRG9N<#N!Enb?R_~ zD+JqHUdI+TqIX3%6&`7TBI*I(93tmJzI0Ms++hXhNoYHpX>^DnWS8U(BOoV6iK@mn z-dTNtB!pm3eQpxM?!nIf(v$4-w)t&m*L`U$oWlbKhq^n3TQ54c=_$-;L0Hkq2^OhG zL}ha^e8UX-$+QGPZ9aGqAgn=T2d#dqXrnb^ORm!12FA>tR10B%orAqSJFIn1xUb3O z1yy7^*$8`riaU0i3QMEM(eu)1Uo)SH(->;j2%~+qMt`>ttOBv-(~s7A%&HMzuavr- zy@S1#*1&BOe4A|D7w|s7paNXgVVIN>o!Y?eVe~RFll^9tR<_MW8R=_TinQcSnw`$p z-d4Nk+l^hoI3Ag1<05GG-(f)ImYV*Bb8p35EyExQCQUEzre|!k)A`-EAj^Dg`_5StA*-z%mkBE7t{jfpoA@lX%L+`t5oN9mrhZC%? z-X$-bgwEx_w+aMe3%+kIJ*M6eb_h2V`X+Z3@=}P|3O;h5nIO&`@%%cfFCCf%+cHX2 zCZ6lDQgYDB)8Y7@$kvr2V*s9(WPdU%?dpxa56vR}6Lo?4mqThbj>mu~g?S?*gIOOl zsiC$!Q!a$y^$}yV9Z}uMh}cIrTKH<5r|fD!a$y^zQ{WOIkpjFi5BL#NLpC%w(dad5 z?N;->LMV)TUGhO-B~H}I2f5jR52zCBS74->K4IP1+mDXlygqw(^5p&5n|IOa+c#$~ zPkwlDcBt@#-wlzQtqfW2h>~F>QBJQq-SugXAfF%>8rygXvd9|AB=BXMe!>H3*6c<4 zbtPb*;t+}%5HSA}H0woBzvya98=X(Y;iAzWz;vtHBXL`%cn8$rJ*E))mLuo7i>qm8 zdv~>~>GMzK+peGc!tRq7Kq~ZGgZ`l-rUO=iwR$ysUePM56+R|QGT<7MA!hyd*4|yN z7WqBWk{{e1?T^V-B7a_paP<25$EwvE71RF32*GZWpnXg}wE?0-2D=#IV0zKo4t{Nc z75pRbmbNr4Q5$!@UyO>xT)Vm1px>&*6ggO-U|)YL^`OF!6C#1E07mdyMa#l``tqoS zy20DNB%01@7=|TZRQk8`$%u5BYrM0)?5p>9GjhKR@*1yv=}PEhelvV$Tc-Ff%VY&Q zunv8+&3$O=O1&xB2y`m?{n(zeE@(oAUfCdftxr6O_RW87`DwU~{2kyn7H`+F2ajI+_)e8Jpc9kmJred#EKRE!mwv}JVme_v_V@oOd4gG9>5*QBaI@6uQq2YE z(`RdAZ`@lUsV}kA(T=%3(s3epxlz{`zcnKfWyfenqofk;$xVO)&w@LeVRtq#_x;wg z?(1ZQqi}2jI<-`B7CK%n?Rnt8-V)3E&CQ z{^=x3d6ffp9b0DkkpN{PHA00#*bqX=ppv#!aL?=lIwWqRgil!Xg=v_dZrcH!_1ePa zpbQS`2Hiix;_X3YosjTxIJy~Y+|Z{JGl%RfERBBjwR`8e>&n-{8w*(=RYn^0vWcIY z38AR+G0YmSUd)1WBGdX{HVN;KtPeY*bFi~{v3>Ax2NX(M`~8E>4lfhuraN;QX?TpV zQmqU`bHlsl8hr+$b|o6wVFNPy>70eSwY9syzqK9Jjszr+-k)GVE(4ZMAs$%JjJ=%y z%_S?Wf1Vx%%k1{CKT%(%^*oz07Z~~M1Os;o$&0N-hhFPEmF=$^$7-AI>~sQ%f+>3v zc?2yzR$K~}e_0i_YhE~MT->L>jGo~8htU()3>#rRD8DM}Wx<OG1 zm+ZbhZJ)!im&>k{d?U?+M}AV7N~s6;wt2475Ot!-_DCm|PpCS!5y0$UWd2qY%4SVG8C?;oOX{ENPrS75}*N43b|L-@;gjj%&b+l##ePS4=@*V=ST6A z%>MS?=imSYB}$`2F*QU=y~fz~W!;>Ndm`v^!Fef?VjEU?lof}Tu5c+X*uV zmJ~WYZ>CR1rf6ubLUx4tgW{+lu-QQC|z0c+A{; zMHihr8v6)yDfiB8_A~kS7^IZieRJBd&JxWqo!Yu1rt>6#kI$rHmn{UsPb|M5l@H(0 zJN7GYhg@S`ebBJw@Vip^dV^oZwF!b9w=y%P5jOBPH9(7bsKu3=p97CE<(F49a8#s- z6_YKnx|LjRTW;iaglI!Zhw}X&8u}`g_3T(>S`~*Ps5q#-tnQ zTem;x?(FT3I{j#S6l`}!+oPyP-@X)cts!6gC2_0$;?!AFsRa(|F~?GC**k|P*v-OP zNO|4L>XkB7EmVH6_soJz7d}(o7XKK9)tUrMK?{vFP%Eb`ye3=|x8RwF66SIn3i>oyyJBpxTV#=BpK^PiYXcnl*U@e(oxUGiy zXdZvt+xTyY3=r0V0f<5twaNqM-e^F z@d(mwW2re%g;7sR?rpr0>M?+32-C69oiIAjH>E~MA`O31x7*O#Nr45J!ko2y%f1Rx zFaHb8L7Er;r7Y%0s-~(uXvM!hYTKGvcCs@I-HGci+Uv)zr>s0>w)4y%1E&02@H%npo@V>r@e@-o9 zavD~(7vAVrSpZU&ORZDw%h{BdqiJvlV@{ljO4B2bTlF}m)4ZfXwVp~h_D#Wf^Q1ha z-L}t!ydaEM>E5>7tGAja$H%CoQcVZ5T!sA-T|F=r_%6LNhnb}NUw`^P&GhT$J=Wcc zbUvpeL8US#o@3+1G^*al$3R&7zK3v%mV7(b(;#2WnK<}lvuy8RI0{9Z5U6+;;vwrVK~7G84*ILgHg zQ%?{W2xqY5+BYuQC&d8@8*fxq3v@HlJpTYAsmf?rJF`NLif>8@z?uaF6^Rs{s*kkn zNCk#POGi5109`bG(v58%$|X?|I3)|oB~ir&Du=7mgl&1>@o^$9_7UcEAK?UBBAOd% zaZ6g;(#i?A4Wy9>9zV9)SQzb2y8Q{Ug>D#4cE{V%a5SizNZ%TSpR&)Q9I$d!o<7y; zqy{(5Hq5_PhYsw7+Cip_UMcXBVVpbhMsOE8#U@JYcZI4~mMPGNj9$d)iE@ip{`>Yd z$(u6EPA!X|COI>xCLdsfs#&uGvk|&5u$h(4a9_+WW+4X~F*{k5W%mU4na&%im(hEd z`^v>c*`HCjpVBDWYwro|y1Oa9&Eoa;#ke!x>qfn9xYr%^_a?*=w+xMD7=yw1#LyYxXC zIhDsmympN#?RG{qi{0UFcih{Jx}$Elx3qn^X9h`enfR8hG-70jNNNXbxN1dg_ckgX zV$~K@qu*3nUtKp>cy7Am{_bSbkGeafoz7@`dpPNgYnDwg&o@yvTZgea%BIW7SoVEe z(pMD}I4Tzh&S(q332H5|-I5{m&MRLL#vx)lc#B!)o43@V#Rb(NvrZSY#E5~aM<^Gz zQ){#V))d(!Y!D+jhvy=4bw54$x8;3E80|%S-Eh<$?sW%2P;)4%bqu=( zCMj1*z2cy)>i*g%!%W$Fr(@jP*%^<6-En6!8SM6h?M`=63k1<~A95HA2MyRGaK#1= zMo5$y?FCUc3_7FU?(WX8VFN#|Q{Lu1Y|V(e#u~wVTFk8frp5kn%_40z8(v!OE;aU5 zV_V%a2y9_c%D>8L{_4;C(EDaT-p^g}Z+Y|8^s1X~L9H^s)(#x?d!4~}I3S|7GaPR3 zb_RR>>e4BxcM4E9GrJG53w0!GZNgzN>h!vuA@beBQ4mEnVu$0NAbqU0=H?ss!tNv( z2YbC?Z#&rA+1=^v)HdJONSLXfMtAEmXh2CSnTnTOz|=u^C4bJqF=gW`VKYo+|7sM! zpi-H-HuXj*z0ve@=gKuW=AM|9SZ@Ue-N|H^1iS4{G~OL;PbT9@R3`&cRq?V>Qn(CM z?QL-x?uCSkS!IE-Kx!S7iry;uaxTpk3)&kEwxjLgIGPN@QP?NBs25cGca$zwmp1_t z1%tlVC~uLTM3RDF=zyru#E)c;i5(dE_0gQm_|;pG>rpZ$Vsb^-_oCtUUeN0eM*XO> zJ)UgSQFXgcyF+bIuqZRGr!D5r5HOMGR>~nA-6&#^ffLkTX_e6v(X61~K7D&yVx9QT>WRb8DYwH3ouaK4kCJ^&wV^h#&h{hbeI`quV8X64LgxtXESOO0S z80$0U`xtv6H}vFn#8y0k`>Y1;2Tlt1Ib4-(@6b5(8M+J(C_sJWytmw z6qEk0EE;qx%5xnpy=}oCPRU53f@wf*sp+90=LwXF*0bb&{~|b#PXw>4IiD-m26=Dh z)rutrU@^F1!4Z+7j5$%oYNPK*V=D#kv*;VsFjc}*VXY9X9MfgmB4uC+j@VEYrTf*};~mz{GIa^j?2^PGMjEDO4|?7s$bVPFKe7Vmsn z!mUM&BA=R|wGWO)szG47V-t^z`+s zgJ=8RE3O_Ph>TfE8*au@l$-b@8T!#gqwg-&p}vAafKx{q7&W#j5kML5+`h**@A1>5 zf;WZt`0^gq&%5;9_uPS8E+5ew7sJVw)ZGhr2kpJYF_x#OiCHL&H#3VcDuQ?_p&rMB zPUl^B*f}=rq@3DgGquNQaxAlYEKold?>oE*cAh>PO&mrusKHAOI}T*e%{a+#2A;0v zsU(vz6>2513)s9Ts9P1L7YXBP0A!f!$nZBJU%9tPBxE80_;yY*_!mNC)FwHdwzR^W zHW=4{q4}55f>;xLG}I~ysX=0bh5^(NPa>^P#a+zOxdb+9auKK<7nwtD3NCP}3ml=j zaDaElTZ;Al#Od7|sYH^9jR^4_#8s#llf_ibFitTHNwX2#P+`z|)LD>V`P)vz*66@c z?++M?Yoxd%?Bt5`F~hlw?!lFX^9r5N!drpqwt8>hi7&)Z8Cn*0Q+`p}D_)T@pqWqs z$A<8v2a7N+I1mDTUZPN#1BTkrJ-{vzXov1>N#N>fEJ2@6X`e|X5F;FtI+yp069sS8 z!h#Imf##(Q8R;=uL`#}Woo}uM%?=rK#i-LT%55A_!kvH%_iXr zohO2K8e9aIT!_w{KbE_EFFdJTg>?gyTF$tMoe&Rj!H#eQZ9XL($&NZ8i zYYvnJQx%1ELySgv$V@tzT$}qJ55Dmq)blQS}!n+8F(z zWPH7o@8ZKEw-Lo+L?6r+$n>WAj#<$&os+#O?LiZg@H7L6^F=j$(jjHDTYfnRcPsGkwMQ)-Og{sQ5#<$D2Oq;mLdgg;?F+bZ{IA!9s8Aedvb6+ z`pxr+lAv3BAh~{Os&W4;JjwH$Wukg&kBQm~m}$FVqigR)5H{Y4Pxyng4H>cnn473h z&6aF+-ua_TpPhJyD2~g%N_c-cv&)Ab;#ZUj^O|UZ0JVcEIMXOfU?1UOySwmU0{Ac; zrHRrtxoK>N5TH`e|KmyV&>GX_n;bMIRXV4q-j)QkW^$t*%S{tj{6GVN6Vz<$ZUkyY;1dfl4Ew(ai$GEy6PpcW4Of7P^5D6JE>51 z(^eUdZt!$A)lz zsBVZ?0_|(Qly^7m34sCLa@yQ1nV7h=xkMCKn#qXw8xvmX=l<@~11X|mCrIXAN_hh6 z(KarbQ@YJ)OeQ{7n4W>d$sv!k_s21$RaL48-z zKXDSfY<2a>=@6(Pk(s4X2k;Q1N){*XKNTN^Q535TRLfTCd9e7is(otkF{IZV9GWXw zL8~`p?$tN1EW$))WAFJ_L{3OQM0$i6=q-}!u7pg6lq3ZIfWrk1CD+vK~m`$kS2xn%qzXE+^(O_bNNIs=6^+)C{|E7dNGPx1&VH@ zhom%6RE|+8 zk7;$eh;6=8;b0O0Q(L936 zMHDY#*GioGk=oc|c}jgc4BOQbadjde%b&V8+f z$9({ikh>hyh2H47HySF%`8CicU?mOmGxheJv;E4*Ho{g-hI_0yyn!uJC}+KKd@xq| zCkvFgNFoqVW3S9>y%RpedEK;8O1uC=Wi$$gK|}KE2`1$V zYk3hdobh!21*yN{8D=%=gj$T|Y?*O5ivc*`utylmWcLJ_v9iz8izs6w`$c35G4STo zDnH7VNPc1*I+&;o^q|^da9Sl@CaBqx9UH56#1*?)de8?o%&O6lWfgcZLV1cyR$0pC z*b2Ojn`yXw=_Cq6_Lhgn_k1n|Vho3B#=o(LG;G!Ox_m zUdtH#G9W<9VC*9_3KVMET%tcl9>;6MmdKV6WiGJh+-%q+ByoexhhH6tj@Kr}BfdvF zUUofL*00GHK~e3XIyTrABF!#Sz#05MGYjXftNuxYZBN9_2cfVUHqKQ%8R$|=>+*V& z2&F(|C)+yhi(0{RB5~6q-B(lif2*0CQ6{eW7oG)LL{uxhrB$EkZ;axy9EivHR{$|D z>+=3K_V6!Y-u4dU2`Tgl__%n68fGDoU0J3B5oP}iO>P)mR$MSh+%*aI!8wibC?Q$n zthAr8$T&#_%oLcZ)ydJ=5izJCJ$juupIs-OBcY9S}_v)f7JHs1Py;&VA!Z8ah znQ-2$T$I1;vqR)AfEhgRiiicd!TfJk{6ZRrOZQ&+l!Q#gTnE-?9lGK9BlL1#3t4GK zL}UB;JV@*dFk+uhC+XyuzF-;7bhL8VIw+edxx(dn+uzFGfbG1i1>)vzcOA! zsxo&ttM&rj^3vYlu;w3hrb+_3h2d;J2!OkPB> z7){olQDXp15an3$=8YBr+<3R8_*a&?T#yusggwO71f1L&orzo-uqm8foK4o4Ra9oD zH$=)M>QT7Y}Yh%-#aWoT)8yCd&tq@h)q_6hqXjTa3vH$PtbGa(kRTvK%-#%#mzz}o+`<+?ZDe-IH!B(}Hv+?jU-^3iHEh)diz%?mE zBMyv#`~#F1LG!EYha^%39HGlGtC_9hGL=e6D8pct0hZSnoW+fb-nGs`DU+hbl{r*D zxM+kHg;3pYSwvegtRVXH1d9!oQSM_lCDXZ0FSr^}iDfNu4P22a=YSP0M1u@mF&(pE z!~RUqu(cIAGbre(X&uO^!xq)?G3iUO-*GfL=O@t8LPiWj}VPckpOL4OqnBiW%ZGjZ{FVR z?+uXGt9aS)3aG!H*Mm-Tl%PUT%X@wan7CI@UZOG+Wbi1nSvm$$+d|_2>PX=LIP#0r zYD3Qe=>YZuJNQByxnJ~b3p5toDRAdP9`pyr78vYz2WNWpnsc6SOLg;9e!p?wk; zl1D_(#5mT8qaGi6j* z#a*Q6C0A6gv7MIZNc{-1@u}YM1z$Xd2k0NriO+f+rPB0?jwyVUk8H)QrAji~Z$sAk z_G)cEPXc+HMf*rqMPcI@-5IsrZ{>1j}+c~ie zDOv5Z+gzEe%lurERY@rtxK^+0Z8)A@x7|(W&^S-NNY6!kBpLN;Ibd^XZ-2#PC5!4l zNLRL~4X(vze$K(G@W8YoX3v@N%FSCk(>`AN2e=|=zRi1xM6h99vmmZ&R47At(C;B= z`%!(~@=^zG+z>0IoZfC{*a3Mgi-B@)__$0JHHz_n(rG-tR3Xa2MZTtJHT8EexOve{ z(eJKNTz5LRRa}Xpoq5m4U!v&kC91ealF4&mi!(ky@)$?=XdED{$oF1>E%x@g2Dtac z+ND=yMud37Y|K@4FH4h^s_JYQNpl~Q?B{rckJweecLSaFNclI5Ns5}l%m{dVm56B? zOB?B9)(>bLZrF>Fa;4AQxlVuGzwA%W!G zS`-E^XnVlbmNb?%^+RbD(rZD z8n15=&irwn_ba8+i|WjjSZKKOMzzylN^&7Xa4;Xq**Rna5or=pWrhjpDX&r_t7PGG zU~HsAH;=~xy)4x-R~RvC!{>vuwW0u@KyQC5TIF1d0@P}l7pM>!VWS7|gwkrv?{`J6i1jsb6*7q)8e<2V~nqsQ@z6W-e%?Q*6uY;;@Q z&Q`Z4fdgnPPJM05A9FL~_&;wgXZ3?+Ccr0f9NrbDvZkIYX4*W93X+u&Q>kHBbhEF~ z9m4kJj=#>Vjqyw8oD%_$1^tk>SDg3USzh=ND$9+7E#4m@H~}?3W;e5H*unJjM;pN) z(Vgn>=BwcG8^My#W>fHe@fx4Qfkx3K=|PeXWmI_8NY$J|0)WIt7~IxeN?!yB0FB`% zk2wkB$;;;!=*q?m!E-$Y{JY*{F!W6{oUnYnv@F?5Cq6j8l#Dmdc_`Q|%xa~rPswK> zFo3vNO7;@RS;$E}mu59{p@f=*pq_YGcWj7#rnP4FAh4 zYl*VT##&xtbGXz!YL2W3@0?V!Vk=^u+hPIIa6X<59<&{pS%u~I(wNTU+_x`&!{5zo z;Tdmx&*|mdAB)P4JuV)wGRuX}po3X$&*2E+Rr|zFAF`u?L)G`Y4>{1p0cm1n>r4=? zJujKhtVrogc9z-g-zjLdqWG1S)oh>?pQJVkMWjA*FTZ`wl_X$!*PsqPgHduG)25hl zVwO3vAV#_YOA8kOQb4W08~&&lW>;03^+88LQ_nObLpk!#7Xc z&t5)0c!mJAMF{>oP9`O(-ja*$?@=S$A9>jBbS(YE>w7+`z&$>E{rK6_#ztDV(%lNg+(%C&6L9DCFx4wmVV3ofQz@kE!v%?j+&D`(C%b(;r4N z4ED{bJZK05ZAq6Ru0iptTCel4P6bG!P6{@t6LXp)FP8(VD=`xsKgkY7(IIf`i$$V% zfl9x0tqry&Z+(mWeHtL(Ey`lh+cL}Y0aqcl7Ea%Us9FNpQUkh@V!0F*NTqtc>^bu2u!V6TfBi`819X`Ic;q6=cWb}sW8H7o@VKvW z{4iYeb(qZ|2-K|`RzPZmVhKoeD`G%192;l(8NH!MljGz5?y-NYwER%QEk)oJfz%Lv z$JHe_lgQ>Bm`QU5+a7Q_t!TT;I!R@SW^lY$bwo_iQVeL429y0m(W|OL_myK*1c50O z3kw!-qj3vn!0u%9ryt+FJyXpo05BbWy28cj;4LsH3cHA^0wbrnHwubP?K)n|>%ai& zPQ#V|>Yg>ncdf4n>^b6qG~~OH#>W(aZLdPNtWysm$}B-;wyvoW59IW;uYT2koU?Q! zV*hbEIi^t_TLy3(r^iCyj)|fkqp9QLW4qlr3WqkFFg$#KM~nWoK?l9#?%;T*cih`q zK7?;d>gk+AzWUl+wdb$Te(B%C`TIz7B?ou#eRdih9bf$CJh%th$$|kp*ffJ&i@b1- z8*6w1nvUEEw%fZJ{+5H|#6F|gx)S)|DCR@T!vvT%~`bN4*H ziDco)GwCh+aM1*l&PT6^Nz$eeqxcQspmz6$+ugkt7O7hpZLYIK_3ywA{Vl7vPtx&O zRKW(l1LJaZHu_7DT%0}Yp8ZzFW$lcy`SU0%#^g|gWcimH8IKP{QH`WHAuZ~5%PquI z&M{kw*Ru(;gF^f;(=F4dN8{5JRRLs;jG`}?1C!u9%_O-lNzYwOQ16mXs#9F&l*5;G zok^QuFrP2Hmy-feA0^zV#rENF8K_8q%<>-=>BF4O6jGGZR)v{yDo`XfSkuBH83Foc ztR8O--!I9UQv&Khl1j89H5;W+&x$*B5tuLol#F3B5u8$GJoERd%x@qwTsod4t#}G{jgTBLO_2zW;3JbO>MUCs z!|6~)XXVxa^j*-@<5tdf#Ro?5ZF#RwpTOJ^#!|gk&4NkH@e>6nogX1Z?06q&na*mbi7z(xawE`9 z(k_kXEV@Kk4~$cRA>ANax%V7~&x0hIPSck6`jW)JS6PhWKOEErTNVJ0IJsn;`lm?g zJxFLQe59W#{ z9IMbU=T0T9<`5RU4Rw23q3F(zVWV3$tKxjlYjP(MjR}dz5^cWJ^JZE50zHD5!YCtHUznv+GJI4nFzdJ z*MIna_wdP|2if79{5`r}X=PQ{t#-3Er*$d%woB39m&XqKgW;;QoZptcT*sz&Zpo(K zMkDWSke}{*Uvkt?;C(59KNd{hs0#@1Ulo1=LUa+0NP0VEb;rahK zkm)t0+1uV<;oGv%4z`N)`q_9qy~w>R^K{Ea~Dxk+hYhlh!?wmhTl@sw2q(S!wZ*txabxRqadFal2m&@a+M&fNYY ztW%(eXem;JoY9P*(Fj{NpD!MlTb)6J>Nu*{#)(R0CXNr}0D1+}M80y6D3JJw!Nn~g zhAg(l-cmn5_`cjG$lG~+Ts%<;#02&QvG3Sc#t^`!EtzYD8_GA;u%+2uxy?k^B{4qz z(Pgz1HLpRM6_Vwm^&`2GS6fMdiyUS=Q&R8O(?eu`;m0jDC2uLnOS)67#eFmM=E&bt?*7e>1i;An*+S0dW4Ydth ztQTJeq(lL*He86SO@X6od&rWrFh7Ag-!g^VV|OgeVO#>tszC!$x%nAj7=&2RxGy>B zgDYof`jLAu+TL4f#uiM8#cz(<%xDDZOS#o}Pt#d6m&$IyqY@#yybp{T%cPj>Xjq|s z4oFtSCgy~D1*=PuV(*rhkzN0QjS6@wTv?mr3O3vsZm&XEe;-zJ9TUA}38PQn#xw6( zgp|CpP!WmRm$akfvG)p_9QY~Grz^N;Je%Ta2@w>`-Yq+XP@3_vWd0b<+=OY)A6Z@m ziZ9iik)*!dJ5FU5Ottc&h0j7h5=2h8ixXN^SBrpOZNhPs(9L&K+0h4ADg(WwK^AijR!mmI53s#;USqS1P!>OQ@ zF`eav$-9)j)<*?SDsPoO8-pPjHSNdxba$7gyW2F~y>hzc95@zMqP#ST>N5%8VWsF&oy8~7>z&Mj6tLtt;{CN|h>@A(#Uen3#JA@MC zAX9w%OK*|rXr@uM3>ph9&Ikne3Sf=SHGYIQncc-YE(V@gF!z}%18W=(I}0rJ+VTl$ z!+Yg4n*LTeVcNn*gv*mryyZ@|I99OVSk8v*RUn9)KV*+SFHUKu@Q408i!SYF7L4TE zR*~7e!$+=&KwohQIemg8-EgG8ef`Wvis2rl-z`1K8{7<0j=kJX|M6TY$QP5pN-Jf@ znq-*Ubg=r$@`$hOJO>7>?7q8@>yK&6E|P{~IP>oP`hWkwO;W{{x%IomqXu-jONc;G zv;^jQI$f|bBxrYq`t>!Q0!2iU6Noh;^#^AOBdxItkrt=>HC89+_AX`C(4yR-US?ui zbO<@>x8ZaMQ{xk6TL?UzU#A7Z1~cSbA&^xz06(~l3QbIe^AC7f@sDsMTDW>v5rc7- z<_aGtrNgS)nYb-4kk`N8)LY=qLBwDlH>DX84hI2N^?g%9A*Um%284wG%rdCCD8dZ) z1-7dj4zA9Mfc9mSj8A6)uvSVT%?Nw7ij_AJZk?fES~O`|tWF{%*o^fygEBPA`d0D| zrZBEwns)L^Lr7MjRiste)NNmZ=yNL0u=cn#+0J{^TxANRHFev*OdQJpwM=+$3+tF* z-qR|zb)fR!3Ic8vSO|+$!;JVW=(m%|W+05EHo66J*Zwe@-(WaNH39wc55rz}@DQLF z1hIL+r8%a3K%X)Y;Y~*Ajv8!e9Ee((_ zT{utUunn}ITxtM({==g$DyUfzk-2fjjU zycql5Znxd{X8D!@h1=-v8lJ!x@~zy>Vwd@mEN-2beQ&Q;3l5T3vTw4cYBu95p+=PCe!_+#SqLE=Jk;*`T}K9#7Ln$P3EW zpK+LMO@eH)KrZH1_s^#<|NPfr{QU9L=qP_2KJ}l^-b{{;2hrEbvuNA@witZ<_~@(j zhwLv~GZ2S;HaG3=?Cxx9NN2?sBXON7q8?-3j(J-i6K^fjlPs9E^K*C|J@qbqW3F>@ zrIFB8$~z|sQ;-sjjBl4iEoe*2*GAiJrGx&X10;&&NdBQO4o3J^-qHrrU>gQwlbNcG4iv&{`BvvgGwnc;bTH$5jVRuEyJa088%JJ z&hoT4$NnIDp3gsDf~kpku&8*I;KisCwgIE{Xw*1K7?)QjTae3_J85#@N?EJ|nsFS(Jro zHc<&G*H~)xa8&JI4w{bII^)E@h?9B=7$lC;;djohxDO=tyUpG|e`W%n(G!VUU|*l`ug`O7pvx*#tFl-6<6< z&N#T4SlotIlttxp#wyLuMZ3gO&aUkpa>n+VcmQLIx<*`!;kDEm$%b)SHNZ8~I`9$- zCuUGM%^!G=BjuWkBT24pa(L`3oD;kaBgTJ^V4`2J?J{Fartv4vg74Ezqw_52tAMz8 zf2EDhOIOamz>-@7HNR%L4{ejX!hsMM1{Y3w6V^-L=-MjjSQg0c4y?VvR0v=UkK7Fp z#zbQT7pEi-T<8Y6OT#JPrm?`4oLGfk=A?NE(WHchMZrReF?TfE9^QU!&Zb zygN)}22Kg@FkxVZhs1WHw!P=3>K~ha_=Jd6lDDIzXIo`6FUq2oj)PYY_s~6pWl#yP zG&41}_cW5LXHUO=sr0JteM_Wd>bSAA_5v;OC{EbNm5R0Gx~9ZuEwDq?La|cIRnI$j zFlRi*Bcit$8_70$V0gFl9TJRAH1{+faqTD;sCnB7bPvf6d!=_YUY6yShrZqC0 znvHY}Fdb0f7oq8$JZq9nb){`7CPdI%S)_T#OwqINR>Qo7I9 ziu{zwo$?6fBbzSoJi-HtmyugAJ!6@1*+v7WsIU?guIKzp>|ZgdP)odd)Ve4H#xj&8 zgPp4F*x%N2Tb3_baVIGNVh0uAP{hA#euI_tOcD1r<}a#qa-PKU>gtJnDF!34IG(Bs zW3t+d48n!exMArqgPmA2tJy)Yh%OQmqPZMTbotBAbI$0}Jch)abcrCDWHi0mg5itg zWDEKw9rrW?cc86IdIoUi0!12OTcLF`x!Q*o{F+Qr45&>sM!kvB64z&9WsMHcLP+4I z7RF|3MzY4fxIzrTg1FKY^Rlv_5+PtI^u~wrZEZF?x6l=ZU9F0k^GAn@l!@p~^#rCV z&%NO>ViE_w09zz+xsu&BJ=-!oJ1BtM?nfc`c$nlqzzK}-qh3gXU{qJ>vVf;&jYEa5 z5g3=G<;GoZ0tpQ7tjp4O;PW>A)jCaNpW;U832#{ktkxBL=fke2wsxKiPI8j6hk|07 zFdJcYfde&5s2x33t=gezRg@b}G16H#7`Sck6@u-w9FW9EhEjwWZAUapKvUWzC&{Y< zrsoL`9Z1o|>7@gTA_`=X8*>Fd!mXiLi^+K~jithn3}KEu$1DycI4lq1&``jzVq^c( zI%uqF!USIXJx2ktwnQ7UHk<7e+5tA!FPuTDXlxDMM3{BT5 z#0mcOr+;^=WHOF*f=;qW-x#gk$T&!a|d!Hg%tq z#7kn@@|1mB@tA3av|}z_Mk12iKF73MXHm^)TB1+v^(!`1a|mgh7K@R@t#ew@)}JnZ z{HM-e&UY7mWEOCvZj8PhDuf{9?ExH>^t%n2rEr&wS<$E3SEz;4DoG&YI)U(;5mzsn7)Gn(hE? z?`+twt^KD$TQGy7$G!^EeE0bXGFjNrNdFqGCUp=PE%cAUn$eigO%W&|bqTQvr5Yob z?&JWv=~Pt!7A0)eZqNaaOmX0Hm=*zuX2Zreuqd`E&LlbsTAM2vv!YrHc!ippW-8(` zS0AzJkV~h^8Ol?uC39`oV2ZSQt^^2G>|gB~d1uijiLL_ajDS0FgwZYZgURkDzJz-W zmX9l3D`dMH9RaB`o(7p4FvmXBDxGP6mwc06;LNsEna5;;^U7=*;5ZbYg&@g6ar}6n4ZrnHcEAuHvc87dG+htSOxfFGXxHbaB zd2{WZ>l&au0><{?M01}7>YbI6&P^9F)9fKHWF+ekD0!gY7AVs{#9 z#=?_Ti8$=f+F0s>t)WmN$5!P}Ex_nVY_b)xc{T3;G)>R)hWkp{osDCqfGL8co%}j| zs_;N|m=Li!kHbY^sS1(Il6uJ-AWCBQiT4OGY=#2id?*|x3yBvR4tS|AF({Ej-9Z8~ zCi2SCWCG>tSgVYJ;?GY(D;Q@5sL}_nP@l=^ophoO;LT`zgRl|)8H)?mNm z9n)s#3hCIsh6jP58whXZ*6>uR58DzQ*wDqlz!9otr=U!5G^_AX*Pg>BPqlJzm{E-_ z?JlvU-6pm)aM{w^_jS4nkrgAMATo*OEJ7axwfKwq{`KOfVCnB{cY8xb_y0jZx|)&f zm3XEKg~$X+)v(%rN4vqz0W+G36KmIKF?Vw|8#fb{3?2k_rzlHPK@qiY3JwdQ)<>CA zcEtHD5>A^6jGd_>U^-@2p<_+ImUaUX9+xg_+!AdW;KahG3Ao<{3`oovT(09PzE$x} z<=I$3Od9;*PEMxC+lE#dBjzYTEl;1JrL@!&tD_qz_)YtE(=%B2>=?d?Mm%uEz>U@A z)JW{DofJ+CqP0>SimSvr;>BozH+$2|(jcj5v21CRgX755mU<(TOL!ogb4@#Ols7gb z4w>pS*mB1R4#9vRYHhYx&zi#6^2w_p-HPT0L1T4Xi|lpX!;S$et2x(Q(-gM^4iveaS%R_9sdmzGkr?1b8Jex-*T#6u3|h&68T0%^6E`98kTv?6fu^B*3)NL$zT zNvlZ-4b~1)qiitv;ZdEw_Lt~uzlpvMOZvKLF`sRGT#MNNP$Q6@I{ia$hDDTmkMF|`?*$FUvbM1AAS#b({O!khZ+O&qao z0&z!5X;*C5i?ouGxLNm4Jg)Ldo)nggPt*e%Cq_)id-P*YFJLwb8D%0H#kf+fayyNb z&M))gz?xl9Z23?l2^t^6dVS$NHpue!qNN#Zhh)cwn7X)~dD(yyHXt3Aj*hD>YVWG8 zexbq<`T)llJH?o1yRheNuQrM1&JB%o-L$PYJ;sff9tyQ>c@>*9w3$krJtRaBcj&PY zLrV3Um6x&8GFPdeOyY5@WDI0rR*`|QfU2ukcLUFq^i7H_;!b+CyYt1UX%lpffG6GL zh!uGLcuzHi8X+9r4HtNs?K9gj;F_ww(EsNbVm?8IgqSfm72(_CNd`5BKElGi#KIt; z#uhdtIvL~*Wb{x18E6Bsf*;SMjIyMQVK2mSSbYzl4%YcA%H`Ml- zQlYR*ZSfm<_Q5O5v#+J)jSW2cC;fSAk#mBh9@v1+eK5y1x*!o7G{WH<&cLbLm4WNF z93727 z=I?RcGWrz)kj!4m#ZIecOU_W!l|GNS25l(2feVP`ihBXn%Y5l|Cb=jup(j)NM9(+b z_KG~3PFj_`Gl3q~S|$_8b+(8Ff(`Ns!X0b+O9e+rMQw#iK2?n7R0AZZv60ysB|u4L zeByX0#ZfGHK=fWF9~BG-#NOVN4#{CNq=)y|AOFzZ?L4fg3<_R=xYVlFKn~m!MaZR69qtCg;5CzM%j$TeAPO2Z@*4Gvrfi#DA78SQ^LdbEpJ8`nSdvj*CYs&#e$LBf`)vW zJP0&ovLG~0Mt;x+%M1yZaMLkL$1nkft47|t{m2Jq3?xwvi5jr^ z(cv_vvXLO-qPneXEogUJ^rwetU`vE6#$0Q|#b?KGx@wez+mCW+M)@`>E%J_{r%?&u z&biUprfgYR*A6-u4tI9M4$2>0)}Xc{J}z^GYidf2spJ^hydvt}JjhD*zs!6pU4xYe zIb=qBN)1UrD<*e%`^nuglY1a)TQG%rr}ToB)D6B|6Xutkn5h%7DF z>=X4kXw#Bs>6zqCbDo{W<;b$dDAy<~bEhh$Ag9{AF^Ri$PUIFo`^PpS zX7T576LN7dk6ro-vzMZIYn|=(@2<7=}+{!>})Zw`H97IEyjDhV>jX& zSi^PZXH2bQNVOn|0AtI`>ZeGpXH%qL8OSvgy=f^G$M`BI(d_*e3a#`>F8FvcMJ-Y#s9K#XHMtaaIJr};G@Y~7TUHX>k;iatDIjAY%=f$EDMJmoqhc- z=d!#=dWEReVh(Mh?w#JWWJ1RzLV-|mRmO-`-JG#9xMtOn?%(i8Z?SG=(aIN7I|#KK z3%WYzxw}E0C#IOhT^Ag2D~)g`SH1pXp5FDl-@bae#)}=(%w2cDX?l&01e_6g*L{#Y zL+ABnf}*oKIRC%8Jp@t5+<=;bXP3rkFL!=kK=6NLpq37bf+!XYMHXo3DE?7!mOKVp z!bd#e;51PqSy>JxI{N%sBn@!&XW+Can z+}S&Mp1&C8&+_rN|5Tj6_|xui+8@7r{o5IMZlNZ}(+xg-6xt^c>LA$@VrLJR! zRoFr&b1B*4zw?>2#$&1b^2zyLHeTc2<=sxdqVab&#!t+ZN`27fp$o z(}V%$-HVW%?w+MQSk^856NsORN0i4{_K&zt}yW1Q$O97deO~ENw3k zI*Bmb0F?qceDR!`mqqq@k-fJP%j5EcrKb13|9(Emdue!{{(!TYUU-LjIj!!dxw@S& zA$|I+zerF9L3h`;>`Hr?ux;?`^vVW$i;MFlc^8Z?<6?P??si>kTxZ{pFM}WFXPvWT z0r3E9@SNiV?bzHluWT#4+#W6Z!!X;8e=uzUTIQFZpRaA8^3`J-o1 z!HP#1O(npHjqktw97ZVCCr$u_Z6hxh$wj7u)rC<)S=ki97P{y1;UW2#_U^9wyiw4_ z>@67UO<_$%Fh^_-is3!1hR_f>2WmNJ{?gtn>&OXS#|`&lTTwe`F1`uQrQ}s+pFs#n ze3Iw@Pt6T%zGgW-CqX)@)xU;8fhSc8Ve?*t)AJ(IL|8tMhnoHR%g+cH6e&GahzGd| zf_h3+lY^?V$a9htc$s2q`)jU|;l`y0mh5CPX<5k1w;n254#9Qqb%mmU2ys^#(m{P4 z&8k(E_R2e`$6=a){(=X3u< zQcm0#Jpa6eqvKUEF@e@u8^Q*B!I@cX2@Hi^%S{FdHKCC@bsrDKUiIyf)|L~@1qs?K zXz-D#b&y^Nyc66%^HYv+d7Ea_@FETw7@sF_sfh`7RMx&Mn=YPwE;4Om55e?d;hCSB zPi%HPWpFt*-dNOn%t4F*?SIknJ5!QqK~7?5oCsJBQ|JQ2PKEWTuE$45M%6W#P|Q-o zXu{RZXm4`)3KDFzlB>faOw|Fg7r-Mr7Gqj2tj$KzaNi7!AEKoV7LK!`^XcM*QM8cO z{SJ|!Z0uwdsmENM^_QRNw_kof3P=ErIiShP7Lrz}g%oU&h;Ls%yLKBx?WS($mHk}q z*zyc9gij`WR~_XVgDEvexk`bZbEdtzNOfbmnGl?M5h<3_zhIdz6PFh$vEq46yTUo`P#yhE)o#NduYj%g=0`dS%B}9&z3R z31e|Pd#}K18%aHsP9fPs;JkwD(k{j|J$b{=&oDQP)uvLBvo#Up6UlldINCxh5eul1 zT#ctxj((ZRBu8JR$K=Fw24^X@o*`T7nxmHysC|;LTC(n#zBP&ILf?o1fI4wXn0^0p z3-&BDzr2g zRY(f1Zg)RZhQYnol~y3VFpG^7+g6O3%@&Eq&`;9wLV)pHIoz8FdOy4${z0{2-PIzx*&9vdNtv> zRgs>*C?y}cLHL-4KnOieWrr)xVM5YCQwyTzg_aHD7~U`F_hXnniVOPt+0Iib<@MR% zad9ywJ(jM}7M=6=lZ?KJdd3zzNIPF@xUVcd((YM+f>B%L$u4tsoj(pj`C*Y3(IZje z4kh{$5&#!F(h1_&0xNLccHk3(n^0n-eF0+Imp<;6`OD22`P0hx4H0+Q47^iaEcOsp^g1fbUL;zgQMV4-7bf$q!wC5%a*?Z5x>?1Z%?Ej z+g6OZ*GFj~B^$K%a;DhCX6B!cLc#1!HaESHw!@qbBrJK7J0e+hrfJJST&%dty9|WnoHitKJ>3a}teBPDEsM^H6mXu7h|nUpwLC7SOB~48tts<6#U+H} zrPEQ6A;jJzk`e!i%|B(Y5OPZ4*9b)ODoY}*HK%WQP1l}O&i{$0sGw~mgi=S#jqFc+ zhU<|@(K@YK#fOOXJ-!CYRt7~)k#Wico|>hHA#v+e!zvy>(PKQ(q8Z@$P+O;A)5b>xthd^yahGw5v(twT+C z5M)yXP)R?DpxBo?nGtKAJ>Dhjo;^42Ln;>X&=?3yWX5$O;jU**lMM26R(wf1e z9!0h9sc-7ClGs3^M0t$c&H8a%+VfI^HnatClC=7bxZ- z^#erj!$g-%m4vX(7RZ2svkF6Csqzfl6pXb{zFg2t>-Z~~&@ubSzC(3ptIzT!m2M6y zeG)w;Bwh>A5JspXHSyT78adSL84Gy8EQj4VuWcfM$5n9xhfwXIva?9pKltTmO^0<; ztw=yxh@d@<*WyC1*-e-!o zC$%LEi?_15TLT64AO!PgY3?;h5+g!ct{o#gBF$*s(Y>xUTBcd#VyxlV=JPmLB+@iF zj}qi9J>+yeVv@NosE{?RxG-V=hlQk}YiGGGy@?!yf5G&h#7ITiT`&T9sB~XVrk?n1bQyJLeL72_q4nq}CM&^l!DJiclpFl~}$+He=3gGuf(1 zgWm-vABdJxSq3p&rG4_PF|JvWM6)W{niikL;EfX1$#2!TIY-?UVOHfOdPNeQh=Rz$ zU#hy&{Y3JkeeTN$X!~hWq9*n_9e6Y^Qu~vr_MMiR->a9mTXlg&$)SM}h4~W}Cox=^ zt3JOE_9saxTX0UAE1?K%DLR}RTYWCM?MWz-L%C|D51mc$F>A1QM(mN9gDh9ZgH=rAAbf`$wPEeN|h8auOu(uNHD~wr=c>g}6*6NgnsSqBi zz*I2$xVt0U-fOexi7Ww-Ozz>+W85>IHFdMb47M8Nx;BF9nDb$3LrO;KfFO)XrYA6i z3&l1r52hiA*LmZY9-~by``+NNmDQMKnQNPa7NAw0YaSz*>c%`RG$%`<^BAGmBH~)F zsWIGh>R3qRBAmXjg|OzrzQ$GB?9w*0@oP(*)b*Ab@2G5xN^FE+uJI8JRGX9Y!eXC9 zl=4{=#0V~7ZPI{UxZLlVPJvS3cKa&7`O%Z_ut z53grQ0W2b2Xf61XvF(h&5Y`RdnYck-sJ{q2sx_#Y0T-GCe)NTvEmpp-V~4I zO!x+GbkkKO4a%)N-2ZdvIV9(wXL5Z_A2?*0X zO5A9ybbO4o)@01JpI^ugzHA2nsqKRQI)e1!A1qGj^*-ozdmc^z&Ms@>^wt2*I z3i?PUh^AAqyc?@CZ%#cOmU>|zW8H@GtSL;ue$L>6D@sm0XR!>S;;Zh~G)J{00u@er z8ffsp0*B!s2lK#!J;2NyiC!-2=k7l?%9;S8wKWxv=r~|#c|C~Uvvh2C+S-0L-9JJA zF$UsAsQ}tY7?1)qvftlQzNTFd#9w!_w{6F!PRBgP!_FnY{a^VPPB|7D553Lgo5)_B z1Y^u11oXMdQ_qYSXB>!SNC*PTw4yqaB!Zi#QjXbZ(@Qaj-@L*%HKuJ5Ydph@D@rB6Zh+p%TxGLLeYTbP=*(xb6h;1{W=a z)dCJ9vcU;b7%QEhviFeP`fNRz$|jq^9L>xw)`1r2L$Z{a#E4*)K*xw zq~P*E644#v99*B&3uiYE&l`F*v@~N<>RO*V)_c>}+pE@(2QplGLAaRTkEgOrD*ePWU^KEQt2d8e|KFSqf}C zp4B^j1)sxGH1BslYtSJYg>*S`Ll^y&&tGXy6?7l>h6;nx8raokW4u=*V)E(@>veM^ zvDpaLGbF+>icv6~_|ObN4aM~+unx!v5+2M5f;3kXSUE>9wO4xjxKb|QjdLT35?P8*Ps5yR1+!GtAmP9$wEu{=-k?JP7qfgs{_h?sjd8+SVNjC$*YDizr4s| zfuYxl;kam`83<%-yEU3jbRMU6HoVClrSPL_h|~tx5HGza0@ayCCwe{w^NA+erUvT*39Vh^w)$AX+96F0JcWs< zzGm||bIJB%7c_l4A=b>f^&N?*`(yNM#&sppdT-l#!-i|g*=!@ySq^{B zvAQLvH;=STWTqT~y=|_wXMEWTHB?eGVs~FkNg*58Gm6|96y&MG2GrG#zXjRjIn|~B zP%ymVzP4v(eR1CavrDy5_PZd^BN!K839c}c&Ys7x`uTbRnQ@#IXDR_lv3D9h7Mt?t%1+I2;i% zqRTbZcW1cphs9?=q z2?UEkaI9}6zaUo%H7Mz&Q}(5}^t4ijE_dQ)1Dk5hh!jG>IGTyJk=cfE5~6riEG7_~ zS>Dr}1SLmIA)<&R3dXWg9o|zouO(JA3g=G{DUJ9K);Qo0Y0kHBB=y5WZM@6I1ulZf z0-6QUVr<#ylqNw!9E`Vl97$<($#hbozSYR2nRH2E8y3?Uft8ir1(%=5C8Hy3yVhQ@ zp`1pH8dj)3N6QXl;H1$zHPjjN8oIq80Y=7pBb9Vaaa<0uFmOOHU6CM5M~i!-jUhOl zXMj#I<7jKtS^Zr`4XR(SnekbVbDD>3&3LTFT94_B1k@~;<%-@YT#NuKtz)oDh z%`qhkGL2Fs9HC@Le9!Jbfa&-ojh`g@+5>FC$B2aYUM`$Cb{pbzUD&$)=9l4hHt`EY z3(Cb~_kt=b4CAZiqyUDBHwiFpl1@^{oTzYf)vMP_x^r}!t26x=xGqWO!W$ZyzVO~^XsDjq|U7ug%>x($shu={m@$x%JpT4+B(q#p+Esmx@ ze5Jp>53=mbXLY>GbuiQF71px+(>Nrt3}kz$$>U=pinIKR-`FZ|VVcvEeR%<=x)V`5 zASsZ4&FTD)BWE8r&YEO5Yvi4p(wQ9OTkL7ynlDJC7;kY0Bs*Jo+GoAakp81tPw5}w zSoEQXli<+HYjmGW8L{=g>B z+f9lVIWb+hZsl(!DL-F~W(ed3f-f^_Nw&UvFCo>svWb{7Ltpaq#cUR2mmgq5Ik*YR zk@kVRA2N=Cq@h_@O!0WI+Q<1lDhclhYvzkzEcTYz=?g3uTK<8 zF8XRJUROnl1?ygBM@##OT}$E&#t`i%bPCL^7MdM#S$veZxi;qVpVr;Sm=oHulygkpZGo0ZRzl5v;osbiHiO zhcVfgddL3QZEijB04%P8pwjfxCRT>`$|w}>#4w^R=`}7V+U;~)7?&+j<(CTp!^Dg@ z_058meeX3V#d&X$Jk;`-HL`ys&}hkXL;^=rC#f_nImHvy-^RvTpZtHb+l-m7dv-iT%-!G zl#Wqtb|wxu&?tAl1-DR^Squwk%T3&JnnHe~Ackolc#vXT^@5X=jKlhnc`FkfPbw{| z$%6B*4feZ<&!IW(XCb@wFH37$+s+-^o_N81V>H4kW^6{(Q!~M9;%*R^qP+DyX1{!H z02(hfha=K_IaJV-t;>8<@+L?}$Dl1(npy=aS=Zv>R3oCkUeAL-&_+`U?rTn-<#$T? zPS7Me#6o@^n@es8|EX4n<5YEQ4Fl`wRA8WuG(Iy0?{K#)0y~6+zE+28`wI15Z_XJ7 z(CG-D0VF`u0I`2fdB7|x78wH_{OO29wUn9i^+)z9GEnYtdXc+Fzp=*0Txvw}D=nHV zOR9J&%}Y~7urM9xOVfScZFl&WtlWG z=wj|9me=p~`i(cgk&H-tYj?ZTX}s|nvHvJMw6EXWX}s;LU>pJNaK&iK8%@2;QTpzf z*QM-jw>xO9e2jF`v+4sq63V*UE1xLRBA8a6*xMfL4m_;fvUR<`@8+d5bJmhriJ1ti&mrO6^ zwqulZTX}L8*)%^kRcAtHk1vfBNBcMqs~rxuC&Ni+5^nc*_x5)7hJ$bvP4+^HbK{aX7d_s6km_)l`hm<7-l%W#6D)9oM$wTZI zn@I+($G!)#l1c?97R6GHq2+0$$<@#hhiigw;W(%~Xa&l$D7-~P`^y5|t8-HeMBnxv zn~K6511gLd7_9)NG5SMjg4m|0!_n`MrV45OP3nZjaYbwuJ0)8TxjnpyoN1)0_diN1 zq$?bVsKNc>Al1a;YOp{c@&GYeHyY(A;wmQ9QMpg47=fe3g3GP=^Ub)kn)GcSU#a9? zl~q`5aJpzwd`;@tN_pOqQObEJq>@EhrN~s(tHmK$2HcQ-OeqoH@doPhzJE!GYS|Dz=>O0<>L`HaiP!3QDeh}zq7@*SHDO1 zNPE^Obtm2&jkoioFfROgMyvt`IsKJwszeYA7Nhl|YlJtgWO)e`T>kGX328H5t;_z} z&Nv={(jkCg&>MFF#Z=1!)i}{jM@e!lw-99d^%XXF*1XPi&Kd8%+N@Ft|F8iNrihbMGKIi5L#0n#Qbd_B4@5%xM6I zKzYABXUh|3kZ~$MC&gHo1P59R3hEcX{`7CwijP-5B~lC ziM5DYL-Ho0M`2dmKty7`Dt=Q44vZ=fvlts5zKo_PC<1n}xK#WgYGgr8eo^VnH?!I7 z*Ps5qa!q(JAnmCGU%3;ts{PqfU^sm_xum zsXX%*i6|!vFh|HgRlr?H=$sbJ!-NGWIg#=rG1rQ4>NnF-48(op8FJtS$VXvw7pILf zTWe|D2~t4Q!a(9`C?e5fB770YPK8hmn46|S*amnUtU?HDoLwpkiEJExok>h&1O}`S zREf$!flW68GM8p*mZ`dS#L^O*8K$Y$d3qA(Npy)?Wcy`!F?jFOq{uFfoHGwlSSS{A z(}dVs+uQi7%(~4_G~qf7oQ}vBbQSm~`5E;+Z*Nv3e6z?VTQYrt%hZ8PodoB==tSgV zh^VIxM#q~@m#SyyA_|D(4z(03FVaeQ5aE;uGrW{VQ9xQ)nlk9l1_vxj=tUU_ECmxZ zPwm}lun>g9_NM2&rJ5Orej&Q=>!41(eD=?9b#h zAP#%yo8o#*Jp(RrT%v<0&2wd{;hqRk4R_vz5;NXenwi9U4MA=Qa5eOX<7>4-ItD&9 z$efN;DVs>-&^AZ9&7u;Ih8OcmbpCSA<%#o@i|=S&nLWV(JxW5L@-WN}<#oLJ0ECxMGMi<@^CGg8D61`8&pl8nSr38o5ZQ4CuvWfN=SqHq%y_2}V~beXD3{K7KtQe*PhvIX&2^K z_TU^j=|OfJNHfPag<1CeT5@V+YX_(8V zfnXWxubN%vKTMBp2t2ATNv{^gWH=jb^Rm~Mny6xw6?Sd0Eo4n=dYp7|e!Z^OwYT!u zVVnQ&_FIm2_BuOmbj^;7)f4}rwp)>&MahTTal6|OYVWI1iVrht^DbG0tKKu3rlS=v z`s(1>QPZ17@yX3j%V@3BvT_~x`rVwFReKfYo?~kiS%XUc=0p;X3#dcKw>~|qmiMN| z$Gqx;oSuHKwxbt|YXf}bXB6)C zSDJCJ?pSX{$9n5^EbIs29(AWb7>)hyAlmVRai{BdgYI4s4ts-MZ*|G0+esbO-3rU; zS~AE2I7T0Xu3RN|@^9?4y<5?M6zt0tukX~}kCfTs^7c&S_rl!nrXL@k_*?#V{k|xI z-*hf;lveVMvK#PC+^iopanig>a~*E`vNeTQ^EOFdc<*(tzSUjm-pmswd+^8XK1Oj{_`o959OTop->IjZ0aJ<*?(m*7JRY@tZ09H)Qj7qf{@obPV%B zeTI&&nk(D=rl~DAU-in}TOaOFtZ<0&ZEXZqDT0qNe=?`6`h4R#P)4>ip?7a-Xy&1o z_B;^z08>;QgfzU}-y8J1o!<63gL3=QcnN#pTYJC1Ze6ecB^k$kyVhJF<~3?4W^(KRS#;qK6nk+Y0|y(Hh59~_axTq=bC+gi8!wO6@c z`H=m(UH!UK{kmKII;egfR=@6*UvDMGk5Ltp^w6}(i!4|x6?pt1Gp$M+Mg3Hlmq&48 z^qXZ$!{Ikqb?^N%8|k;`-8|0j*lTV-%aGt^jLrx)`q8jD*%wy{HkxW=Yj z?yu@xyVI$6P<&6Q(e>L&%fO7k^6htGyc?qy4k_Iq<4~;0xW;QSu9cfuf4Cb?awXvr zn2LL(xu-dILUVNa z?#a$Q*|{e>_hjc|k)1dnqdd!6v9I@p=brG~6P|m*a~Fh1;_vRM&OOz+r#kmk=VMWw zS(Gg9Y0f>(xu-ezH0PtyoEX)ZqkFP*Pj>Ff&OO=rSY#(dQNerH`90OSr#kmk=Oa>` z{N9IkPjl{R&OOcfXf&rt)9EO<7j^E*&OO<=Cp#aD?C=7uL2~H6-;m^(g^rVR+R>qu zX8o&HEm;W8ioh>(VrSN;b88~hK2 zEV$m}Hr@3>xM_`Me{E_(VEy0hpcOOaR zs`oQluAU^~e-g}o2dwxyo%q9A45vX}lxk2si)i1?=D(K?t-C@uX3o1;zVF8+OSgO&$!D2?G)g};A*a3) z^>rvM5m!uQ!|7eVyr`Qr%yc%(2+b(Ub(T_6`8sj03KrJ-(7AFj@+z*=(&=}a?zQc| z`1aYe=0UpsUEW$HWZ88??%#IEkWd!0TMvA@+xu+?KD_b3<$FPcIqucQy}jfZYbhBqs9`@zME->04ZHz>z*d%)_o3dXH1UjNqJ$QPsUX)Avid2PEk z>9-fr?r5|hPc)qc@$`edskc*~)zfqq&4ZHGN`e6V?3_KB?%9r1o-v2^}_ zv^tUy^A@-DJKvySWN}Kfx0Va@rUZ3)U)-g=VD$!B;vIKr6}Z7$e{YpI$E9|510(aD zJ64z5WH<0tO)XX$rA@C^5&-i{^W!%!C|XWp(+Zaxqq(@ZeXktu<7NqC?!H6Gz>0Q~ z#q2nVE*cuCYvc`@;HqV+zjbLEYx7WfaY<2H<(2MUi4MNGVkp|XE9Ui(z`2py&Ylg+Ojtc zT4;7|n4@Er)n*mbm0cge$MH!yajsrhDuH3Pm@6|bB{ch%iXi1&b>y7~`}^JMB)d9j zXRlYC^u`|@=5Gttmwfs`r@M6r8uU%8=-x2EquEh2Z#I5hxomLP{MPGcZ3j*3W`DeP z-P)bbM_9U>TO!s5t4^m=Y3#!(;%i4}epo-x+THjFG3aYZcjdykvvX(MjWpH8BJ&Q$j4L+VRs|I_kWT-n|KbRJ~+s-JOXo~7d` z&(kdb^dXNa-tRQr{I{Im_-R~3Grq6SWAD*DL>e!mkR8w?$@i&0)0ha?EO^HY^YCx)u`r7woq;lwz<>SLpf{6N6=n1q zyt&)qKHmD}T)}D{t@N_1pWOBE%6B*{5j)hwihW$?155m1J^<*#_``baZ;|JqT*Y5`1y&xR+2EE?kQ(fCx8ZM?$ zb))uc&6>SR6Ev&diVg%>5ued5f8(La^zc4*W)#=T1}e|-7djNQO8DXqm4A|wHdtpTu|0$=EXoGwmcetM@ zqc)h48hc7GUy?5T|VWX&Wi@o7C$!A+S%Z@+@o+x-V$oDId_x%yS{_tU`KZ1l>-*%=9Ogb)sh z2|z3~fYL}zl!h2!A1I{ALgLxg5XU9NZwy#g1GXCUc(BGl?xGA;ukcwIMK#K*56_$Q zbeN8xY5jZ=5gJ@7MKWHE$$X)i+q<#x^$5tK!yEfjF*> z-R$p8A1Bs_V;cx02#JVZMgWyABvS1FBAf+Gu#z6XR2<6&j_YxsL3a~#P&d2;&!mCM z>OF&qrfo!@Zrj3igyXN<1H2H?PXoe|0U8NFK{*W(Y5-e~0OiaBjUfciiJ+CDRHzqA zNNEkg2Ge&nyZkut(g|E0*LtxU3Aw>m$A|l$;@w%&(9IfMe9@2#>-ElWMk0=2PN@_w zv7;1F6Ay7?umhAy5(PrXtcR0wr?SnR7M-7nIVCkjtIv!kkMSi%n|WA-#EhL!AZZ_4 zdFaS#p7fE%$0YK1`OdV=D10J3-}&XkNHhn+Bl(O#78n4K3o7zR710P!7Vfm>~Y!&iw=(^nw`g+xQm1TecAUTyw%h40;psBT`%W_5_c?L z$PDC2aU2h0ALW}643IdNe;>kE16F`>hX;h0$=k zCZ3X<^Via{pxu2uh8yGSBFwHg{skdyr?)?h#TR#$X{!)W*hPF{j6fn*K*TdxA`Foh z>KX9WkSQ8tx(&J>*McVItMS=EZ1E0X*W2odQhl#`g@Dwo+ufrPz4#K{1Jj|Vdii~*&o1OhW8<4x-1^|tBB_08p&&pT{SYV$^j zCk>lL`Te>1biTc#ukEo4`me<^GxKToo9s;b;wjqJCkMx|(yt&A5l#T4Dzb=FQJ`H) zv*xJb7863<_0;SU5a#|~rBSY4aXZ0ej0Q$jeb2dJ&ar*;wQ2${e&@S-NIhVy@4XPg zBxQ~st#2U+5*tNeCYT14L7CLVNuTGiLj-9erxi*>TPVqWpGYb>NY3R~o>Fpd5W0q3 zQFr9DOmezy6RYv}?;Gztk1n=d(4N)cVV8Ql{d7J*s04Q&;V4xH5h4YRl6DkDL_F0| z5KKi8obqY;!J_9q{9tEDJpim4zw(1O#L_mRcy)mf42RHIgeV|HK|rk$KqrNbm5yWQ zC8f{q1C#vo(&&2N)*1CN+zxGD9bldUfam$Y7$FP}m;jCy2UJIW8ksL6H+c<2DU z9)s;AfE$CiS4(XLvNMfZfpLnZWB|qUFN%;-0b_BL0=QI6s(=ugTnTp}=S3@|4Vkot zdHz?6)+E?F-=IZkpqNRZp(RNL9Ds6>%6ZC7ikKr7PHE5@LKd%(HLSiE#10Pmd?eYCLsEb^~CI6Bj4)sY^3d z@nXBFo$Dso#1_kR2t>WWrxQmpG99CY>nL6dX@Hj00>PQYP#ebZ^`SiHL$KD7^^WbV zlk;KY=hta2rh+0(wySb@w*@2Y0psLuN)ZQ}i$c$>P((5*0rWDGK|&RfCh2mSgDiM& zh`L^v`_!T5EO%-gg9bAvj}k` zoU=+Xqx6j+{$kUYJiZ}L$>f~lI0lA5o=PGL z=eZzeS}pk%2Li3|Ka|*E5c}7#*spmVCI|4jCT$ih#SzFrFr5MsB#XyGjtWIEL<$ja z`4@^|alr6NlXgE(^J>zb0)Xe4v>_r)SjPZ?CK6B+6fhWvC=oK^6%>;DmkK^of$xM# z`&{1P)ueqc+|Ekp;GxD`Mk*%+i|jBnkrP%);#1g1>?L1sJE_DsK{|∾X74{mC4L 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
qr`Hn>Pc0;wYMT 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Πy5(i~HzSwb9EAmP}F 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

1JZ+wFSjx9s#2|^M(OF+ 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ⅇ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

>cJR7luy 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

rnQ3h*}*%Aoon@VspMHE0xub+OPl zYtTZ+b_$`32Xy^z@SQ*`+4l!sX`@_Z3AV*BTGN6>7DD4|G)Q5bbXA^BvE>#vQPy5J z!eL|A@*8cB`-y~#9PFGDJ54J)brLl46peNmaku!+S>jdCbVc^xowgy6(2UFr5 zmTS3{r3xp)Cr?_0oEge8rP?lVjIix8&o_0e@&|4^H2Ef3`x)GFKr|)vlnyZ+!U@0! zBo>m;frwVfmi9yUu4^JVz&Yx2<#h8C33-Um2rELDMjK^$GK;DiBM{j2Mi+dxWuV?I@K@{GzkE>Zbf{fRUp_r|H+4Y+7c3wLgswV8GCOW?S*#0NCN0Vam%!8 z+Hy%5cx8#A!)MO=Lfh7f-34=PA%cl}%NQTHxhYE%%+v#OLKPmDJO_)82F z0Ynb{W^5L}Z0?%nvNCr^$dbTjs?y}1UE{;=Y<}ODDo=uB8L`(p1{$}R_HE;f5{B(< zn&)M7$K2zyDocwN;Z0-Z5lhujFwE%a^aQ(PCy5J0lu-(qd+3>&XBR2o>#;;!zwg}> z30d~hd=n-YTtLs}fK#d|fZ$`GD)lE43hbQY&&#+)0t<*R!JX>u`TKWK8_&&=GBvYA zh4j=elHT1?nQx3WJ$MIhEO;aZn}si%FW-+|QvK{>xE~28KjaTVJccMj_SEE;N=zhesIq)}hN%Sk8o=8Zv*Br)DmL&C1#2&xI z@H4B;*19U|3!CtymY~NU-yfILZi#Ik^SEiOZR!Jc$n-?GDTfe(Y9fqBw=2^Oz`4C@ zQ2`uq^y>8ODFOq7O|KN3M&|M*K>6os;{^zmMN0)&EwSi0;yZ4@nqixRt|$;SQ$V#$ z(oujhEiN;&dY9OfI4KdsVgnj*l}8?SZM!1^(}>vDY`=n7eZQE4XrU}uf+i3a&y^i2 zOT2mLj1bm3T@ecp&a%Z}lgMdl-Y{){Fb?b8o*9Xn3%N8ER<`bsbXAr>XKv&D769ee zr+`HD0T{cY%*(m*K9W#p?*I=FW7h+0!O^twQu($bLCjDrmD+}qDq?ueSHWS1oteWt zQ3-nWrmVX@eWg53vFpp%Y?=KtOmX5932()eh*h0}L!~@I!IXiMmK)p9!NC(~n1U0% z!+wlq0Sv(>m-J6^MKz7r~>=Fl3ay2fG&%Z)-Dt+YXqCxv#1_NWB2{(#&}c-}mylIgRC%rq+l-M8^CV#@R< zWwXyKk4(ZVxC09&(+XEUq$E(<>qS{MzDyXfwp^)gc~5lO(_~=&)BJ6^7^;JNc?y~W zr`li*GaSL0<}*8WQ5#P<&7ReR>q!V3AYr(UDJDflJ_Dt%*`SjdzY!9$@7;r-#pu;w zNYq(kHXs@cG9W2}0oK%BQ2hZZixy5B5N(eHRL@bMk4Riv=w}5}68&Q4wd~r}sU0I#)_^&hzN%RG}l6?8A|9N zHfdIC6JL@!IfUq>@)DEqcnoxKF>^RlFiS+dg~m)mjN3?03lP}YDzsS%#oJ)hu()%# zxzX~Xxi)Ud@(X`627pJe=#P>AM;AL6+g{w$Z4mTC0tFu19-Q0&Mp@#zPCd{E!WfcE zsO~LOrgy5UG{(wV)&)%~VVk4V|0VlY0_T1~ER~9uxU*7~sh)7_?*YOncK-ZPF zr4Wvt6M9TkWw-m`<9YPq^SgJ-Icy2EXp3%lZ1M!05VVkGlHT8eI~ZCFBF=JsFenoP z&STsrq}qLqo=A{Mh(5)Wrp!BI zC6TalcaqKlDu^q6v}oJv#r^vu?b(--)(FiS01#A#K9%5<9$e`4*%@aqLG-TKqqr9x zpK6kLSI!_XqNfsy@(c=*)AkB{VY;5sH=xecm7u?HVPYI2iI8ZqKKQVT68dOWaotDF zmdj1iU>grZI0N6o+R`t`c`5-gkJ{EOB1}h9qi1E25(!c-GM;HS-+d|pD&M3KE1qr| zqTbR+eJVjH=@1yyQYep8?0Vd3&!%7p|MR+@U;k5Cj$q_|J~mc%QbU7)(+@ufafY5s zutQ2ONe-nD-hl=qR;-2RV=H zB!`?gfEN1jg}HXLb%rS|Ww+v~2(-LzfQy}O7|PQqL)ej>SfZtdI?o%uc&KpSLZM9>PNT~U~lu8>t?ZU zUQPTDyR`r6r#~0j*S;vgen+p~jW06Z_Ud=QJ_c~#yrdQ*$y$n|6~4qrLVz%;r}Uh788f0ssUCm$|>EnTne z)8((ZZaPUkk@m3wo|Gn z<;{c4<;W5bflxCyHttiF>ZilHb`rKBW={ub8_aXNg)k?)gqU4zCQBW+U2Mf`$f~T1 zRNhd>MZ;YUxJcg^;kMIFo;{VYw8#H6*7#x(D@&4!v9dg?vZ7R$BpvTp#;u5cHtt2N zd;^e>u>Wc9RmxWY3H$mk)}A@3;m)*F&e%R(2Vw1L3cxO5IWAT=OsPm0YUwL74ExbX z?5m!E<#4B9AAR;B(;jvH3up!A;-kuAl4!17we6<-mzzqHfUiHsb(`rTubxU!*SFbx zkpl&kGI`ij3DGFH;6h!XWSDq>!DLF84=WQ1Ig~fI z1VVjd{E0N+7zML+ns>U)9#19g=@~Q!G#<0E9TvMzBE<^a0d!?aFw#SE%9I5Ow&V_Y zr1@SOHy3+I{&I(s^2(AWmZ_+L)+&3A3oTnZ8i(+5T~+vIWJ4AJQA;h>e?L0T8v922 z6cFy18!5mT`^q8yu=1%R;Z=7iP{fBONCKM%IXj|O(^f$+Y9C6BImCH}8A1qR*ZN-J|r^+?CF8GNbC*T=T?yV-F2VG zcaOQlhWkdFoB>pz_E>Leyq-ew<*dEJx-h!OC<_;C@S(*IQC02kdqNuNX6BwsNY_=# zf2J=6?gc^`n~MhkDT6eGekuW64^a_UP~rN2K%V`Or6{il3D)|#fG|rAOz~IO5o3x(Npvf&lv473#NX(aEve5$&X&I6u_@6qD#AmtYW%~OFae6vA8jr`o@Ap zPN}A~0YPPH60s^Elgh3Ma4(Xemgu7;sW}CedD@>!4f@`iC6ya%d$`~qT;oju+?)T) z;Mj@tFLX*D8dtn%f%dn?mac~_2KxuqUzo?gqpbRxD>!y5aWVEC{Ed6eUFvr;e=1=v zPb`{9`Dsaz%X7zD2uT<1(2#_-d}9pC!YqE}g)c!YPo~;JBpXF(T8fa;;;oE>mwoLK zB1n4xgdaQf${1EuR?vEi5UuZjZi>xn^6TDp%`3B+x@B5tQ?FarxNmU?#kX7cGTeC7 zg26oQ5nAjhX4=;!3EFw?;b{h<`%=O5tMT@}BmAvdocS!EAe|CjP@_ z4a=7^x?aKUID6Pw@1}cqs%^5AOQsg{`fu=FC z@FsOUhbFe#dPzYB;OsLxu@>59Q82-8frvYpLpNmb?5f2aDp?1t& zMtQy^Wa%xs%n<@uTXo{E+Uf{q{5A1vt=>(Q1q-JAGqql@*j{@Vb}T~LV;AYKDLUf^ z^fBBYQ}_lfKh^_Mc?ng&WXuJN*=)02!Iw|e6Pgl=^aIqy^3@{Ev55X?C&g=@s25*$leqF|`4L; z{A9cftX)?YwZ>KTO5iN46{`~Uv8_)f$li}#e!-I)XzNHM_b|Y=uOrc(YQZ3V{v4?H z-%|;o_g`IFU+Y7Bo=Uj9vox-!i*T(hpGq)1PiPosou?A;4S}884tL|Z6|B(b;-UaR zu1&B7c%o7kyfc2ISwA5-x}QoYu^;0p)^CC*73gV7y_|q(E81PgMF-WB$|sqG&^ou3 zg;>EejAc&CD)VaAV|wG{ngRwGXODB^J|))_$#BTh1PLAKa7;4bs4Hu2Fq4GwdeaYN zcgHA}1D@{Qt%HJI+X2Hd&m>gXo6Y9isCI=fmqzkcjp@s_N%NVuifag)`W|<`vOs{) z#(U)2>aC$^f}OIU%O(t3?%ad~{5t z;di6u-Ld)iVsgK^Ya7o@@)%IG#<0PZ^hn+aOk9`8)UKz>&Am6bFkuexRas@u+`ARj z3;qxO+uXgU%R2i^0z95WdJg$j;`&0ljQg2{bhIFT&VOMx66aZYu}PptE1RgYLMtE~ zyL*u(3*un=p0Z3SXIW>keC2o^j9zoNT4*dqg0b($feCC5D=ezD3zVfz`BKscf6yh|WB0PN!B4cCb7q)1@6 z_i+Jh&;iu#DjD7!1JN=*lMr*iP^l7jdL{y>RJq6TGZ8qK73R#%fm)0zy-F9=!Dc*- z*_Kq7(K!09ysyA_FmR~+Q{Fie><)-YKxUXg{4)u4chu8}0@_}kE$o?uygS1^2v_WG zl4p(beMbV`nPU?6p0XgREDknV^d3;J%5g3Ues{tqZkg6*zyCL69$!F37{F39{RGl8 z36|$=?L&(B={H+^Cc*SRQD`x+V8NK30@o9hKWR^}V8qU#NvP$TiYp+>jCK3lK9k^b zM>U0)n~s0542;b2M6O_eo3fXwe^*vb3h!E$sdn``3rH%cK0+hDEH8bqV>~op$3ynDlHRm2Ggn~7h+ z1aqJ^lyt#}q36v>*LnC2qx}?fGcQfcu|!6K$KU6=uxf;*Oe*Z-F%q= zhA9Ew_=Y^_;5d%zGPh6N+lGN2y#$W?P__%R@|DLg#ZAk+snS^4S(ZR)J5V?GBC@1^ zkWJW`bp?4#yE)`_ckthGMwK`Blzo<4x)B~?p|P?!$+p?h9g}kJK`j}&G1wX_dc6uR z1mcc*iZubo79y;W>Iiss2E!FTlOSkR&LC(WExV>C^WZV|SV(Qv)>QRvpc+o@uTARW zx>}^#6kN|FB-?te;UdA6hA^XzSsW)VjRmh1FvH3UO2D_HrtRuX8F~Cng0;Pkv(^ZT zUe{@UTkHoDfVnr9<5;PexlAuv>N;Lw6b6ctYMu2+Xr-t z)t}vz;P-%gvcO%?sz2m5^nwDO*AgJ@cK@y4cRo~P>oMK*>?p8^B7A}_l;x!2la&!_na6qBL-x}@MAI!S!84z$A zL#DM`_Ni0%5q{+h|3Q12q-IQDUgA6lW=~~l61ou1lft>}uK&1ef)0ztsDynv3og8w zLFKUWR7hY%ynTNm>IkoUb&&cj383i9N93o6s8g0MoPRf@dr2N;=@R9oC!I0z;YPnM z@-mbkZv29Qx5;TR+{@IM%j++Bwlq)S4*o}30l{2;Fe|;p!vb6Mz}bSxsWG^`DOD-a zfuT!O@JvEHzQ-A$tle8$i`2v#`=Ai4; zV}t@?5=*P%u3eP%-3CusidN~COG)TPtm&f45NIcl4F+I#Vw-u}k9NP0{w+GS?-@rA z%&#BJ^L2mHMU*}l(2Y1hE-i28X^Sb^@?!B^f-fE>wee|c;(`o9!t-2$C7%7)yN%(( z8_T(^+o}5P@VSIr!xeA4IAT>HS7c)G*cD#3Exj1txLrv*77SQ~B}eN3$%>bR33XKR zd|d>y5Pk^}gi+bG4bWS$2M=%6Z+G%sg34J$#sCfggfZH(r8=;-E=5cBri8X?cxnDU zA_X)2xnN#6mv9Y`<$5l)#^cMlalg!UkcuEV->fWKu&9{cT&;mY2#0pI?YW30bHG}> zR4EIT0Axdf_A;U@SYo#{H*7#6?hu=c4G2){P>d7Q=2D{0(Dz&dlzmEp%o&*tQ;voj zcL&^|FZ$uh=Mu^c`O8|Qwl=r^IXE59eed^mSzVGFkx_87q-z>WqqmE4OO~= z{hg5dNS&JLTCl1P;0b(9xEG#14R>NA^Lkl!%^vz4kVV&4Rx16Hl?^y!61f?-4JW$- z-5DV6WC`4{Fs;$O+B}!wWM>@L;xh~_OWL?#Ao(a?xUId_(x%;&r%A$}y^S}m>fY81 zmVjq(5dDpxQXZOAj!QtGFwVAwIs2&G>-o8aBcsign2VIXV|{1;bZE~qs(RF3J%XA1 z+}K1_j=4*Z;TBf+=wm?-djzfI@h!?atu>V}LC|XV#_Yf!)u%=t2Re&qQhMS>^2o5DCd*;dT>@ya1v-WpvO!~Vu-^;IK^ub|) zY;hz>fLqfBB3`gsx>F>8%`hyn!`8`KDVT?;Ya{_6PxB=2?(m!%EG}a0p|0UWG6!Un5f3yD&?{7dA`~{c`_WGT%ZVUOMneUV zGt`HUZ9NMETrSe<|G_y>K6NDYAn0%8S;RcUgYa7zIKUx4=H{nT8}eNSnS0pWt}7Q$ z1lE{Cata2f?LtTp#a=fv9^#pd^B34A9B0};R)I1jPq{>4j7)w0c#Qi6^8!N%@+<@o z;2rWWLaqb^+D@uXiJ0yRJhEL_JTySNcehWRN153QIbw-OcuWUyfyz|xl{cj5W9ZK8$5e1CR ze^>8((E4jqmKR^TIv>5VzvN(sfz$DH7jnH3ces|p)-~aq=;`u?V$UUO+~q=uV99F>A4Z3x^`h zdQR`7-}lY$I6x{&c3S|i-|4VVx{G84?3DgoLf`(S-%!1?U@HpU_Oo#Tm>CWXuse`7 zJ;)r0MlgtF(S_3I%$1sY$=gdc)M~jH1QAT<*F(E9hI21Tn`xa*dak*D!M2w`#kbC& zXU?{sLz~3iU=o*q_=yu7i_f>LE@!P?HkdzubqIxyX#pvGlP$@U1k83|lJ zN{j)P$fRUfY}zi$q}l&&Bkg*QB~OLuGK(YP8oP1$;g`R-IVv|CE&Y`rpWu?6+`6>C z{R8CfLa|);7&p}N5A-0#aVS4dss6v&kfdPSWR`@|o| zq4UQmp)5`6Pz(L-x9U!|u{6OABuHF9nS!HrnnP#75Zn~u`C+-1*wzrbsu*c4^o?8a5)MZ zq=rF)pyD< z5hY!1Zy^wHt18Ah$9m>rKDX5u`;_UkZ_H}HIHmlBSvEF}?6e)3EIa z1v2Nc(Ob05wcl z9e{gD9>*3ahHb|oA@etR5TMfL4jYf(bZSXi)tIeNC;9-cw zJ8k^6EXw6Ic324TXa?UOYGfh@&#ynAfo_{Wrf)JN;rKjX*eo!V(8tsQ#?5}6a)b0m zR)tb(&A|x75pX7QpBX#ns8Qc$G2m$_5h#FSeKSq)Rhu50O~x`Is5P{JLCr&HCvncO z^fPL?b#BXDfDXnuMTNz!wH=}+@@|Pf(lpPE-_%%&BD*ZPkrQ9~aB#Ggq4}D!cO)?| z{9Kn^#cHZbJCNE$GYd6YOq?0?$6S3d_>xtXQw)6$s`+TPzMot?F;@cJ**TC%7yQ|2 zqTM*5UK??)TOEHOGA~%hZp4tYT&K&8dCNE&&X*&EWYAr&q?wGg;eZDsj{|%ANqJR3 zX$Fxicrgy##89;gv5(K6PLx$zgH7hBmLJSYqswv{Par&c%^fbxF-rJXNa$!!mW)@% z$s&dtE(KH;D;R#hJwl8zDW@HKc71OHNR$jmRDV|@A_^;JLK_Dru`-E9@lo=zRG;UjC ziqb^4cg}&t3L)uVLlZ;JmBc-g?cXWVoYCAGOB4gzkAuxTW*BQspVFRu(P(E3#$b}j zxM6C?W$LyC^@0L7zi%n=>QzK^nb6?E{DSXMPBqJC}6fygYuv>a#u z_0Bw%D_YjdV%HdXEEU1Jcw(Z1J85cc0Z@f2KV*qV0;<2E7j@?l_icHR78ZZlAc6`p z_n#}l)x_0P{j;Qyed9uVdr9CzYT7=KE>6Xh_x#{MC zL_)FdX(FE&l|hXi&sP{|*n!+4xoHE`UmZwP6}Qa+LRq=m15U~`pJ|U?K-nH+zj9On z38C=f0ZS2Bei@}_)+n!%zZDVx5Av}Lt6j8h_2T}0PP^|<%jJDr+6o1+U*N4@;Ct^g zi9lcH+JE0Mb)U8Ou}NyY1jNoG;;z7Ab)(i*TpQoh%-{kW2BU5`oMny z@i?@tnW+go53(x~dqBFekG(IVT2gy7kwB?^qWB8>O;%!J?mFvBXfc zvQ)uqegb^roifAdfkaL4AdskAtW2F=W{v($T7vq&HkW7P$8FIUckBHqn43?=fL9p| zb<+}vO~)uf-*>QVWdZFSm4!)UGnUkyZfWY9K?0du?rw9;w{=`JoEB0REQJbEaA?R$ zP%jfdkl^9(A+Bv)NBRm)VPX@wW*RHgU>-=w@OS0B3>4Lru-3d@@SdgYVM~ze52cG_ zOwvVsnU!IBTOCN~Wn}d~Y(i{B2@y;@x{y|B(pneHa3JAl&$%+Rmq}e(@LmwtX{`Kw zB`E3%2RB&;;ZlVg zRZGC>f%ML^;j?k{46K~?blg%E5TiLK7s4%98wDaiMp+rbcH5<3*I@wLBmpDOfL3*M z3NAKGJ_g#94UL47bWqOa!l;DoXJQYx7CrCSk_?FScw&eY7a;1B_Y(#bB3Fed;3q@?J zj!-E+ICJ%PW6WPuPg!DKTbgOls-E-HWAKC(@ZkSE{6CMPU0A{&Kiva2;KBIenE!J0 z;aIs7{DFjU9O&=#MV^sjn)(%WcviyLkTR?-=eT#rlwpDHTsMY$l`?x(p7m9;cvs;h zKGj!v9L*AuG-qFvZfXvv&U_byx|@;xnD!h=l>q)6wXO`ep{L9MX2FwAzoJb`qB>>_ zS6mRMnzdkPw3G)R96dkhWz#@GAArO9qKcm1tsfLT@V`c6LHk3-{k}#=ja_462XCAAfnh;plhf;*4(;s(B=g#fxBE%bai#L@0AtZ zg*|_F^^eMBHxiWdHT8hU-h^2}#8tSadpaL|cA^6bhUvuvP=>C+Tg|j9%?5wF80s+^ zGRIF#<|Oz0#_yFkvxI>>50vQ^!HG^*w2PZ~gujfi^14X0JM12aSVZK(sm#XOopo5c z4S`ASA~@O`0i{$JWhDGzuS^AO3*SnWHEw=m>-dq+HjDG@pTOD$U1@!Onf=HTJWuJo zilZqNg`l+i+#ef=^DzvM?&z1=7Hy*8qIzEK^(`@UfixV#Zddf9Qk~Jq-%AigPjWc9 z5fN)Fk?)JB5Hgs$RZ0A8RMEhUkeE!8z)R1^%fyV54v zY?dO3rYj(;I{;NUo;u}#h|y^s42ADt8~|KEqrbIbc*cJ86aElUTp_ju?;IKf#4okb z%5?XW(NnPDtP5$XEKY=u52nRU$q7?aL3$-?ZI}?FL@;$guFq$1u*s1aXF;7HQzJEh zrYBKWz)iGify~ANC7P7M%A>h;_Z6##@+?cxLDIuTMqSyQsxN6o3%0d)?PwdiEl5gu z(O$qBY0rgJIczS7=qnQKukj&*R1q5Cw>rA@dNqutOpQ-=C=n#YQBRGmO z-8-z2yRM7I4Y|?oA>G-P{d);~2ZZEz0^szGG>IdrL)cxaP1$dx2?p_$1W}0ZX7%L@ zWeo(gca~N$G~l}_-KAhbw>TQzAMIl^Ee@=Wp_34W*p#&t%%1i{NJJJ$j|0grkOJMK zlw}G=>(H_loBQBlTeiBK+K<1N0A_#;w{XR1H^oBIsHCFFBrTLTw1hSDHBgo&Vv5b- zWs8NsAT8G}4>#2wtYE!3tpZ&@cw1qLN?EXA$Uc;=h8x2ZlQac7heSD-Y=levJ9Ruq zZz-|frS|1O0;0i5!5bKncB$D^=6P!`G8vcVOMDR>f^VxVS7hJ0f^FPDw%hUU*pN;L zxQtOlYAB0+IG}`ObW~iA`1Vn*TsNrq=pNruhL;azB_)vCJ4n>?$sTBKB)Hqrpx-UG z(Xwhl^)foi+KR}mJ6G5=5?VOGMHLG>TJv*bv}=I+t!w+Ld2U{jd$XpjqvY!W{Tz|# z1Q99N$sbdDp$j8&UBNO)1hNz)#Zs0j`FS9-N^5-lkdf-2ys~h?JiZ42b`VILktdVU zfCc>SIEa@af#^Q-z5=`wuyp83lyG#feAok9&_4f$4_XE9t%kiN+R#aYo%s>tpBTv)Df752E~t`?>3aT9RK2`2e7 zNMB$@zGYwuBzz5}AsEI6pje{%`_czo zMIw((PF20rRW;WwDEOm&Qy@hpP}|RGJEV7K!+;!$H?$9>m~bZ8Y)>3D8TM-g);ls# z$PwZjy3pzgrvUqB5PPv&Oc+2zRBZdMi8L_76)F4;Fg9GD6xS)2*rL;6HWBhz=enpRvjj0v=JH5NrRJP+Pcc+<3{K$tY9IU=!7)b68!9_N5hShv}zYbKXK0e zRbE8rK&Ee|mnw?!E%&(d?6OP3&5$!4+20jBgxy;hWr>MN zzzo$~@68&f{N!$o%WA~mJ%s<#`$yEUN|)urj9akPe`Zc6FWNv2SNV~Ic>q#{8i}O> zbe?`>_)`|WJ{dsn1SPzbh5j0K#&4lV*^iFN`x#PH{Kv{xL%Y~_rXGjgh34K)`? zw_c+{9syJlF<+DiWj>Iwcdz^TyXtAt;41I3@!B&WmH3esEA7sl63PmQ1QUa4u)S}rF{H}{s@&&A`p2%$jS@+d4SiZ&XiN zJK-3xeU9S1fx^yz0Nx0e*PR=E{y0CHUweH;$!V!m0GJ|9N_#$qqv3aHJcVv@(J}=a zoi$5kbtRnN?@|{xx3-dkx&K{Cf>8>h=o(!1Z&p;l8J|&7s&{mo9f}M(r&k>w2{h#Wl+5fuCN8`v`SWz&9jCbro>>6kFk>kNM zUt21H1Uqge{sFGN7;ho8J#>qrv3zz&p=FF=(M1z362@OB7itu;ph@$7ZB1|C!Ck8< zFVKO){@=cZ-og>eu`0+FjH3ofbPwU*?|{45TyDLW8~=4>#Y7;IlPoEttAK>5bnIj5 zSK0>>n$n4Lt3g?&*aU)`fff<;zXJ22EL1pP-lSZ~q%2A}R#22X;g#jxMp(B+Yo?9m z3FZ-7tOKv0vM9m6K~C(t(w;-XAhq#)&RKG0VSxzK#iQD?1WQ7l zB$VX{)`R3kyI`xdX_X#Gz{Q?re37Y7q~w*BwYr#fu?cmU&jSgLcu0A}U8)5H02mTJ zZTRfAOzb|8V2N0-i44ukqZLfaXWJPT>t~haNknIu30lU;)vqj1f)8R9Np=~qyM>Xv zrhgS(Pul47=TM-42NGiNoM@8MpmGJ%;~)?r<*upz#ymzyx#BIBvx*_*3I>X{kUCQN zfdm1>E_2Po82M?3*DYm{Qk4Q1==KdC15K@n2Lvt}Z4Y0>0rutPMBrzfZx8X`n4h#` z{t_hceVSx(05IzV2?L0|emFoIf6bQNGE%=bN&vv4`Mgf&oOM@s&?Vg8Ptc|uBNf`u za83PHP2AH=!+nt!Uf7Si7HC)ZJdnVDE1Y-3I3&ay{RSe+>PQvF$oHE4)0SERv$L|) zTQV+KD}(IyO*d)GO`yZ_)c(QL$WRXPMsDL7Sq?QMa@SruQgyGJAmnKeFhLS>aP_f3 zR-EJmeSBqBOaMKkaMHF6|GlOHqdiq2!-MCVTR2+enUe(TjPJ7WSdVIRTQxKmE`eEmEZ9p%*35BI#KZ-VR0sXaa3Ey4(FD ziW9zAuW_zV#NM$l_T6~{zsY)%Q~6WX4IrBW##tPDN7y401d!R))mc@U`F$S~I1!pd zc`#&(Mj&yxGsngV`$LpXN(8rXsB0bqGgJ}8O=ZJEcxKrUn}#MAD%%Wg5u@&|1C1Uy zrhOO0J!MvxW}1|YqEWUeYLezz3sF%KWh$0nvZCzIkS9)O=mC{|6D1t-A}Y-dp(9*5 zr;ws%TGGm^2h?Q`%~3v{2Z_0ssem?vw<$4FJL8Qyr1cA3tU7zb$9t%9N**PUqAW21(N&(o}kNUsZufH37; z-&Y7a6ps6AF}MwA-M z$sp4YRekYOP}2-Ohh$S;%Oe5jc}VxM||#Liy|uy zf`xK$5#2<@%^L=JQjg7U7y{rZczQ^`KJ9Z^IIQd&xDXtE4&wxON~(C5Z3!&dK2CZ8 zZ){6wNjqBR`*F{xZBkkTE#+GUifQm%GU^K+XJ`*JVe=-`e~vnO!Y~F7EoEOrn73ws z;2krjv$?Yc*|VGcHtwsVB(agl)lW z%V_QaQMM}tcYqWzsKN(mdRtPZBfi`9utmnITve1Her&bfd!}twmwqOgE4cn};8>U5Mu%cg8rHs8haPVtRG8;}uW>C(8f z%9FRUGg2ecjA1`^B~V{it=6+AB8uCr7Po13XKqJ%5IlkYRZllSg7+O#T50_WY?uz7 z5YEw4$y$Qhk$r2}lU*Sk&R+K@O1u^7C14$2HJbHgRciPIbHPUNhyh5#xLsK$hB^nG zS5MRs+ak1$X*H zjqgafwvPkSXbhRV8LC6`-ZTx(Fou0VdSt~2o37#b#bb&`R!8ONXZ&^~c$y`^N*Ye7 zR?{1##f{g#{1M{o51>RmGwV)IJXsf_t3CU*($jH;U}h3QWcb63gPuacj)Y`e7#&Zh zrG)v+H4}Ncw`WbRc+QQxC)*FC1Xh|BD6c)7#L1{I4><3voA=_(vB>KgCL#!`U*hVX z@vUIyCc1-OLr&UZ(iGDJbfHwj0#Z(-JMuLjC6!R&X`NwS^5lvna5V2q`3R0kFg0;Z z&wcD+^g?M7_-ayVeoQ%-;t1Gt1ZpYUG}Rk%@Pjn^oDpV z0BthQ#x1Xm8M5n-k2~EZq zD5gxqTPRT!1gz)30%H=+y3>hYX!`oY$IDk+=HI5`r0kGP87?>k-ke^{IYUzB_MrsyEb-v# zcC_wDn6*D(Irx}*-j&VC%a94(eM@&po%VLY0hL$K%(80^m8zkho`+=_IYKT_axrVH zaf&NKL!w8VL`i;AlQvS4jmL-yF3h+NYWzie7D_ld#BrXSUR<7jIKEW2CmduNc}yG7 zapmQPJZ_ECEjsQzDdO(U0|8Y$l;SF}rP>0B705m^T zGsXsr_BT_L1}p92x_XbD1-L4?i|!-kWjw5tumBR;Y;fUesfu_|SITh39SJ@7F3WHi2OZ~Mp-uo_NA*%-Pnk<8yyRP6#`meBPH36{kCkk~{8I`dnzNy8>hJOY0gtiPQ` z#W+fb_sD|(JXk-0z4fw;uq%5kv!X`98YWm~wlBjh2Qq#uH4s<9D2u4eF!~ag+G!yP z;dxva;otvfm?>M5I_&@czv@)|STDgkFJdz#--l)+9cfz=0_yM0iTDDext|uz9SPIP z>BUdb#%iXv^3FnnZyu$y6>mHQcxb!Zk>H$d2@`6=;3vMY1276O&mS+{m$0-uQa7H3 zQc-O|*`S0XYF)o@$qlw^aL+zn!&V zxJyV*FzL&j)Nl-}2)^t|$8yU1s-t3eBygl{I;Tzd`!EGkO=YuEDU9=uBW?YV9SQY# z3CN^4HK!U6X-x^rxcyx)jni8F+Jqpq>&cX)<^e}C{E(l0y97SGggp-LG+^_y0o(`o z!4w4Y#>!Zf9SMlY+q}ZhHcvv}9Wp~dgOT|xs=ddP@N4h*SZh{}_43<*R6CW;N~DBj zHYX)n(ri>erAV@TA2LTggXJ_2)PXw^rtGp|yTMNWHQc)?+Z9uOAlus*$C9BHQ1Qe;9HAE zZvzB2rf~^yKL{#TE1p`2RtBuCI_)I@S*rj7*B>_OhE-Mr7k4ux>rss7hK?}_;>uU< zOhTc}XuqR>ApD+$a7#!^_5YBYCKcuhqiy~>O0+k|5(@69o#0u&496@9qFjFzmFmJc z3CjCY8(g|00opJVi|OGfcuTKg)8py3N{zbn@lW@PMM*lA)u1|L=~U~1J~`b|>(HlB`uGp>FMaEpN6UQ!mrQWj0Jl4Fi@7BXDKK*oKGQ-{R{R3Q25WJSz!BuQB!_gT!>)vfyNF@+ z#NvpuF^N>}-yu7Q&_fS(r(Ic34IAjatd+YG9_^1-RFk1U%9kiax*u5=%t?R)@_mR6 zC1$9x3C$Pye^-K?{Sk})`n;*T62|P(N@LQagTmZdUEw}^GdRxjdps%DDR$lw$!1$o z(*zn&7)L5Y^W41(gGmwHeBV1nE!NjX1o&Mmwlj`iZH2G3pURGIqiRxQ1K_K-k<#7WZb#MLwaQ`e;JDfmkWII4+}c@A8j zjCZU&Sa$RSG~SgY#xAJmjT_!@LzB4A>LXsR$L&Ix7-q*>ku0p4jetBvPB`TLTEGg(C&t%hxF!v zL?+=R(@|hFR4#SyO1LWo_vL0&O544HLPgmRa0ATc$Qhq(sichtRDR+`VAf60Bj)yA z--Mf}IY&&YDnHoTs>{uMl5eI_wKWaXI!v~rbjxxBZo)51c2qiqzvat3lJb+zC1&6gJ?7d2ziIgUI;lDq`Y-UyBR(|f%pLVmZ2XBwz~(x z6<3z9Lr9nBbyvcdVRjYR#u*x68~dw;fo=4%J*>VGAng-$+H-*%=d`j(VG;U}S&T!Y zQbP&{DMKLcwZ&L>C5W2EsRDxrruBH62~)esm|L4GkDks15|-`A97^H97JE7q$w)Tr z62K?MGOBRhg(y|5x~^rC@HHO7vPN}~M=9s+N?5j)#%7hu)XL6vfYYjYL^b~zQXXGU zbfo4nm6}6rFR@VO$-IO?dxxq-q=-^h$ONw&JR~^Td*-Xzpt2Cw@J)1AHY`NXcTQOY zm6;iiKEVSjFo-Qr9JaI<-F?KO7wIa@ZA&{LM9Qnu3P$Ue*>)w6*I72s^o5jnCD7I( zXQ$R*m3f$wgwyvuWOmuW=PMoeUdJi4a+qxsBqSgnz1o6zzos)j`vP%+(+0z=P;T_t z6=7fw6Rm7Z3VxKEaZErNZ6B1k4iYE~yOvrY-xiy_vULd^MnNB7-Nx>)F7UkKa%uit z=@2J{{F6tkLJZs>`uGiHOHyB5L>wX5eS*wbIPg8f$I)RB4V zSIDSTR`a|no53X;!cUfc$}_dZDdD>uDtbnPfV!sWbkKayf~r>gD|;Q{ z!Xm4^nFB?ZPn4scgoQ(-M7t8Wp~?~D^g3K;L49bvMc+$-dqtD3zpnU zqlhKBEWv^$nKdVEsOh$k`v+JWwk(63zw+d=u_DS@mN1@UlAyfpVxX@dIT~#e6ZqCXC7HG+ef0ZPlk(0xkk#s$|fH zwce*aBNYTF{f5a1pc%~l<>4fBBRt#KzivqnfwRX?-=>6ev;-1KY!(j6NSX7;q@E&Q zKsZuo@!ORkkL*R+^c2LrW&cvuA+>R64~7tDe>WSxJ`|gWRNzxKEyUN4MLdq7C&MBP zJ?}MWcCtDvsnGgk4PRff1A3>>%%(RM{D&Nbqyp5my4M*M+zYh7Yb+2RAd?JVmKYTfu8!L>{qMLna66qH31w>&FBrm{H zIp6;)`K0WQ7-6Sap9Tac7Dneb^13%h0vsMYp1TrT&>`OC#1w)!CU9wKUtb z+sIDxC;H5byAmw%og-2lw1R3_E^JAZC$fYjJmpUE5o%BC^WX1EP{LE!zTRuu?Ewe1 z2`*5-;|z^$d?=!-F46`X!$s}P?rN}~uFj!Vo?yf?`2iZykealVuTEwcvNq3_-&n4? z#gOocGclV&!or*ircqjZI)F$(#VZ7zm>^!5MLW~R5=pqjODifOFkcdU$P!=Te6s%0 zdn^oHd!9%j8Azt(+Vsr35=PPDg@L_&nk$n*?MZ;dBS;5C4N}&}o_9|IC)%1)L!hE; zb1{haj(&giALf#QlmF>KaGXF>AJpb*;^Q}aWoTQ!v0a^`__OL#ye9w{txslqT(x}) z;RR*ui!snz&w<`(#yq~#jEb@+i!qTs8AN8OkGgLT{oT{ukr*$)t4TFY4uVe+)o{T! zrr0oS(;+8QhLZ0IC`BG2a}b=rS^Sc>yCuX#>b?#xwQs8rj z41)Oq8X0Ri&Xv%zr9Mps`88C}W4;k6_OJ>wD5VaJg@)-JRs0LTJr)A_QE-!l2$qV|5oTALzC_GT zO)ysu;K1a*&1D#k;)>fF@N(9-gYOw#9{&uB+IQx6OhLHUlxg($Bm^IoR*Z#F01uAM zyiG&IeI?)q2^s|#k$KA1hqz-=Fq5$Obv)|A$=#UWK}q`8aH*rg`6j;kwLI!7(#2nX zEsr|Zh7!ejekGqemWC)EPkt?zx|W6bR~sZ@S$Kyb7KOVw$d)ah2wDwHm~GaqQSDj+ ziBN{hPrL^2Yr8C|FY^XNf9EE_>)zDKE%PF(XE-G!9a6H`W;;4u6NwXReCT>0f$5GX zS;i@QtoFe1Zsg=?!b{ZZGj z2%DKR3<)S@vkz1kdzP)Fhwav75Vm`Bu-T}Q3Ph&9yns-Z+|vqzC&V_m23`=aiP?ujRlYdOpX?MB>l7&q;mQ1B&TGTCYV~ZH*c#91UxSotIEsj0Pd8s6 ziu5(h1UdkkAGl1oL?Yf|$c{~r|H1AnW>o0z;?Y=}3t~?KbdowK*0W1bMf5!p${9`b ztbh%TU(=ExY7u`X9aNu&C6ZYNwp;+|i&@!*ep)y7Bs}M7x%m{1A7p8BLWFbX z$|M_y%7+69X^1kj)Kjf%Ou`a=ibl2eCQAYezA-!LTTIR>+meWfa2v(a)I^kROIuiw7qmda!?GUy#RPd}vqHe(7WW4Pp;{s?{90i421!H&F3e@w{xGm+ zrS`4()#h!=QTqXTKXVE)pHwy{$FPP6OWB+d!-#yGYLcE-VF_FJ(R?Fj7tAh|jXMS~ z*!iwPZX>WQ zIAPl z5930+Q9>3IB-SHHS^;b8mpoG@_S}#6{v6LX$5u#HFXOhWN-`hc)Vw{eOLca#lq83darC-6&y zT!*)MnY$A9Z%hx1vLR8L1rzg4%Fk@;2AJP*s(0G_b9(|Xug49Q7zjaQBYj#?_7VIr zR_=omINn2x+Gp@!sho3?(0lHL4Y~9YHPp5S%uE@}gG8tVcOlvnT8QD6IZ|IaeNTe* zT}}{5%Bj-fEp+VRj%y7YQ(!dU;H7=xLU0EqxTEwQl;D(&$)Oe)2vJ|oF^wwPzdZJ&MYY$Z0$7B1(2HzV zlc80V_2q#OCa+S8$Z(gI1}Cg+SVD@7pzFF|9Zl#HV?`3M3?On)}VcWi+MD$r@qET2*}4M zh}fK}hlscV!gcMP(!PYvg9I^lp@vBu0!*~5qHsi&xmJ^^?%J>~f%VR!bPVmWH>7G1 zr`(EI;?s`Wb1o*869jS&Kp_I^bK33+LHhysEUq09Tg+1B+e0CCGhPbaW2hzOE(ei~ zmD)~7fM-%syJG=EGoc}^+=x>wVvyYdPM?=`UjhNz9ne!q-#(?i0G{AuT#so-im6>L zzp0)H_9X=1TTTGj+!9Dr;D*@N+U>bF=)v;}AiW+R7MRu@4>!ZCfcj{n+||A>$r*ld zY9vT)&G!hk71|W2acqi2YGxwQQLX7=&M8Sz!V!cW=m(4?8UlGceg>sd{*XHVkTZx(Tf%b++l7L)`zQA6s z50YeAV(i)hA*BxD1}vg6;Pr9I1R*r5o6$Eja9}*%Abvoz#mcm+!21%I@+}-ngYWP@ zLDo2)#_DE;b%DEJQ7gbpYG7XiL>^~Tq-5kHB<*UIFScU=0J)4cP-l#(FUWky(n-Fh zZA+2gY+R@2lHp4GG!KC%vnrq+GEQlaqm6Re?*bmu8pH|Orrry3#P&p1GQL82Y`TDl z=KE9j!Ymljgq#FxFhao1;?(33jG^t35RBuaS zdkwQZZn1l%8NGABiFPb7;V_k(!8x>aMNY26{25F2wH1%VamS-Ieu+Nm<$fn%ancMkhwi=kM~qgk5ElDfcq(ccCkn<9>@Pz!CzRZ z9_UB3kB(h{%tik#{YmGIUu*vY#emdD2p931|L9Decb%yC>}>Ux<&uD$%@o2MIp9pe zn^6S7kD2-7H}(oE<=QNDHkjsztN=u@pLBo(2PH??g^+d%oRd?wE;RHa%oeKmx`L$JIE+($T;#rli#!|=)Y)xOfYPQNt>FYjPpDbz zP>?Y;{<|hMXicco(mZWem3v%-DJ_2Ouj#{MiCPCR0u3q@x@iVkc6*IipAo{#zUX5N zI#$niNO3>T#-xUlW9D@Pp@CQzvN3_imstv7foRxppi*Xr4x>~*;FBqRA5#Zfi!dY1 zmJ!mc!1C3;4~`oIj-52(jzEMBFpCIguV?Qd8#BQN;ApVw4&l2w&uu{lF3y0sMK3 z--57b^L?aPX+L-nJmH^|M?h+vtp`B)G{AwL;lxeoA+8l+0^#u9?*5gH3(EAzMDthR!67)TY=0m9be%?b2TV%N zf3qEnw3W~;KT7z{RUL#^{0^f41+~KnJ(INSA!jy;Wzl-*b?l^$*RObG6OTRzOK5;) zx1c&~v)R;khi%85etI1}fg0G&Jd_Ifr}0$i8fe|;7JVF60a{PSqs&4nQ@Ese?LYdR zlLE^?%SkS+fg6Xm*Z0xKQR)&~#l_Y;{ElV!ngWi-=_va0>kXrX%U#wx`lHvu6X3jd z@Ce#&D}HerTTY7Eumi3?M%0nOz_Tm!qF=a5!w+_mE&zM-2y2c6B5t?yACe&Ry*4k# zz62nClVwR1rnGMO*)~f6Vr)cqL{eNP@MK-$^_gMJdS`-BR45H{Qe*<|Rlh zU<&@46J?|=fwnJ!gU^7d$cjxlWgYE-5<;V6FQ-W3x=6#(=MbMq*7%{~2E9pQDRRuf z#SPRLq054k2h2HWo-*JSWb!n+Jney%D)j06r5N9Cuzjr=ZJQRSTsf2LGa!-cIXC8- zNps8mmOu{~w&+?WBgloEG@R4K0@o5`Bwhv<`pb$D2`&wg5Pr68FgI_Gq3e#Et*BQ8 ziEOlot0RvDMQiAV#mjdbyiF%|5m7S8mAts4(frpnyTf;2uTPqdqOI+n-94njOB>E+ z_m0E5NVKm^SY}vc&;_(<8&^ZV+l{RhnBuvV9Tts8Qxx->u zMCC-;W>;ATvav|)xkdyx5vb}?TOhf z03iq!YTNHjWrGv(eBOP0%+f8{L=P9+N_()g@vK5e4%Vr2%g+Eh=`oe_!6873$oX=Yz1nt)BHv{g6$Y)=|TfYxe7;L`F?ThvU z^V^qj*Ca)UmyY+_tVzGXlV!(Wz+U$(WQMRYgZqZgGAUI~mk*zb@Num=Gk zQSkKte%hcYs43iRs7J%FF#D;u+%$_{gip#E?!GK7%CIgFD~#f^B|3qR2fk~=eh>BE zB0&Rw8s4@UteNL4t*nX%{gSIo_3TT~ad+AUN(AM5BrFrKcSgDZ;mZhCE zb*G1;saX=r3b~_7I__ftn?39?F{k#32!WfS4OCCUUIuDYNXS;Qfwp-e$o~YJhuOX?Kh~c~Q0@z2PV{eEh?6Iw ziCNG@dzOvI+Q9W^5+2(o@wwxsf%VVoRq02KXCn4`#+#7u0lJcAxOiwgAz`m)oiOK{ z6fS?X64%4h4hXUHfl&zQxhSg;i47W+g|Rk($3A4PTEG=QYpxQ!as_EBQU z_^OZ0Cy%jrcc%qu)%LEtG&<+qAPSw>id7S9R2b9+)}BdVYxaz_UaV&Ti9>{3g!@hp zkDvs`KH_y5^YV<5bzo~B*@kBlM*0XIec2J$KkmgBDNo<+i$_O<5KXxs*QX7~^_)5_ zX_L93EN1jf0yD2sA>tt~l%41f(^edbbcctNXc|(q0Uk>2u@GYN71=NAA#~R2&jE?K zm`pkl3~8Tg8}4jCT%&rOkBa;=3DA6s{S|ytfYUq_61YwP1)-4{huns5^i4Mp^h{J* zE#fINut7yPL0%nYvm(6^kS-3Akf`5?zPC;hL28C%-XZPVBSC&4IS$+v%9e!KhgD@T z7XpzsoXF6Wu3bqFdo%(w_Ctts zjUPybM7}7S6=I#c=SYuYZ~TUb8!z$mw2dp9>tJrcd3I?2t4oRgOoHN`Te5~(N=e>% z>Tfk=(NADI$ity-Uhc)qK!0Fc0-71)(zUp*~OK9 zV}cm#nX)rtwlagNlTRkfXA;QsQ?vn|Ylx z|4agnE_aE5)A*OT!Y)WCNGv?S1n^IMMY7a~y-VwBMHD7bef@T&N!i5{;3$N%8}q!k zSRu@I2T#udcUFP*Yh&bo{afsm3#JUEEGy&DG`K5(g-|Ighcz0f%y z9)5x!9*hNw5OFBL!s8Bwuovi>4F4xyzOd6ciAOD_3bQ$ED|iMyq_gN*rSx%F45+}I zSc;<-vjq+VULmu-FTk}Af;Ik0`^vg%tYuVurXG}Gm}B@gqt9L4v>i<>M+)pi$JljL zO^U1@PlBWKW0LEoi$l^5QeoH(;2`-5h>Tu``Eawi8E(IL_B{AL*nYKzufk>xTg387 zz8R${upH4}io%*+>kGK6Q6+U;8w16iM&9>xRUd4;(Mp6HTnJ(FO~ zzx*kquCkWLn*qp56Pf~3Q80D+Q$Rn$eCnm0r!@VA!I-+=r0T1s>`Y zn`0>p$Vm_MPT8vt`6ICY4hN$$$NHhN(GIK`QlYOo5z3Hn2e*txMW4Cv@MY~8Bg9e~ z056@%&mCQUSQY?D$EfUSoOB0Ds$xv4DnHoT zy1TpEG=CY7HnU>fR=ld{()jRTE(1hCxdYQ&Ba!?woEXn0U>mP~V*}o_F>X6zKi+)f zW^fTL9ADtA@D)S_=;5F#qNVZaY1#qXjitbV+g3}#Oi5`0JZ8|>s6(dx9{9Yr+Z~J> zIQelFm@`!TGc8Ol1_X(=cVssCyy-Q!dHcKXzL@_9dHf|xwDVP}SQ+A_3*glvYAubl|)0E_W1}WjP@#*3xE~++Xo=h6{o1 z#Blc35F4bj+Z|APQ6&l8@kshHasHH?ftS z>?p(v12?~GcN$k|c4rlqw7ruW`k)MuMs_W6?v-ZF4S^pPRo%*_{}55aAev^OUi41j z*SLervENWO0yB+r31sBy`?7Q{F@~>iAd;;2nxy1furf&S=Xht;7aIw8emUuym-{(W2#T95{D09WUCgzOYP$K<=MprVW~>`MmhQFnPB?qDcxOn3p@0Mk zmBsDHtj31zIqRDvtl8PYhJEpfN!xbT5&+mf+=+HiZtG6s-!fD%uxBT$OrU$io=e#A z4W@_PSkBan?aR+aF>ibIuDca#qwDS64=5dBq*b1?&n5WytUn>PL_}q^RYoZHU{?OZ zjF37E`MH21?=6lEKQK?r)`^CjtaT|^o=c$eqajslg#(Q4TJu~2jz465VK}t!&O`L8 z?o7G<1j>lIo6_eJ0(_NooR{j^a|!*uidSB070)Fc_`-tO9Oe8SaGr};@UJX~hn|;1 z2@{Sr6gM

r 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 H7Jp9wYuw0? literal 0 HcmV?d00001 diff --git a/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php b/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php index 5e2835e6a..7c817c2ce 100644 --- a/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php +++ b/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php @@ -6,6 +6,7 @@ */ namespace Drupal\test_page_test\Controller; +use Symfony\Component\HttpKernel\Exception\HttpException; /** * Defines a test controller for page titles. @@ -75,4 +76,14 @@ class Test { ); } + /** + * Throws a HTTP exception. + * + * @param int $code + * The status code. + */ + public function httpResponseException($code) { + throw new HttpException($code); + } + } diff --git a/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml b/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml index 240842349..a00d0844c 100644 --- a/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml +++ b/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml @@ -42,3 +42,11 @@ test_page_test.admin_render_title: _controller: '\Drupal\test_page_test\Controller\Test::renderTitle' requirements: _access: 'TRUE' + +test_page_test.http_response_exception: + path: '/test-http-response-exception/{code}' + defaults: + _controller: '\Drupal\test_page_test\Controller\Test::httpResponseException' + code: 200 + requirements: + _access: 'TRUE' diff --git a/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php b/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php index ac6af1491..d51f6e3a7 100644 --- a/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php +++ b/core/modules/system/tests/src/Unit/Menu/MenuLinkTreeTest.php @@ -135,6 +135,7 @@ class MenuLinkTreeTest extends UnitTestCase { 'max-age' => Cache::PERMANENT, ], '#sorted' => TRUE, + '#menu_name' => 'mock', '#theme' => 'menu__mock', '#items' => [ // To be filled when generating test cases, using $get_built_element(). diff --git a/core/modules/system/tests/src/Unit/Menu/SystemLocalTasksTest.php b/core/modules/system/tests/src/Unit/Menu/SystemLocalTasksTest.php index 802f5ef84..54e67902f 100644 --- a/core/modules/system/tests/src/Unit/Menu/SystemLocalTasksTest.php +++ b/core/modules/system/tests/src/Unit/Menu/SystemLocalTasksTest.php @@ -44,6 +44,10 @@ class SystemLocalTasksTest extends LocalTaskIntegrationTestBase { ->will($this->returnValue(array( 'bartik' => $theme, ))); + $this->themeHandler->expects($this->any()) + ->method('hasUi') + ->with('bartik') + ->willReturn(TRUE); $this->container->set('theme_handler', $this->themeHandler); } diff --git a/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml b/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml index afa55cb55..3efb45f3d 100644 --- a/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml +++ b/core/modules/system/tests/themes/test_basetheme/test_basetheme.info.yml @@ -4,6 +4,8 @@ description: 'Test theme which acts as a base theme for other test subthemes.' version: VERSION core: 8.x base theme: false +hidden: true + libraries: - test_basetheme/global-styling stylesheets-remove: diff --git a/core/modules/system/tests/themes/test_theme/test_theme.info.yml b/core/modules/system/tests/themes/test_theme/test_theme.info.yml index 4c1568c4c..fca49c240 100644 --- a/core/modules/system/tests/themes/test_theme/test_theme.info.yml +++ b/core/modules/system/tests/themes/test_theme/test_theme.info.yml @@ -44,12 +44,12 @@ libraries-override: core/drupal.dropbutton: css: component: - misc/dropbutton/dropbutton.css: /themes/my_theme/css/dropbutton.css + /core/themes/stable/css/core/dropbutton/dropbutton.css: /themes/my_theme/css/dropbutton.css # Use stream wrappers. core/drupal.vertical-tabs: css: component: - misc/vertical-tabs.css: public://my_css/vertical-tabs.css + /core/themes/stable/css/core/vertical-tabs.css: public://my_css/vertical-tabs.css # Use a protocol-relative URI. core/jquery.ui: css: diff --git a/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml b/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml index b4aca4899..bda89d41c 100644 --- a/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml +++ b/core/modules/taxonomy/migration_templates/d6_vocabulary_field_instance.yml @@ -19,6 +19,7 @@ process: - plugin: skip_on_empty method: row + label: name 'settings/handler': 'constants/selection_handler' 'settings/handler_settings/target_bundles/0': '@field_name' 'settings/handler_settings/auto_create': 'constants/auto_create' diff --git a/core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyTerm.php b/core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyTerm.php deleted file mode 100644 index 0a28f5ba7..000000000 --- a/core/modules/taxonomy/src/Plugin/migrate/destination/EntityTaxonomyTerm.php +++ /dev/null @@ -1,30 +0,0 @@ -isStub()) { - $row->setDestinationProperty('name', $this->t('Stub name for source tid:') . $row->getSourceProperty('tid')); - } - return parent::getEntity($row, $old_destination_id_values); - } - -} diff --git a/core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php b/core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php new file mode 100644 index 000000000..a7cd9ca7f --- /dev/null +++ b/core/modules/taxonomy/src/Tests/Migrate/MigrateTaxonomyTermStubTest.php @@ -0,0 +1,118 @@ +installEntitySchema('taxonomy_term'); + } + + /** + * Tests creation of taxonomy term stubs. + */ + public function testStub() { + Vocabulary::create([ + 'vid' => 'test_vocabulary', + 'name' => 'Test vocabulary', + ])->save(); + $this->performStubTest('taxonomy_term'); + } + + /** + * Tests creation of stubs when weight is mapped. + */ + public function testStubWithWeightMapping() { + // Create a vocabulary via migration for the terms to reference. + $vocabulary_data_rows = [ + ['id' => '1', 'name' => 'tags'], + ]; + $ids = ['id' => ['type' => 'integer']]; + $config = [ + 'id' => 'vocabularies', + 'migration_tags' => ['Stub test'], + 'source' => [ + 'plugin' => 'embedded_data', + 'data_rows' => $vocabulary_data_rows, + 'ids' => $ids, + ], + 'process' => [ + 'vid' => 'id', + 'name' => 'name', + ], + 'destination' => ['plugin' => 'entity:taxonomy_vocabulary'], + ]; + $vocabulary_migration = Migration::create($config); + $vocabulary_executable = new MigrateExecutable($vocabulary_migration, $this); + $vocabulary_executable->import(); + + // We have a term referencing an unmigrated parent, forcing a stub to be + // created. + $term_data_rows = [ + ['id' => '1', 'vocab' => '1', 'name' => 'music', 'parent' => '2'], + ]; + $ids = ['id' => ['type' => 'integer']]; + $config = [ + 'id' => 'terms', + 'migration_tags' => ['Import and rollback test'], + 'source' => [ + 'plugin' => 'embedded_data', + 'data_rows' => $term_data_rows, + 'ids' => $ids, + ], + 'process' => [ + 'tid' => 'id', + 'vid' => 'vocab', + 'name' => 'name', + 'weight' => 'weight', + 'parent' => [ + 'plugin' => 'migration', + 'migration' => 'terms', + 'source' => 'parent', + ], + ], + 'destination' => ['plugin' => 'entity:taxonomy_term'], + 'migration_dependencies' => ['required' => ['vocabularies']], + ]; + + $term_migration = Migration::create($config); + $term_migration->save(); + $term_executable = new MigrateExecutable($term_migration, $this); + $term_executable->import(); + // Load the referenced term, which should exist as a stub. + /** @var \Drupal\Core\Entity\ContentEntityBase $stub_entity */ + $stub_entity = Term::load(2); + $this->assertTrue($stub_entity, 'Stub successfully created'); + if ($stub_entity) { + $this->assertIdentical(count($stub_entity->validate()), 0, 'Stub is a valid entity'); + } + } +} diff --git a/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateVocabularyFieldInstanceTest.php b/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateVocabularyFieldInstanceTest.php index 903957fc3..967dc6824 100644 --- a/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateVocabularyFieldInstanceTest.php +++ b/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateVocabularyFieldInstanceTest.php @@ -39,11 +39,13 @@ class MigrateVocabularyFieldInstanceTest extends MigrateDrupal6TestBase { $field_id = 'node.article.tags'; $field = FieldConfig::load($field_id); $this->assertIdentical($field_id, $field->id(), 'Field instance exists on article bundle.'); + $this->assertIdentical('Tags', $field->label()); // Test the page bundle as well. $field_id = 'node.page.tags'; $field = FieldConfig::load($field_id); $this->assertIdentical($field_id, $field->id(), 'Field instance exists on page bundle.'); + $this->assertIdentical('Tags', $field->label()); $settings = $field->getSettings(); $this->assertIdentical('default:taxonomy_term', $settings['handler'], 'The handler plugin ID is correct.'); diff --git a/core/modules/taxonomy/taxonomy.routing.yml b/core/modules/taxonomy/taxonomy.routing.yml index a7a75f30f..8a3bd1a58 100644 --- a/core/modules/taxonomy/taxonomy.routing.yml +++ b/core/modules/taxonomy/taxonomy.routing.yml @@ -23,6 +23,7 @@ entity.taxonomy_term.edit_form: _admin_route: TRUE requirements: _entity_access: 'taxonomy_term.update' + taxonomy_term: \d+ entity.taxonomy_term.delete_form: path: '/taxonomy/term/{taxonomy_term}/delete' @@ -33,6 +34,7 @@ entity.taxonomy_term.delete_form: _admin_route: TRUE requirements: _entity_access: 'taxonomy_term.delete' + taxonomy_term: \d+ entity.taxonomy_vocabulary.add_form: path: '/admin/structure/taxonomy/add' @@ -82,3 +84,4 @@ entity.taxonomy_term.canonical: _title_callback: '\Drupal\taxonomy\Controller\TaxonomyController::termTitle' requirements: _entity_access: 'taxonomy_term.view' + taxonomy_term: \d+ diff --git a/core/modules/toolbar/js/views/ToolbarVisualView.js b/core/modules/toolbar/js/views/ToolbarVisualView.js index 7e0401926..c3b0c85cb 100644 --- a/core/modules/toolbar/js/views/ToolbarVisualView.js +++ b/core/modules/toolbar/js/views/ToolbarVisualView.js @@ -124,7 +124,7 @@ var orientation = this.model.get('orientation'); // Determine the toggle-to orientation. var antiOrientation = (orientation === 'vertical') ? 'horizontal' : 'vertical'; - var locked = (antiOrientation === 'vertical') ? true : false; + var locked = antiOrientation === 'vertical'; // Remember the locked state. if (locked) { localStorage.setItem('Drupal.toolbar.trayVerticalLocked', 'true'); diff --git a/core/modules/toolbar/src/Menu/ToolbarMenuLinkTree.php b/core/modules/toolbar/src/Menu/ToolbarMenuLinkTree.php index 6742e6c61..d1e22a9e4 100644 --- a/core/modules/toolbar/src/Menu/ToolbarMenuLinkTree.php +++ b/core/modules/toolbar/src/Menu/ToolbarMenuLinkTree.php @@ -30,6 +30,7 @@ class ToolbarMenuLinkTree extends MenuLinkTree { $menu_name = $first_link->getMenuName(); // Add a more specific theme suggestion to differentiate this rendered // menu from others. + $build['#menu_name'] = $menu_name; $build['#theme'] = 'menu__toolbar__' . strtr($menu_name, '-', '_'); return $build; } diff --git a/core/modules/tracker/tracker.routing.yml b/core/modules/tracker/tracker.routing.yml index d227f6d97..ed2f8681c 100644 --- a/core/modules/tracker/tracker.routing.yml +++ b/core/modules/tracker/tracker.routing.yml @@ -14,6 +14,7 @@ tracker.users_recent_content: requirements: _permission: 'access content' _access_tracker_own_information: 'TRUE' + user: \d+ tracker.user_tab: path: '/user/{user}/activity' @@ -23,4 +24,5 @@ tracker.user_tab: requirements: _permission: 'access content' _entity_access: 'user.view' + user: \d+ diff --git a/core/modules/update/migration_templates/d6_update_settings.yml b/core/modules/update/migration_templates/update_settings.yml similarity index 94% rename from core/modules/update/migration_templates/d6_update_settings.yml rename to core/modules/update/migration_templates/update_settings.yml index 37e0ef1ee..ad2247235 100644 --- a/core/modules/update/migration_templates/d6_update_settings.yml +++ b/core/modules/update/migration_templates/update_settings.yml @@ -1,7 +1,8 @@ -id: d6_update_settings +id: update_settings label: Update configuration migration_tags: - Drupal 6 + - Drupal 7 source: plugin: variable variables: diff --git a/core/modules/update/src/Tests/Migrate/d6/MigrateUpdateConfigsTest.php b/core/modules/update/src/Tests/Migrate/d6/MigrateUpdateConfigsTest.php index 679350a85..29cf50293 100644 --- a/core/modules/update/src/Tests/Migrate/d6/MigrateUpdateConfigsTest.php +++ b/core/modules/update/src/Tests/Migrate/d6/MigrateUpdateConfigsTest.php @@ -29,7 +29,7 @@ class MigrateUpdateConfigsTest extends MigrateDrupal6TestBase { */ protected function setUp() { parent::setUp(); - $this->executeMigration('d6_update_settings'); + $this->executeMigration('update_settings'); } /** diff --git a/core/modules/user/config/schema/user.source.schema.yml b/core/modules/user/config/schema/user.source.schema.yml index 19990aa0b..81d3a38c6 100644 --- a/core/modules/user/config/schema/user.source.schema.yml +++ b/core/modules/user/config/schema/user.source.schema.yml @@ -17,7 +17,7 @@ migrate.source.d6_user: migrate.source.d6_user_picture_file: type: migrate_source_sql - label: 'Drupal 6 user picure display' + label: 'Drupal 6 user picture display' mapping: constants: type: mapping @@ -29,7 +29,7 @@ migrate.source.d6_user_picture_file: migrate.source.d6_user_picture_instance: type: migrate_source_sql - label: 'Drupal 6 user picure display' + label: 'Drupal 6 user picture display' mapping: provider: type: string diff --git a/core/modules/user/src/Entity/UserRouteProvider.php b/core/modules/user/src/Entity/UserRouteProvider.php index f4cfd7928..fb2ea6918 100644 --- a/core/modules/user/src/Entity/UserRouteProvider.php +++ b/core/modules/user/src/Entity/UserRouteProvider.php @@ -27,6 +27,7 @@ class UserRouteProvider implements EntityRouteProviderInterface { '_entity_view' => 'user.full', '_title_callback' => 'Drupal\user\Controller\UserController::userTitle', ]) + ->setRequirement('user', '\d+') ->setRequirement('_entity_access', 'user.view'); $route_collection->add('entity.user.canonical', $route); @@ -36,6 +37,7 @@ class UserRouteProvider implements EntityRouteProviderInterface { '_title_callback' => 'Drupal\user\Controller\UserController::userTitle', ]) ->setOption('_admin_route', TRUE) + ->setRequirement('user', '\d+') ->setRequirement('_entity_access', 'user.update'); $route_collection->add('entity.user.edit_form', $route); @@ -45,6 +47,7 @@ class UserRouteProvider implements EntityRouteProviderInterface { '_entity_form' => 'user.cancel', ]) ->setOption('_admin_route', TRUE) + ->setRequirement('user', '\d+') ->setRequirement('_entity_access', 'user.delete'); $route_collection->add('entity.user.cancel_form', $route); diff --git a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php index 160c50efd..3964f29db 100644 --- a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php +++ b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php @@ -168,6 +168,42 @@ class UserSelection extends DefaultSelection { return $query; } + /** + * {@inheritdoc} + */ + public function createNewEntity($entity_type_id, $bundle, $label, $uid) { + $user = parent::createNewEntity($entity_type_id, $bundle, $label, $uid); + + // In order to create a referenceable user, it needs to be active. + if (!$this->currentUser->hasPermission('administer users')) { + /** @var \Drupal\user\UserInterface $user */ + $user->activate(); + } + + return $user; + } + + /** + * {@inheritdoc} + */ + public function validateReferenceableNewEntities(array $entities) { + $entities = parent::validateReferenceableNewEntities($entities); + // Mirror the conditions checked in buildEntityQuery(). + if (!empty($this->configuration['handler_settings']['filter']['role'])) { + $entities = array_filter($entities, function ($user) { + /** @var \Drupal\user\UserInterface $user */ + return !empty(array_intersect($user->getRoles(), $this->configuration['handler_settings']['filter']['role'])); + }); + } + if (!$this->currentUser->hasPermission('administer users')) { + $entities = array_filter($entities, function ($user) { + /** @var \Drupal\user\UserInterface $user */ + return $user->isActive(); + }); + } + return $entities; + } + /** * {@inheritdoc} */ diff --git a/core/modules/user/src/Plugin/migrate/destination/EntityUser.php b/core/modules/user/src/Plugin/migrate/destination/EntityUser.php index 53520921e..beda7c806 100644 --- a/core/modules/user/src/Plugin/migrate/destination/EntityUser.php +++ b/core/modules/user/src/Plugin/migrate/destination/EntityUser.php @@ -7,8 +7,11 @@ namespace Drupal\user\Plugin\migrate\destination; +use Drupal\Component\Utility\Unicode; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Entity\EntityStorageInterface; +use Drupal\Core\Field\FieldTypePluginManagerInterface; +use Drupal\Core\Field\Plugin\Field\FieldType\EmailItem; use Drupal\Core\Password\PasswordInterface; use Drupal\migrate\Entity\MigrationInterface; use Drupal\migrate\MigrateException; @@ -50,11 +53,13 @@ class EntityUser extends EntityContentBase { * The migrate plugin manager. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager service. + * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager + * The field type plugin manager service. * @param \Drupal\Core\Password\PasswordInterface $password * The password service. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, PasswordInterface $password) { - parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager); + public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EntityStorageInterface $storage, array $bundles, EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager, PasswordInterface $password) { + parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $storage, $bundles, $entity_manager, $field_type_manager); if (isset($configuration['md5_passwords'])) { $this->password = $password; } @@ -73,6 +78,7 @@ class EntityUser extends EntityContentBase { $container->get('entity.manager')->getStorage($entity_type), array_keys($container->get('entity.manager')->getBundleInfo($entity_type)), $container->get('entity.manager'), + $container->get('plugin.manager.field.field_type'), $container->get('password') ); } @@ -90,6 +96,10 @@ class EntityUser extends EntityContentBase { throw new MigrateException('Password service has been altered by another module, aborting.'); } } + // Do not overwrite the root account password. + if ($row->getDestinationProperty('uid') == 1) { + $row->removeDestinationProperty('pass'); + } $ids = parent::import($row, $old_destination_id_values); if ($this->password) { $this->password->disableMd5Prefixing(); @@ -98,4 +108,28 @@ class EntityUser extends EntityContentBase { return $ids; } + /** + * {@inheritdoc} + */ + protected function processStubRow(Row $row) { + parent::processStubRow($row); + // Email address is not defined as required in the base field definition but + // is effectively required by the UserMailRequired constraint. This means + // that Entity::processStubRow() did not populate it - we do it here. + $field_definitions = $this->entityManager + ->getFieldDefinitions($this->storage->getEntityTypeId(), + $this->getKey('bundle')); + $mail = EmailItem::generateSampleValue($field_definitions['mail']); + $row->setDestinationProperty('mail', reset($mail)); + + // @todo Work-around for https://www.drupal.org/node/2602066. + $name = $row->getDestinationProperty('name'); + if (is_array($name)) { + $name = reset($name); + } + if (Unicode::strlen($name) > USERNAME_MAX_LENGTH) { + $row->setDestinationProperty('name', Unicode::substr($name, 0, USERNAME_MAX_LENGTH)); + } + } + } diff --git a/core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php b/core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php new file mode 100644 index 000000000..58496508f --- /dev/null +++ b/core/modules/user/src/Tests/Migrate/MigrateUserAdminPassTest.php @@ -0,0 +1,116 @@ +container->get('module_handler')->loadInclude('user', 'install'); + $this->installEntitySchema('user'); + user_install(); + /** @var \Drupal\user\Entity\User $admin_account */ + $admin_account = User::load(1); + $admin_account->setPassword('original'); + $admin_account->save(); + $this->originalPasswords[1] = $admin_account->getPassword(); + + /** @var \Drupal\user\Entity\User $user_account */ + $user_account = User::create([ + 'uid' => 2, + 'name' => 'original_username', + 'mail' => 'original_email@example.com', + 'pass' => 'original_password', + ]); + $user_account->save(); + $this->originalPasswords[2] = $user_account->getPassword(); + } + + /** + * Tests preserving the admin user's password. + */ + public function testAdminPasswordPreserved() { + $user_data_rows = [ + [ + 'id' => '1', + 'username' => 'site_admin', + 'password' => 'new_password', + 'email' => 'site_admin@example.com', + ], + [ + 'id' => '2', + 'username' => 'random_user', + 'password' => 'random_password', + 'email' => 'random_user@example.com', + ], + ]; + $ids = ['id' => ['type' => 'integer']]; + $config = [ + 'id' => 'users', + 'migration_tags' => ['Admin password test'], + 'source' => [ + 'plugin' => 'embedded_data', + 'data_rows' => $user_data_rows, + 'ids' => $ids, + ], + 'process' => [ + 'uid' => 'id', + 'name' => 'username', + 'mail' => 'email', + 'pass' => 'password', + ], + 'destination' => ['plugin' => 'entity:user'], + ]; + $migration = Migration::create($config); + $this->executeMigration($migration); + + // Verify that admin username and email were changed, but password was not. + /** @var \Drupal\user\Entity\User $admin_account */ + $admin_account = User::load(1); + $this->assertIdentical($admin_account->getUsername(), 'site_admin'); + $this->assertIdentical($admin_account->getEmail(), 'site_admin@example.com'); + $this->assertIdentical($admin_account->getPassword(), $this->originalPasswords[1]); + + // Verify that everything changed for the regular user. + /** @var \Drupal\user\Entity\User $user_account */ + $user_account = User::load(2); + $this->assertIdentical($user_account->getUsername(), 'random_user'); + $this->assertIdentical($user_account->getEmail(), 'random_user@example.com'); + $this->assertNotIdentical($user_account->getPassword(), $this->originalPasswords[2]); + } + +} diff --git a/core/modules/user/src/Tests/Migrate/MigrateUserStubTest.php b/core/modules/user/src/Tests/Migrate/MigrateUserStubTest.php new file mode 100644 index 000000000..0a65ddf2d --- /dev/null +++ b/core/modules/user/src/Tests/Migrate/MigrateUserStubTest.php @@ -0,0 +1,43 @@ +installEntitySchema('user'); + $this->installSchema('system', ['sequences']); + } + + /** + * Tests creation of user stubs. + */ + public function testStub() { + $this->performStubTest('user'); + } + +} diff --git a/core/modules/user/src/Tests/Migrate/d6/MigrateUserTest.php b/core/modules/user/src/Tests/Migrate/d6/MigrateUserTest.php index ddb93cf4f..eb94627c6 100644 --- a/core/modules/user/src/Tests/Migrate/d6/MigrateUserTest.php +++ b/core/modules/user/src/Tests/Migrate/d6/MigrateUserTest.php @@ -119,8 +119,11 @@ class MigrateUserTest extends MigrateDrupal6TestBase { } // Use the API to check if the password has been salted and re-hashed to - // conform the Drupal >= 7. - $this->assertTrue(\Drupal::service('password')->check($source->pass_plain, $user->getPassword())); + // conform to Drupal >= 7 for non-admin users. + if ($user->id() != 1) { + $this->assertTrue(\Drupal::service('password') + ->check($source->pass_plain, $user->getPassword())); + } } // Rollback the migration and make sure everything is deleted but uid 1. (new MigrateExecutable($this->migration, $this))->rollback(); diff --git a/core/modules/user/src/Tests/UserValidationTest.php b/core/modules/user/src/Tests/UserValidationTest.php index 4891d5a15..dfa8a2114 100644 --- a/core/modules/user/src/Tests/UserValidationTest.php +++ b/core/modules/user/src/Tests/UserValidationTest.php @@ -176,7 +176,7 @@ class UserValidationTest extends KernelTestBase { $user->roles[1]->target_id = 'unknown_role'; $violations = $user->validate(); $this->assertEqual(count($violations), 1); - $this->assertEqual($violations[0]->getPropertyPath(), 'roles.1'); + $this->assertEqual($violations[0]->getPropertyPath(), 'roles.1.target_id'); $this->assertEqual($violations[0]->getMessage(), t('The referenced entity (%entity_type: %name) does not exist.', array('%entity_type' => 'user_role', '%name' => 'unknown_role'))); } diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml index 6eb709fe5..6eea7ecec 100644 --- a/core/modules/user/user.routing.yml +++ b/core/modules/user/user.routing.yml @@ -138,6 +138,7 @@ user.cancel_confirm: hashed_pass: '' requirements: _entity_access: 'user.delete' + user: \d+ user.reset: path: '/user/reset/{uid}/{timestamp}/{hash}' diff --git a/core/modules/views/src/Plugin/views/argument_default/Raw.php b/core/modules/views/src/Plugin/views/argument_default/Raw.php index b94a2db0f..b4efe9cf6 100644 --- a/core/modules/views/src/Plugin/views/argument_default/Raw.php +++ b/core/modules/views/src/Plugin/views/argument_default/Raw.php @@ -112,11 +112,15 @@ class Raw extends ArgumentDefaultPluginBase implements CacheableDependencyInterf * {@inheritdoc} */ public function getArgument() { - $path = trim($this->currentPath->getPath($this->view->getRequest()), '/'); + // Don't trim the leading slash since getAliasByPath() requires it. + $path = rtrim($this->currentPath->getPath($this->view->getRequest()), '/'); if ($this->options['use_alias']) { $path = $this->aliasManager->getAliasByPath($path); } $args = explode('/', $path); + // Drop the empty first element created by the leading slash since the path + // component index doesn't take it into account. + array_shift($args); if (isset($args[$this->options['index']])) { return $args[$this->options['index']]; } diff --git a/core/modules/views/src/Tests/DefaultViewsTest.php b/core/modules/views/src/Tests/DefaultViewsTest.php index 23e7c97e5..197d25e5a 100644 --- a/core/modules/views/src/Tests/DefaultViewsTest.php +++ b/core/modules/views/src/Tests/DefaultViewsTest.php @@ -210,6 +210,13 @@ class DefaultViewsTest extends ViewTestBase { ), ); $this->assertIdenticalResultset($view, $expected_result, $column_map); + + $view->storage->setStatus(TRUE); + $view->save(); + \Drupal::service('router.builder')->rebuild(); + + $this->drupalGet('archive'); + $this->assertResponse(200); } } diff --git a/core/modules/views/src/Tests/Plugin/StyleGridTest.php b/core/modules/views/src/Tests/Plugin/StyleGridTest.php index 6dbac6bd9..698d2ba10 100644 --- a/core/modules/views/src/Tests/Plugin/StyleGridTest.php +++ b/core/modules/views/src/Tests/Plugin/StyleGridTest.php @@ -53,7 +53,7 @@ class StyleGridTest extends PluginTestBase { // Ensure styles are properly added for grid views. $this->drupalGet('test-grid'); - $this->assertRaw('views/css/views.module.css'); + $this->assertRaw('stable/css/views/views.module.css'); } /** diff --git a/core/modules/views/src/Tests/Plugin/StyleSummaryTest.php b/core/modules/views/src/Tests/Plugin/StyleSummaryTest.php new file mode 100644 index 000000000..cea8fba1b --- /dev/null +++ b/core/modules/views/src/Tests/Plugin/StyleSummaryTest.php @@ -0,0 +1,77 @@ +entities[] = $entity = EntityTest::create([ + 'name' => 'Entity ' . ($i * 5 + $j), + 'type' => 'type' . $i, + ]); + $entity->save(); + } + } + } + + /** + * Tests a summary view. + */ + public function testSummaryView() { + $this->drupalGet('test-summary'); + + $summary_list = $this->cssSelect('ul.views-summary li'); + $this->assertEqual(4, count($summary_list)); + + foreach ($summary_list as $summary_list_item) { + $this->assertEqual('(5)', trim((string) $summary_list_item)); + } + + $summary_links = $this->cssSelect('ul.views-summary a'); + $this->assertEqual(4, count($summary_links)); + foreach ($summary_links as $index => $summary_link) { + $this->assertEqual('type' . $index, trim((string) $summary_link)); + } + + $this->clickLink('type1'); + $entries = $this->cssSelect('div.view-content div.views-row'); + $this->assertEqual(2, count($entries)); + } + +} diff --git a/core/modules/views/src/Tests/Plugin/StyleTestBase.php b/core/modules/views/src/Tests/Plugin/StyleTestBase.php index 38db4d903..508fc1214 100644 --- a/core/modules/views/src/Tests/Plugin/StyleTestBase.php +++ b/core/modules/views/src/Tests/Plugin/StyleTestBase.php @@ -18,7 +18,7 @@ abstract class StyleTestBase extends ViewKernelTestBase { /** * Stores the SimpleXML representation of the output. * - * @var SimpleXMLElement + * @var \SimpleXMLElement */ protected $elements; diff --git a/core/modules/views/src/Tests/Wizard/BasicTest.php b/core/modules/views/src/Tests/Wizard/BasicTest.php index 8a64df8cb..b87bca611 100644 --- a/core/modules/views/src/Tests/Wizard/BasicTest.php +++ b/core/modules/views/src/Tests/Wizard/BasicTest.php @@ -189,7 +189,10 @@ class BasicTest extends WizardTestBase { $this->drupalPostAjaxForm(NULL, array('show[wizard_key]' => 'users'), 'show[wizard_key]'); $this->assertNoFieldByName('show[type]', NULL, 'The "of type" filter is not added for users.'); $this->drupalPostAjaxForm(NULL, array('show[wizard_key]' => 'node'), 'show[wizard_key]'); - $this->assertFieldByName('show[type]', 'all', 'The "of type" filter is added for nodes.'); + $this->assertNoFieldByName('show[type]', 'all', 'The "of type" filter is not added for nodes when there are no node types.'); + $this->drupalCreateContentType(array('type' => 'page')); + $this->drupalPostAjaxForm(NULL, array('show[wizard_key]' => 'node'), 'show[wizard_key]'); + $this->assertFieldByName('show[type]', 'all', 'The "of type" filter is added for nodes when there is at least one node type.'); } /** diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php index 9f5d32a88..3ac4e1792 100644 --- a/core/modules/views/src/ViewExecutable.php +++ b/core/modules/views/src/ViewExecutable.php @@ -553,7 +553,11 @@ class ViewExecutable implements \Serializable { * The items per page. */ public function setItemsPerPage($items_per_page) { - $this->element['#cache']['keys'][] = 'items_per_page:' . $items_per_page; + // Check whether the element is pre rendered. At that point, the cache keys + // cannot longer be manipulated. + if (empty($this->element['#pre_rendered'])) { + $this->element['#cache']['keys'][] = 'items_per_page:' . $items_per_page; + } $this->items_per_page = $items_per_page; // If the pager is already initialized, pass it through to the pager. @@ -583,9 +587,15 @@ class ViewExecutable implements \Serializable { * The pager offset. */ public function setOffset($offset) { - $this->element['#cache']['keys'][] = 'offset:' . $offset; + // Check whether the element is pre rendered. At that point, the cache keys + // cannot longer be manipulated. + if (empty($this->element['#pre_rendered'])) { + $this->element['#cache']['keys'][] = 'offset:' . $offset; + } + $this->offset = $offset; + // If the pager is already initialized, pass it through to the pager. if (!empty($this->pager)) { $this->pager->setOffset($offset); diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml new file mode 100644 index 000000000..daf92fa2a --- /dev/null +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_summary.yml @@ -0,0 +1,127 @@ +langcode: en +status: true +id: test_summary +label: Test Summary +module: views +description: '' +tag: default +base_table: entity_test +base_field: id +core: '8' +display: + default: + id: default + display_title: Master + display_plugin: default + position: 0 + display_options: + query: + type: views_query + options: + query_comment: '' + disable_sql_rewrite: false + distinct: false + replica: false + query_tags: { } + title: 'Summary test' + access: + type: none + cache: + type: tag + options: { } + pager: + type: mini + options: + items_per_page: 2 + offset: 0 + id: 0 + total_pages: 0 + expose: + items_per_page: false + items_per_page_label: 'Items per page' + items_per_page_options: '1, 2, 3, 4' + items_per_page_options_all: false + items_per_page_options_all_label: '- All -' + offset: false + offset_label: Offset + tags: + previous: ‹‹ + next: ›› + sorts: + id: + id: id + table: entity_test + field: id + order: ASC + plugin_id: standard + relationship: none + arguments: + type: + id: type + field: type + table: entity_test + default_action: summary + exception: + title_enable: true + title_enable: true + title: '{{ arguments.type }}' + default_argument_type: fixed + summary: + sort_order: asc + format: default_summary + summary_options: + override: true + items_per_page: 4 + specify_validation: true + plugin_id: string + entity_type: entity_test + fields: + id: + id: id + field: id + table: entity_test + plugin_id: field + entity_type: entity_test + style: + type: default + options: + grouping: { } + row_class: '' + default_row_class: true + uses_fields: false + row: + type: fields + header: { } + footer: { } + empty: { } + relationships: { } + fields: { } + display_extenders: { } + cache_metadata: + contexts: + - 'languages:language_interface' + - url + - url.query_args + - user.permissions + max-age: -1 + tags: { } + page_1: + id: page_1 + display_title: Page + display_plugin: page + position: 2 + display_options: + query: + type: views_query + options: { } + path: test-summary + display_extenders: { } + cache_metadata: + contexts: + - 'languages:language_interface' + - url + - url.query_args + - 'user.node_grants:view' + - user.permissions + max-age: -1 + tags: { } diff --git a/core/modules/views/tests/src/Unit/Plugin/argument_default/QueryParameterTest.php b/core/modules/views/tests/src/Unit/Plugin/argument_default/QueryParameterTest.php index 0df15f2ca..f19e20b3b 100644 --- a/core/modules/views/tests/src/Unit/Plugin/argument_default/QueryParameterTest.php +++ b/core/modules/views/tests/src/Unit/Plugin/argument_default/QueryParameterTest.php @@ -48,41 +48,33 @@ class QueryParameterTest extends UnitTestCase { * - third entry: the expected default argument value. */ public function providerGetArgument() { - $data = array(); + $data = []; - $single[] = array( - 'query_param' => 'test', - ); - $single[] = new Request(array('test' => 'data')); - $single[] = 'data'; - $data[] = $single; + $data[] = [ + ['query_param' => 'test'], + new Request(['test' => 'data']), + 'data', + ]; - $single[] = array( - 'query_param' => 'test', - 'multiple' => 'AND' - ); - $single[] = new Request(array('test' => array('data1', 'data2'))); - $single[] = 'data1+data2'; - $data[] = $single; + $data[] = [ + ['query_param' => 'test', 'multiple' => 'and'], + new Request(['test' => ['data1', 'data2']]), + 'data1,data2', + ]; - $single[] = array( - 'query_param' => 'test', - 'multiple' => 'OR' - ); - $single[] = new Request(array('test' => array('data1', 'data2'))); - $single[] = 'data1,data2'; - $data[] = $single; + $data[] = [ + ['query_param' => 'test', 'multiple' => 'or'], + new Request(['test' => ['data1', 'data2']]), + 'data1+data2', + ]; - $single[] = array( - 'query_param' => 'test', - 'fallback' => 'blub', - ); - $single[] = new Request(array()); - $single[] = 'blub'; - $data[] = $single; + $data[] = [ + ['query_param' => 'test', 'fallback' => 'blub'], + new Request([]), + 'blub', + ]; return $data; } } - diff --git a/core/modules/views/tests/src/Unit/Plugin/argument_default/RawTest.php b/core/modules/views/tests/src/Unit/Plugin/argument_default/RawTest.php index f50b928f4..f33cbaa2f 100644 --- a/core/modules/views/tests/src/Unit/Plugin/argument_default/RawTest.php +++ b/core/modules/views/tests/src/Unit/Plugin/argument_default/RawTest.php @@ -42,7 +42,15 @@ class RawTest extends UnitTestCase { $alias_manager->expects($this->never()) ->method('getAliasByPath'); - // Don't use aliases. + // Don't use aliases. Check against NULL and nonexistent path component + // values in addition to valid ones. + $raw = new Raw(array(), 'raw', array(), $alias_manager, $current_path); + $options = array( + 'use_alias' => FALSE, + ); + $raw->init($view, $display_plugin, $options); + $this->assertEquals(NULL, $raw->getArgument()); + $raw = new Raw(array(), 'raw', array(), $alias_manager, $current_path); $options = array( 'use_alias' => FALSE, @@ -59,12 +67,27 @@ class RawTest extends UnitTestCase { $raw->init($view, $display_plugin, $options); $this->assertEquals('example', $raw->getArgument()); + $raw = new Raw(array(), 'raw', array(), $alias_manager, $current_path); + $options = array( + 'use_alias' => FALSE, + 'index' => 2, + ); + $raw->init($view, $display_plugin, $options); + $this->assertEquals(NULL, $raw->getArgument()); + // Setup an alias manager with a path alias. $alias_manager = $this->getMock('Drupal\Core\Path\AliasManagerInterface'); $alias_manager->expects($this->any()) ->method('getAliasByPath') - ->with($this->equalTo('test/example')) - ->will($this->returnValue('other/example')); + ->with($this->equalTo('/test/example')) + ->will($this->returnValue('/other/example')); + + $raw = new Raw(array(), 'raw', array(), $alias_manager, $current_path); + $options = array( + 'use_alias' => TRUE, + ); + $raw->init($view, $display_plugin, $options); + $this->assertEquals(NULL, $raw->getArgument()); $raw = new Raw(array(), 'raw', array(), $alias_manager, $current_path); $options = array( @@ -82,6 +105,13 @@ class RawTest extends UnitTestCase { $raw->init($view, $display_plugin, $options); $this->assertEquals('example', $raw->getArgument()); + $raw = new Raw(array(), 'raw', array(), $alias_manager, $current_path); + $options = array( + 'use_alias' => TRUE, + 'index' => 2, + ); + $raw->init($view, $display_plugin, $options); + $this->assertEquals(NULL, $raw->getArgument()); } } diff --git a/core/modules/views/tests/src/Unit/ViewExecutableTest.php b/core/modules/views/tests/src/Unit/ViewExecutableTest.php index fea412b63..049df8d9e 100644 --- a/core/modules/views/tests/src/Unit/ViewExecutableTest.php +++ b/core/modules/views/tests/src/Unit/ViewExecutableTest.php @@ -469,4 +469,100 @@ class ViewExecutableTest extends UnitTestCase { return array($view, $display); } + /** + * @covers ::setItemsPerPage + * @covers ::getItemsPerPage + */ + public function testSetItemsPerPageBeforePreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $view->setItemsPerPage(12); + $this->assertEquals(12, $view->getItemsPerPage()); + $this->assertContains('items_per_page:12', $view->element['#cache']['keys']); + } + + /** + * @covers ::setItemsPerPage + * @covers ::getItemsPerPage + */ + public function testSetItemsPerPageDuringPreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $elements = &$view->element; + $elements['#cache'] += ['keys' => []]; + $elements['#pre_rendered'] = TRUE; + + $view->setItemsPerPage(12); + $this->assertEquals(12, $view->getItemsPerPage()); + $this->assertNotContains('items_per_page:12', $view->element['#cache']['keys']); + } + + /** + * @covers ::setOffset + * @covers ::getOffset + */ + public function testSetOffsetBeforePreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $view->setOffset(12); + $this->assertEquals(12, $view->getOffset()); + $this->assertContains('offset:12', $view->element['#cache']['keys']); + } + + /** + * @covers ::setOffset + * @covers ::getOffset + */ + public function testSetOffsetDuringPreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $elements = &$view->element; + $elements['#cache'] += ['keys' => []]; + $elements['#pre_rendered'] = TRUE; + + $view->setOffset(12); + $this->assertEquals(12, $view->getOffset()); + $this->assertNotContains('offset:12', $view->element['#cache']['keys']); + } + + /** + * @covers ::setCurrentPage + * @covers ::getCurrentPage + */ + public function testSetCurrentPageBeforePreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $view->setCurrentPage(12); + $this->assertEquals(12, $view->getCurrentPage()); + $this->assertContains('page:12', $view->element['#cache']['keys']); + } + + /** + * @covers ::setCurrentPage + * @covers ::getCurrentPage + */ + public function testSetCurrentPageDuringPreRender() { + /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */ + /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */ + list($view, $display) = $this->setupBaseViewAndDisplay(); + + $elements = &$view->element; + $elements['#cache'] += ['keys' => []]; + $elements['#pre_rendered'] = TRUE; + + $view->setCurrentPage(12); + $this->assertEquals(12, $view->getCurrentPage()); + $this->assertNotContains('page:12', $view->element['#cache']['keys']); + } + } diff --git a/core/modules/views_ui/src/ViewPreviewForm.php b/core/modules/views_ui/src/ViewPreviewForm.php index 7ec8f4de1..d87f593d1 100644 --- a/core/modules/views_ui/src/ViewPreviewForm.php +++ b/core/modules/views_ui/src/ViewPreviewForm.php @@ -94,6 +94,7 @@ class ViewPreviewForm extends ViewFormBase { 'event' => 'click', 'progress' => array('type' => 'fullscreen'), 'method' => 'replaceWith', + 'disable-refocus' => TRUE, ), ), ); diff --git a/core/modules/views_ui/src/ViewUI.php b/core/modules/views_ui/src/ViewUI.php index 47b8e88fe..fe3198b26 100644 --- a/core/modules/views_ui/src/ViewUI.php +++ b/core/modules/views_ui/src/ViewUI.php @@ -1031,6 +1031,13 @@ class ViewUI implements ViewEntityInterface { return $this->storage->urlInfo($rel, $options); } + /** + * {@inheritdoc} + */ + public function toUrl($rel = 'edit-form', array $options = []) { + return $this->storage->toUrl($rel, $options); + } + /** * {@inheritdoc} */ @@ -1038,6 +1045,13 @@ class ViewUI implements ViewEntityInterface { return $this->storage->link($text, $rel, $options); } + /** + * {@inheritdoc} + */ + public function toLink($text = NULL, $rel = 'edit-form', array $options = []) { + return $this->storage->toLink($text, $rel, $options); + } + /** * {@inheritdoc} */ diff --git a/core/profiles/standard/config/install/block.block.classy_page_title.yml b/core/profiles/standard/config/install/block.block.classy_page_title.yml deleted file mode 100644 index 42362242b..000000000 --- a/core/profiles/standard/config/install/block.block.classy_page_title.yml +++ /dev/null @@ -1,17 +0,0 @@ -langcode: en -status: true -dependencies: - theme: - - classy -id: classy_page_title -theme: classy -region: content -weight: -50 -provider: null -plugin: page_title_block -settings: - id: page_title_block - label: 'Page title' - provider: core - label_display: '0' -visibility: { } diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh index 9ca309f48..bf46a4018 100755 --- a/core/scripts/run-tests.sh +++ b/core/scripts/run-tests.sh @@ -12,6 +12,7 @@ use Drupal\Core\Database\Database; use Drupal\Core\StreamWrapper\PublicStream; use Drupal\Core\Test\TestRunnerKernel; use Drupal\simpletest\Form\SimpletestResultsForm; +use Drupal\simpletest\TestBase; use Symfony\Component\HttpFoundation\Request; $autoloader = require_once __DIR__ . '/../../autoload.php'; @@ -23,46 +24,68 @@ const SIMPLETEST_SCRIPT_COLOR_EXCEPTION = 33; // Brown. // Restricting the chunk of queries prevents memory exhaustion. const SIMPLETEST_SCRIPT_SQLITE_VARIABLE_LIMIT = 350; +const SIMPLETEST_SCRIPT_EXIT_SUCCESS = 0; +const SIMPLETEST_SCRIPT_EXIT_FAILURE = 1; +const SIMPLETEST_SCRIPT_EXIT_EXCEPTION = 2; + // Set defaults and get overrides. list($args, $count) = simpletest_script_parse_args(); if ($args['help'] || $count == 0) { simpletest_script_help(); - exit; + exit(($count == 0) ? SIMPLETEST_SCRIPT_EXIT_FAILURE : SIMPLETEST_SCRIPT_EXIT_SUCCESS); } simpletest_script_init(); -$request = Request::createFromGlobals(); -$kernel = TestRunnerKernel::createFromRequest($request, $autoloader); -$kernel->prepareLegacyRequest($request); +try { + $request = Request::createFromGlobals(); + $kernel = TestRunnerKernel::createFromRequest($request, $autoloader); + $kernel->prepareLegacyRequest($request); +} +catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); +} if ($args['execute-test']) { simpletest_script_setup_database(); simpletest_script_run_one_test($args['test-id'], $args['execute-test']); // Sub-process exited already; this is just for clarity. - exit; + exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS); } if ($args['list']) { // Display all available tests. echo "\nAvailable test groups & classes\n"; echo "-------------------------------\n\n"; - $groups = simpletest_test_get_all($args['module']); + try { + $groups = simpletest_test_get_all($args['module']); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } foreach ($groups as $group => $tests) { echo $group . "\n"; foreach ($tests as $class => $info) { echo " - $class\n"; } } - exit; + exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS); } simpletest_script_setup_database(TRUE); if ($args['clean']) { // Clean up left-over tables and directories. - simpletest_clean_environment(); + try { + simpletest_clean_environment(); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } echo "\nEnvironment cleaned.\n"; // Get the status messages and print them. @@ -70,7 +93,7 @@ if ($args['clean']) { foreach ($messages['status'] as $text) { echo " - " . $text . "\n"; } - exit; + exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS); } $test_list = simpletest_script_get_test_list(); @@ -85,7 +108,7 @@ for ($i = 0; $i < $args['repeat']; $i++) { } // Execute tests. -simpletest_script_execute_batch($tests_to_run); +$status = simpletest_script_execute_batch($tests_to_run); // Stop the timer. simpletest_script_reporter_timer_stop(); @@ -104,11 +127,17 @@ if ($args['xml']) { // Clean up all test results. if (!$args['keep-results']) { - simpletest_clean_results_table(); + try { + simpletest_clean_results_table(); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } } // Test complete, exit. -exit; +exit($status); /** * Print help text. @@ -295,7 +324,7 @@ function simpletest_script_parse_args() { else { // Argument not found in list. simpletest_script_print_error("Unknown argument '$arg'."); - exit; + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } } else { @@ -308,7 +337,7 @@ function simpletest_script_parse_args() { // Validate the concurrency argument if (!is_numeric($args['concurrency']) || $args['concurrency'] <= 0) { simpletest_script_print_error("--concurrency must be a strictly positive integer."); - exit; + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } if ($args['browser']) { @@ -343,7 +372,7 @@ function simpletest_script_init() { else { simpletest_script_print_error('Unable to automatically determine the path to the PHP interpreter. Supply the --php command line argument.'); simpletest_script_help(); - exit(); + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } // Get URL from arguments. @@ -441,7 +470,7 @@ function simpletest_script_setup_database($new = FALSE) { } catch (\InvalidArgumentException $e) { simpletest_script_print_error('Invalid --dburl. Reason: ' . $e->getMessage()); - exit(1); + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } } // Otherwise, use the default database connection from settings.php. @@ -452,7 +481,7 @@ function simpletest_script_setup_database($new = FALSE) { // If there is no default database connection for tests, we cannot continue. if (!isset($databases['default']['default'])) { simpletest_script_print_error('Missing default database connection for tests. Use --dburl to specify one.'); - exit(1); + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } Database::addConnectionInfo('default', 'default', $databases['default']['default']); @@ -496,21 +525,33 @@ function simpletest_script_setup_database($new = FALSE) { } catch (\PDOException $e) { simpletest_script_print_error($databases['test-runner']['default']['driver'] . ': ' . $e->getMessage()); - exit(1); + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } if ($new && $sqlite) { require_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'simpletest') . '/simpletest.install'; foreach (simpletest_schema() as $name => $table_spec) { - if ($schema->tableExists($name)) { - $schema->dropTable($name); + try { + if ($schema->tableExists($name)) { + $schema->dropTable($name); + } + $schema->createTable($name, $table_spec); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); } - $schema->createTable($name, $table_spec); } } // Verify that the Simpletest database schema exists by checking one table. - if (!$schema->tableExists('simpletest')) { - simpletest_script_print_error('Missing Simpletest database schema. Either install Simpletest module or use the --sqlite parameter.'); - exit(1); + try { + if (!$schema->tableExists('simpletest')) { + simpletest_script_print_error('Missing Simpletest database schema. Either install Simpletest module or use the --sqlite parameter.'); + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); + } + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); } } @@ -520,6 +561,8 @@ function simpletest_script_setup_database($new = FALSE) { function simpletest_script_execute_batch($test_classes) { global $args, $test_ids; + $total_status = SIMPLETEST_SCRIPT_EXIT_SUCCESS; + // Multi-process execution. $children = array(); while (!empty($test_classes) || !empty($children)) { @@ -528,8 +571,16 @@ function simpletest_script_execute_batch($test_classes) { break; } - $test_id = Database::getConnection('default', 'test-runner') - ->insert('simpletest_test_id')->useDefaults(array('test_id'))->execute(); + try { + $test_id = Database::getConnection('default', 'test-runner') + ->insert('simpletest_test_id') + ->useDefaults(array('test_id')) + ->execute(); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } $test_ids[] = $test_id; $test_class = array_shift($test_classes); @@ -539,7 +590,7 @@ function simpletest_script_execute_batch($test_classes) { if (!is_resource($process)) { echo "Unable to fork test process. Aborting.\n"; - exit; + exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS); } // Register our new child. @@ -560,8 +611,16 @@ function simpletest_script_execute_batch($test_classes) { if (empty($status['running'])) { // The child exited, unregister it. proc_close($child['process']); - if ($status['exitcode']) { - echo 'FATAL ' . $child['class'] . ': test runner returned a non-zero error code (' . $status['exitcode'] . ').' . "\n"; + if ($status['exitcode'] === SIMPLETEST_SCRIPT_EXIT_FAILURE) { + $total_status = max($status['exitcode'], $total_status); + } + elseif ($status['exitcode']) { + $message = 'FATAL ' . $child['class'] . ': test runner returned a non-zero error code (' . $status['exitcode'] . ').'; + echo $message . "\n"; + // Insert a fail for xml results. + TestBase::insertAssert($child['test_id'], $child['class'], FALSE, $message, 'run-tests.sh check'); + /// Ensure that an error line is displayed for the class. + simpletest_script_reporter_display_summary($child['class'], ['#pass' => 0, '#fail' => 1, '#exception' => 0, '#debug' => 0]); if ($args['die-on-fail']) { list($db_prefix, ) = simpletest_last_test_get($child['test_id']); $test_directory = 'sites/simpletest/' . substr($db_prefix, 10); @@ -581,19 +640,19 @@ function simpletest_script_execute_batch($test_classes) { } } } + return $total_status; } /** * Run a group of phpunit tests. */ function simpletest_script_run_phpunit($test_id, $class) { - $reflection = new \ReflectionClass($class); if ($reflection->hasProperty('runLimit')) { set_time_limit($reflection->getStaticPropertyValue('runLimit')); } - $results = simpletest_run_phpunit_tests($test_id, array($class)); + $results = simpletest_run_phpunit_tests($test_id, array($class), $status); simpletest_process_phpunit_results($results); // Map phpunit results to a data structure we can pass to @@ -628,6 +687,7 @@ function simpletest_script_run_phpunit($test_id, $class) { foreach ($summaries as $class => $summary) { simpletest_script_reporter_display_summary($class, $summary); } + return $status; } /** @@ -648,23 +708,28 @@ function simpletest_script_run_one_test($test_id, $test_class) { } $test = new $class_name($test_id); if (is_subclass_of($test_class, '\PHPUnit_Framework_TestCase')) { - simpletest_script_run_phpunit($test_id, $test_class); + $status = simpletest_script_run_phpunit($test_id, $test_class); } else { $test->dieOnFail = (bool) $args['die-on-fail']; $test->verbose = (bool) $args['verbose']; $test->run($methods); simpletest_script_reporter_display_summary($test_class, $test->results); + + $status = SIMPLETEST_SCRIPT_EXIT_SUCCESS; + // Finished, kill this runner. + if ($test->results['#fail'] || $test->results['#exception']) { + $status = SIMPLETEST_SCRIPT_EXIT_FAILURE; + } } - // Finished, kill this runner. - exit(0); + exit($status); } // DrupalTestCase::run() catches exceptions already, so this is only reached // when an exception is thrown in the wrapping test runner environment. catch (Exception $e) { echo (string) $e; - exit(1); + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); } } @@ -726,7 +791,13 @@ function simpletest_script_cleanup($test_id, $test_class, $exitcode) { return; } // Retrieve the last database prefix used for testing. - list($db_prefix, ) = simpletest_last_test_get($test_id); + try { + list($db_prefix,) = simpletest_last_test_get($test_id); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } // If no database prefix was found, then the test was not set up correctly. if (empty($db_prefix)) { @@ -741,7 +812,13 @@ function simpletest_script_cleanup($test_id, $test_class, $exitcode) { $messages[] = "- Found database prefix '$db_prefix' for test ID $test_id."; // Read the log file in case any fatal errors caused the test to crash. - simpletest_log_read($test_id, $db_prefix, $test_class); + try { + simpletest_log_read($test_id, $db_prefix, $test_class); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } // Check whether a test site directory was setup already. // @see \Drupal\simpletest\TestBase::prepareEnvironment() @@ -763,12 +840,19 @@ function simpletest_script_cleanup($test_id, $test_class, $exitcode) { } // Clear out all database tables from the test. - $schema = Database::getConnection('default', 'default')->schema(); - $count = 0; - foreach ($schema->findTables($db_prefix . '%') as $table) { - $schema->dropTable($table); - $count++; + try { + $schema = Database::getConnection('default', 'default')->schema(); + $count = 0; + foreach ($schema->findTables($db_prefix . '%') as $table) { + $schema->dropTable($table); + $count++; + } } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } + if ($count) { $messages[] = "- Removed $count leftover tables."; } @@ -792,7 +876,13 @@ function simpletest_script_get_test_list() { $test_list = array(); if ($args['all'] || $args['module']) { - $groups = simpletest_test_get_all($args['module']); + try { + $groups = simpletest_test_get_all($args['module']); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } $all_tests = array(); foreach ($groups as $group => $tests) { $all_tests = array_merge($all_tests, array_keys($tests)); @@ -808,14 +898,20 @@ function simpletest_script_get_test_list() { $test_list[] = $test_class; } else { - $groups = simpletest_test_get_all(); + try { + $groups = simpletest_test_get_all(); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } $all_classes = array(); foreach ($groups as $group) { $all_classes = array_merge($all_classes, array_keys($group)); } simpletest_script_print_error('Test class not found: ' . $class_name); simpletest_script_print_alternatives($class_name, $all_classes, 6); - exit(1); + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } } } @@ -824,7 +920,7 @@ function simpletest_script_get_test_list() { foreach ($args['test_names'] as $file) { if (!file_exists($file)) { simpletest_script_print_error('File not found: ' . $file); - exit; + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } $content = file_get_contents($file); // Extract a potential namespace. @@ -903,7 +999,13 @@ function simpletest_script_get_test_list() { } } else { - $groups = simpletest_test_get_all(); + try { + $groups = simpletest_test_get_all(); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } foreach ($args['test_names'] as $group_name) { if (isset($groups[$group_name])) { $test_list = array_merge($test_list, array_keys($groups[$group_name])); @@ -911,7 +1013,7 @@ function simpletest_script_get_test_list() { else { simpletest_script_print_error('Test group not found: ' . $group_name); simpletest_script_print_alternatives($group_name, array_keys($groups)); - exit(1); + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } } } @@ -919,7 +1021,7 @@ function simpletest_script_get_test_list() { if (empty($test_list)) { simpletest_script_print_error('No valid tests were specified.'); - exit; + exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } return $test_list; } @@ -993,7 +1095,13 @@ function simpletest_script_reporter_display_summary($class, $results) { function simpletest_script_reporter_write_xml_results() { global $args, $test_ids, $results_map; - $results = simpletest_script_load_messages_by_test_id($test_ids); + try { + $results = simpletest_script_load_messages_by_test_id($test_ids); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } $test_class = ''; $xml_files = array(); @@ -1083,7 +1191,13 @@ function simpletest_script_reporter_display_results() { echo "Detailed test results\n"; echo "---------------------\n"; - $results = simpletest_script_load_messages_by_test_id($test_ids); + try { + $results = simpletest_script_load_messages_by_test_id($test_ids); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } $test_class = ''; foreach ($results as $result) { if (isset($results_map[$result->status])) { @@ -1231,10 +1345,16 @@ function simpletest_script_load_messages_by_test_id($test_ids) { } foreach ($test_id_chunks as $test_id_chunk) { - $result_chunk = Database::getConnection('default', 'test-runner') - ->query("SELECT * FROM {simpletest} WHERE test_id IN ( :test_ids[] ) ORDER BY test_class, message_id", array( - ':test_ids[]' => $test_id_chunk, - ))->fetchAll(); + try { + $result_chunk = Database::getConnection('default', 'test-runner') + ->query("SELECT * FROM {simpletest} WHERE test_id IN ( :test_ids[] ) ORDER BY test_class, message_id", array( + ':test_ids[]' => $test_id_chunk, + ))->fetchAll(); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } if ($result_chunk) { $results = array_merge($results, $result_chunk); } @@ -1249,14 +1369,20 @@ function simpletest_script_load_messages_by_test_id($test_ids) { function simpletest_script_open_browser() { global $test_ids; - $connection = Database::getConnection('default', 'test-runner'); - $results = $connection->select('simpletest') - ->fields('simpletest') - ->condition('test_id', $test_ids, 'IN') - ->orderBy('test_class') - ->orderBy('message_id') - ->execute() - ->fetchAll(); + try { + $connection = Database::getConnection('default', 'test-runner'); + $results = $connection->select('simpletest') + ->fields('simpletest') + ->condition('test_id', $test_ids, 'IN') + ->orderBy('test_class') + ->orderBy('message_id') + ->execute() + ->fetchAll(); + } + catch (Exception $e) { + echo (string) $e; + exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION); + } // Get the results form. $form = array(); diff --git a/core/tests/Drupal/KernelTests/Core/Cache/CacheCollectorTest.php b/core/tests/Drupal/KernelTests/Core/Cache/CacheCollectorTest.php new file mode 100644 index 000000000..e9ca67a0a --- /dev/null +++ b/core/tests/Drupal/KernelTests/Core/Cache/CacheCollectorTest.php @@ -0,0 +1,79 @@ +installSchema('system', ['semaphore']); + } + + /** + * {@inheritdoc} + */ + public function register(ContainerBuilder $container) { + parent::register($container); + // Change container to database cache backends. + $container + ->register('cache_factory', 'Drupal\Core\Cache\CacheFactory') + ->addArgument(new Reference('settings')) + ->addMethodCall('setContainer', [new Reference('service_container')]); + + // Change container to use database lock backends. + $container + ->register('lock', 'Drupal\Core\Lock\DatabaseLockBackend') + ->addArgument(new Reference('database')); + } + + /** + * Tests setting and invalidating + * + * @dataProvider providerTestInvalidCharacters + */ + public function testCacheCollector($cid, $key, $value) { + $collector = new CacheCollectorHelper($cid, $this->container->get('cache.default'), $this->container->get('lock')); + $this->assertNull($collector->get($key)); + $collector->set($key, $value); + $this->assertEquals($value, $collector->get($key)); + $collector->destruct(); + // @todo Shouldn't this be empty after destruction? + $this->assertEquals($value, $collector->get($key)); + } + + /** + * Data provider for ::testCacheCollector(). + */ + public function providerTestInvalidCharacters() { + return [ + // Nothing special. + ['foo', 'bar', 'baz'], + // Invalid characters in CID. + ['éøïвβ中國書۞', 'foo', 'bar'], + // Really long CID. + [$this->randomString(1024), 'foo', 'bar'], + ]; + } + +} diff --git a/core/tests/Drupal/KernelTests/Core/Path/AliasStorageTest.php b/core/tests/Drupal/KernelTests/Core/Path/AliasStorageTest.php new file mode 100644 index 000000000..98180e3a3 --- /dev/null +++ b/core/tests/Drupal/KernelTests/Core/Path/AliasStorageTest.php @@ -0,0 +1,86 @@ +installSchema('system', 'url_alias'); + $this->storage = $this->container->get('path.alias_storage'); + } + + /** + * @covers ::load + */ + public function testLoad() { + $this->storage->save('/test-source-Case', '/test-alias-Case'); + + $expected = [ + 'pid' => 1, + 'alias' => '/test-alias-Case', + 'source' => '/test-source-Case', + 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED, + ]; + + $this->assertEquals($expected, $this->storage->load(['alias' => '/test-alias-Case'])); + $this->assertEquals($expected, $this->storage->load(['alias' => '/test-alias-case'])); + $this->assertEquals($expected, $this->storage->load(['source' => '/test-source-Case'])); + $this->assertEquals($expected, $this->storage->load(['source' => '/test-source-case'])); + } + + /** + * @covers ::lookupPathAlias + */ + public function testLookupPathAlias() { + $this->storage->save('/test-source-Case', '/test-alias'); + + $this->assertEquals('/test-alias', $this->storage->lookupPathAlias('/test-source-Case', LanguageInterface::LANGCODE_NOT_SPECIFIED)); + $this->assertEquals('/test-alias', $this->storage->lookupPathAlias('/test-source-case', LanguageInterface::LANGCODE_NOT_SPECIFIED)); + } + + /** + * @covers ::lookupPathSource + */ + public function testLookupPathSource() { + $this->storage->save('/test-source', '/test-alias-Case'); + + $this->assertEquals('/test-source', $this->storage->lookupPathSource('/test-alias-Case', LanguageInterface::LANGCODE_NOT_SPECIFIED)); + $this->assertEquals('/test-source', $this->storage->lookupPathSource('/test-alias-case', LanguageInterface::LANGCODE_NOT_SPECIFIED)); + } + + /** + * @covers ::aliasExists + */ + public function testAliasExists() { + $this->storage->save('/test-source-Case', '/test-alias-Case'); + + $this->assertTrue($this->storage->aliasExists('/test-alias-Case', LanguageInterface::LANGCODE_NOT_SPECIFIED)); + $this->assertTrue($this->storage->aliasExists('/test-alias-case', LanguageInterface::LANGCODE_NOT_SPECIFIED)); + } + +} diff --git a/core/tests/Drupal/KernelTests/Core/Theme/MaintenanceThemeTest.php b/core/tests/Drupal/KernelTests/Core/Theme/MaintenanceThemeTest.php new file mode 100644 index 000000000..7cadffa25 --- /dev/null +++ b/core/tests/Drupal/KernelTests/Core/Theme/MaintenanceThemeTest.php @@ -0,0 +1,43 @@ +setSetting('maintenance_theme', 'seven'); + // Get the maintenance theme loaded. + drupal_maintenance_theme(); + + // Do we have an active theme? + $this->assertTrue(\Drupal::theme()->hasActiveTheme()); + + $active_theme = \Drupal::theme()->getActiveTheme(); + $this->assertEquals('seven', $active_theme->getName()); + + $base_themes = $active_theme->getBaseThemes(); + $base_theme_names = array_keys($base_themes); + $this->assertSame(['classy', 'stable'], $base_theme_names); + + // Ensure Classy has the correct base themes and amount of base themes. + $classy_base_themes = $base_themes['classy']->getBaseThemes(); + $classy_base_theme_names = array_keys($classy_base_themes); + $this->assertSame(['stable'], $classy_base_theme_names); + } + +} diff --git a/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php b/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php new file mode 100644 index 000000000..69d9e8c61 --- /dev/null +++ b/core/tests/Drupal/KernelTests/Core/Theme/StableTemplateOverrideTest.php @@ -0,0 +1,108 @@ +themeHandler = $this->container->get('theme_handler'); + + $this->container->get('theme_installer')->install(['stable']); + + $this->installSchema('system', 'router'); + $this->installAllModules(); + } + + /** + * Installs all core modules. + */ + protected function installAllModules() { + // Needed for system_rebuild_module_data(). + include_once $this->root . '/core/modules/system/system.module'; + + // Enable all core modules. + $all_modules = system_rebuild_module_data(); + $all_modules = array_filter($all_modules, function ($module) { + // Filter contrib, hidden, already enabled modules and modules in the + // Testing package. + if ($module->origin !== 'core' || !empty($module->info['hidden']) || $module->status == TRUE || $module->info['package'] == 'Testing') { + return FALSE; + } + return TRUE; + }); + $this->allModules = array_keys($all_modules); + sort($this->allModules); + + $module_installer = $this->container->get('module_installer'); + $module_installer->install($this->allModules); + + $this->installConfig(['system', 'user']); + } + + /** + * Ensures that Stable overrides all relevant core templates. + */ + public function testStableTemplateOverrides() { + $registry = new Registry(\Drupal::root(), \Drupal::cache(), \Drupal::lock(), \Drupal::moduleHandler(), $this->themeHandler, \Drupal::service('theme.initialization'), 'stable'); + $registry->setThemeManager(\Drupal::theme()); + + $registry_full = $registry->get(); + + foreach ($registry_full as $hook => $info) { + if (isset($info['template'])) { + // Allow skipping templates. + if (in_array($info['template'], $this->templatesToSkip)) { + continue; + } + + $this->assertEquals('core/themes/stable', $info['theme path'], $info['template'] . '.html.twig overridden in Stable.'); + } + } + } + +} diff --git a/core/tests/Drupal/KernelTests/RequestProcessing/RedirectOnExceptionTest.php b/core/tests/Drupal/KernelTests/RequestProcessing/RedirectOnExceptionTest.php new file mode 100644 index 000000000..4c7a6860f --- /dev/null +++ b/core/tests/Drupal/KernelTests/RequestProcessing/RedirectOnExceptionTest.php @@ -0,0 +1,50 @@ +installSchema('system', ['router', 'url_alias']); + \Drupal::service('router.builder')->rebuild(); + } + + public function testRedirectOn404() { + \Drupal::configFactory()->getEditable('system.site') + ->set('page.404', '/test-http-response-exception/' . Response::HTTP_PERMANENTLY_REDIRECT) + ->save(); + + /** @var \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel */ + $http_kernel = \Drupal::service('http_kernel'); + + // Foo doesn't exist, so this triggers the 404 page. + $request = Request::create('/foo'); + $response = $http_kernel->handle($request); + $this->assertEquals(Response::HTTP_PERMANENTLY_REDIRECT, $response->getStatusCode()); + } + +} diff --git a/core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php b/core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php new file mode 100644 index 000000000..8b1b3399f --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Asset/AssetResolverTest.php @@ -0,0 +1,168 @@ +libraryDiscovery = $this->getMockBuilder('Drupal\Core\Asset\LibraryDiscovery') + ->disableOriginalConstructor() + ->getMock(); + $this->libraryDependencyResolver = $this->getMock('\Drupal\Core\Asset\LibraryDependencyResolverInterface'); + $this->libraryDependencyResolver->expects($this->any()) + ->method('getLibrariesWithDependencies') + ->willReturnArgument(0); + $this->moduleHandler = $this->getMock('\Drupal\Core\Extension\ModuleHandlerInterface'); + $this->themeManager = $this->getMock('\Drupal\Core\Theme\ThemeManagerInterface'); + $active_theme = $this->getMockBuilder('\Drupal\Core\Theme\ActiveTheme') + ->disableOriginalConstructor() + ->getMock(); + $active_theme->expects($this->any()) + ->method('getName') + ->willReturn('bartik'); + $this->themeManager->expects($this->any()) + ->method('getActiveTheme') + ->willReturn($active_theme); + + $this->languageManager = $this->getMock('\Drupal\Core\Language\LanguageManagerInterface'); + $english = $this->getMock('\Drupal\Core\Language\LanguageInterface'); + $english->expects($this->any()) + ->method('getId') + ->willReturn('en'); + $japanese = $this->getMock('\Drupal\Core\Language\LanguageInterface'); + $japanese->expects($this->any()) + ->method('getId') + ->willReturn('jp'); + $this->languageManager = $this->getMock('\Drupal\Core\Language\LanguageManagerInterface'); + $this->languageManager->expects($this->any()) + ->method('getCurrentLanguage') + ->will($this->onConsecutiveCalls($english, $english, $japanese, $japanese)); + $this->cache = new TestMemoryBackend('llama'); + + $this->assetResolver = new AssetResolver($this->libraryDiscovery, $this->libraryDependencyResolver, $this->moduleHandler, $this->themeManager, $this->languageManager, $this->cache); + } + + /** + * @covers ::getCssAssets + * @dataProvider providerAttachedAssets + */ + public function testGetCssAssets(AttachedAssetsInterface $assets_a, AttachedAssetsInterface $assets_b, $expected_cache_item_count) { + $this->assetResolver->getCssAssets($assets_a, FALSE); + $this->assetResolver->getCssAssets($assets_b, FALSE); + $this->assertCount($expected_cache_item_count, $this->cache->getAllCids()); + } + + /** + * @covers ::getJsAssets + * @dataProvider providerAttachedAssets + */ + public function testGetJsAssets(AttachedAssetsInterface $assets_a, AttachedAssetsInterface $assets_b, $expected_cache_item_count) { + $this->assetResolver->getJsAssets($assets_a, FALSE); + $this->assetResolver->getJsAssets($assets_b, FALSE); + $this->assertCount($expected_cache_item_count, $this->cache->getAllCids()); + + $this->assetResolver->getJsAssets($assets_a, FALSE); + $this->assetResolver->getJsAssets($assets_b, FALSE); + $this->assertCount($expected_cache_item_count * 2, $this->cache->getAllCids()); + } + + public function providerAttachedAssets() { + $time = time(); + return [ + 'same libraries, different timestamps' => [ + (new AttachedAssets())->setAlreadyLoadedLibraries([])->setLibraries(['core/drupal'])->setSettings(['currentTime' => $time]), + (new AttachedAssets())->setAlreadyLoadedLibraries([])->setLibraries(['core/drupal'])->setSettings(['currentTime' => $time + 100]), + 1 + ], + 'different libraries, same timestamps' => [ + (new AttachedAssets())->setAlreadyLoadedLibraries([])->setLibraries(['core/drupal'])->setSettings(['currenttime' => $time]), + (new AttachedAssets())->setAlreadyLoadedLibraries([])->setLibraries(['core/drupal', 'core/jquery'])->setSettings(['currentTime' => $time]), + 2 + ], + ]; + } + +} + +if (!defined('CSS_AGGREGATE_DEFAULT')) { + define('CSS_AGGREGATE_DEFAULT', 0); +} + +if (!defined('JS_DEFAULT')) { + define('JS_DEFAULT', 0); +} + +class TestMemoryBackend extends MemoryBackend { + public function getAllCids() { + return array_keys($this->cache); + } +} diff --git a/core/tests/Drupal/Tests/Core/Asset/LibraryDiscoveryParserTest.php b/core/tests/Drupal/Tests/Core/Asset/LibraryDiscoveryParserTest.php index 2f5ed21ba..ed0c9ceec 100644 --- a/core/tests/Drupal/Tests/Core/Asset/LibraryDiscoveryParserTest.php +++ b/core/tests/Drupal/Tests/Core/Asset/LibraryDiscoveryParserTest.php @@ -10,20 +10,6 @@ namespace Drupal\Tests\Core\Asset; use Drupal\Core\Asset\LibraryDiscoveryParser; use Drupal\Tests\UnitTestCase; -if (!defined('CSS_AGGREGATE_DEFAULT')) { - define('CSS_AGGREGATE_DEFAULT', 0); - define('CSS_AGGREGATE_THEME', 100); - define('CSS_BASE', -200); - define('CSS_LAYOUT', -100); - define('CSS_COMPONENT', 0); - define('CSS_STATE', 100); - define('CSS_THEME', 200); - define('JS_SETTING', -200); - define('JS_LIBRARY', -100); - define('JS_DEFAULT', 0); - define('JS_THEME', 100); -} - /** * @coversDefaultClass \Drupal\Core\Asset\LibraryDiscoveryParser * @group Asset @@ -575,3 +561,37 @@ class TestLibraryDiscoveryParser extends LibraryDiscoveryParser { } } + +if (!defined('CSS_AGGREGATE_DEFAULT')) { + define('CSS_AGGREGATE_DEFAULT', 0); +} +if (!defined('CSS_AGGREGATE_THEME')) { + define('CSS_AGGREGATE_THEME', 100); +} +if (!defined('CSS_BASE')) { + define('CSS_BASE', -200); +} +if (!defined('CSS_LAYOUT')) { + define('CSS_LAYOUT', -100); +} +if (!defined('CSS_COMPONENT')) { + define('CSS_COMPONENT', 0); +} +if (!defined('CSS_STATE')) { + define('CSS_STATE', 100); +} +if (!defined('CSS_THEME')) { + define('CSS_THEME', 200); +} +if (!defined('JS_SETTING')) { + define('JS_SETTING', -200); +} +if (!defined('JS_LIBRARY')) { + define('JS_LIBRARY', -100); +} +if (!defined('JS_DEFAULT')) { + define('JS_DEFAULT', 0); +} +if (!defined('JS_THEME')) { + define('JS_THEME', 100); +} diff --git a/core/tests/Drupal/Tests/Core/Common/AttributesTest.php b/core/tests/Drupal/Tests/Core/Common/AttributesTest.php index 1dafef988..4fc57ae6f 100644 --- a/core/tests/Drupal/Tests/Core/Common/AttributesTest.php +++ b/core/tests/Drupal/Tests/Core/Common/AttributesTest.php @@ -71,4 +71,20 @@ class AttributesTest extends UnitTestCase { } } + /** + * Test AttributeValueBase copy. + */ + public function testAttributeValueBaseCopy() { + $original_attributes = new Attribute([ + 'checked' => TRUE, + 'class' => ['who', 'is', 'on'], + 'id' => 'first', + ]); + $attributes['selected'] = $original_attributes['checked']; + $attributes['id'] = $original_attributes['id']; + $attributes = new Attribute($attributes); + $this->assertSame((string) $original_attributes, ' checked class="who is on" id="first"', 'Original boolean value used with original name.'); + $this->assertSame((string) $attributes, ' selected id="first"', 'Original boolean value used with new name.'); + } + } diff --git a/core/tests/Drupal/Tests/Core/Datetime/DateHelperTest.php b/core/tests/Drupal/Tests/Core/Datetime/DateHelperTest.php new file mode 100644 index 000000000..a88861ca5 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Datetime/DateHelperTest.php @@ -0,0 +1,112 @@ + ['first_day' => $first_day]]; + $container->set('config.factory', $this->getConfigFactoryStub($config)); + \Drupal::setContainer($container); + + $weekdays = DateHelper::weekDaysUntranslated(); + // self::assertSame() MUST be used here as it checks for array key order. + $this->assertSame($expected, DateHelper::weekDaysOrdered($weekdays)); + } + + public function providerTestWeekDaysOrdered() { + $data = []; + $data[] = [0, [ + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + ]]; + $data[] = [1, [ + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + 0 => 'Sunday', + ]]; + $data[] = [2, [ + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + 0 => 'Sunday', + 1 => 'Monday', + ]]; + $data[] = [3, [ + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + ]]; + $data[] = [4, [ + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + ]]; + $data[] = [5, [ + 5 => 'Friday', + 6 => 'Saturday', + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + ]]; + $data[] = [6, [ + 6 => 'Saturday', + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + ]]; + $data[] = [7, [ + 0 => 'Sunday', + 1 => 'Monday', + 2 => 'Tuesday', + 3 => 'Wednesday', + 4 => 'Thursday', + 5 => 'Friday', + 6 => 'Saturday', + ]]; + return $data; + } + +} diff --git a/core/tests/Drupal/Tests/Core/DrupalTest.php b/core/tests/Drupal/Tests/Core/DrupalTest.php index 315ce38c0..d22ed78b5 100644 --- a/core/tests/Drupal/Tests/Core/DrupalTest.php +++ b/core/tests/Drupal/Tests/Core/DrupalTest.php @@ -86,6 +86,16 @@ class DrupalTest extends UnitTestCase { $this->assertNotNull(\Drupal::entityManager()); } + /** + * Tests the entityTypeManager() method. + * + * @covers ::entityTypeManager + */ + public function testEntityTypeManager() { + $this->setMockContainerService('entity_type.manager'); + $this->assertNotNull(\Drupal::entityTypeManager()); + } + /** * Tests the database() method. * diff --git a/core/tests/Drupal/Tests/Core/Enhancer/ParamConversionEnhancerTest.php b/core/tests/Drupal/Tests/Core/Enhancer/ParamConversionEnhancerTest.php index a4c8af62e..41b2104bc 100644 --- a/core/tests/Drupal/Tests/Core/Enhancer/ParamConversionEnhancerTest.php +++ b/core/tests/Drupal/Tests/Core/Enhancer/ParamConversionEnhancerTest.php @@ -59,7 +59,7 @@ class ParamConversionEnhancerTest extends UnitTestCase { $expected['id'] = 'something_better!'; $expected['_raw_variables'] = new ParameterBag($raw_variables); - $this->paramConverterManager->expects($this->any()) + $this->paramConverterManager->expects($this->once()) ->method('convert') ->with($this->isType('array')) ->will($this->returnValue($expected)); @@ -67,6 +67,12 @@ class ParamConversionEnhancerTest extends UnitTestCase { $result = $this->paramConversionEnhancer->enhance($defaults, new Request()); $this->assertEquals($expected, $result); + + // Now run with the results as the new defaults to ensure that the + // conversion is just run once. + $result = $this->paramConversionEnhancer->enhance($result, new Request()); + + $this->assertEquals($expected, $result); } /** diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityLinkTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityLinkTest.php index 9e54ebedb..efcf1b89a 100644 --- a/core/tests/Drupal/Tests/Core/Entity/EntityLinkTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/EntityLinkTest.php @@ -57,6 +57,8 @@ class EntityLinkTest extends UnitTestCase { } /** + * Tests for the Entity::link() method + * * @covers ::link * * @dataProvider providerTestLink @@ -98,7 +100,7 @@ class EntityLinkTest extends UnitTestCase { /** @var \Drupal\Core\Entity\Entity $entity */ $entity = $this->getMockForAbstractClass('Drupal\Core\Entity\Entity', [ ['id' => $entity_id, 'label' => $entity_label, 'langcode' => 'es'], - $entity_type_id + $entity_type_id, ]); $expected_link = Link::createFromRoute( @@ -116,6 +118,64 @@ class EntityLinkTest extends UnitTestCase { $this->assertSame($expected, $entity->link($link_text, $link_rel, $link_options)); } + /** + * Tests for the Entity::toLink() method + * + * @covers ::toLink + * + * @dataProvider providerTestLink + */ + public function testToLink($entity_label, $link_text, $expected_text, $link_rel = 'canonical', array $link_options = []) { + $language = new Language(['id' => 'es']); + $link_options += ['language' => $language]; + $this->languageManager->expects($this->any()) + ->method('getLanguage') + ->with('es') + ->willReturn($language); + + $route_name_map = [ + 'canonical' => 'entity.test_entity_type.canonical', + 'edit-form' => 'entity.test_entity_type.edit_form', + ]; + $route_name = $route_name_map[$link_rel]; + $entity_id = 'test_entity_id'; + $entity_type_id = 'test_entity_type'; + $expected = '' . $expected_text . ''; + + $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface'); + $entity_type->expects($this->once()) + ->method('getLinkTemplates') + ->willReturn($route_name_map); + $entity_type->expects($this->any()) + ->method('getKey') + ->willReturnMap([ + ['label', 'label'], + ['langcode', 'langcode'], + ]); + + $this->entityManager + ->expects($this->any()) + ->method('getDefinition') + ->with($entity_type_id) + ->will($this->returnValue($entity_type)); + + /** @var \Drupal\Core\Entity\Entity $entity */ + $entity = $this->getMockForAbstractClass('Drupal\Core\Entity\Entity', [ + ['id' => $entity_id, 'label' => $entity_label, 'langcode' => 'es'], + $entity_type_id, + ]); + + $expected_link = Link::createFromRoute( + $expected_text, + $route_name, + [$entity_type_id => $entity_id], + ['entity_type' => $entity_type_id, 'entity' => $entity] + $link_options + ); + + $result_link = $entity->toLink($link_text, $link_rel, $link_options); + $this->assertEquals($expected_link, $result_link); + } + /** * Provides test data for testLink(). */ diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityTypeBundleInfoTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityTypeBundleInfoTest.php index 82626ec74..9003bc581 100644 --- a/core/tests/Drupal/Tests/Core/Entity/EntityTypeBundleInfoTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/EntityTypeBundleInfoTest.php @@ -175,11 +175,11 @@ class EntityTypeBundleInfoTest extends UnitTestCase { $apple = $this->prophesize(EntityTypeInterface::class); $apple->getLabel()->willReturn('Apple'); - $apple->getBundleOf()->willReturn(NULL); + $apple->getBundleEntityType()->willReturn(NULL); $banana = $this->prophesize(EntityTypeInterface::class); $banana->getLabel()->willReturn('Banana'); - $banana->getBundleOf()->willReturn(NULL); + $banana->getBundleEntityType()->willReturn(NULL); $this->setUpEntityTypeDefinitions([ 'apple' => $apple, @@ -223,11 +223,11 @@ class EntityTypeBundleInfoTest extends UnitTestCase { $apple = $this->prophesize(EntityTypeInterface::class); $apple->getLabel()->willReturn('Apple'); - $apple->getBundleOf()->willReturn(NULL); + $apple->getBundleEntityType()->willReturn(NULL); $banana = $this->prophesize(EntityTypeInterface::class); $banana->getLabel()->willReturn('Banana'); - $banana->getBundleOf()->willReturn(NULL); + $banana->getBundleEntityType()->willReturn(NULL); $this->setUpEntityTypeDefinitions([ 'apple' => $apple, @@ -271,4 +271,49 @@ class EntityTypeBundleInfoTest extends UnitTestCase { $this->assertSame('cached data', $bundle_info); } + /** + * @covers ::getAllBundleInfo + */ + public function testGetAllBundleInfoWithEntityBundleInfo() { + // Ensure that EntityTypeBundleInfo::getAllBundleInfo() does not add + // additional bundles if hook_entity_bundle_info() defines some and the + // entity_type does not define a bundle entity type. + $this->moduleHandler->invokeAll('entity_bundle_info')->willReturn([ + 'banana' => [ + 'fig' => [ + 'label' => 'Fig banana', + ], + ], + ]); + $this->moduleHandler->alter('entity_bundle_info', Argument::type('array'))->willReturn(NULL); + + $apple = $this->prophesize(EntityTypeInterface::class); + $apple->getLabel()->willReturn('Apple'); + $apple->getBundleEntityType()->willReturn(NULL); + + $banana = $this->prophesize(EntityTypeInterface::class); + $banana->getLabel()->willReturn('Banana'); + $banana->getBundleEntityType()->willReturn(NULL); + + $this->setUpEntityTypeDefinitions([ + 'apple' => $apple, + 'banana' => $banana, + ]); + + $expected = [ + 'banana' => [ + 'fig' => [ + 'label' => 'Fig banana', + ], + ], + 'apple' => [ + 'apple' => [ + 'label' => 'Apple', + ], + ], + ]; + $bundle_info = $this->entityTypeBundleInfo->getAllBundleInfo(); + $this->assertSame($expected, $bundle_info); + } + } diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php index d19f473d1..c60a18fd7 100644 --- a/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php @@ -28,6 +28,8 @@ class EntityUrlTest extends UnitTestCase { protected $entityManager; /** + * The mocked URL generator. + * * @var \Drupal\Core\Routing\UrlGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $urlGenerator; @@ -50,12 +52,15 @@ class EntityUrlTest extends UnitTestCase { /** * Tests the urlInfo() method. * + * Note that urlInfo() is a deprecated alias for toUrl(). + * See testToUrl(). + * * @covers ::urlInfo * - * @dataProvider providerTestUrlInfo + * @dataProvider providerTestToUrl */ public function testUrlInfo($entity_class, $link_template, $expected, $langcode = NULL) { - /** @var $entity \Drupal\Core\Entity\EntityInterface */ + /** @var \Drupal\Core\Entity\EntityInterface $entity */ $entity = $this->getMockForAbstractClass($entity_class, array(array('id' => 'test_entity_id'), 'test_entity_type')); $uri = $this->getTestUrlInfo($entity, $link_template, [], $langcode); @@ -75,27 +80,57 @@ class EntityUrlTest extends UnitTestCase { } } } + /** + * Tests the toUrl() method. + * + * @covers ::toUrl + * + * @dataProvider providerTestToUrl + */ + public function testToUrl($entity_class, $link_template, $expected, $langcode = NULL) { + /** @var \Drupal\Core\Entity\EntityInterface $entity */ + $entity = $this->getMockForAbstractClass($entity_class, array(array('id' => 'test_entity_id'), 'test_entity_type')); + $uri = $this->getTestToUrl($entity, $link_template, [], $langcode); + + $this->assertSame($expected, $uri->getRouteName()); + $this->assertSame($entity, $uri->getOption('entity')); + + if ($langcode) { + $this->assertEquals($langcode, $uri->getOption('language')->getId()); + } + else { + if ($entity instanceof ConfigEntityInterface) { + // Config entities do not provide a language with their URIs. + $this->assertEquals(NULL, $uri->getOption('language')); + } + else { + $this->assertEquals(LanguageInterface::LANGCODE_NOT_SPECIFIED, $uri->getOption('language')->getId()); + } + } + } /** - * @covers ::urlInfo + * Tests for Entity::toUrl() exercising different language options. + * + * @covers ::toUrl */ - public function testUrlInfoWithSpecificLanguageInOptions() { - /** @var $entity \Drupal\Core\Entity\EntityInterface */ + public function testToUrlWithSpecificLanguageInOptions() { + /** @var \Drupal\Core\Entity\EntityInterface $entity */ $entity = $this->getMockForAbstractClass('Drupal\Core\Entity\Entity', array(array('id' => 'test_entity_id'), 'test_entity_type')); // Ensure that a specified language overrides the current translation // language. - $uri = $this->getTestUrlInfo($entity, 'edit-form', [], 'en'); + $uri = $this->getTestToUrl($entity, 'edit-form', [], 'en'); $this->assertEquals('en', $uri->getOption('language')->getId()); - $uri = $this->getTestUrlInfo($entity, 'edit-form', ['language' => new Language(['id' => 'fr'])], 'en'); + $uri = $this->getTestToUrl($entity, 'edit-form', ['language' => new Language(['id' => 'fr'])], 'en'); $this->assertEquals('fr', $uri->getOption('language')->getId()); } /** * Provides test data for testUrlInfo(). */ - public function providerTestUrlInfo() { + public function providerTestToUrl() { return array( array('Drupal\Core\Entity\Entity', 'edit-form', 'entity.test_entity_type.edit_form', NULL), // Specify a langcode. @@ -108,19 +143,20 @@ class EntityUrlTest extends UnitTestCase { } /** - * Tests the urlInfo() method with an invalid link template. + * Tests the toUrl() method with an invalid link template. * - * @covers ::urlInfo + * @covers ::toUrl * * @expectedException \Drupal\Core\Entity\Exception\UndefinedLinkTemplateException + * * @expectedExceptionMessage No link template 'canonical' found for the 'test_entity_type' entity type * - * @dataProvider providerTestUrlInfoForInvalidLinkTemplate + * @dataProvider providerTestToUrlForInvalidLinkTemplate */ - public function testUrlInfoForInvalidLinkTemplate($entity_class, $link_template) { - /** @var $entity \Drupal\Core\Entity\EntityInterface */ + public function testToUrlForInvalidLinkTemplate($entity_class, $link_template) { + /** @var \Drupal\Core\Entity\EntityInterface $entity */ $entity = $this->getMockForAbstractClass($entity_class, array(array('id' => 'test_entity_id'), 'test_entity_type')); - $uri = $this->getTestUrlInfo($entity, $link_template); + $uri = $this->getTestToUrl($entity, $link_template); $this->assertEmpty($uri); } @@ -128,7 +164,7 @@ class EntityUrlTest extends UnitTestCase { /** * Provides test data for testUrlInfoForInvalidLinkTemplate(). */ - public function providerTestUrlInfoForInvalidLinkTemplate() { + public function providerTestToUrlForInvalidLinkTemplate() { return array( array('Drupal\Core\Entity\Entity', 'canonical'), array('Drupal\Core\Entity\Entity', FALSE), @@ -139,6 +175,9 @@ class EntityUrlTest extends UnitTestCase { /** * Creates a \Drupal\Core\Url object based on the entity and link template. * + * Method urlInfo() is deprecated and replaced with toUrl(). + * See also getTestToUrl(). + * * @param \Drupal\Core\Entity\EntityInterface $entity * The test entity. * @param string $link_template @@ -184,17 +223,64 @@ class EntityUrlTest extends UnitTestCase { } /** - * Tests the urlInfo() method when an entity is still "new". + * Creates a \Drupal\Core\Url object based on the entity and link template. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The test entity. + * @param string $link_template + * The link template. + * @param string $langcode + * The langcode. + * + * @return \Drupal\Core\Url + * The URL for this entity's link template. + */ + protected function getTestToUrl(EntityInterface $entity, $link_template, array $options = [], $langcode = NULL) { + $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface'); + $entity_type->expects($this->any()) + ->method('getLinkTemplates') + ->will($this->returnValue(array( + 'edit-form' => 'test_entity_type.edit', + ))); + + if ($langcode) { + $entity->langcode = $langcode; + } + + $this->entityManager + ->expects($this->any()) + ->method('getDefinition') + ->with('test_entity_type') + ->will($this->returnValue($entity_type)); + + // If no link template is given, call without a value to test the default. + if ($link_template) { + $uri = $entity->toUrl($link_template, $options); + } + else { + if ($entity instanceof ConfigEntityInterface) { + $uri = $entity->toUrl('edit-form', $options); + } + else { + $uri = $entity->toUrl('canonical', $options); + } + } + + return $uri; + } + + /** + * Tests the toUrl() method when an entity is still "new". * * @see \Drupal\Core\Entity\EntityInterface::isNew() * - * @covers ::urlInfo + * @covers ::toUrl * * @expectedException \Drupal\Core\Entity\EntityMalformedException */ - public function testUrlInfoForNewEntity() { + public function testToUrlForNewEntity() { $entity = $this->getMockForAbstractClass('Drupal\Core\Entity\Entity', array(array(), 'test_entity_type')); - $entity->urlInfo(); + $entity->toUrl(); } /** @@ -236,7 +322,7 @@ class EntityUrlTest extends UnitTestCase { if ($route_name === 'entity.test_entity_type.canonical' && $route_parameters === array('test_entity_type' => 'test_entity_id') && array_keys($options) === ['absolute', 'entity_type', 'entity', 'language'] && $options['language'] == $language) { return 'http://drupal/entity/test_entity_type/test_entity_id'; } - }); + }); $this->assertSame('/entity/test_entity_type/test_entity_id', $valid_entity->url()); $this->assertSame('http://drupal/entity/test_entity_type/test_entity_id', $valid_entity->url('canonical', array('absolute' => TRUE))); diff --git a/core/tests/Drupal/Tests/Core/Entity/Routing/DefaultHtmlRouteProviderTest.php b/core/tests/Drupal/Tests/Core/Entity/Routing/DefaultHtmlRouteProviderTest.php new file mode 100644 index 000000000..cdfd0f292 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Entity/Routing/DefaultHtmlRouteProviderTest.php @@ -0,0 +1,155 @@ +prophesize(EntityManagerInterface::class); + $route_provider = new TestDefaultHtmlRouteProvider($entity_manager->reveal()); + + $entity_type = $this->prophesize(EntityTypeInterface::class); + $entity_type->isSubclassOf(FieldableEntityInterface::class)->willReturn(TRUE); + $entity_type_id = 'the_entity_type_id'; + $entity_type->id()->willReturn($entity_type_id); + $entity_type->getKey('id')->willReturn('id'); + + $field_storage_definition = $this->prophesize(FieldStorageDefinitionInterface::class); + $field_storage_definition->getType()->willReturn('integer'); + $entity_manager->getFieldStorageDefinitions($entity_type_id)->willReturn(['id' => $field_storage_definition]); + + $type = $route_provider->getEntityTypeIdKeyType($entity_type->reveal()); + $this->assertSame('integer', $type); + } + + /** + * @covers ::getEntityTypeIdKeyType + */ + public function testGetEntityTypeIdKeyTypeNotFieldable() { + $entity_manager = $this->prophesize(EntityManagerInterface::class); + $route_provider = new TestDefaultHtmlRouteProvider($entity_manager->reveal()); + + $entity_type = $this->prophesize(EntityTypeInterface::class); + $entity_type->isSubclassOf(FieldableEntityInterface::class)->willReturn(FALSE); + $entity_manager->getFieldStorageDefinitions(Argument::any())->shouldNotBeCalled(); + + $type = $route_provider->getEntityTypeIdKeyType($entity_type->reveal()); + $this->assertNull($type); + } + + /** + * @covers ::getCanonicalRoute + * @dataProvider providerTestGetCanonicalRoute + */ + public function testGetCanonicalRoute($entity_type_prophecy, $expected, $field_storage_definition = NULL) { + $entity_manager = $this->prophesize(EntityManagerInterface::class); + $route_provider = new TestDefaultHtmlRouteProvider($entity_manager->reveal()); + $entity_type = $entity_type_prophecy->reveal(); + + if ($field_storage_definition) { + $entity_manager->getFieldStorageDefinitions($entity_type->id()) + ->willReturn([$entity_type->getKey('id') => $field_storage_definition]); + } + + $route = $route_provider->getCanonicalRoute($entity_type); + $this->assertEquals($expected, $route); + } + + public function providerTestGetCanonicalRoute() { + $data = []; + + $entity_type1 = $this->prophesize(EntityTypeInterface::class); + $entity_type1->hasLinkTemplate('canonical')->willReturn(FALSE); + $data['no_canonical_link_template'] = [$entity_type1, NULL]; + + $entity_type2 = $this->prophesize(EntityTypeInterface::class); + $entity_type2->hasLinkTemplate('canonical')->willReturn(TRUE); + $entity_type2->hasViewBuilderClass()->willReturn(FALSE); + $data['no_view_builder'] = [$entity_type2, NULL]; + + $entity_type3 = $this->prophesize(EntityTypeInterface::class); + $entity_type3->hasLinkTemplate('canonical')->willReturn(TRUE); + $entity_type3->hasViewBuilderClass()->willReturn(TRUE); + $entity_type3->id()->willReturn('the_entity_type_id'); + $entity_type3->getLinkTemplate('canonical')->willReturn('/the/canonical/link/template'); + $entity_type3->isSubclassOf(FieldableEntityInterface::class)->willReturn(FALSE); + $route3 = (new Route('/the/canonical/link/template')) + ->setDefaults([ + '_entity_view' => 'the_entity_type_id.full', + '_title_callback' => '\Drupal\Core\Entity\Controller\EntityController::title', + ]) + ->setRequirements([ + '_entity_access' => 'the_entity_type_id.view', + ]) + ->setOptions([ + 'parameters' => [ + 'the_entity_type_id' => [ + 'type' => 'entity:the_entity_type_id', + ], + ], + ]); + $data['id_key_type_null'] = [$entity_type3, $route3]; + + $entity_type4 = $this->prophesize(EntityTypeInterface::class); + $entity_type4->hasLinkTemplate('canonical')->willReturn(TRUE); + $entity_type4->hasViewBuilderClass()->willReturn(TRUE); + $entity_type4->id()->willReturn('the_entity_type_id'); + $entity_type4->getLinkTemplate('canonical')->willReturn('/the/canonical/link/template'); + $entity_type4->isSubclassOf(FieldableEntityInterface::class)->willReturn(TRUE); + $entity_type4->getKey('id')->willReturn('id'); + $route4 = (new Route('/the/canonical/link/template')) + ->setDefaults([ + '_entity_view' => 'the_entity_type_id.full', + '_title_callback' => '\Drupal\Core\Entity\Controller\EntityController::title', + ]) + ->setRequirements([ + '_entity_access' => 'the_entity_type_id.view', + 'the_entity_type_id' => '\d+', + ]) + ->setOptions([ + 'parameters' => [ + 'the_entity_type_id' => [ + 'type' => 'entity:the_entity_type_id', + ], + ], + ]); + $field_storage_definition = $this->prophesize(FieldStorageDefinitionInterface::class); + $field_storage_definition->getType()->willReturn('integer'); + $data['id_key_type_integer'] = [$entity_type4, $route4, $field_storage_definition]; + + return $data; + } + +} + +class TestDefaultHtmlRouteProvider extends DefaultHtmlRouteProvider { + + public function getEntityTypeIdKeyType(EntityTypeInterface $entity_type) { + return parent::getEntityTypeIdKeyType($entity_type); + } + public function getCanonicalRoute(EntityTypeInterface $entity_type) { + return parent::getCanonicalRoute($entity_type); + } + +} diff --git a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php index d01a1f6ef..da61f5fc6 100644 --- a/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php +++ b/core/tests/Drupal/Tests/Core/PathProcessor/PathProcessorTest.php @@ -150,11 +150,16 @@ class PathProcessorTest extends UnitTestCase { $current_user = $this->getMockBuilder('Drupal\Core\Session\AccountInterface') ->getMock(); + // Create a config event subscriber stub. + $config_subscriber = $this->getMockBuilder('Drupal\language\EventSubscriber\ConfigSubscriber') + ->disableOriginalConstructor() + ->getMock(); + // Create the processors. $alias_processor = new PathProcessorAlias($alias_manager); $decode_processor = new PathProcessorDecode(); $front_processor = new PathProcessorFront($config_factory_stub); - $language_processor = new PathProcessorLanguage($config_factory_stub, $this->languageManager, $negotiator, $current_user); + $language_processor = new PathProcessorLanguage($config_factory_stub, $this->languageManager, $negotiator, $current_user, $config_subscriber); // First, test the processor manager with the processors in the incorrect // order. The alias processor will run before the language processor, meaning diff --git a/core/tests/Drupal/Tests/Core/StringTranslation/TranslationManagerTest.php b/core/tests/Drupal/Tests/Core/StringTranslation/TranslationManagerTest.php index 1a99bbf3a..1a1b3904e 100644 --- a/core/tests/Drupal/Tests/Core/StringTranslation/TranslationManagerTest.php +++ b/core/tests/Drupal/Tests/Core/StringTranslation/TranslationManagerTest.php @@ -43,6 +43,8 @@ class TranslationManagerTest extends UnitTestCase { // @todo support locale_get_plural [2, 'Singular', '@count @arg', array('@arg' => '

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%0D! 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